/usr/share/pyshared/gpodder/directory.py is in gpodder 3.9.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | # -*- coding: utf-8 -*-
#
# gPodder - A media aggregator and podcast client
# Copyright (c) 2005-2016 Thomas Perl and the gPodder Team
#
# gPodder is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# gPodder is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
# gpodder.directory - Podcast directory and search providers
# Thomas Perl <thp@gpodder.org>; 2014-10-22
#
import gpodder
_ = gpodder.gettext
import urllib
import json
import os
from gpodder import opml
from gpodder import util
class DirectoryEntry(object):
def __init__(self, title, url, image=None, subscribers=-1, description=None):
self.title = title
self.url = url
self.image = image
self.subscribers = subscribers
self.description = description
class DirectoryTag(object):
def __init__(self, tag, weight):
self.tag = tag
self.weight = weight
class Provider(object):
PROVIDER_SEARCH, PROVIDER_URL, PROVIDER_FILE, PROVIDER_TAGCLOUD, PROVIDER_STATIC = range(5)
def __init__(self):
self.name = ''
self.kind = self.PROVIDER_SEARCH
self.icon = None
def on_search(self, query):
# Should return a list of DirectoryEntry objects
raise NotImplemented()
def on_url(self, url):
# Should return a list of DirectoryEntry objects
raise NotImplemented()
def on_file(self, filename):
# Should return a list of DirectoryEntry objects
raise NotImplemented()
def on_tag(self, tag):
# Should return a list of DirectoryEntry objects
raise NotImplemented()
def on_static(self):
# Should return a list of DirectoryEntry objects
raise NotImplemented()
def get_tags(self):
# Should return a list of DirectoryTag objects
raise NotImplemented()
def directory_entry_from_opml(url):
return [DirectoryEntry(d['title'], d['url'], description=d['description']) for d in opml.Importer(url).items]
def directory_entry_from_mygpo_json(url):
return [DirectoryEntry(d['title'], d['url'], d['logo_url'], d['subscribers'], d['description'])
for d in json.load(util.urlopen(url))]
class GPodderNetSearchProvider(Provider):
def __init__(self):
self.name = _('gpodder.net search')
self.kind = Provider.PROVIDER_SEARCH
self.icon = 'directory-gpodder.png'
def on_search(self, query):
return directory_entry_from_mygpo_json('http://gpodder.net/search.json?q=' + urllib.quote(query))
class OpmlWebImportProvider(Provider):
def __init__(self):
self.name = _('OPML from web')
self.kind = Provider.PROVIDER_URL
self.icon = 'directory-opml.png'
def on_url(self, url):
return directory_entry_from_opml(url)
class OpmlFileImportProvider(Provider):
def __init__(self):
self.name = _('OPML file')
self.kind = Provider.PROVIDER_FILE
self.icon = 'directory-opml.png'
def on_file(self, filename):
return directory_entry_from_opml(filename)
class GPodderRecommendationsProvider(Provider):
def __init__(self):
self.name = _('Getting started')
self.kind = Provider.PROVIDER_STATIC
self.icon = 'directory-examples.png'
def on_static(self):
return directory_entry_from_opml('http://gpodder.org/directory.opml')
class GPodderNetToplistProvider(Provider):
def __init__(self):
self.name = _('gpodder.net Top 50')
self.kind = Provider.PROVIDER_STATIC
self.icon = 'directory-toplist.png'
def on_static(self):
return directory_entry_from_mygpo_json('http://gpodder.net/toplist/50.json')
class GPodderNetTagsProvider(Provider):
def __init__(self):
self.name = _('gpodder.net Tags')
self.kind = Provider.PROVIDER_TAGCLOUD
self.icon = 'directory-tags.png'
def on_tag(self, tag):
return directory_entry_from_mygpo_json('http://gpodder.net/api/2/tag/%s/50.json' % urllib.quote(tag))
def get_tags(self):
return [DirectoryTag(d['tag'], d['usage']) for d in json.load(util.urlopen('http://gpodder.net/api/2/tags/40.json'))]
class SoundcloudSearchProvider(Provider):
def __init__(self):
self.name = _('Soundcloud search')
self.kind = Provider.PROVIDER_SEARCH
self.icon = 'directory-soundcloud.png'
def on_search(self, query):
# XXX: This cross-import of the plugin here is bad, but it
# works for now (no proper plugin architecture...)
from gpodder.plugins.soundcloud import search_for_user
return [DirectoryEntry(entry['username'], entry['permalink_url']) for entry in search_for_user(query)]
class FixedOpmlFileProvider(Provider):
def __init__(self, filename):
self.name = _('Imported OPML file')
self.kind = Provider.PROVIDER_STATIC
self.icon = 'directory-opml.png'
self.filename = filename
def on_static(self):
return directory_entry_from_opml(self.filename)
PROVIDERS = [
GPodderRecommendationsProvider,
None,
GPodderNetSearchProvider,
GPodderNetToplistProvider,
#GPodderNetTagsProvider,
None,
OpmlWebImportProvider,
#OpmlFileImportProvider,
None,
SoundcloudSearchProvider,
]
|