utils.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import logging
  2. from urllib.parse import unquote
  3. from django.contrib.auth import get_user_model
  4. from dateutil.parser import ParserError, parse
  5. from django.conf import settings
  6. from django.db import models
  7. logger = logging.getLogger(__name__)
  8. User = get_user_model()
  9. def convert_to_seconds(run_time: str) -> int:
  10. """Jellyfin sends run time as 00:00:00 string. We want the run time to
  11. actually be in seconds so we'll convert it"
  12. This is actually deprecated, as we now convert to seconds before saving.
  13. But for older videos, we'll leave this here.
  14. """
  15. if ":" in str(run_time):
  16. run_time_list = run_time.split(":")
  17. hours = int(run_time_list[0])
  18. minutes = int(run_time_list[1])
  19. seconds = int(run_time_list[2])
  20. run_time = (((hours * 60) + minutes) * 60) + seconds
  21. return int(run_time)
  22. def parse_mopidy_uri(uri: str) -> dict:
  23. logger.debug(f"Parsing URI: {uri}")
  24. parsed_uri = uri.split("/")
  25. episode_str = unquote(parsed_uri.pop(-1).strip(".mp3"))
  26. podcast_str = unquote(parsed_uri.pop(-1))
  27. possible_date_str = episode_str[0:10]
  28. try:
  29. pub_date = parse(possible_date_str)
  30. except ParserError:
  31. pub_date = ""
  32. logger.debug(f"Found pub date {pub_date} from Mopidy URI")
  33. try:
  34. if pub_date:
  35. episode_num = int(episode_str.split("-")[3])
  36. else:
  37. episode_num = int(episode_str.split("-")[0])
  38. except IndexError:
  39. episode_num = None
  40. except ValueError:
  41. episode_num = None
  42. logger.debug(f"Found episode num {episode_num} from Mopidy URI")
  43. if pub_date:
  44. episode_str = episode_str.strip(episode_str[:11])
  45. if type(episode_num) is int:
  46. episode_num_gap = len(str(episode_num)) + 1
  47. episode_str = episode_str.strip(episode_str[:episode_num_gap])
  48. episode_str = episode_str.replace("-", " ")
  49. logger.debug(f"Found episode name {episode_str} from Mopidy URI")
  50. return {
  51. "episode_filename": episode_str,
  52. "episode_num": episode_num,
  53. "podcast_name": podcast_str,
  54. "pub_date": pub_date,
  55. }
  56. def check_scrobble_for_finish(
  57. scrobble: "Scrobble", force_to_100=False, force_finish=False
  58. ) -> None:
  59. completion_percent = scrobble.media_obj.COMPLETION_PERCENT
  60. if scrobble.percent_played >= completion_percent or force_finish:
  61. logger.info(f"{scrobble.id} {completion_percent} met, finishing")
  62. if (
  63. scrobble.playback_position_ticks
  64. and scrobble.media_obj.run_time_ticks
  65. and force_to_100
  66. ):
  67. scrobble.playback_position_ticks = (
  68. scrobble.media_obj.run_time_ticks
  69. )
  70. logger.info(
  71. f"{scrobble.playback_position_ticks} set to {scrobble.media_obj.run_time_ticks}"
  72. )
  73. scrobble.in_progress = False
  74. scrobble.is_paused = False
  75. scrobble.played_to_completion = True
  76. scrobble.save(
  77. update_fields=[
  78. "in_progress",
  79. "is_paused",
  80. "played_to_completion",
  81. "playback_position_ticks",
  82. ]
  83. )
  84. if scrobble.percent_played % 5 == 0:
  85. if getattr(settings, "KEEP_DETAILED_SCROBBLE_LOGS", False):
  86. scrobble.scrobble_log += f"\n{str(scrobble.timestamp)} - {scrobble.playback_position} - {str(scrobble.playback_position_ticks)} - {str(scrobble.percent_played)}%"
  87. scrobble.save(update_fields=["scrobble_log"])
  88. def get_scrobbles_for_media(media_obj, user: User) -> models.QuerySet:
  89. from scrobbles.models import Scrobble
  90. if media_obj.__class__.__name__ == "Book":
  91. media_query = models.Q(book=media_obj)
  92. return Scrobble.objects.filter(media_query, user=user)