import os
import json
import yt_dlp
from suno_utils.utils.text import write_jsonl

tiktok_queries = [
    "tiktok covers singing voice",
    "tiktok singing",
    "tiktok vocal",
    "singing compilation",
    "acapella tiktok",
    "tiktok harmonies",
]

audiophile_queries = [
    "Audiophile music test",
    "High fidelity music",
    "HQ audiophile music",
    "Audiophile grade soundtracks",
    "Hi-Res audio music",
    "Lossless audio music",
    "Best audiophile music tracks",
    "24-bit music collection",
    "Audiophile music 2024",
    "FLAC music playlist",
    "Best sound quality songs",
    "High-definition music playlist",
    "DSD music tracks",
    "Audiophile jazz collection",
    "Audiophile classical music",
    "Best audiophile albums",
    "Audiophile music system test",
    "4K music videos audiophile",
    "Audiophile acoustic music",
    "Audiophile music streaming",
    "Vinyl rips audiophile",
    "Audiophile instrumental music",
    "Audiophile rock music",
    "Audiophile electronic music",
    "Audiophile pop music",
    "Audiophile blues collection",
    "Audiophile world music",
    "Audiophile soundstage test",
    "Audiophile vocals music",
    "Audiophile demo tracks",
    "Audiophile music experience",
    "Audiophile headphone test music",
    "Best audiophile tracks for testing",
    "Audiophile quality recordings",
    "Hi-Fi music videos",
    "High-resolution music playlist",
    "Audiophile surround sound music",
    "Mastered for audiophiles",
    "High-end audio test tracks",
    "Audiophile reference music",
    "Audiophile studio recordings",
    "Audiophile remastered music",
    "Best audiophile speakers test music",
    "Audiophile live recordings",
    "Audiophile sound quality comparison",
    "32-bit music collection",
    "Audiophile bass test music",
    "Audiophile music videos 2024",
    "Audiophile chillout music",
    "Audiophile ambient music",
    "Audiophile orchestral music",
    "Audiophile new age music",
    "Audiophile folk music",
    "Best audiophile soundtracks",
    "Audiophile piano music",
    "Audiophile guitar music",
    "Audiophile vocal test music",
    "Audiophile sound system test",
    "Audiophile binaural music",
    "Audiophile space music",
    "Audiophile soundstage tracks",
    "Audiophile soundcheck music",
    "Audiophile instrumental test",
    "Audiophile brass music",
    "Audiophile woodwind music",
    "Audiophile percussions test music",
    "Audiophile string music",
    "Audiophile concert music",
    "Audiophile background music",
    "Audiophile meditation music",
    "Audiophile relaxing music",
    "Audiophile movie soundtracks",
    "Audiophile high dynamic range music",
    "Audiophile SACD music",
    "Audiophile vinyl music",
    "Audiophile digital music",
    "Audiophile analog music",
    "Best audiophile headphones music",
    "Audiophile playlist 2024",
    "Audiophile quality music collection",
    "Best audiophile test albums",
    "Audiophile audio test",
    "Audiophile best sound test music",
    "Audiophile premium music",
    "Audiophile music showcase",
    "Audiophile music essentials",
    "Audiophile immersive sound music",
    "Audiophile demo playlist",
    "Audiophile recommended music",
    "Audiophile sound quality test",
    "Audiophile music highlights",
    "Audiophile sound experience",
    "Audiophile sound perfection",
    "Audiophile music journey",
    "Audiophile listening session music",
    "Audiophile audio experience",
    "Audiophile high end music",
    "Audiophile best quality music",
    "Audiophile ultimate test music",
]


def search_and_download_audio(query, max_results=1, output_dir="downloads"):
    ydl_opts = {
        "format": "bestaudio/best",
        "outtmpl": f"{output_dir}/%(title)s.%(ext)s",
        "postprocessors": [
            {
                "key": "FFmpegExtractAudio",
                "preferredcodec": "mp3",
                "preferredquality": "320",
            }
        ],
    }

    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        # Perform the search query
        search_results = ydl.extract_info(
            f"ytsearch{max_results}:{query}", download=False
        )["entries"]

        if not search_results:
            print("No results found.")
            return

        for result in search_results:
            print(f"Downloading: {result['title']}")
            # Download the audio from the search result
            ydl.download([result["webpage_url"]])


def download_audio(query: str, download_dir: str, downloaded_videos: set):
    ydl_opts = {
        "format": "bestaudio/best",
        "outtmpl": f"{download_dir}/%(id)s.%(ext)s",
        "postprocessors": [
            {
                "key": "FFmpegExtractAudio",
                "preferredcodec": "mp3",
                "preferredquality": "320",
            }
        ],
        "noplaylist": True,
        "quiet": False,
        "force_ipv4": True,  # Force IPv4 usage
    }

    try:
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            result = ydl.extract_info(f"ytsearch1:{query}", download=False)
            if "entries" in result:
                video = result["entries"][0]
                video_id = video["id"]
                if video_id not in downloaded_videos:
                    ydl.download([video["webpage_url"]])
                    downloaded_videos.add(video_id)
                    audio_file_path = os.path.join(download_dir, f"{video_id}.mp3")

                    metadata = {
                        "title": video["title"],
                        "tags": video.get("tags", []),
                        "webpage_url": video["webpage_url"],
                        "video_id": video_id,
                        "audio_file": audio_file_path,
                    }
                    print(f"Downloaded: {video['title']}")
                else:
                    print(f"Already downloaded: {video['title']}")
    except Exception as e:
        print(f"Error downloading {query}: {e}")
        metadata = None

    return metadata


if __name__ == "__main__":

    downloaded_videos = set()

    max_results = 1000
    output_dir = "/app/suno/christian/data/audiophile"
    os.makedirs(output_dir, exist_ok=True)

    metas = []

    for query in audiophile_queries[:10]:
        metadata = download_audio(query, output_dir, downloaded_videos)
        if metadata is not None:
            metas.append(metadata)

    # save metadata to json
    metas_filepath = os.path.join(output_dir, "metadata.json")
    write_jsonl(metas, metas_filepath)
