utils.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import logging
  2. import os
  3. from urllib.parse import unquote
  4. from dateutil.parser import ParserError, parse
  5. from podcasts.models import PodcastEpisode
  6. logger = logging.getLogger(__name__)
  7. # TODO This should be configurable in settings or per deploy
  8. PODCAST_DATE_FORMAT = "YYYY-MM-DD"
  9. def parse_mopidy_uri(uri: str) -> dict:
  10. logger.debug(f"Parsing URI: {uri}")
  11. parsed_uri = os.path.splitext(unquote(uri))[0].split("/")
  12. episode_str = parsed_uri[-1]
  13. podcast_name = parsed_uri[-2].strip()
  14. episode_num = None
  15. episode_num_pad = 0
  16. try:
  17. # Without episode numbers the date will lead
  18. pub_date = parse(episode_str[0:10])
  19. except ParserError:
  20. episode_num = int(episode_str.split("-")[0])
  21. episode_num_pad = len(str(episode_num)) + 1
  22. try:
  23. # Beacuse we have epsiode numbers on
  24. pub_date = parse(
  25. episode_str[
  26. episode_num_pad : len(PODCAST_DATE_FORMAT)
  27. + episode_num_pad
  28. ]
  29. )
  30. except ParserError:
  31. pub_date = ""
  32. gap_to_strip = 0
  33. if pub_date:
  34. gap_to_strip += len(PODCAST_DATE_FORMAT)
  35. if episode_num:
  36. gap_to_strip += episode_num_pad
  37. episode_name = episode_str[gap_to_strip:].replace("-", " ").strip()
  38. return {
  39. "episode_filename": episode_name,
  40. "episode_num": episode_num,
  41. "podcast_name": podcast_name,
  42. "pub_date": pub_date,
  43. }
  44. def get_or_create_podcast(post_data: dict):
  45. mopidy_uri = post_data.get("mopidy_uri", "")
  46. parsed_data = parse_mopidy_uri(mopidy_uri)
  47. producer_dict = {"name": post_data.get("artist")}
  48. podcast_name = post_data.get("album")
  49. if not podcast_name:
  50. podcast_name = parsed_data.get("podcast_name")
  51. podcast_dict = {"name": podcast_name}
  52. episode_name = parsed_data.get("episode_filename")
  53. episode_dict = {
  54. "title": episode_name,
  55. "run_time_seconds": post_data.get("run_time"),
  56. "number": parsed_data.get("episode_num"),
  57. "pub_date": parsed_data.get("pub_date"),
  58. "mopidy_uri": mopidy_uri,
  59. }
  60. return PodcastEpisode.find_or_create(
  61. podcast_dict, producer_dict, episode_dict
  62. )