Browse Source

Fanart PR cleanup

pull/3289/head
Ruud 11 years ago
parent
commit
0097167dec
  1. 8
      couchpotato/core/media/movie/providers/info/_modifier.py
  2. 58
      couchpotato/core/media/movie/providers/info/fanarttv.py
  3. 24
      couchpotato/core/media/movie/providers/info/themoviedb.py
  4. 46
      couchpotato/core/media/movie/providers/metadata/base.py
  5. 100
      couchpotato/core/media/movie/providers/metadata/xbmc.py
  6. 77
      couchpotato/core/notifications/xbmc.py

8
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': '',

58
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': [

24
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))))

46
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)

100
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('<i>', 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': '&lt;i&gt; is the image number, and must be included to have multiple images',
'default': 'extrathumbs/thumb<i>.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<i>.jpg',
'description': '&lt;i&gt; is the image number, and must be included to have multiple images',
'advanced': True
}
],

77
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.',
},
],
}
],

Loading…
Cancel
Save