diff --git a/couchpotato/core/media/movie/providers/info/_modifier.py b/couchpotato/core/media/movie/providers/info/_modifier.py index beb29e7..f6a3089 100644 --- a/couchpotato/core/media/movie/providers/info/_modifier.py +++ b/couchpotato/core/media/movie/providers/info/_modifier.py @@ -29,11 +29,11 @@ class MovieResultModifier(Plugin): 'actors': {}, 'landscape': [], 'logo': [], - 'clearart': [], - 'discart': [], + 'clear_art': [], + 'disc_art': [], 'banner': [], - 'extrathumbs': [], - 'extrafanart': [] + 'extra_thumbs': [], + 'extra_fanart': [] }, 'runtime': 0, 'plot': '', diff --git a/couchpotato/core/media/movie/providers/info/fanarttv.py b/couchpotato/core/media/movie/providers/info/fanarttv.py index 07d1a00..bc273ef 100644 --- a/couchpotato/core/media/movie/providers/info/fanarttv.py +++ b/couchpotato/core/media/movie/providers/info/fanarttv.py @@ -5,9 +5,8 @@ from couchpotato.core.event import addEvent from couchpotato.core.logger import CPLog from couchpotato.core.media.movie.providers.base import MovieProvider from couchpotato.core.plugins.quality import QualityPlugin - -from libs.fanarttv.movie import Movie -import libs.fanarttv.errors as fanarttv_errors +from fanarttv.movie import Movie +import fanarttv.errors as fanarttv_errors log = CPLog(__name__) @@ -16,10 +15,11 @@ autoload = 'FanartTV' class FanartTV(MovieProvider): + MAX_EXTRAFANART = 20 def __init__(self): - addEvent('movie.extraart', self.getArt, priority=2) + addEvent('movie.extra_art', self.getArt, priority=2) # Configure fanarttv API settings os.environ.setdefault('FANART_APIKEY', self.conf('api_key')) @@ -35,7 +35,7 @@ class FanartTV(MovieProvider): try: try: exists = True - movie = Movie.get(id=identifier) + movie = Movie.get(id = identifier) except (fanarttv_errors.FanartError, IOError): exists = False @@ -49,23 +49,23 @@ class FanartTV(MovieProvider): return images - def _parseMovie(self, movie, isHD): + def _parseMovie(self, movie, is_hd): images = { - 'landscape': [], - 'logo': [], - 'discart': [], - 'clearart': [], - 'banner': [], - 'extrafanart': [] - } + 'landscape': [], + 'logo': [], + 'disc_art': [], + 'clear_art': [], + 'banner': [], + 'extra_fanart': [], + } images['landscape'] = self._getMultImages(movie.thumbs, 1) images['banner'] = self._getMultImages(movie.banners, 1) - images['discart'] = self._getMultImages(self._trimDiscs(movie.discs, isHD), 1) + images['disc_art'] = self._getMultImages(self._trimDiscs(movie.discs, is_hd), 1) - images['clearart'] = self._getMultImages(movie.hdarts, 1) - if len(images['clearart']) is 0: - images['clearart'] = self._getMultImages(movie.arts, 1) + images['clear_art'] = self._getMultImages(movie.hdarts, 1) + if len(images['clear_art']) is 0: + images['clear_art'] = self._getMultImages(movie.arts, 1) images['logo'] = self._getMultImages(movie.hdlogos, 1) if len(images['logo']) is 0: @@ -75,29 +75,30 @@ class FanartTV(MovieProvider): if fanarts: images['backdrop_original'] = fanarts[0] - images['extrafanart'] = fanarts[1:] + images['extra_fanart'] = fanarts[1:] # TODO: Add support for extra backgrounds - #extraFanart = self._getMultImages(movie.backgrounds, -1) + #extra_fanart = self._getMultImages(movie.backgrounds, -1) return images - def _trimDiscs(self, discImages, isHD): - ''' + def _trimDiscs(self, disc_images, is_hd): + """ Return a subset of discImages based on isHD. If isHD is true, only bluray disc images will be returned. If isHD is false, only dvd disc images will be returned. If the resulting list would be an empty list, then the original list is returned instead. - ''' + """ + trimmed = [] - for disc in discImages: - if isHD and disc.disc_type == u'bluray': + for disc in disc_images: + if is_hd and disc.disc_type == u'bluray': trimmed.append(disc) - elif not isHD and disc.disc_type == u'dvd': + elif not is_hd and disc.disc_type == u'dvd': trimmed.append(disc) if len(trimmed) is 0: - return discImages + return disc_images else: return trimmed @@ -121,9 +122,9 @@ class FanartTV(MovieProvider): for image in images: if image.lang == u'en': pool.append(image) - origPoolSize = len(pool) + orig_pool_size = len(pool) - while len(pool) > 0 and (n < 0 or origPoolSize - len(pool) < n): + while len(pool) > 0 and (n < 0 or orig_pool_size - len(pool) < n): best = None highscore = -1 for image in pool: @@ -147,6 +148,7 @@ class FanartTV(MovieProvider): return bool(qualityDef.get('hd')) return False + config = [{ 'name': 'fanarttv', 'groups': [ diff --git a/couchpotato/core/media/movie/providers/info/themoviedb.py b/couchpotato/core/media/movie/providers/info/themoviedb.py index 7ffba38..35fae5e 100644 --- a/couchpotato/core/media/movie/providers/info/themoviedb.py +++ b/couchpotato/core/media/movie/providers/info/themoviedb.py @@ -90,8 +90,8 @@ class TheMovieDb(MovieProvider): # Get extra artwork via Fanart.TV and merge into images dict try: - extraArt = fireEvent('movie.extraart', identifier)[0] - result['images'] = dict(result['images'].items() + extraArt.items()) + extra_art = fireEvent('movie.extra_art', identifier)[0] + result['images'] = dict(result['images'].items() + extra_art.items()) except IndexError: pass @@ -108,7 +108,7 @@ class TheMovieDb(MovieProvider): poster = self.getImage(movie, type = 'poster', size = 'poster') poster_original = self.getImage(movie, type = 'poster', size = 'original') backdrop_original = self.getImage(movie, type = 'backdrop', size = 'original') - extrathumbs = self.getMultImages(movie, type='backdrops', size='original', n=self.MAX_EXTRATHUMBS, skipfirst=True) + extra_thumbs = self.getMultImages(movie, type = 'backdrops', size = 'original', n = self.MAX_EXTRATHUMBS, skipfirst = True) images = { 'poster': [poster] if poster else [], @@ -116,7 +116,7 @@ class TheMovieDb(MovieProvider): 'poster_original': [poster_original] if poster_original else [], 'backdrop_original': [backdrop_original] if backdrop_original else [], 'actors': {}, - 'extrathumbs': extrathumbs + 'extra_thumbs': extra_thumbs } # Genres @@ -182,22 +182,24 @@ class TheMovieDb(MovieProvider): return image_url - def getMultImages(self, movie, type='backdrops', size='original', n=-1, skipfirst=False): - ''' + def getMultImages(self, movie, type = 'backdrops', size = 'original', n = -1, skipfirst = False): + """ If n < 0, return all images. Otherwise return n images. If n > len(getattr(movie, type)), then return all images. If skipfirst is True, then it will skip getattr(movie, type)[0]. This is because backdrops[0] is typically backdrop. - ''' + """ + image_urls = [] try: images = getattr(movie, type) if n < 0 or n > len(images): - numImages = len(images) + num_images = len(images) else: - numImages = n - for i in range(int(skipfirst), numImages + int(skipfirst)): - image_urls.append(images[i].geturl(size=size)) + num_images = n + + for i in range(int(skipfirst), num_images + int(skipfirst)): + image_urls.append(images[i].geturl(size = size)) except: log.debug('Failed getting %i %s.%s for "%s"', (n, type, size, ss(str(movie)))) diff --git a/couchpotato/core/media/movie/providers/metadata/base.py b/couchpotato/core/media/movie/providers/metadata/base.py index ec91b06..0d25fba 100644 --- a/couchpotato/core/media/movie/providers/metadata/base.py +++ b/couchpotato/core/media/movie/providers/metadata/base.py @@ -44,27 +44,27 @@ class MovieMetaData(MetaDataBase): except: log.error('Unable to create %s file: %s', ('nfo', traceback.format_exc())) - for file_type in ['thumbnail', 'fanart', 'banner', 'discart', 'logo', 'clearart', 'landscape', 'extrathumbs', 'extrafanart']: + for file_type in ['thumbnail', 'fanart', 'banner', 'disc_art', 'logo', 'clear_art', 'landscape', 'extra_thumbs', 'extra_fanart']: try: if file_type == 'thumbnail': - numImages = len(movie_info['images']['poster_original']) + num_images = len(movie_info['images']['poster_original']) elif file_type == 'fanart': - numImages = len(movie_info['images']['backdrop_original']) + num_images = len(movie_info['images']['backdrop_original']) else: - numImages = len(movie_info['images'][file_type]) + num_images = len(movie_info['images'][file_type]) - for i in range(numImages): + for i in range(num_images): self._createType(meta_name, root, movie_info, group, file_type, i) except: log.error('Unable to create %s file: %s', (file_type, traceback.format_exc())) - def _createType(self, meta_name, root, movie_info, group, file_type, i):# Get file path + def _createType(self, meta_name, root, movie_info, group, file_type, i): # Get file path name = getattr(self, 'get' + file_type.capitalize() + 'Name')(meta_name, root, i) if name and (self.conf('meta_' + file_type) or self.conf('meta_' + file_type) is None): # Get file content - content = getattr(self, 'get' + file_type.capitalize())(movie_info=movie_info, data=group, i=i) + content = getattr(self, 'get' + file_type.capitalize())(movie_info = movie_info, data = group, i = i) if content: log.debug('Creating %s file: %s', (file_type, name)) if os.path.isfile(content): @@ -123,7 +123,7 @@ class MovieMetaData(MetaDataBase): def getNfoName(self, name, root, i): return - def getNfo(self, movie_info=None, data=None, i=0): + def getNfo(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} @@ -148,39 +148,39 @@ class MovieMetaData(MetaDataBase): def getFanart(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} - return self.getThumbnail(movie_info=movie_info, data=data, wanted_file_type='backdrop_original', i=i) + return self.getThumbnail(movie_info = movie_info, data = data, wanted_file_type = 'backdrop_original', i = i) - def getBanner(self, movie_info=None, data=None, i=0): + def getBanner(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} - return self.getThumbnail(movie_info=movie_info, data=data, wanted_file_type='banner', i=i) + return self.getThumbnail(movie_info = movie_info, data = data, wanted_file_type = 'banner', i = i) - def getClearart(self, movie_info=None, data=None, i=0): + def getClearart(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} - return self.getThumbnail(movie_info=movie_info, data=data, wanted_file_type='clearart', i=i) + return self.getThumbnail(movie_info = movie_info, data = data, wanted_file_type = 'clear_art', i = i) - def getLogo(self, movie_info=None, data=None, i=0): + def getLogo(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} - return self.getThumbnail(movie_info=movie_info, data=data, wanted_file_type='logo', i=i) + return self.getThumbnail(movie_info = movie_info, data = data, wanted_file_type = 'logo', i = i) - def getDiscart(self, movie_info=None, data=None, i=0): + def getDiscart(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} - return self.getThumbnail(movie_info=movie_info, data=data, wanted_file_type='discart', i=i) + return self.getThumbnail(movie_info = movie_info, data = data, wanted_file_type = 'disc_art', i = i) - def getLandscape(self, movie_info=None, data=None, i=0): + def getLandscape(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} - return self.getThumbnail(movie_info=movie_info, data=data, wanted_file_type='landscape', i=i) + return self.getThumbnail(movie_info = movie_info, data= data, wanted_file_type = 'landscape', i = i) - def getExtrathumbs(self, movie_info=None, data=None, i=0): + def getExtrathumbs(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} - return self.getThumbnail(movie_info=movie_info, data=data, wanted_file_type='extrathumbs', i=i) + return self.getThumbnail(movie_info = movie_info, data = data, wanted_file_type = 'extra_thumbs', i = i) - def getExtrafanart(self, movie_info=None, data=None, i=0): + def getExtrafanart(self, movie_info = None, data = None, i = 0): if not data: data = {} if not movie_info: movie_info = {} - return self.getThumbnail(movie_info=movie_info, data=data, wanted_file_type='extrafanart', i=i) + return self.getThumbnail(movie_info = movie_info, data = data, wanted_file_type = 'extra_fanart', i = i) diff --git a/couchpotato/core/media/movie/providers/metadata/xbmc.py b/couchpotato/core/media/movie/providers/metadata/xbmc.py index 318f79a..079174e 100644 --- a/couchpotato/core/media/movie/providers/metadata/xbmc.py +++ b/couchpotato/core/media/movie/providers/metadata/xbmc.py @@ -30,28 +30,28 @@ class XBMC(MovieMetaData): return self.createMetaName(self.conf('meta_banner_name'), name, root) def getClearartName(self, name, root, i): - return self.createMetaName(self.conf('meta_clearart_name'), name, root) + return self.createMetaName(self.conf('meta_clear_art_name'), name, root) def getLogoName(self, name, root, i): return self.createMetaName(self.conf('meta_logo_name'), name, root) def getDiscartName(self, name, root, i): - return self.createMetaName(self.conf('meta_discart_name'), name, root) + return self.createMetaName(self.conf('meta_disc_art_name'), name, root) def getLandscapeName(self, name, root, i): return self.createMetaName(self.conf('meta_landscape_name'), name, root) def getExtrathumbsName(self, name, root, i): - return self.createMetaNameMult(self.conf('meta_extrathumbs_name'), name, root, i) + return self.createMetaNameMult(self.conf('meta_extra_thumbs_name'), name, root, i) def getExtrafanartName(self, name, root, i): - return self.createMetaNameMult(self.conf('meta_extrafanart_name'), name, root, i) + return self.createMetaNameMult(self.conf('meta_extra_fanart_name'), name, root, i) def createMetaName(self, basename, name, root): return os.path.join(root, basename.replace('%s', name)) def createMetaNameMult(self, basename, name, root, i): - return os.path.join(root, basename.replace('%s', name).replace('%i', str(i + 1))) + return os.path.join(root, basename.replace('%s', name).replace('', str(i + 1))) def getNfo(self, movie_info=None, data=None, i=0): if not data: data = {} @@ -153,39 +153,25 @@ class XBMC(MovieMetaData): for image_url in movie_info['images']['poster_original']: image = SubElement(nfoxml, 'thumb') image.text = toUnicode(image_url) - fanart = SubElement(nfoxml, 'fanart') - for image_url in movie_info['images']['backdrop_original']: - image = SubElement(fanart, 'thumb') - image.text = toUnicode(image_url) - banner = SubElement(nfoxml, 'banner') - for image_url in movie_info['images']['banner']: - image = SubElement(banner, 'thumb') - image.text = toUnicode(image_url) - discart = SubElement(nfoxml, 'discart') - for image_url in movie_info['images']['discart']: - image = SubElement(discart, 'thumb') - image.text = toUnicode(image_url) - logo = SubElement(nfoxml, 'logo') - for image_url in movie_info['images']['logo']: - image = SubElement(logo, 'thumb') - image.text = toUnicode(image_url) - clearart = SubElement(nfoxml, 'clearart') - for image_url in movie_info['images']['clearart']: - image = SubElement(clearart, 'thumb') - image.text = toUnicode(image_url) - landscape = SubElement(nfoxml, 'landscape') - for image_url in movie_info['images']['landscape']: - image = SubElement(landscape, 'thumb') - image.text = toUnicode(image_url) - extrathumb = SubElement(nfoxml, 'extrathumb') - for image_url in movie_info['images']['extrathumbs']: - image = SubElement(extrathumb, 'thumb') - image.text = toUnicode(image_url) - extrafanart = SubElement(nfoxml, 'extrafanart') - for image_url in movie_info['images']['extrafanart']: - image = SubElement(extrafanart, 'thumb') - image.text = toUnicode(image_url) + image_types = [ + ('fanart', 'backdrop_original'), + ('banner', 'banner'), + ('discart', 'disc_art'), + ('logo', 'logo'), + ('clearart', 'clear_art'), + ('landscape', 'landscape'), + ('extrathumb', 'extra_thumbs'), + ('extrafanart', 'extra_fanart'), + ] + + for image_type in image_types: + sub, type = image_type + + sub_element = SubElement(nfoxml, sub) + for image_url in movie_info['images'][type]: + image = SubElement(sub_element, 'thumb') + image.text = toUnicode(image_url) # Add trailer if found trailer_found = False @@ -295,7 +281,7 @@ config = [{ { 'name': 'meta_banner', 'label': 'Banner', - 'default': True, + 'default': False, 'type': 'bool' }, { @@ -305,13 +291,13 @@ config = [{ 'advanced': True, }, { - 'name': 'meta_clearart', + 'name': 'meta_clear_art', 'label': 'ClearArt', - 'default': True, + 'default': False, 'type': 'bool' }, { - 'name': 'meta_clearart_name', + 'name': 'meta_clear_art_name', 'label': 'ClearArt filename', 'default': 'clearart.png', 'advanced': True, @@ -319,11 +305,11 @@ config = [{ { 'name': 'meta_disc', 'label': 'DiscArt', - 'default': True, + 'default': False, 'type': 'bool' }, { - 'name': 'meta_discart_name', + 'name': 'meta_disc_art_name', 'label': 'DiscArt filename', 'default': 'disc.png', 'advanced': True, @@ -331,7 +317,7 @@ config = [{ { 'name': 'meta_landscape', 'label': 'Landscape', - 'default': True, + 'default': False, 'type': 'bool' }, { @@ -343,7 +329,7 @@ config = [{ { 'name': 'meta_logo', 'label': 'ClearLogo', - 'default': True, + 'default': False, 'type': 'bool' }, { @@ -353,27 +339,29 @@ config = [{ 'advanced': True, }, { - 'name': 'meta_extrathumbs', + 'name': 'meta_extra_thumbs', 'label': 'Extrathumbs', - 'default': True, + 'default': False, 'type': 'bool' }, { - 'name': 'meta_extrathumbs_name', - 'label': 'Extrathumbs filename (%i is the image number, and must be included to have multiple images).', - 'default': 'extrathumbs/thumb%i.jpg', + 'name': 'meta_extra_thumbs_name', + 'label': 'Extrathumbs filename', + 'description': '<i> is the image number, and must be included to have multiple images', + 'default': 'extrathumbs/thumb.jpg', 'advanced': True }, { - 'name': 'meta_extrafanart', - 'lavel': 'Extrafanart', - 'default': True, + 'name': 'meta_extra_fanart', + 'label': 'Extrafanart', + 'default': False, 'type': 'bool' }, { - 'name': 'meta_extrafanart_name', - 'label': 'Extrafanart filename (%i is the image number, and must be included to have multiple images).', - 'default': 'extrafanart/extrafanart%i.jpg', + 'name': 'meta_extra_fanart_name', + 'label': 'Extrafanart filename', + 'default': 'extrafanart/extrafanart.jpg', + 'description': '<i> is the image number, and must be included to have multiple images', 'advanced': True } ], diff --git a/couchpotato/core/notifications/xbmc.py b/couchpotato/core/notifications/xbmc.py index db34306..8dbf936 100644 --- a/couchpotato/core/notifications/xbmc.py +++ b/couchpotato/core/notifications/xbmc.py @@ -3,8 +3,6 @@ import json import socket import traceback import urllib -import time -import os from couchpotato.core.helpers.variable import splitString, getTitle from couchpotato.core.logger import CPLog @@ -54,7 +52,7 @@ class XBMC(Notification): response = self.notifyXBMCnoJSON(host, {'title': self.default_title, 'message': message}) if data and data.get('destination_dir') and (not self.conf('only_first') or hosts.index(host) == 0): - response += self.request(host, [('VideoLibrary.Scan', {})]) + response += self.request(host, [('VideoLibrary.Scan', None, {})]) max_successful += 1 max_successful += 1 @@ -68,50 +66,6 @@ class XBMC(Notification): except: log.error('Failed parsing results: %s', traceback.format_exc()) - - if self.conf('run_artwork_downloader') and data and self.use_json_notifications.get(host): - time.sleep(self.conf('run_artwork_downloader_delay')) - - if self.conf('force_full_scan'): - calls = [('Addons.ExecuteAddon', None, {'addonid': 'script.artwork.downloader'})] - max_successful += len(calls) - response = self.request(host, calls) - - try: - if response[0].get('result') and result['result'] == 'OK': - successful += 1 - elif response[0].get('error'): - log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code'])) - except: - log.error('Failed parsing results: %s', traceback.format_exc()) - else: - calls = [('VideoLibrary.GetMovies', 'libMovies', {"filter":{"field": "title", "operator": "is", "value": data['media']['title'], "year": data['media']['info']['year']}})] - max_successful += len(calls) - response = self.request(host, calls) - - dbid = None - try: - if response[0].get('result'): - successful += 1 - dbid = response[0]['result']['movies'][-1]['movieid'] - elif response[0].get('error'): - log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code'])) - except: - log.error('Failed parsing results: %s', traceback.format_exc()) - - if dbid is not None: - calls = [('Addons.ExecuteAddon', None, {'addonid': 'script.artwork.downloader', 'params':{'media_type': 'movie', 'dbid': str(dbid)}})] - - max_successful += len(calls) - response = self.request(host, calls) - - try: - if response[0].get('result') and result['result'] == 'OK': - successful += 1 - elif response[0].get('error'): - log.error('XBMC error; %s: %s (%s)', (result['id'], result['error']['message'], result['error']['code'])) - except: - log.error('Failed parsing results: %s', traceback.format_exc()) return successful == max_successful @@ -232,14 +186,11 @@ class XBMC(Notification): for req in do_requests: method, id, kwargs = req - if id is None: - id = method - data.append({ 'method': method, 'params': kwargs, 'jsonrpc': '2.0', - 'id': id, + 'id': id if id else method, }) data = json.dumps(data) @@ -273,7 +224,7 @@ config = [{ 'list': 'notification_providers', 'name': 'xbmc', 'label': 'XBMC', - 'description': 'v11 (Eden) and v12 (Frodo)', + 'description': 'v11 (Eden), v12 (Frodo), v13 (Gotham)', 'options': [ { 'name': 'enabled', @@ -306,7 +257,7 @@ config = [{ 'default': 0, 'type': 'bool', 'advanced': True, - 'description': 'Only scan new movie folder at remote XBMC servers. Works if movie location is the same.', + 'description': ('Only scan new movie folder at remote XBMC servers.', 'Useful if the XBMC path is different from the path CPS uses.'), }, { 'name': 'force_full_scan', @@ -314,31 +265,15 @@ config = [{ 'default': 0, 'type': 'bool', 'advanced': True, - 'description': 'Do a full scan instead of only the new movie. Useful if the XBMC path is different from the path CPS uses.', + 'description': ('Do a full scan instead of only the new movie.', 'Useful if the XBMC path is different from the path CPS uses.'), }, { 'name': 'on_snatch', - 'default': 0, + 'default': False, 'type': 'bool', 'advanced': True, 'description': 'Also send message when movie is snatched.', }, - { - 'name': 'run_artwork_downloader', - 'label': 'Run the Artwork Downloader', - 'default': 0, - 'type': 'bool', - 'advanced': True, - 'description': 'Runs the Artwork Downloader script to initialize/download artwork. (Requires the Artwork Downloader addon and XBMC Frodo or later)' - }, - { - 'name': 'run_artwork_downloader_delay', - 'label': 'Artwork Downloader delay', - 'default': 5, - 'type': 'int', - 'advanced': True, - 'description': 'Number of seconds to wait to start the Artwork Downloader script after notifying XBMC.', - }, ], } ],