tmdb.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import logging
  2. import pendulum
  3. from django.conf import settings
  4. from themoviedb import TMDb
  5. from tmdbv3api import TV, Movie, TMDb as TMDb_direct
  6. from videos.metadata import VideoMetadata, VideoType
  7. TMDB_KEY = getattr(settings, "TMDB_API_KEY", "")
  8. tmdb_direct = TMDb_direct()
  9. tmdb_direct.api_key = TMDB_KEY
  10. tmdb = TMDb(key=TMDB_KEY, language="en-US", region="US")
  11. TMDB_IMAGE_URL = "https://image.tmdb.org/t/p/original"
  12. logger = logging.getLogger(__name__)
  13. def lookup_video_from_tmdb(
  14. name_or_id: str, kind: str = "movie"
  15. ) -> VideoMetadata:
  16. from videos.models import Series
  17. imdb_id = name_or_id
  18. if name_or_id.startswith("tt"):
  19. imdb_id = name_or_id[2:]
  20. video_metadata = VideoMetadata(imdb_id=imdb_id)
  21. tmdb_result = tmdb.find().by_imdb("tt" + imdb_id)
  22. if not tmdb_result:
  23. logger.info(
  24. "[lookup_video_from_tmdb] no video found on tmdb",
  25. extra={"name_or_id": name_or_id},
  26. )
  27. return None
  28. video_metadata = VideoMetadata(imdb_id=imdb_id)
  29. media = None
  30. show = None
  31. if len(tmdb_result.movie_results) > 0:
  32. media = Movie().details(tmdb_result.movie_results[0].id)
  33. video_metadata.video_type = VideoType.MOVIE.value
  34. video_metadata.title = media.title
  35. video_metadata.cover_url = TMDB_IMAGE_URL + media.poster_path # TODO: enrich this with TMDB url
  36. video_metadata.year = pendulum.parse(media.release_date).year
  37. video_metadata.genres = [g.get("name", "") for g in media.genres]
  38. if len(tmdb_result.tv_episode_results) > 0:
  39. video_metadata.video_type = VideoType.TV_EPISODE.value
  40. media = tmdb_result.tv_episode_results[0]
  41. video_metadata.title = media.name
  42. video_metadata.cover_url = TMDB_IMAGE_URL + media.still_path # TODO: enrich this with TMDB url
  43. video_metadata.episode_number = media.episode_number
  44. video_metadata.season_number = media.season_number
  45. video_metadata.year = media.air_date.year
  46. series_imdb_id = TV().external_ids(media.show_id).imdb_id[2:]
  47. series, created = Series.objects.get_or_create(imdb_id=series_imdb_id)
  48. if created:
  49. show_data = TV().details(tv_id=media.show_id)
  50. series.name = show_data.name
  51. series.save()
  52. video_metadata.tv_series_id = series.id
  53. if not media:
  54. logger.warning("Video not found on TMDB", extra={"imdb_id":imdb_id})
  55. return video_metadata
  56. video_metadata.tmdb_id = media.id
  57. video_metadata.run_time_seconds = media.runtime * 60
  58. video_metadata.plot = media.overview
  59. video_metadata.overview = media.overview
  60. video_metadata.tmdb_rating = media.vote_average
  61. #video_metadata.next_imdb_id = imdb_result.get("next episode", None)
  62. return video_metadata