diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-05 16:23:09 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-05 16:23:09 +0100 |
commit | 1c70f3d967b79cc4d9a8ee645921c53e95b096b1 (patch) | |
tree | 08d9ef037f85f95270505f23538d7072407331c2 /tool | |
parent | d84a306e86316b845b7fb8dfc971d9a577f00f22 (diff) | |
download | jellything-1c70f3d967b79cc4d9a8ee645921c53e95b096b1.tar jellything-1c70f3d967b79cc4d9a8ee645921c53e95b096b1.tar.bz2 jellything-1c70f3d967b79cc4d9a8ee645921c53e95b096b1.tar.zst |
generic node flags and show meta import
Diffstat (limited to 'tool')
-rw-r--r-- | tool/src/add.rs | 103 |
1 files changed, 65 insertions, 38 deletions
diff --git a/tool/src/add.rs b/tool/src/add.rs index 6e79381..06487c9 100644 --- a/tool/src/add.rs +++ b/tool/src/add.rs @@ -14,30 +14,21 @@ use std::{ fmt::Display, path::{Path, PathBuf}, }; -use tokio::fs::rename; +use tokio::{ + fs::{rename, OpenOptions}, + io::AsyncWriteExt, +}; pub async fn add(action: Action) -> anyhow::Result<()> { match action { Action::Add { media } => { let theme = ColorfulTheme::default(); - // let possible_kinds = [ - // TraktKind::Movie, - // TraktKind::Season, - // TraktKind::Show, - // TraktKind::Episode, - // ]; - // let trakt_kind: Vec<usize> = MultiSelect::with_theme(&theme) - // .with_prompt("Media Kind") - // .items(&possible_kinds) - // .defaults(&[true, false, false, false]) - // .interact() - // .unwrap(); - // let search_kinds = trakt_kind - // .iter() - // .map(|&i| possible_kinds[i]) - // .collect::<Vec<_>>(); - let search_kinds = [TraktKind::Show, TraktKind::Season, TraktKind::Movie]; + let search_kinds = if media.is_dir() { + &[TraktKind::Show, TraktKind::Season] + } else { + &[TraktKind::Movie, TraktKind::Episode] + }; let (trakt_object, trakt_kind) = loop { let name: String = Input::with_theme(&theme) @@ -54,7 +45,7 @@ pub async fn add(action: Action) -> anyhow::Result<()> { .ok_or(anyhow!("no trakt api key configured"))?, ); - let results = trakt.search(&search_kinds, &name, false).await?; + let results = trakt.search(search_kinds, &name, false).await?; if results.is_empty() { warn!("no search results"); @@ -73,27 +64,63 @@ pub async fn add(action: Action) -> anyhow::Result<()> { } }; - assert_eq!(trakt_kind, TraktKind::Movie); + if media.is_dir() { + let flagspath = media.join("flags"); + let flag = format!( + "trakt={}:{}\n", + match trakt_kind { + TraktKind::Movie => "movie", + TraktKind::Show => "show", + TraktKind::Season => "season", + _ => unreachable!(), + }, + trakt_object.ids.trakt.unwrap() + ); - let stem = media.file_name().unwrap().to_string_lossy().to_string(); - let stem = stem.split_once(".").unwrap_or((stem.as_str(), "")).0; - let mut newpath = media.parent().unwrap().join(format!( - "{stem}.trakt-{}.mkv", - trakt_object.ids.trakt.unwrap() - )); - let mut n = 1; - while newpath.exists() { - newpath = media.parent().unwrap().join(format!("{stem}.alt-{n}.mkv",)); - n += 1; - } + if Confirm::with_theme(&theme) + .with_prompt(format!("Append {flag:?} to {flagspath:?}?")) + .default(true) + .interact() + .unwrap() + { + OpenOptions::new() + .append(true) + .write(true) + .create(true) + .open(flagspath) + .await? + .write_all(flag.as_bytes()) + .await?; + } + } else { + let ext = media + .extension() + .map(|e| format!(".{}", e.to_string_lossy())) + .unwrap_or("mkv".to_string()); + + let stem = media.file_name().unwrap().to_string_lossy().to_string(); + let stem = stem.split_once(".").unwrap_or((stem.as_str(), "")).0; + let mut newpath = media.parent().unwrap().join(format!( + "{stem}.trakt-{}{ext}", + trakt_object.ids.trakt.unwrap() + )); + let mut n = 1; + while newpath.exists() { + newpath = media + .parent() + .unwrap() + .join(format!("{stem}.alt-{n}{ext}",)); + n += 1; + } - if Confirm::with_theme(&theme) - .with_prompt(format!("Rename {media:?} -> {newpath:?}?")) - .default(true) - .interact() - .unwrap() - { - rename(media, newpath).await?; + if Confirm::with_theme(&theme) + .with_prompt(format!("Rename {media:?} -> {newpath:?}?")) + .default(true) + .interact() + .unwrap() + { + rename(media, newpath).await?; + } } Ok(()) |