tmdb.py 2.5 KB

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