service-podcasts/src/perun/get_episode.py
2025-10-10 12:34:05 +02:00

67 lines
2.2 KiB
Python

import requests
import yt_dlp
import os
from dotenv import load_dotenv
from helper import log_message
from ssh_helper import upload_via_sftp, send_notification_via_ssh
from youtube_handler import get_url_for_latest_video, get_youtube_data, return_download_options
load_dotenv()
PODCAST_AUTHORIZATION_TOKEN = os.getenv("PODCAST_AUTHORIZATION_TOKEN")
PODCAST_API_URL = os.getenv("PODCAST_API_URL")
def get_audiobookshelf_data()->tuple[int | None, str | None]:
headers = {"Authorization": f"Bearer {PODCAST_AUTHORIZATION_TOKEN}"}
try:
response = requests.get(PODCAST_API_URL, headers=headers)
response.raise_for_status()
result = response.json()
audiobookshelf_track = result["media"]["episodes"][-1]["audioFile"]["metaTags"]["tagTrack"]
audiobookshelf_title = result["media"]["episodes"][-1]["audioFile"]["metaTags"]["tagTitle"]
return audiobookshelf_track, audiobookshelf_title
except requests.RequestException as e:
log_message(f"Failed to fetch data: {e}")
return None
def download_episode():
log_message("Starting Perun")
audiobookshelf_track, audiobookshelf_title = get_audiobookshelf_data()
if audiobookshelf_track is None or audiobookshelf_title is None:
log_message("Unable to fetch Audiobookshelf data. Exiting.")
return
episode_url = get_url_for_latest_video()
episode_info = get_youtube_data(episode_url)
log_message(f"Latest episode: {episode_info['title']}")
if audiobookshelf_title != episode_info["title"]:
log_message("New Episode found")
track = str(int(audiobookshelf_track) + 1).zfill(4)
options = return_download_options(episode_info,track)
log_message("Downloading episode")
try:
with yt_dlp.YoutubeDL(options) as episode:
episode.download(episode_url)
except Exception as e:
log_message(f"Failed to download episode: {e}")
return
log_message("Uploading episode")
upload_via_sftp(f"perun-{episode_info['date']}.mp3")
log_message("Finished uploading, sending notification")
send_notification_via_ssh(f"Perun episode {track} has been released",episode_info["title"])
log_message("Finished")
else:
log_message("No new episode found, exiting...")
if __name__ == "__main__":
download_episode()