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()