import os
import urllib.parse
from datetime import timedelta
from pathlib import Path
from podgen import Podcast, Episode, Media
from mutagen.mp3 import MP3

# Replace with your public Tailscale Funnel URL (no trailing slash)
BASE_URL = "https://your-node-name.tailnet-name.ts.net"

SCRIPT_DIR = Path(__file__).parent.resolve()
DOWNLOADS_DIR = SCRIPT_DIR / "downloads"
OUTPUT_FEED = SCRIPT_DIR / "feed.xml"

def generate_rss():
    p = Podcast(
        name="Local YouTube Audio Feed",
        description="Automated RSS feed for local YouTube downloads",
        website=BASE_URL,
        explicit=False,
    )

    for mp3_path in DOWNLOADS_DIR.glob("**/*.mp3"):
        # 1. Get relative path (e.g. downloads/Playlist/Song.mp3)
        relative_path = mp3_path.relative_to(SCRIPT_DIR)
        
        # 2. URL-encode spaces and special characters
        encoded_path = urllib.parse.quote(relative_path.as_posix())
        
        # 3. Build valid URL starting from root
        file_url = f"{BASE_URL.rstrip('/')}/{encoded_path.lstrip('/')}"
        file_size = mp3_path.stat().st_size

        # 4. Create Episode object with core parameters
        episode = Episode(
            title=mp3_path.stem,
            media=Media(file_url, size=file_size, type="audio/mpeg")
        )

        # 5. Assign duration directly as a timedelta object
        try:
            audio = MP3(mp3_path)
            duration_secs = int(audio.info.length)
            episode.duration = timedelta(seconds=duration_secs)
        except Exception:
            pass

        p.episodes.append(episode)

    p.rss_file(str(OUTPUT_FEED), minimize=True)
    print(f"Successfully generated {OUTPUT_FEED} with {len(p.episodes)} episode(s).")

if __name__ == "__main__":
    generate_rss()