utils.py 2.8 KB

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