Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tmdb_lookup release dates #3637

Open
wants to merge 13 commits into
base: develop
Choose a base branch
from
10 changes: 10 additions & 0 deletions flexget/components/tmdb/api.py
Expand Up @@ -107,6 +107,12 @@ class ObjectsContainer:
tmdb_parser.add_argument(
'include_backdrops', type=inputs.boolean, default=False, help='Include backdrops in response'
)
tmdb_parser.add_argument(
'include_release_dates',
type=inputs.boolean,
default=False,
help='Include release dates in response',
)


@tmdb_api.route('/movies/')
Expand All @@ -126,6 +132,7 @@ def get(self, session=None):

posters = args.pop('include_posters', False)
backdrops = args.pop('include_backdrops', False)
release_dates = args.pop('include_release_dates', False)

if not (title or tmdb_id or imdb_id):
raise BadRequest(description)
Expand All @@ -145,4 +152,7 @@ def get(self, session=None):
if backdrops:
return_movie['backdrops'] = [p.to_dict() for p in movie.backdrops]

if release_dates:
return_movie['release_dates'] = movie.release_dates

return jsonify(return_movie)
47 changes: 47 additions & 0 deletions flexget/components/tmdb/api_tmdb.py
@@ -1,4 +1,5 @@
from datetime import datetime, timedelta
from functools import lru_cache

from dateutil.parser import parse as dateutil_parse
from loguru import logger
Expand All @@ -23,6 +24,7 @@
from flexget.event import event
from flexget.manager import Session
from flexget.utils import requests
from flexget.utils.cache import timed_lru_cache
from flexget.utils.database import json_synonym, with_session, year_property

logger = logger.bind(name='api_tmdb')
Expand Down Expand Up @@ -94,6 +96,43 @@ def upgrade(ver, session):
Base.register_table(genres_table)


RELEASE_DATE_TYPE_MAPPING = {
1: 'premiere',
2: 'theatrical_limited',
3: 'theatrical',
4: 'digital',
5: 'physical',
6: 'tv',
}


@timed_lru_cache("1 days", maxsize=10000)
def get_release_dates(id, name, lookup_language):
logger.debug('release dates for movie {} not found in DB, fetching from TMDB', name)
try:
release_dates = {}
results = tmdb_request('movie/{}/release_dates'.format(id))['results']
for iso in results:
# loop and get the first release per type
for release in iso['release_dates']:
release_type = RELEASE_DATE_TYPE_MAPPING[release['type']]
release_date = dateutil_parse(release['release_date']).date()
release_language = release['iso_639_1'] or lookup_language

if release_language != lookup_language:
continue

if release_type not in release_dates or (
release_dates.get(release_type) >= release_date
):
release_dates[release_type] = release_date

return release_dates

except requests.RequestException as e:
raise LookupError('Error updating data from tmdb: %s' % e)


class TMDBMovie(Base):
__tablename__ = 'tmdb_movies'

Expand Down Expand Up @@ -184,6 +223,14 @@ def backdrops(self):
self.get_images()
return self._backdrops

@property
def release_dates(self):
return get_release_dates(
id=self.id,
name=self.name,
lookup_language=self.lookup_language or self.language,
)

def to_dict(self):
return {
'id': self.id,
Expand Down
1 change: 1 addition & 0 deletions flexget/components/tmdb/tmdb_lookup.py
Expand Up @@ -32,6 +32,7 @@ class PluginTmdbLookup:
# Make sure we don't stor the db association proxy directly on the entry
'tmdb_genres': lambda movie: list(movie.genres),
'tmdb_released': 'released',
'tmdb_release_dates': 'release_dates',
'tmdb_votes': 'votes',
# Just grab the top 5 posters
'tmdb_posters': lambda movie: [poster.url('original') for poster in movie.posters[:5]],
Expand Down