/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2023 metamuffin */ pub mod add; pub mod migrate; use add::add; use anyhow::anyhow; use clap::{Parser, Subcommand, ValueEnum}; use jellybase::{CONF, SECRETS}; use jellyclient::Instance; use jellycommon::user::CreateSessionParams; use log::info; use migrate::migrate; use std::{fmt::Debug, path::PathBuf}; #[derive(Parser)] struct Args { #[clap(subcommand)] action: Action, } #[derive(Subcommand)] enum Action { Add { #[arg(short, long)] id: Option, #[arg(short, long)] media: Option, #[arg(short, long)] library_path: Option, }, Migrate { database: PathBuf, mode: MigrateMode, save_location: PathBuf, }, Reimport { /// Custom hostname, the config's is used by default #[arg(long)] hostname: Option, /// Disable TLS. Dont use this. #[arg(long)] no_tls: bool, }, } #[derive(Debug, Clone, Copy, PartialEq, ValueEnum)] enum MigrateMode { Import, Export, } fn main() -> anyhow::Result<()> { env_logger::builder() .filter_level(log::LevelFilter::Info) .parse_env("LOG") .init(); let args = Args::parse(); match args.action { a @ Action::Add { .. } => tokio::runtime::Builder::new_multi_thread() .enable_all() .build() .unwrap() .block_on(add(a)), a @ Action::Migrate { .. } => migrate(a), Action::Reimport { hostname, no_tls } => tokio::runtime::Builder::new_multi_thread() .enable_all() .build() .unwrap() .block_on(async move { let inst = Instance::new(hostname.unwrap_or(CONF.hostname.clone()), !no_tls); info!("login"); let session = inst .login(CreateSessionParams { drop_permissions: None, expire: None, password: SECRETS .admin_password .clone() .ok_or(anyhow!("admin account required"))?, username: CONF .admin_username .clone() .ok_or(anyhow!("admin account required"))?, }) .await?; session.reimport().await?; Ok(()) }), } }