2023-01-12 01:04:47 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import absolute_import, unicode_literals
|
|
|
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
from dateutil.parser import parse
|
|
|
|
|
|
|
|
from .imdbpie import Imdb
|
|
|
|
from .objects import (
|
2024-06-07 12:27:06 +00:00
|
|
|
Title,
|
|
|
|
TitleEpisodes,
|
|
|
|
Name,
|
|
|
|
TitleName,
|
|
|
|
Image,
|
|
|
|
TitleRelease,
|
|
|
|
TitleSearchResult,
|
|
|
|
NameSearchResult,
|
2023-01-12 01:04:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
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(
|
2024-06-07 12:27:06 +00:00
|
|
|
season=season,
|
|
|
|
episode=episode,
|
|
|
|
episodes=episodes,
|
|
|
|
runtime=runtime,
|
|
|
|
**title_data
|
2023-01-12 01:04:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
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(
|
2024-06-07 12:27:06 +00:00
|
|
|
name=name,
|
|
|
|
imdb_id=imdb_id,
|
|
|
|
date_of_birth=date_of_birth,
|
|
|
|
gender=gender,
|
|
|
|
birth_place=birth_place,
|
|
|
|
bios=bios,
|
|
|
|
image=image,
|
2023-01-12 01:04:47 +00:00
|
|
|
filmography=filmography,
|
|
|
|
)
|
|
|
|
|
|
|
|
def search_for_name(self, query):
|
|
|
|
results = []
|
|
|
|
for result in self._client.search_for_name(query):
|
|
|
|
result = NameSearchResult(
|
2024-06-07 12:27:06 +00:00
|
|
|
imdb_id=result['imdb_id'],
|
|
|
|
name=result['name'],
|
2023-01-12 01:04:47 +00:00
|
|
|
)
|
|
|
|
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(
|
2024-06-07 12:27:06 +00:00
|
|
|
imdb_id=result['imdb_id'],
|
|
|
|
title=result['title'],
|
|
|
|
type=result['type'],
|
|
|
|
year=year,
|
2023-01-12 01:04:47 +00:00
|
|
|
)
|
|
|
|
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'),
|
2024-06-07 12:27:06 +00:00
|
|
|
imdb_id=self._parse_id(i['id']),
|
|
|
|
)
|
|
|
|
for i in top_crew_data['writers']
|
2023-01-12 01:04:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
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'),
|
2024-06-07 12:27:06 +00:00
|
|
|
imdb_id=self._parse_id(i['id']),
|
|
|
|
)
|
|
|
|
for i in principals_data
|
2023-01-12 01:04:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
def _get_creators(self, top_crew_data):
|
|
|
|
return tuple(
|
|
|
|
TitleName(
|
|
|
|
name=i['name'],
|
|
|
|
job=i.get('job'),
|
|
|
|
category=i.get('category'),
|
2024-06-07 12:27:06 +00:00
|
|
|
imdb_id=self._parse_id(i['id']),
|
|
|
|
)
|
|
|
|
for i in top_crew_data['writers']
|
2023-01-12 01:04:47 +00:00
|
|
|
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'),
|
2024-06-07 12:27:06 +00:00
|
|
|
imdb_id=self._parse_id(i['id']),
|
|
|
|
)
|
|
|
|
for i in top_crew_data['directors']
|
2023-01-12 01:04:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
def _get_credits(self, credits_data):
|
|
|
|
credits = []
|
|
|
|
for category in credits_data.get('credits', ()):
|
|
|
|
for item in credits_data['credits'][category]:
|
2024-06-07 12:27:06 +00:00
|
|
|
credits.append(
|
|
|
|
TitleName(
|
|
|
|
name=item['name'],
|
|
|
|
category=item.get('category'),
|
|
|
|
job=item.get('job'),
|
|
|
|
imdb_id=self._parse_id(item['id']),
|
|
|
|
)
|
|
|
|
)
|
2023-01-12 01:04:47 +00:00
|
|
|
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
|
2024-06-07 12:27:06 +00:00
|
|
|
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,
|
|
|
|
)
|