ytdlp-gui 0.3.0

a GUI for yt-dlp written in Rust
Documentation
#![cfg_attr(not(debug_assertion), windows_subsystem = "windows")]

use std::fs;

use iced::{window, Application, Settings};
use ytdlp_gui::{git_hash, logging, Config, YtGUI};

fn main() -> iced::Result {
    let mut args = std::env::args();

    if let Some(arg) = args.nth(1) {
        if arg == "--help" || arg == "-h" {
            println!("Usage: ytdlp-gui <OPTIONS>\n");
            println!("Options:");
            println!("-h, --help     Print help");
            println!("-V, --version  Print version");
            std::process::exit(0);
        } else if arg == "--version" || arg == "-V" {
            let version = option_env!("CARGO_PKG_VERSION").unwrap_or("unknown");
            let git_hash = git_hash!();
            println!("version: {version}");
            println!("git hash: {git_hash}");
            std::process::exit(0);
        } else {
            println!("Invalid option/argument");
            std::process::exit(1);
        }
    }

    logging();

    let config_dir = dirs::config_dir()
        .expect("config directory")
        .join("ytdlp-gui/");

    fs::create_dir_all(&config_dir).expect("create config dir");

    let config_file = match fs::read_to_string(config_dir.join("config.toml")) {
        Ok(file) => file,
        Err(e) => match e.kind() {
            std::io::ErrorKind::NotFound => {
                tracing::warn!("Config file not found, creating a default config file...");
                let new_config = toml::to_string(&Config::default()).expect("Config to string");
                fs::write(config_dir.join("config.toml"), &new_config)
                    .expect("create new config file");

                new_config
            }
            _ => panic!("{e}"),
        },
    };

    let config = toml::from_str::<Config>(&config_file).unwrap_or_else(|e| {
        tracing::error!("failed to parse config: {e:#?}");
        let config = Config::default();
        tracing::warn!("falling back to default configs: {config:#?}");
        config
    });

    let settings = Settings {
        id: Some(String::from("ytdlp-gui")),
        window: window::Settings {
            size: (600, 320),
            resizable: false,
            ..Default::default()
        },
        exit_on_close_request: false,
        flags: config,
        ..Default::default()
    };

    YtGUI::run(settings)
}