SickGear/lib/imdbpie/facade.py

233 lines
7.5 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import re
from dateutil.parser import parse
from .imdbpie import Imdb
from .objects import (
Title, TitleEpisodes, Name, TitleName, Image, TitleRelease,
TitleSearchResult, NameSearchResult,
)
REGEX_IMDB_ID = re.compile(r'([a-zA-Z]{2}[0-9]{7})')
class ImdbFacade(object):
def __init__(self, client=None):
self._client = client or Imdb()
def get_title(self, imdb_id):
title_data, title_aux_data = self._get_title_data(imdb_id=imdb_id)
try:
runtime = title_aux_data['runningTimes'][0]['timeMinutes']
except (KeyError, IndexError):
runtime = None
try:
episodes = TitleEpisodes(facade=self, imdb_id=imdb_id)
except LookupError:
episodes = ()
try:
season = title_aux_data['season']
episode = title_aux_data['episode']
except KeyError:
season = None
episode = None
return Title(
season=season, episode=episode, episodes=episodes,
runtime=runtime, **title_data
)
def get_name(self, imdb_id):
name_data = self._client.get_name(imdb_id=imdb_id)
name = name_data['base']['name']
imdb_id = self._parse_id(name_data['base']['id'])
try:
image_data = name_data['base']['image']
image = Image(
url=image_data['url'],
height=image_data['height'],
width=image_data['width'],
)
except KeyError:
image = None
gender = name_data['base']['gender'].lower()
date_of_birth = parse(name_data['base']['birthDate']).date()
birth_place = name_data['base']['birthPlace']
try:
bios = tuple(b['text'] for b in name_data['base']['miniBios'])
except KeyError:
bios = ()
filmography_data = self._client.get_name_filmography(imdb_id)
filmography = tuple(
self._parse_id(f['id']) for f in filmography_data['filmography']
)
return Name(
name=name, imdb_id=imdb_id, date_of_birth=date_of_birth,
gender=gender, birth_place=birth_place, bios=bios, image=image,
filmography=filmography,
)
def search_for_name(self, query):
results = []
for result in self._client.search_for_name(query):
result = NameSearchResult(
imdb_id=result['imdb_id'], name=result['name'],
)
results.append(result)
return tuple(results)
def search_for_title(self, query):
results = []
for result in self._client.search_for_title(query):
if result['year']:
year = int(result['year'])
else:
year = None
result = TitleSearchResult(
imdb_id=result['imdb_id'], title=result['title'],
type=result['type'], year=year,
)
results.append(result)
return tuple(results)
def _get_writers(self, top_crew_data):
return tuple(
TitleName(
name=i['name'],
job=i.get('job'),
category=i.get('category'),
imdb_id=self._parse_id(i['id'])
) for i in top_crew_data['writers']
)
def _get_stars(self, principals_data):
return tuple(
TitleName(
name=i['name'],
job=i.get('job'),
characters=tuple(i.get('characters', ())),
category=i.get('category'),
imdb_id=self._parse_id(i['id'])
) for i in principals_data
)
def _get_creators(self, top_crew_data):
return tuple(
TitleName(
name=i['name'],
job=i.get('job'),
category=i.get('category'),
imdb_id=self._parse_id(i['id'])
) for i in top_crew_data['writers']
if i.get('job') == 'creator'
)
def _get_directors(self, top_crew_data):
return tuple(
TitleName(
name=i['name'],
job=i.get('job'),
category=i.get('category'),
imdb_id=self._parse_id(i['id'])
) for i in top_crew_data['directors']
)
def _get_credits(self, credits_data):
credits = []
for category in credits_data.get('credits', ()):
for item in credits_data['credits'][category]:
credits.append(TitleName(
name=item['name'],
category=item.get('category'),
job=item.get('job'),
imdb_id=self._parse_id(item['id'])
))
return tuple(credits)
def _parse_id(self, string):
return REGEX_IMDB_ID.findall(string)[0]
def _get_title_data(self, imdb_id):
base_title_data = self._client.get_title(imdb_id=imdb_id)
top_crew_data = self._client.get_title_top_crew(imdb_id=imdb_id)
title_aux_data = self._client.get_title_auxiliary(imdb_id=imdb_id)
credits_data = self._client.get_title_credits(imdb_id=imdb_id)
title = base_title_data['base']['title']
year = base_title_data['base'].get('year')
try:
rating = float(base_title_data['ratings']['rating'])
except KeyError:
rating = None
type_ = base_title_data['base']['titleType'].lower()
try:
releases_data = self._client.get_title_releases(imdb_id=imdb_id)
except LookupError:
release_date = None
releases = ()
else:
release_date = parse(releases_data['releases'][0]['date']).date()
releases = tuple(
TitleRelease(date=parse(r['date']).date(), region=r['region'])
for r in releases_data['releases']
)
try:
rating_count = base_title_data['ratings']['ratingCount']
except KeyError:
rating_count = 0
try:
plot_outline = base_title_data['plot']['outline']['text']
except KeyError:
plot_outline = None
writers = self._get_writers(top_crew_data)
directors = self._get_directors(top_crew_data)
creators = self._get_creators(top_crew_data)
try:
genres = tuple(g.lower() for g in title_aux_data.get('genres'))
except TypeError:
genres = ()
credits = self._get_credits(credits_data)
try:
certification = title_aux_data['certificate']['certificate']
except TypeError:
certification = None
stars = self._get_stars(title_aux_data['principals'])
try:
image_data = title_aux_data['image']
image = Image(
url=image_data['url'],
height=image_data['height'],
width=image_data['width'],
)
except KeyError:
image = None
return dict(
imdb_id=imdb_id,
title=title,
year=year,
rating=rating,
type=type_,
release_date=release_date,
releases=releases,
plot_outline=plot_outline,
rating_count=rating_count,
writers=writers,
directors=directors,
creators=creators,
genres=genres,
credits=credits,
certification=certification,
image=image,
stars=stars,
), title_aux_data