14 changed files with 1110 additions and 52 deletions
@ -0,0 +1,168 @@ |
|||
import os |
|||
import traceback |
|||
|
|||
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 |
|||
|
|||
|
|||
log = CPLog(__name__) |
|||
|
|||
autoload = 'FanartTV' |
|||
|
|||
|
|||
class FanartTV(MovieProvider): |
|||
MAX_EXTRAFANART = 20 |
|||
|
|||
def __init__(self): |
|||
addEvent('movie.extraart', self.getArt, priority=2) |
|||
|
|||
# Configure fanarttv API settings |
|||
os.environ.setdefault('FANART_APIKEY', self.conf('api_key')) |
|||
|
|||
def getArt(self, identifier): |
|||
# FIXME: I believe I should be registering a cache here... I need to look into that. |
|||
log.debug("Getting Extra Artwork from Fanart.tv...") |
|||
if not identifier: |
|||
return {} |
|||
|
|||
images = {} |
|||
|
|||
try: |
|||
try: |
|||
exists = True |
|||
movie = Movie.get(id=identifier) |
|||
except (fanarttv_errors.FanartError, IOError): |
|||
exists = False |
|||
|
|||
if exists: |
|||
images = self._parseMovie(movie, True) |
|||
|
|||
except: |
|||
log.error('Failed getting extra art for %s: %s', |
|||
(identifier, traceback.format_exc())) |
|||
return {} |
|||
|
|||
return images |
|||
|
|||
def _parseMovie(self, movie, isHD): |
|||
images = { |
|||
'landscape': [], |
|||
'logo': [], |
|||
'discart': [], |
|||
'clearart': [], |
|||
'banner': [], |
|||
'extrafanart': [] |
|||
} |
|||
|
|||
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['clearart'] = self._getMultImages(movie.hdarts, 1) |
|||
if len(images['clearart']) is 0: |
|||
images['clearart'] = self._getMultImages(movie.arts, 1) |
|||
|
|||
images['logo'] = self._getMultImages(movie.hdlogos, 1) |
|||
if len(images['logo']) is 0: |
|||
images['logo'] = self._getMultImages(movie.logos, 1) |
|||
|
|||
fanarts = self._getMultImages(movie.backgrounds, self.MAX_EXTRAFANART + 1) |
|||
|
|||
if fanarts: |
|||
images['backdrop_original'] = fanarts[0] |
|||
images['extrafanart'] = fanarts[1:] |
|||
|
|||
# TODO: Add support for extra backgrounds |
|||
#extraFanart = self._getMultImages(movie.backgrounds, -1) |
|||
|
|||
return images |
|||
|
|||
def _trimDiscs(self, discImages, isHD): |
|||
''' |
|||
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': |
|||
trimmed.append(disc) |
|||
elif not isHD and disc.disc_type == u'dvd': |
|||
trimmed.append(disc) |
|||
|
|||
if len(trimmed) is 0: |
|||
return discImages |
|||
else: |
|||
return trimmed |
|||
|
|||
def _getImage(self, images): |
|||
image_url = None |
|||
highscore = -1 |
|||
for image in images: |
|||
if image.likes > highscore: |
|||
highscore = image.likes |
|||
image_url = image.url |
|||
|
|||
return image_url |
|||
|
|||
def _getMultImages(self, images, n): |
|||
''' |
|||
Chooses the best n images and returns them as a list. |
|||
If n<0, all images will be returned. |
|||
''' |
|||
image_urls = [] |
|||
pool = [] |
|||
for image in images: |
|||
if image.lang == u'en': |
|||
pool.append(image) |
|||
origPoolSize = len(pool) |
|||
|
|||
while len(pool) > 0 and (n < 0 or origPoolSize - len(pool) < n): |
|||
best = None |
|||
highscore = -1 |
|||
for image in pool: |
|||
if image.likes > highscore: |
|||
highscore = image.likes |
|||
best = image |
|||
image_urls.append(best.url) |
|||
pool.remove(best) |
|||
|
|||
return image_urls |
|||
|
|||
def isDisabled(self): |
|||
if self.conf('api_key') == '': |
|||
log.error('No API key provided.') |
|||
return True |
|||
return False |
|||
|
|||
def _determineHD(self, quality): |
|||
for qualityDef in QualityPlugin.qualities: |
|||
if quality == qualityDef.get('identifier'): |
|||
return bool(qualityDef.get('hd')) |
|||
return False |
|||
|
|||
config = [{ |
|||
'name': 'fanarttv', |
|||
'groups': [ |
|||
{ |
|||
'tab': 'providers', |
|||
'name': 'fanarttv', |
|||
'label': 'fanart.tv', |
|||
'hidden': True, |
|||
'description': 'Used for all calls to fanart.tv.', |
|||
'options': [ |
|||
{ |
|||
'name': 'api_key', |
|||
'default': 'd788b4822b9e1f44068026e05557e5d9', |
|||
'label': 'API Key', |
|||
}, |
|||
], |
|||
}, |
|||
], |
|||
}] |
@ -0,0 +1,110 @@ |
|||
__author__ = 'Andrea De Marco <24erre@gmail.com>' |
|||
__version__ = '1.4.0' |
|||
__classifiers__ = [ |
|||
'Development Status :: 5 - Production/Stable', |
|||
'Intended Audience :: Developers', |
|||
'License :: OSI Approved :: Apache Software License', |
|||
'Operating System :: OS Independent', |
|||
'Programming Language :: Python', |
|||
'Topic :: Internet :: WWW/HTTP', |
|||
'Topic :: Software Development :: Libraries', |
|||
] |
|||
__copyright__ = "2012, %s " % __author__ |
|||
__license__ = """ |
|||
Copyright %s. |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expressed or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
""" % __copyright__ |
|||
|
|||
__docformat__ = 'restructuredtext en' |
|||
|
|||
__doc__ = """ |
|||
:abstract: Python interface to fanart.tv API |
|||
:version: %s |
|||
:author: %s |
|||
:contact: http://z4r.github.com/ |
|||
:date: 2012-04-04 |
|||
:copyright: %s |
|||
""" % (__version__, __author__, __license__) |
|||
|
|||
|
|||
def values(obj): |
|||
return [v for k, v in obj.__dict__.iteritems() if not k.startswith('_')] |
|||
|
|||
BASEURL = 'http://api.fanart.tv/webservice' |
|||
|
|||
|
|||
class FORMAT(object): |
|||
JSON = 'JSON' |
|||
XML = 'XML' |
|||
PHP = 'PHP' |
|||
|
|||
|
|||
class WS(object): |
|||
MUSIC = 'artist' |
|||
MOVIE = 'movie' |
|||
TV = 'series' |
|||
|
|||
|
|||
class TYPE(object): |
|||
ALL = 'all' |
|||
|
|||
class TV(object): |
|||
ART = 'clearart' |
|||
LOGO = 'clearlogo' |
|||
CHARACTER = 'characterart' |
|||
THUMB = 'tvthumb' |
|||
SEASONTHUMB = 'seasonthumb' |
|||
BACKGROUND = 'showbackground' |
|||
HDLOGO = 'hdtvlogo' |
|||
HDART = 'hdclearart' |
|||
POSTER = 'tvposter' |
|||
BANNER = 'tvbanner' |
|||
|
|||
class MUSIC(object): |
|||
DISC = 'cdart' |
|||
LOGO = 'musiclogo' |
|||
BACKGROUND = 'artistbackground' |
|||
COVER = 'albumcover' |
|||
THUMB = 'artistthumb' |
|||
|
|||
class MOVIE(object): |
|||
ART = 'movieart' |
|||
LOGO = 'movielogo' |
|||
DISC = 'moviedisc' |
|||
POSTER = 'movieposter' |
|||
BACKGROUND = 'moviebackground' |
|||
HDLOGO = 'hdmovielogo' |
|||
HDART = 'hdmovieclearart' |
|||
BANNER = 'moviebanner' |
|||
THUMB = 'moviethumb' |
|||
|
|||
|
|||
class SORT(object): |
|||
POPULAR = 1 |
|||
NEWEST = 2 |
|||
OLDEST = 3 |
|||
|
|||
|
|||
class LIMIT(object): |
|||
ONE = 1 |
|||
ALL = 2 |
|||
|
|||
FORMAT_LIST = values(FORMAT) |
|||
WS_LIST = values(WS) |
|||
TYPE_LIST = values(TYPE.MUSIC) + values(TYPE.TV) + values(TYPE.MOVIE) + [TYPE.ALL] |
|||
MUSIC_TYPE_LIST = values(TYPE.MUSIC) + [TYPE.ALL] |
|||
TV_TYPE_LIST = values(TYPE.TV) + [TYPE.ALL] |
|||
MOVIE_TYPE_LIST = values(TYPE.MOVIE) + [TYPE.ALL] |
|||
SORT_LIST = values(SORT) |
|||
LIMIT_LIST = values(LIMIT) |
@ -0,0 +1,44 @@ |
|||
import libs.requests as requests |
|||
import libs.fanarttv as fanart |
|||
from libs.fanarttv.errors import RequestFanartError, ResponseFanartError |
|||
|
|||
|
|||
class Request(object): |
|||
def __init__(self, apikey, id, ws, type=None, sort=None, limit=None): |
|||
self._apikey = apikey |
|||
self._id = id |
|||
self._ws = ws |
|||
self._type = type or fanart.TYPE.ALL |
|||
self._sort = sort or fanart.SORT.POPULAR |
|||
self._limit = limit or fanart.LIMIT.ALL |
|||
self.validate() |
|||
self._response = None |
|||
|
|||
def validate(self): |
|||
for attribute_name in ('ws', 'type', 'sort', 'limit'): |
|||
attribute = getattr(self, '_' + attribute_name) |
|||
choices = getattr(fanart, attribute_name.upper() + '_LIST') |
|||
if attribute not in choices: |
|||
raise RequestFanartError('Not allowed {0}: {1} [{2}]'.format(attribute_name, attribute, ', '.join(choices))) |
|||
|
|||
def __str__(self): |
|||
return '/'.join(map(str, [ |
|||
fanart.BASEURL, |
|||
self._ws, |
|||
self._apikey, |
|||
self._id, |
|||
fanart.FORMAT.JSON, |
|||
self._type, |
|||
self._sort, |
|||
self._limit, |
|||
])) |
|||
|
|||
def response(self): |
|||
try: |
|||
response = requests.get(str(self)) |
|||
rjson = response.json() |
|||
if not isinstance(rjson, dict): |
|||
raise Exception(response.text) |
|||
return rjson |
|||
except Exception as e: |
|||
raise ResponseFanartError(str(e)) |
@ -0,0 +1,15 @@ |
|||
class FanartError(Exception): |
|||
def __str__(self): |
|||
return ', '.join(map(str, self.args)) |
|||
|
|||
def __repr__(self): |
|||
name = self.__class__.__name__ |
|||
return '%s%r' % (name, self.args) |
|||
|
|||
|
|||
class ResponseFanartError(FanartError): |
|||
pass |
|||
|
|||
|
|||
class RequestFanartError(FanartError): |
|||
pass |
@ -0,0 +1,46 @@ |
|||
class Immutable(object): |
|||
_mutable = False |
|||
|
|||
def __setattr__(self, name, value): |
|||
if self._mutable or name == '_mutable': |
|||
super(Immutable, self).__setattr__(name, value) |
|||
else: |
|||
raise TypeError("Can't modify immutable instance") |
|||
|
|||
def __delattr__(self, name): |
|||
if self._mutable: |
|||
super(Immutable, self).__delattr__(name) |
|||
else: |
|||
raise TypeError("Can't modify immutable instance") |
|||
|
|||
def __eq__(self, other): |
|||
return hash(self) == hash(other) |
|||
|
|||
def __hash__(self): |
|||
return hash(repr(self)) |
|||
|
|||
def __repr__(self): |
|||
return '%s(%s)' % ( |
|||
self.__class__.__name__, |
|||
', '.join(['{0}={1}'.format(k, repr(v)) for k, v in self]) |
|||
) |
|||
|
|||
def __iter__(self): |
|||
l = self.__dict__.keys() |
|||
l.sort() |
|||
for k in l: |
|||
if not k.startswith('_'): |
|||
yield k, getattr(self, k) |
|||
|
|||
@staticmethod |
|||
def mutablemethod(f): |
|||
def func(self, *args, **kwargs): |
|||
if isinstance(self, Immutable): |
|||
old_mutable = self._mutable |
|||
self._mutable = True |
|||
res = f(self, *args, **kwargs) |
|||
self._mutable = old_mutable |
|||
else: |
|||
res = f(self, *args, **kwargs) |
|||
return res |
|||
return func |
@ -0,0 +1,68 @@ |
|||
import json |
|||
import os |
|||
import libs.requests as requests |
|||
from libs.fanarttv.core import Request |
|||
from libs.fanarttv.immutable import Immutable |
|||
|
|||
|
|||
class LeafItem(Immutable): |
|||
KEY = NotImplemented |
|||
|
|||
@Immutable.mutablemethod |
|||
def __init__(self, id, url, likes): |
|||
self.id = int(id) |
|||
self.url = url |
|||
self.likes = int(likes) |
|||
self._content = None |
|||
|
|||
@classmethod |
|||
def from_dict(cls, resource): |
|||
return cls(**dict([(str(k), v) for k, v in resource.iteritems()])) |
|||
|
|||
@classmethod |
|||
def extract(cls, resource): |
|||
return [cls.from_dict(i) for i in resource.get(cls.KEY, {})] |
|||
|
|||
@Immutable.mutablemethod |
|||
def content(self): |
|||
if not self._content: |
|||
self._content = requests.get(self.url).content |
|||
return self._content |
|||
|
|||
def __str__(self): |
|||
return self.url |
|||
|
|||
|
|||
class ResourceItem(Immutable): |
|||
WS = NotImplemented |
|||
request_cls = Request |
|||
|
|||
@classmethod |
|||
def from_dict(cls, map): |
|||
raise NotImplementedError |
|||
|
|||
@classmethod |
|||
def get(cls, id): |
|||
map = cls.request_cls( |
|||
apikey=os.environ.get('FANART_APIKEY'), |
|||
id=id, |
|||
ws=cls.WS |
|||
).response() |
|||
return cls.from_dict(map) |
|||
|
|||
def json(self, **kw): |
|||
return json.dumps( |
|||
self, |
|||
default=lambda o: dict([(k, v) for k, v in o.__dict__.items() if not k.startswith('_')]), |
|||
**kw |
|||
) |
|||
|
|||
|
|||
class CollectableItem(Immutable): |
|||
@classmethod |
|||
def from_dict(cls, key, map): |
|||
raise NotImplementedError |
|||
|
|||
@classmethod |
|||
def collection_from_dict(cls, map): |
|||
return [cls.from_dict(k, v) for k, v in map.iteritems()] |
@ -0,0 +1,103 @@ |
|||
import libs.fanarttv as fanart |
|||
from libs.fanarttv.items import LeafItem, Immutable, ResourceItem |
|||
__all__ = ( |
|||
'ArtItem', |
|||
'DiscItem', |
|||
'LogoItem', |
|||
'PosterItem', |
|||
'BackgroundItem', |
|||
'HdLogoItem', |
|||
'HdArtItem', |
|||
'BannerItem', |
|||
'ThumbItem', |
|||
'Movie', |
|||
) |
|||
|
|||
|
|||
class MovieItem(LeafItem): |
|||
|
|||
@Immutable.mutablemethod |
|||
def __init__(self, id, url, likes, lang): |
|||
super(MovieItem, self).__init__(id, url, likes) |
|||
self.lang = lang |
|||
|
|||
|
|||
class DiscItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.DISC |
|||
|
|||
@Immutable.mutablemethod |
|||
def __init__(self, id, url, likes, lang, disc, disc_type): |
|||
super(DiscItem, self).__init__(id, url, likes, lang) |
|||
self.disc = int(disc) |
|||
self.disc_type = disc_type |
|||
|
|||
|
|||
class ArtItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.ART |
|||
|
|||
|
|||
class LogoItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.LOGO |
|||
|
|||
|
|||
class PosterItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.POSTER |
|||
|
|||
|
|||
class BackgroundItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.BACKGROUND |
|||
|
|||
|
|||
class HdLogoItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.HDLOGO |
|||
|
|||
|
|||
class HdArtItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.HDART |
|||
|
|||
|
|||
class BannerItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.BANNER |
|||
|
|||
|
|||
class ThumbItem(MovieItem): |
|||
KEY = fanart.TYPE.MOVIE.THUMB |
|||
|
|||
|
|||
class Movie(ResourceItem): |
|||
WS = fanart.WS.MOVIE |
|||
|
|||
@Immutable.mutablemethod |
|||
def __init__(self, name, imdbid, tmdbid, arts, logos, discs, posters, backgrounds, hdlogos, hdarts, |
|||
banners, thumbs): |
|||
self.name = name |
|||
self.imdbid = imdbid |
|||
self.tmdbid = tmdbid |
|||
self.arts = arts |
|||
self.posters = posters |
|||
self.logos = logos |
|||
self.discs = discs |
|||
self.backgrounds = backgrounds |
|||
self.hdlogos = hdlogos |
|||
self.hdarts = hdarts |
|||
self.banners = banners |
|||
self.thumbs = thumbs |
|||
|
|||
@classmethod |
|||
def from_dict(cls, resource): |
|||
assert len(resource) == 1, 'Bad Format Map' |
|||
name, resource = resource.items()[0] |
|||
return cls( |
|||
name=name, |
|||
imdbid=resource['imdb_id'], |
|||
tmdbid=resource['tmdb_id'], |
|||
arts=ArtItem.extract(resource), |
|||
logos=LogoItem.extract(resource), |
|||
discs=DiscItem.extract(resource), |
|||
posters=PosterItem.extract(resource), |
|||
backgrounds=BackgroundItem.extract(resource), |
|||
hdlogos=HdLogoItem.extract(resource), |
|||
hdarts=HdArtItem.extract(resource), |
|||
banners=BannerItem.extract(resource), |
|||
thumbs=ThumbItem.extract(resource), |
|||
) |
@ -0,0 +1,80 @@ |
|||
from libs.fanarttv.items import Immutable, LeafItem, ResourceItem, CollectableItem |
|||
import libs.fanarttv as fanart |
|||
__all__ = ( |
|||
'BackgroundItem', |
|||
'CoverItem', |
|||
'LogoItem', |
|||
'ThumbItem', |
|||
'DiscItem', |
|||
'Artist', |
|||
'Album', |
|||
) |
|||
|
|||
|
|||
class BackgroundItem(LeafItem): |
|||
KEY = fanart.TYPE.MUSIC.BACKGROUND |
|||
|
|||
|
|||
class CoverItem(LeafItem): |
|||
KEY = fanart.TYPE.MUSIC.COVER |
|||
|
|||
|
|||
class LogoItem(LeafItem): |
|||
KEY = fanart.TYPE.MUSIC.LOGO |
|||
|
|||
|
|||
class ThumbItem(LeafItem): |
|||
KEY = fanart.TYPE.MUSIC.THUMB |
|||
|
|||
|
|||
class DiscItem(LeafItem): |
|||
KEY = fanart.TYPE.MUSIC.DISC |
|||
|
|||
@Immutable.mutablemethod |
|||
def __init__(self, id, url, likes, disc, size): |
|||
super(DiscItem, self).__init__(id, url, likes) |
|||
self.disc = int(disc) |
|||
self.size = int(size) |
|||
|
|||
|
|||
class Artist(ResourceItem): |
|||
WS = fanart.WS.MUSIC |
|||
|
|||
@Immutable.mutablemethod |
|||
def __init__(self, name, mbid, albums, backgrounds, logos, thumbs): |
|||
self.name = name |
|||
self.mbid = mbid |
|||
self.albums = albums |
|||
self.backgrounds = backgrounds |
|||
self.logos = logos |
|||
self.thumbs = thumbs |
|||
|
|||
@classmethod |
|||
def from_dict(cls, resource): |
|||
assert len(resource) == 1, 'Bad Format Map' |
|||
name, resource = resource.items()[0] |
|||
return cls( |
|||
name=name, |
|||
mbid=resource['mbid_id'], |
|||
albums=Album.collection_from_dict(resource.get('albums', {})), |
|||
backgrounds=BackgroundItem.extract(resource), |
|||
thumbs=ThumbItem.extract(resource), |
|||
logos=LogoItem.extract(resource), |
|||
) |
|||
|
|||
|
|||
class Album(CollectableItem): |
|||
|
|||
@Immutable.mutablemethod |
|||
def __init__(self, mbid, covers, arts): |
|||
self.mbid = mbid |
|||
self.covers = covers |
|||
self.arts = arts |
|||
|
|||
@classmethod |
|||
def from_dict(cls, key, resource): |
|||
return cls( |
|||
mbid=key, |
|||
covers=CoverItem.extract(resource), |
|||
arts=DiscItem.extract(resource), |
|||
) |
@ -0,0 +1,108 @@ |
|||
import libs.fanarttv as fanart |
|||
from libs.fanarttv.items import LeafItem, Immutable, ResourceItem |
|||
__all__ = ( |
|||
'CharacterItem', |
|||
'ArtItem', |
|||
'LogoItem', |
|||
'BackgroundItem', |
|||
'SeasonItem', |
|||
'ThumbItem', |
|||
'HdLogoItem', |
|||
'HdArtItem', |
|||
'PosterItem', |
|||
'BannerItem', |
|||
'TvShow', |
|||
) |
|||
|
|||
|
|||
class TvItem(LeafItem): |
|||
@Immutable.mutablemethod |
|||
def __init__(self, id, url, likes, lang): |
|||
super(TvItem, self).__init__(id, url, likes) |
|||
self.lang = lang |
|||
|
|||
|
|||
class SeasonedTvItem(TvItem): |
|||
@Immutable.mutablemethod |
|||
def __init__(self, id, url, likes, lang, season): |
|||
super(SeasonedTvItem, self).__init__(id, url, likes, lang) |
|||
self.season = 0 if season == 'all' else int(season or 0) |
|||
|
|||
|
|||
class CharacterItem(TvItem): |
|||
KEY = fanart.TYPE.TV.CHARACTER |
|||
|
|||
|
|||
class ArtItem(TvItem): |
|||
KEY = fanart.TYPE.TV.ART |
|||
|
|||
|
|||
class LogoItem(TvItem): |
|||
KEY = fanart.TYPE.TV.LOGO |
|||
|
|||
|
|||
class BackgroundItem(SeasonedTvItem): |
|||
KEY = fanart.TYPE.TV.BACKGROUND |
|||
|
|||
|
|||
class SeasonItem(SeasonedTvItem): |
|||
KEY = fanart.TYPE.TV.SEASONTHUMB |
|||
|
|||
|
|||
class ThumbItem(TvItem): |
|||
KEY = fanart.TYPE.TV.THUMB |
|||
|
|||
|
|||
class HdLogoItem(TvItem): |
|||
KEY = fanart.TYPE.TV.HDLOGO |
|||
|
|||
|
|||
class HdArtItem(TvItem): |
|||
KEY = fanart.TYPE.TV.HDART |
|||
|
|||
|
|||
class PosterItem(TvItem): |
|||
KEY = fanart.TYPE.TV.POSTER |
|||
|
|||
|
|||
class BannerItem(TvItem): |
|||
KEY = fanart.TYPE.TV.BANNER |
|||
|
|||
|
|||
class TvShow(ResourceItem): |
|||
WS = fanart.WS.TV |
|||
|
|||
@Immutable.mutablemethod |
|||
def __init__(self, name, tvdbid, backgrounds, characters, arts, logos, seasons, thumbs, hdlogos, hdarts, posters, |
|||
banners): |
|||
self.name = name |
|||
self.tvdbid = tvdbid |
|||
self.backgrounds = backgrounds |
|||
self.characters = characters |
|||
self.arts = arts |
|||
self.logos = logos |
|||
self.seasons = seasons |
|||
self.thumbs = thumbs |
|||
self.hdlogos = hdlogos |
|||
self.hdarts = hdarts |
|||
self.posters = posters |
|||
self.banners = banners |
|||
|
|||
@classmethod |
|||
def from_dict(cls, resource): |
|||
assert len(resource) == 1, 'Bad Format Map' |
|||
name, resource = resource.items()[0] |
|||
return cls( |
|||
name=name, |
|||
tvdbid=resource['thetvdb_id'], |
|||
backgrounds=BackgroundItem.extract(resource), |
|||
characters=CharacterItem.extract(resource), |
|||
arts=ArtItem.extract(resource), |
|||
logos=LogoItem.extract(resource), |
|||
seasons=SeasonItem.extract(resource), |
|||
thumbs=ThumbItem.extract(resource), |
|||
hdlogos=HdLogoItem.extract(resource), |
|||
hdarts=HdArtItem.extract(resource), |
|||
posters=PosterItem.extract(resource), |
|||
banners=BannerItem.extract(resource), |
|||
) |
Loading…
Reference in new issue