scrobblers.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import logging
  2. from typing import Optional
  3. from django.utils import timezone
  4. from music.models import Track
  5. from podcasts.models import Episode
  6. from scrobbles.models import Scrobble
  7. from scrobbles.utils import parse_mopidy_uri
  8. logger = logging.getLogger(__name__)
  9. def scrobble_podcast(data_dict: dict, user_id: Optional[int]) -> Scrobble:
  10. mopidy_uri = data_dict.get("mopidy_uri", "")
  11. parsed_data = parse_mopidy_uri(mopidy_uri)
  12. producer_dict = {"name": data_dict.get("artist")}
  13. podcast_name = data_dict.get("album")
  14. if not podcast_name:
  15. podcast_name = parsed_data.get("podcast_name")
  16. podcast_dict = {"name": podcast_name}
  17. episode_name = data_dict.get("name")
  18. if not episode_name or '.mp3' in episode_name:
  19. episode_name = parsed_data.get("episode_filename")
  20. episode_dict = {
  21. "title": episode_name,
  22. "run_time_ticks": data_dict.get("run_time_ticks"),
  23. "run_time": data_dict.get("run_time"),
  24. "number": parsed_data.get("episode_num"),
  25. "pub_date": parsed_data.get("pub_date"),
  26. "mopidy_uri": mopidy_uri,
  27. }
  28. episode = Episode.find_or_create(podcast_dict, producer_dict, episode_dict)
  29. # Now we run off a scrobble
  30. mopidy_data = {
  31. "user_id": user_id,
  32. "timestamp": timezone.now(),
  33. "source": "Mopidy",
  34. "status": data_dict.get("status"),
  35. }
  36. scrobble = None
  37. if episode:
  38. scrobble = Scrobble.create_or_update_for_podcast_episode(
  39. episode, user_id, mopidy_data
  40. )
  41. return scrobble
  42. def scrobble_track(
  43. data_dict: dict, user_id: Optional[int]
  44. ) -> Optional[Scrobble]:
  45. artist_dict = {
  46. "name": data_dict.get("artist", None),
  47. "musicbrainz_id": data_dict.get("musicbrainz_artist_id", None),
  48. }
  49. album_dict = {
  50. "name": data_dict.get("album"),
  51. "musicbrainz_id": data_dict.get("musicbrainz_album_id"),
  52. }
  53. track_dict = {
  54. "title": data_dict.get("name"),
  55. "run_time_ticks": data_dict.get("run_time_ticks"),
  56. "run_time": data_dict.get("run_time"),
  57. }
  58. track = Track.find_or_create(artist_dict, album_dict, track_dict)
  59. # Now we run off a scrobble
  60. mopidy_data = {
  61. "user_id": user_id,
  62. "timestamp": timezone.now(),
  63. "source": "Mopidy",
  64. "status": data_dict.get("status"),
  65. }
  66. scrobble = None
  67. if track:
  68. # Jellyfin MB ids suck, so always overwrite with Mopidy if they're offering
  69. track.musicbrainz_id = data_dict.get("musicbrainz_track_id")
  70. track.save()
  71. scrobble = Scrobble.create_or_update_for_track(
  72. track, user_id, mopidy_data
  73. )
  74. return scrobble