From 2b88e08dd54372b58129546ff0fbad3470aa16ac Mon Sep 17 00:00:00 2001 From: Ruud Date: Tue, 12 Apr 2011 10:51:29 +0200 Subject: [PATCH] Subdirectories for providers --- couchpotato/core/loader.py | 13 ++- couchpotato/core/providers/imdb/__init__.py | 4 - couchpotato/core/providers/imdb/main.py | 82 -------------- couchpotato/core/providers/movie/__init__.py | 0 couchpotato/core/providers/movie/imdb/__init__.py | 4 + couchpotato/core/providers/movie/imdb/main.py | 82 ++++++++++++++ .../core/providers/movie/themoviedb/__init__.py | 24 ++++ .../core/providers/movie/themoviedb/main.py | 111 ++++++++++++++++++ couchpotato/core/providers/newzbin/__init__.py | 29 ----- couchpotato/core/providers/newzbin/main.py | 8 -- couchpotato/core/providers/newznab/__init__.py | 30 ----- couchpotato/core/providers/newznab/main.py | 8 -- couchpotato/core/providers/nzb/__init__.py | 0 couchpotato/core/providers/nzb/newzbin/__init__.py | 29 +++++ couchpotato/core/providers/nzb/newzbin/main.py | 8 ++ couchpotato/core/providers/nzb/newznab/__init__.py | 30 +++++ couchpotato/core/providers/nzb/newznab/main.py | 8 ++ .../core/providers/nzb/nzbmatrix/__init__.py | 29 +++++ couchpotato/core/providers/nzb/nzbmatrix/main.py | 116 +++++++++++++++++++ .../core/providers/nzb/nzbmatrix/nzbmatrix.py | 124 +++++++++++++++++++++ couchpotato/core/providers/nzb/nzbs/__init__.py | 30 +++++ couchpotato/core/providers/nzb/nzbs/main.py | 8 ++ couchpotato/core/providers/nzbmatrix/__init__.py | 29 ----- couchpotato/core/providers/nzbmatrix/main.py | 116 ------------------- couchpotato/core/providers/nzbs/__init__.py | 30 ----- couchpotato/core/providers/nzbs/main.py | 8 -- couchpotato/core/providers/subtitle/__init__.py | 0 couchpotato/core/providers/themoviedb/__init__.py | 24 ---- couchpotato/core/providers/themoviedb/main.py | 111 ------------------ .../core/providers/thepiratebay/__init__.py | 24 ---- couchpotato/core/providers/thepiratebay/main.py | 8 -- couchpotato/core/providers/torrent/__init__.py | 0 .../providers/torrent/thepiratebay/__init__.py | 24 ++++ .../core/providers/torrent/thepiratebay/main.py | 8 ++ couchpotato/core/providers/trailer/__init__.py | 0 35 files changed, 645 insertions(+), 514 deletions(-) delete mode 100644 couchpotato/core/providers/imdb/__init__.py delete mode 100644 couchpotato/core/providers/imdb/main.py create mode 100644 couchpotato/core/providers/movie/__init__.py create mode 100644 couchpotato/core/providers/movie/imdb/__init__.py create mode 100644 couchpotato/core/providers/movie/imdb/main.py create mode 100644 couchpotato/core/providers/movie/themoviedb/__init__.py create mode 100644 couchpotato/core/providers/movie/themoviedb/main.py delete mode 100644 couchpotato/core/providers/newzbin/__init__.py delete mode 100644 couchpotato/core/providers/newzbin/main.py delete mode 100644 couchpotato/core/providers/newznab/__init__.py delete mode 100644 couchpotato/core/providers/newznab/main.py create mode 100644 couchpotato/core/providers/nzb/__init__.py create mode 100644 couchpotato/core/providers/nzb/newzbin/__init__.py create mode 100644 couchpotato/core/providers/nzb/newzbin/main.py create mode 100644 couchpotato/core/providers/nzb/newznab/__init__.py create mode 100644 couchpotato/core/providers/nzb/newznab/main.py create mode 100644 couchpotato/core/providers/nzb/nzbmatrix/__init__.py create mode 100644 couchpotato/core/providers/nzb/nzbmatrix/main.py create mode 100644 couchpotato/core/providers/nzb/nzbmatrix/nzbmatrix.py create mode 100644 couchpotato/core/providers/nzb/nzbs/__init__.py create mode 100644 couchpotato/core/providers/nzb/nzbs/main.py delete mode 100644 couchpotato/core/providers/nzbmatrix/__init__.py delete mode 100644 couchpotato/core/providers/nzbmatrix/main.py delete mode 100644 couchpotato/core/providers/nzbs/__init__.py delete mode 100644 couchpotato/core/providers/nzbs/main.py create mode 100644 couchpotato/core/providers/subtitle/__init__.py delete mode 100644 couchpotato/core/providers/themoviedb/__init__.py delete mode 100644 couchpotato/core/providers/themoviedb/main.py delete mode 100644 couchpotato/core/providers/thepiratebay/__init__.py delete mode 100644 couchpotato/core/providers/thepiratebay/main.py create mode 100644 couchpotato/core/providers/torrent/__init__.py create mode 100644 couchpotato/core/providers/torrent/thepiratebay/__init__.py create mode 100644 couchpotato/core/providers/torrent/thepiratebay/main.py create mode 100644 couchpotato/core/providers/trailer/__init__.py diff --git a/couchpotato/core/loader.py b/couchpotato/core/loader.py index 4fa31e2..a9f75d7 100644 --- a/couchpotato/core/loader.py +++ b/couchpotato/core/loader.py @@ -14,11 +14,18 @@ class Loader: def preload(self, root = ''): + core = os.path.join(root, 'couchpotato', 'core') + providers = os.path.join(root, 'couchpotato', 'core', 'providers') + self.paths = { - 'plugin' : ('couchpotato.core.plugins', os.path.join(root, 'couchpotato', 'core', 'plugins')), - 'provider' : ('couchpotato.core.providers', os.path.join(root, 'couchpotato', 'core', 'providers')), - 'notifications' : ('couchpotato.core.notifications', os.path.join(root, 'couchpotato', 'core', 'notifications')), + 'plugin' : ('couchpotato.core.plugins', os.path.join(core, 'plugins')), + 'notifications' : ('couchpotato.core.notifications', os.path.join(core, 'notifications')), 'downloaders' : ('couchpotato.core.downloaders', os.path.join(root, 'couchpotato', 'core', 'downloaders')), + 'movie_provider' : ('couchpotato.core.providers.movie', os.path.join(providers, 'movie')), + 'nzb_provider' : ('couchpotato.core.providers.nzb', os.path.join(providers, 'nzb')), + 'torrent_provider' : ('couchpotato.core.providers.torrent', os.path.join(providers, 'torrent')), + 'trailer_provider' : ('couchpotato.core.providers.trailer', os.path.join(providers, 'trailer')), + 'subtitle_provider' : ('couchpotato.core.providers.subtitle', os.path.join(providers, 'subtitle')), } for type, tuple in self.paths.iteritems(): diff --git a/couchpotato/core/providers/imdb/__init__.py b/couchpotato/core/providers/imdb/__init__.py deleted file mode 100644 index 3442847..0000000 --- a/couchpotato/core/providers/imdb/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -def start(): - pass - -config = [] diff --git a/couchpotato/core/providers/imdb/main.py b/couchpotato/core/providers/imdb/main.py deleted file mode 100644 index 3eb7cac..0000000 --- a/couchpotato/core/providers/imdb/main.py +++ /dev/null @@ -1,82 +0,0 @@ -from couchpotato.core.event import addEvent -from couchpotato.core.logger import CPLog -from couchpotato.core.providers.base import MovieProvider -from imdb import IMDb - -log = CPLog(__name__) - - -class IMDB(MovieProvider): - - def __init__(self): - - addEvent('provider.movie.search', self.search) - - self.p = IMDb('http') - - - def search(self): - print 'search' - - def conf(self, option): - return self.config.get('IMDB', option) - - def find(self, q, limit = 8, alternative = True): - ''' Find movie by name ''' - - log.info('IMDB - Searching for movie: %s' % q) - - r = self.p.search_movie(q) - - return self.toResults(r, limit) - - def toResults(self, r, limit = 8, one = False): - results = [] - - if one: - new = self.feedItem() - new.imdb = 'tt' + r.movieID - new.name = self.toSaveString(r['title']) - try: - new.year = r['year'] - except: - new.year = '' - - return new - else : - nr = 0 - for movie in r: - results.append(self.toResults(movie, one = True)) - nr += 1 - if nr == limit: - break - - return results - - def findById(self, id): - ''' Find movie by TheMovieDB ID ''' - - return [] - - - def findByImdbId(self, id, details = False): - ''' Find movie by IMDB ID ''' - - log.info('IMDB - Searching for movie: %s' % str(id)) - - r = self.p.get_movie(id.replace('tt', '')) - - if not details: - return self.toResults(r, one = True) - else: - self.p.update(r) - self.p.update(r, info = 'release dates') - self.p.update(r, info = 'taglines') - return r - - def get_IMDb_instance(self): - return IMDb('http') - - - def findReleaseDate(self, movie): - pass diff --git a/couchpotato/core/providers/movie/__init__.py b/couchpotato/core/providers/movie/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/couchpotato/core/providers/movie/imdb/__init__.py b/couchpotato/core/providers/movie/imdb/__init__.py new file mode 100644 index 0000000..3442847 --- /dev/null +++ b/couchpotato/core/providers/movie/imdb/__init__.py @@ -0,0 +1,4 @@ +def start(): + pass + +config = [] diff --git a/couchpotato/core/providers/movie/imdb/main.py b/couchpotato/core/providers/movie/imdb/main.py new file mode 100644 index 0000000..3eb7cac --- /dev/null +++ b/couchpotato/core/providers/movie/imdb/main.py @@ -0,0 +1,82 @@ +from couchpotato.core.event import addEvent +from couchpotato.core.logger import CPLog +from couchpotato.core.providers.base import MovieProvider +from imdb import IMDb + +log = CPLog(__name__) + + +class IMDB(MovieProvider): + + def __init__(self): + + addEvent('provider.movie.search', self.search) + + self.p = IMDb('http') + + + def search(self): + print 'search' + + def conf(self, option): + return self.config.get('IMDB', option) + + def find(self, q, limit = 8, alternative = True): + ''' Find movie by name ''' + + log.info('IMDB - Searching for movie: %s' % q) + + r = self.p.search_movie(q) + + return self.toResults(r, limit) + + def toResults(self, r, limit = 8, one = False): + results = [] + + if one: + new = self.feedItem() + new.imdb = 'tt' + r.movieID + new.name = self.toSaveString(r['title']) + try: + new.year = r['year'] + except: + new.year = '' + + return new + else : + nr = 0 + for movie in r: + results.append(self.toResults(movie, one = True)) + nr += 1 + if nr == limit: + break + + return results + + def findById(self, id): + ''' Find movie by TheMovieDB ID ''' + + return [] + + + def findByImdbId(self, id, details = False): + ''' Find movie by IMDB ID ''' + + log.info('IMDB - Searching for movie: %s' % str(id)) + + r = self.p.get_movie(id.replace('tt', '')) + + if not details: + return self.toResults(r, one = True) + else: + self.p.update(r) + self.p.update(r, info = 'release dates') + self.p.update(r, info = 'taglines') + return r + + def get_IMDb_instance(self): + return IMDb('http') + + + def findReleaseDate(self, movie): + pass diff --git a/couchpotato/core/providers/movie/themoviedb/__init__.py b/couchpotato/core/providers/movie/themoviedb/__init__.py new file mode 100644 index 0000000..31441fc --- /dev/null +++ b/couchpotato/core/providers/movie/themoviedb/__init__.py @@ -0,0 +1,24 @@ +from .main import TheMovieDb + +def start(): + return TheMovieDb() + +config = [{ + 'name': 'themoviedb', + 'groups': [ + { + 'tab': 'providers', + 'name': 'tmdb', + 'label': 'TheMovieDB', + 'advanced': True, + 'description': 'Used for all calls to TheMovieDB.', + 'options': [ + { + 'name': 'api_key', + 'default': '9b939aee0aaafc12a65bf448e4af9543', + 'label': 'Api Key', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/movie/themoviedb/main.py b/couchpotato/core/providers/movie/themoviedb/main.py new file mode 100644 index 0000000..bd9e0ad --- /dev/null +++ b/couchpotato/core/providers/movie/themoviedb/main.py @@ -0,0 +1,111 @@ +from __future__ import with_statement +from couchpotato.core.event import addEvent +from couchpotato.core.helpers.encoding import simplifyString, toUnicode +from couchpotato.core.logger import CPLog +from couchpotato.core.providers.base import MovieProvider +from libs.themoviedb import tmdb + +log = CPLog(__name__) + + +class TheMovieDb(MovieProvider): + """Api for theMovieDb""" + + apiUrl = 'http://api.themoviedb.org/2.1' + imageUrl = 'http://hwcdn.themoviedb.org' + + def __init__(self): + addEvent('provider.movie.search', self.search) + addEvent('provider.movie.info', self.getInfo) + + # Use base wrapper + tmdb.Config.api_key = self.conf('api_key') + + def search(self, q, limit = 12): + ''' Find movie by name ''' + + if self.isDisabled(): + return False + + log.debug('TheMovieDB - Searching for movie: %s' % q) + raw = tmdb.search(simplifyString(q)) + + results = [] + if raw: + try: + nr = 0 + for movie in raw: + + results.append(self.parseMovie(movie)) + + nr += 1 + if nr == limit: + break + + log.info('TheMovieDB - Found: %s' % [result['titles'][0] + ' (' + str(result['year']) + ')' for result in results]) + return results + except SyntaxError, e: + log.error('Failed to parse XML response: %s' % e) + return False + + return results + + def getInfo(self, identifier = None): + result = {} + + movie = tmdb.imdbLookup(id = identifier)[0] + + if movie: + result = self.parseMovie(movie) + + return result + + def parseMovie(self, movie): + + year = str(movie.get('released', 'none'))[:4] + + # Poster url + poster = self.getImage(movie, type = 'poster') + backdrop = self.getImage(movie, type = 'backdrop') + + # 1900 is the same as None + if year == '1900' or year.lower() == 'none': + year = None + + movie_data = { + 'id': int(movie.get('id', 0)), + 'titles': [toUnicode(movie.get('name'))], + 'images': { + 'posters': [poster], + 'backdrops': [backdrop], + }, + 'imdb': movie.get('imdb_id'), + 'year': year, + 'plot': movie.get('overview', ''), + 'tagline': '', + } + + # Add alternative names + for alt in ['original_name', 'alternative_name']: + alt_name = toUnicode(movie.get(alt)) + if alt_name and not alt_name in movie_data['titles'] and alt_name.lower() != 'none' and alt_name != None: + movie_data['titles'].append(alt_name) + + return movie_data + + def getImage(self, movie, type = 'poster'): + + image = '' + for image in movie.get('images', []): + if(image.get('type') == type): + image = image.get('thumb') + break + + return image + + def isDisabled(self): + if self.conf('api_key') == '': + log.error('No API key provided.') + True + else: + False diff --git a/couchpotato/core/providers/newzbin/__init__.py b/couchpotato/core/providers/newzbin/__init__.py deleted file mode 100644 index 0b411bf..0000000 --- a/couchpotato/core/providers/newzbin/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -from .main import Newzbin - -def start(): - return Newzbin() - -config = [{ - 'name': 'newzbin', - 'groups': [ - { - 'tab': 'providers', - 'name': 'newzbin', - 'options': [ - { - 'name': 'enabled', - 'type': 'enabler', - }, - { - 'name': 'username', - 'default': '', - }, - { - 'name': 'password', - 'default': '', - 'type': 'password', - }, - ], - }, - ], -}] diff --git a/couchpotato/core/providers/newzbin/main.py b/couchpotato/core/providers/newzbin/main.py deleted file mode 100644 index 3fe3a29..0000000 --- a/couchpotato/core/providers/newzbin/main.py +++ /dev/null @@ -1,8 +0,0 @@ -from couchpotato.core.logger import CPLog -from couchpotato.core.providers.base import NZBProvider - -log = CPLog(__name__) - - -class Newzbin(NZBProvider): - pass diff --git a/couchpotato/core/providers/newznab/__init__.py b/couchpotato/core/providers/newznab/__init__.py deleted file mode 100644 index 6587764..0000000 --- a/couchpotato/core/providers/newznab/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -from .main import Newznab - -def start(): - return Newznab() - -config = [{ - 'name': 'newznab', - 'groups': [ - { - 'tab': 'providers', - 'name': 'newznab', - 'options': [ - { - 'name': 'enabled', - 'type': 'enabler', - }, - { - 'name': 'host', - 'default': 'http://nzb.su', - }, - { - 'name': 'api_key', - 'default': '', - 'label': 'Api Key', - 'description': 'Can be found after login on the "API" page, bottom left. The string after "&apikey=".', - }, - ], - }, - ], -}] diff --git a/couchpotato/core/providers/newznab/main.py b/couchpotato/core/providers/newznab/main.py deleted file mode 100644 index 0e2f30d..0000000 --- a/couchpotato/core/providers/newznab/main.py +++ /dev/null @@ -1,8 +0,0 @@ -from couchpotato.core.logger import CPLog -from couchpotato.core.providers.base import NZBProvider - -log = CPLog(__name__) - - -class Newznab(NZBProvider): - pass diff --git a/couchpotato/core/providers/nzb/__init__.py b/couchpotato/core/providers/nzb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/couchpotato/core/providers/nzb/newzbin/__init__.py b/couchpotato/core/providers/nzb/newzbin/__init__.py new file mode 100644 index 0000000..0b411bf --- /dev/null +++ b/couchpotato/core/providers/nzb/newzbin/__init__.py @@ -0,0 +1,29 @@ +from .main import Newzbin + +def start(): + return Newzbin() + +config = [{ + 'name': 'newzbin', + 'groups': [ + { + 'tab': 'providers', + 'name': 'newzbin', + 'options': [ + { + 'name': 'enabled', + 'type': 'enabler', + }, + { + 'name': 'username', + 'default': '', + }, + { + 'name': 'password', + 'default': '', + 'type': 'password', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/nzb/newzbin/main.py b/couchpotato/core/providers/nzb/newzbin/main.py new file mode 100644 index 0000000..3fe3a29 --- /dev/null +++ b/couchpotato/core/providers/nzb/newzbin/main.py @@ -0,0 +1,8 @@ +from couchpotato.core.logger import CPLog +from couchpotato.core.providers.base import NZBProvider + +log = CPLog(__name__) + + +class Newzbin(NZBProvider): + pass diff --git a/couchpotato/core/providers/nzb/newznab/__init__.py b/couchpotato/core/providers/nzb/newznab/__init__.py new file mode 100644 index 0000000..6587764 --- /dev/null +++ b/couchpotato/core/providers/nzb/newznab/__init__.py @@ -0,0 +1,30 @@ +from .main import Newznab + +def start(): + return Newznab() + +config = [{ + 'name': 'newznab', + 'groups': [ + { + 'tab': 'providers', + 'name': 'newznab', + 'options': [ + { + 'name': 'enabled', + 'type': 'enabler', + }, + { + 'name': 'host', + 'default': 'http://nzb.su', + }, + { + 'name': 'api_key', + 'default': '', + 'label': 'Api Key', + 'description': 'Can be found after login on the "API" page, bottom left. The string after "&apikey=".', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/nzb/newznab/main.py b/couchpotato/core/providers/nzb/newznab/main.py new file mode 100644 index 0000000..0e2f30d --- /dev/null +++ b/couchpotato/core/providers/nzb/newznab/main.py @@ -0,0 +1,8 @@ +from couchpotato.core.logger import CPLog +from couchpotato.core.providers.base import NZBProvider + +log = CPLog(__name__) + + +class Newznab(NZBProvider): + pass diff --git a/couchpotato/core/providers/nzb/nzbmatrix/__init__.py b/couchpotato/core/providers/nzb/nzbmatrix/__init__.py new file mode 100644 index 0000000..201cfcc --- /dev/null +++ b/couchpotato/core/providers/nzb/nzbmatrix/__init__.py @@ -0,0 +1,29 @@ +from .main import NZBMatrix + +def start(): + return NZBMatrix() + +config = [{ + 'name': 'nzbmatrix', + 'groups': [ + { + 'tab': 'providers', + 'name': 'nzbmatrix', + 'label': 'NZBMatrix', + 'options': [ + { + 'name': 'enabled', + 'type': 'enabler', + }, + { + 'name': 'username', + }, + { + 'name': 'api_key', + 'default': '9b939aee0aaafc12a65bf448e4af9543', + 'label': 'Api Key', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/nzb/nzbmatrix/main.py b/couchpotato/core/providers/nzb/nzbmatrix/main.py new file mode 100644 index 0000000..fe7d80a --- /dev/null +++ b/couchpotato/core/providers/nzb/nzbmatrix/main.py @@ -0,0 +1,116 @@ +from couchpotato.core.logger import CPLog +from couchpotato.core.providers.base import NZBProvider + +log = CPLog(__name__) + + +class NZBMatrix(NZBProvider): + + urls = { + 'download': 'https://api.nzbmatrix.com/v1.1/download.php?id=%s%s', + 'detail': 'https://nzbmatrix.com/nzb-details.php?id=%s&hit=1', + 'search': 'http://rss.nzbmatrix.com/rss.php', + } + + cat_ids = [ + ([42], ['720p', '1080p']), + ([2], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr']), + ([54], ['brrip']), + ([1], ['dvdr']), + ] + cat_backup_id = 2 + + def __init__(self, config): + log.info('Using NZBMatrix provider') + + self.config = config + + def find(self, movie, quality, type, retry = False): + + self.cleanCache(); + + results = [] + if not self.enabled() or not self.isAvailable(self.searchUrl): + return results + + catId = self.getCatId(type) + arguments = urlencode({ + 'term': movie.imdb, + 'subcat': catId, + 'username': self.conf('username'), + 'apikey': self.conf('apikey'), + 'searchin': 'weblink', + 'english': 1 if self.conf('english') else 0, + }) + url = "%s?%s" % (self.searchUrl, arguments) + cacheId = str(movie.imdb) + '-' + str(catId) + singleCat = (len(self.catIds.get(catId)) == 1 and catId != self.catBackupId) + + try: + cached = False + if(self.cache.get(cacheId)): + data = True + cached = True + log.info('Getting RSS from cache: %s.' % cacheId) + else: + log.info('Searching: %s' % url) + data = self.urlopen(url) + self.cache[cacheId] = { + 'time': time.time() + } + + except (IOError, URLError): + log.error('Failed to open %s.' % url) + return results + + if data: + try: + try: + if cached: + xml = self.cache[cacheId]['xml'] + else: + xml = self.getItems(data) + self.cache[cacheId]['xml'] = xml + except: + log.debug('No valid xml or to many requests.. You never know with %s.' % self.name) + return results + + for nzb in xml: + + title = self.gettextelement(nzb, "title") + if 'error' in title.lower(): continue + + id = int(self.gettextelement(nzb, "link").split('&')[0].partition('id=')[2]) + size = self.gettextelement(nzb, "description").split('
')[2].split('> ')[1] + date = str(self.gettextelement(nzb, "description").split('
')[3].partition('Added: ')[2]) + + new = self.feedItem() + new.id = id + new.type = 'nzb' + new.name = title + new.date = int(time.mktime(parse(date).timetuple())) + new.size = self.parseSize(size) + new.url = self.downloadLink(id) + new.detailUrl = self.detailLink(id) + new.content = self.gettextelement(nzb, "description") + new.score = self.calcScore(new, movie) + new.checkNZB = True + + if new.date > time.time() - (int(self.config.get('NZB', 'retention')) * 24 * 60 * 60): + if self.isCorrectMovie(new, movie, type, imdbResults = True, singleCategory = singleCat): + results.append(new) + log.info('Found: %s' % new.name) + else: + log.info('Found outside retention: %s' % new.name) + + return results + except SyntaxError: + log.error('Failed to parse XML response from NZBMatrix.com') + + return results + + def getApiExt(self): + return '&username=%s&apikey=%s' % (self.conf('username'), self.conf('apikey')) + + def isEnabled(self): + return self.conf('enabled') and self.conf('username') and self.conf('apikey') diff --git a/couchpotato/core/providers/nzb/nzbmatrix/nzbmatrix.py b/couchpotato/core/providers/nzb/nzbmatrix/nzbmatrix.py new file mode 100644 index 0000000..905a00d --- /dev/null +++ b/couchpotato/core/providers/nzb/nzbmatrix/nzbmatrix.py @@ -0,0 +1,124 @@ +from app.config.cplog import CPLog +from app.lib.provider.yarr.base import nzbBase +from dateutil.parser import parse +from urllib import urlencode +from urllib2 import URLError +import time + +log = CPLog(__name__) + +class nzbMatrix(nzbBase): + """Api for NZBMatrix""" + + name = 'NZBMatrix' + downloadUrl = 'https://api.nzbmatrix.com/v1.1/download.php?id=%s%s' + detailUrl = 'https://nzbmatrix.com/nzb-details.php?id=%s&hit=1' + searchUrl = 'http://rss.nzbmatrix.com/rss.php' + + catIds = { + 42: ['720p', '1080p'], + 2: ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr'], + 54: ['brrip'], + 1: ['dvdr'] + } + catBackupId = 2 + + timeBetween = 10 # Seconds + + def __init__(self, config): + log.info('Using NZBMatrix provider') + + self.config = config + + def conf(self, option): + return self.config.get('NZBMatrix', option) + + def enabled(self): + return self.conf('enabled') and self.config.get('NZB', 'enabled') and self.conf('username') and self.conf('apikey') + + def find(self, movie, quality, type, retry = False): + + self.cleanCache(); + + results = [] + if not self.enabled() or not self.isAvailable(self.searchUrl): + return results + + catId = self.getCatId(type) + arguments = urlencode({ + 'term': movie.imdb, + 'subcat': catId, + 'username': self.conf('username'), + 'apikey': self.conf('apikey'), + 'searchin': 'weblink', + 'english': 1 if self.conf('english') else 0, + }) + url = "%s?%s" % (self.searchUrl, arguments) + cacheId = str(movie.imdb) + '-' + str(catId) + singleCat = (len(self.catIds.get(catId)) == 1 and catId != self.catBackupId) + + try: + cached = False + if(self.cache.get(cacheId)): + data = True + cached = True + log.info('Getting RSS from cache: %s.' % cacheId) + else: + log.info('Searching: %s' % url) + data = self.urlopen(url) + self.cache[cacheId] = { + 'time': time.time() + } + + except (IOError, URLError): + log.error('Failed to open %s.' % url) + return results + + if data: + try: + try: + if cached: + xml = self.cache[cacheId]['xml'] + else: + xml = self.getItems(data) + self.cache[cacheId]['xml'] = xml + except: + log.debug('No valid xml or to many requests.. You never know with %s.' % self.name) + return results + + for nzb in xml: + + title = self.gettextelement(nzb, "title") + if 'error' in title.lower(): continue + + id = int(self.gettextelement(nzb, "link").split('&')[0].partition('id=')[2]) + size = self.gettextelement(nzb, "description").split('
')[2].split('> ')[1] + date = str(self.gettextelement(nzb, "description").split('
')[3].partition('Added: ')[2]) + + new = self.feedItem() + new.id = id + new.type = 'nzb' + new.name = title + new.date = int(time.mktime(parse(date).timetuple())) + new.size = self.parseSize(size) + new.url = self.downloadLink(id) + new.detailUrl = self.detailLink(id) + new.content = self.gettextelement(nzb, "description") + new.score = self.calcScore(new, movie) + new.checkNZB = True + + if new.date > time.time() - (int(self.config.get('NZB', 'retention')) * 24 * 60 * 60): + if self.isCorrectMovie(new, movie, type, imdbResults = True, singleCategory = singleCat): + results.append(new) + log.info('Found: %s' % new.name) + else: + log.info('Found outside retention: %s' % new.name) + + return results + except SyntaxError: + log.error('Failed to parse XML response from NZBMatrix.com') + + return results + + def getApiExt(self): + return '&username=%s&apikey=%s' % (self.conf('username'), self.conf('apikey')) diff --git a/couchpotato/core/providers/nzb/nzbs/__init__.py b/couchpotato/core/providers/nzb/nzbs/__init__.py new file mode 100644 index 0000000..1fe5a64 --- /dev/null +++ b/couchpotato/core/providers/nzb/nzbs/__init__.py @@ -0,0 +1,30 @@ +from .main import Nzbs + +def start(): + return Nzbs() + +config = [{ + 'name': 'nzbs', + 'groups': [ + { + 'tab': 'providers', + 'name': 'nzbs', + 'options': [ + { + 'name': 'enabled', + 'type': 'enabler', + }, + { + 'name': 'id', + 'label': 'Id', + 'description': 'Can be found here, the number after "&i="', + }, + { + 'name': 'api_key', + 'label': 'Api Key', + 'description': 'Can be found here, the string after "&h="' + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/nzb/nzbs/main.py b/couchpotato/core/providers/nzb/nzbs/main.py new file mode 100644 index 0000000..fb4742c --- /dev/null +++ b/couchpotato/core/providers/nzb/nzbs/main.py @@ -0,0 +1,8 @@ +from couchpotato.core.logger import CPLog +from couchpotato.core.providers.base import NZBProvider + +log = CPLog(__name__) + + +class Nzbs(NZBProvider): + pass diff --git a/couchpotato/core/providers/nzbmatrix/__init__.py b/couchpotato/core/providers/nzbmatrix/__init__.py deleted file mode 100644 index 201cfcc..0000000 --- a/couchpotato/core/providers/nzbmatrix/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -from .main import NZBMatrix - -def start(): - return NZBMatrix() - -config = [{ - 'name': 'nzbmatrix', - 'groups': [ - { - 'tab': 'providers', - 'name': 'nzbmatrix', - 'label': 'NZBMatrix', - 'options': [ - { - 'name': 'enabled', - 'type': 'enabler', - }, - { - 'name': 'username', - }, - { - 'name': 'api_key', - 'default': '9b939aee0aaafc12a65bf448e4af9543', - 'label': 'Api Key', - }, - ], - }, - ], -}] diff --git a/couchpotato/core/providers/nzbmatrix/main.py b/couchpotato/core/providers/nzbmatrix/main.py deleted file mode 100644 index fe7d80a..0000000 --- a/couchpotato/core/providers/nzbmatrix/main.py +++ /dev/null @@ -1,116 +0,0 @@ -from couchpotato.core.logger import CPLog -from couchpotato.core.providers.base import NZBProvider - -log = CPLog(__name__) - - -class NZBMatrix(NZBProvider): - - urls = { - 'download': 'https://api.nzbmatrix.com/v1.1/download.php?id=%s%s', - 'detail': 'https://nzbmatrix.com/nzb-details.php?id=%s&hit=1', - 'search': 'http://rss.nzbmatrix.com/rss.php', - } - - cat_ids = [ - ([42], ['720p', '1080p']), - ([2], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr']), - ([54], ['brrip']), - ([1], ['dvdr']), - ] - cat_backup_id = 2 - - def __init__(self, config): - log.info('Using NZBMatrix provider') - - self.config = config - - def find(self, movie, quality, type, retry = False): - - self.cleanCache(); - - results = [] - if not self.enabled() or not self.isAvailable(self.searchUrl): - return results - - catId = self.getCatId(type) - arguments = urlencode({ - 'term': movie.imdb, - 'subcat': catId, - 'username': self.conf('username'), - 'apikey': self.conf('apikey'), - 'searchin': 'weblink', - 'english': 1 if self.conf('english') else 0, - }) - url = "%s?%s" % (self.searchUrl, arguments) - cacheId = str(movie.imdb) + '-' + str(catId) - singleCat = (len(self.catIds.get(catId)) == 1 and catId != self.catBackupId) - - try: - cached = False - if(self.cache.get(cacheId)): - data = True - cached = True - log.info('Getting RSS from cache: %s.' % cacheId) - else: - log.info('Searching: %s' % url) - data = self.urlopen(url) - self.cache[cacheId] = { - 'time': time.time() - } - - except (IOError, URLError): - log.error('Failed to open %s.' % url) - return results - - if data: - try: - try: - if cached: - xml = self.cache[cacheId]['xml'] - else: - xml = self.getItems(data) - self.cache[cacheId]['xml'] = xml - except: - log.debug('No valid xml or to many requests.. You never know with %s.' % self.name) - return results - - for nzb in xml: - - title = self.gettextelement(nzb, "title") - if 'error' in title.lower(): continue - - id = int(self.gettextelement(nzb, "link").split('&')[0].partition('id=')[2]) - size = self.gettextelement(nzb, "description").split('
')[2].split('> ')[1] - date = str(self.gettextelement(nzb, "description").split('
')[3].partition('Added: ')[2]) - - new = self.feedItem() - new.id = id - new.type = 'nzb' - new.name = title - new.date = int(time.mktime(parse(date).timetuple())) - new.size = self.parseSize(size) - new.url = self.downloadLink(id) - new.detailUrl = self.detailLink(id) - new.content = self.gettextelement(nzb, "description") - new.score = self.calcScore(new, movie) - new.checkNZB = True - - if new.date > time.time() - (int(self.config.get('NZB', 'retention')) * 24 * 60 * 60): - if self.isCorrectMovie(new, movie, type, imdbResults = True, singleCategory = singleCat): - results.append(new) - log.info('Found: %s' % new.name) - else: - log.info('Found outside retention: %s' % new.name) - - return results - except SyntaxError: - log.error('Failed to parse XML response from NZBMatrix.com') - - return results - - def getApiExt(self): - return '&username=%s&apikey=%s' % (self.conf('username'), self.conf('apikey')) - - def isEnabled(self): - return self.conf('enabled') and self.conf('username') and self.conf('apikey') diff --git a/couchpotato/core/providers/nzbs/__init__.py b/couchpotato/core/providers/nzbs/__init__.py deleted file mode 100644 index 1fe5a64..0000000 --- a/couchpotato/core/providers/nzbs/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -from .main import Nzbs - -def start(): - return Nzbs() - -config = [{ - 'name': 'nzbs', - 'groups': [ - { - 'tab': 'providers', - 'name': 'nzbs', - 'options': [ - { - 'name': 'enabled', - 'type': 'enabler', - }, - { - 'name': 'id', - 'label': 'Id', - 'description': 'Can be found here, the number after "&i="', - }, - { - 'name': 'api_key', - 'label': 'Api Key', - 'description': 'Can be found here, the string after "&h="' - }, - ], - }, - ], -}] diff --git a/couchpotato/core/providers/nzbs/main.py b/couchpotato/core/providers/nzbs/main.py deleted file mode 100644 index fb4742c..0000000 --- a/couchpotato/core/providers/nzbs/main.py +++ /dev/null @@ -1,8 +0,0 @@ -from couchpotato.core.logger import CPLog -from couchpotato.core.providers.base import NZBProvider - -log = CPLog(__name__) - - -class Nzbs(NZBProvider): - pass diff --git a/couchpotato/core/providers/subtitle/__init__.py b/couchpotato/core/providers/subtitle/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/couchpotato/core/providers/themoviedb/__init__.py b/couchpotato/core/providers/themoviedb/__init__.py deleted file mode 100644 index 31441fc..0000000 --- a/couchpotato/core/providers/themoviedb/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -from .main import TheMovieDb - -def start(): - return TheMovieDb() - -config = [{ - 'name': 'themoviedb', - 'groups': [ - { - 'tab': 'providers', - 'name': 'tmdb', - 'label': 'TheMovieDB', - 'advanced': True, - 'description': 'Used for all calls to TheMovieDB.', - 'options': [ - { - 'name': 'api_key', - 'default': '9b939aee0aaafc12a65bf448e4af9543', - 'label': 'Api Key', - }, - ], - }, - ], -}] diff --git a/couchpotato/core/providers/themoviedb/main.py b/couchpotato/core/providers/themoviedb/main.py deleted file mode 100644 index bd9e0ad..0000000 --- a/couchpotato/core/providers/themoviedb/main.py +++ /dev/null @@ -1,111 +0,0 @@ -from __future__ import with_statement -from couchpotato.core.event import addEvent -from couchpotato.core.helpers.encoding import simplifyString, toUnicode -from couchpotato.core.logger import CPLog -from couchpotato.core.providers.base import MovieProvider -from libs.themoviedb import tmdb - -log = CPLog(__name__) - - -class TheMovieDb(MovieProvider): - """Api for theMovieDb""" - - apiUrl = 'http://api.themoviedb.org/2.1' - imageUrl = 'http://hwcdn.themoviedb.org' - - def __init__(self): - addEvent('provider.movie.search', self.search) - addEvent('provider.movie.info', self.getInfo) - - # Use base wrapper - tmdb.Config.api_key = self.conf('api_key') - - def search(self, q, limit = 12): - ''' Find movie by name ''' - - if self.isDisabled(): - return False - - log.debug('TheMovieDB - Searching for movie: %s' % q) - raw = tmdb.search(simplifyString(q)) - - results = [] - if raw: - try: - nr = 0 - for movie in raw: - - results.append(self.parseMovie(movie)) - - nr += 1 - if nr == limit: - break - - log.info('TheMovieDB - Found: %s' % [result['titles'][0] + ' (' + str(result['year']) + ')' for result in results]) - return results - except SyntaxError, e: - log.error('Failed to parse XML response: %s' % e) - return False - - return results - - def getInfo(self, identifier = None): - result = {} - - movie = tmdb.imdbLookup(id = identifier)[0] - - if movie: - result = self.parseMovie(movie) - - return result - - def parseMovie(self, movie): - - year = str(movie.get('released', 'none'))[:4] - - # Poster url - poster = self.getImage(movie, type = 'poster') - backdrop = self.getImage(movie, type = 'backdrop') - - # 1900 is the same as None - if year == '1900' or year.lower() == 'none': - year = None - - movie_data = { - 'id': int(movie.get('id', 0)), - 'titles': [toUnicode(movie.get('name'))], - 'images': { - 'posters': [poster], - 'backdrops': [backdrop], - }, - 'imdb': movie.get('imdb_id'), - 'year': year, - 'plot': movie.get('overview', ''), - 'tagline': '', - } - - # Add alternative names - for alt in ['original_name', 'alternative_name']: - alt_name = toUnicode(movie.get(alt)) - if alt_name and not alt_name in movie_data['titles'] and alt_name.lower() != 'none' and alt_name != None: - movie_data['titles'].append(alt_name) - - return movie_data - - def getImage(self, movie, type = 'poster'): - - image = '' - for image in movie.get('images', []): - if(image.get('type') == type): - image = image.get('thumb') - break - - return image - - def isDisabled(self): - if self.conf('api_key') == '': - log.error('No API key provided.') - True - else: - False diff --git a/couchpotato/core/providers/thepiratebay/__init__.py b/couchpotato/core/providers/thepiratebay/__init__.py deleted file mode 100644 index 1e154ce..0000000 --- a/couchpotato/core/providers/thepiratebay/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -from .main import ThePirateBay - -def start(): - return ThePirateBay() - -config = [{ - 'name': 'themoviedb', - 'groups': [ - { - 'tab': 'providers', - 'name': 'tmdb', - 'label': 'TheMovieDB', - 'advanced': True, - 'description': 'Used for all calls to TheMovieDB.', - 'options': [ - { - 'name': 'api_key', - 'default': '9b939aee0aaafc12a65bf448e4af9543', - 'label': 'Api Key', - }, - ], - }, - ], -}] diff --git a/couchpotato/core/providers/thepiratebay/main.py b/couchpotato/core/providers/thepiratebay/main.py deleted file mode 100644 index 2c2ce6f..0000000 --- a/couchpotato/core/providers/thepiratebay/main.py +++ /dev/null @@ -1,8 +0,0 @@ -from couchpotato.core.logger import CPLog -from couchpotato.core.providers.base import TorrentProvider - -log = CPLog(__name__) - - -class ThePirateBay(TorrentProvider): - pass diff --git a/couchpotato/core/providers/torrent/__init__.py b/couchpotato/core/providers/torrent/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/couchpotato/core/providers/torrent/thepiratebay/__init__.py b/couchpotato/core/providers/torrent/thepiratebay/__init__.py new file mode 100644 index 0000000..1e154ce --- /dev/null +++ b/couchpotato/core/providers/torrent/thepiratebay/__init__.py @@ -0,0 +1,24 @@ +from .main import ThePirateBay + +def start(): + return ThePirateBay() + +config = [{ + 'name': 'themoviedb', + 'groups': [ + { + 'tab': 'providers', + 'name': 'tmdb', + 'label': 'TheMovieDB', + 'advanced': True, + 'description': 'Used for all calls to TheMovieDB.', + 'options': [ + { + 'name': 'api_key', + 'default': '9b939aee0aaafc12a65bf448e4af9543', + 'label': 'Api Key', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/torrent/thepiratebay/main.py b/couchpotato/core/providers/torrent/thepiratebay/main.py new file mode 100644 index 0000000..2c2ce6f --- /dev/null +++ b/couchpotato/core/providers/torrent/thepiratebay/main.py @@ -0,0 +1,8 @@ +from couchpotato.core.logger import CPLog +from couchpotato.core.providers.base import TorrentProvider + +log = CPLog(__name__) + + +class ThePirateBay(TorrentProvider): + pass diff --git a/couchpotato/core/providers/trailer/__init__.py b/couchpotato/core/providers/trailer/__init__.py new file mode 100644 index 0000000..e69de29