imdb.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import logging
  2. from imdb import Cinemagoer, helpers
  3. from videos.services import metadata
  4. imdb_client = Cinemagoer()
  5. logger = logging.getLogger(__name__)
  6. def lookup_video_from_imdb(
  7. name_or_id: str, kind: str = "movie"
  8. ) -> metadata.VideoMetadata:
  9. from videos.models import Series
  10. # Very few video titles start with tt, but IMDB IDs often come in with it
  11. if name_or_id.startswith("tt"):
  12. name_or_id = name_or_id[2:]
  13. imdb_id = None
  14. try:
  15. imdb_id = int(name_or_id)
  16. except ValueError:
  17. pass
  18. video_metadata = metadata.VideoMetadata(imdb_id=imdb_id)
  19. imdb_result: dict = {}
  20. imdb_result = imdb_client.get_movie(name_or_id)
  21. if not imdb_result:
  22. imdb_result = {}
  23. imdb_results: list = imdb_client.search_movie(name_or_id)
  24. if len(imdb_results) > 1:
  25. for result in imdb_results:
  26. if result["kind"] == kind:
  27. imdb_client.update(
  28. result,
  29. info=[
  30. "plot",
  31. "synopsis",
  32. "taglines",
  33. "next_episode",
  34. "genres",
  35. ],
  36. )
  37. imdb_result = result
  38. break
  39. if len(imdb_results) == 1:
  40. imdb_result = imdb_results[0]
  41. imdb_client.update(
  42. imdb_result,
  43. info=["plot", "synopsis", "taglines", "next_episode", "genres"],
  44. )
  45. if not imdb_result:
  46. logger.info(
  47. f"[lookup_video_from_imdb] no video found on imdb",
  48. extra={"name_or_id": name_or_id},
  49. )
  50. return None
  51. video_metadata.cover_url = imdb_result.get("cover url")
  52. if video_metadata.cover_url:
  53. video_metadata.cover_url = helpers.resizeImage(
  54. video_metadata.cover_url, width=800
  55. )
  56. video_metadata.video_type = metadata.VideoType.MOVIE
  57. series_name = None
  58. if imdb_result.get("kind") == "episode":
  59. series_name = imdb_result.get("episode of", None).data.get(
  60. "title", None
  61. )
  62. series, _ = Series.objects.get_or_create(name=series_name)
  63. video_metadata.video_type = metadata.VideoType.TV_EPISODE
  64. video_metadata.tv_series_id = series.id
  65. if imdb_result.get("runtimes"):
  66. video_metadata.run_time_seconds = (
  67. int(imdb_result.get("runtimes")[0]) * 60
  68. )
  69. video_metadata.title = imdb_result.get("title", "")
  70. video_metadata.imdb_id = imdb_result.get("imdbID")
  71. video_metadata.episode_number = imdb_result.get("episode", None)
  72. video_metadata.season_number = imdb_result.get("season", None)
  73. video_metadata.next_imdb_id = imdb_result.get("next episode", None)
  74. video_metadata.year = imdb_result.get("year", None)
  75. video_metadata.plot = imdb_result.get("plot outline")
  76. video_metadata.imdb_rating = imdb_result.get("rating")
  77. video_metadata.genres = imdb_result.get("genres")
  78. return video_metadata