aboutsummaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-02-05 16:23:09 +0100
committermetamuffin <metamuffin@disroot.org>2025-02-05 16:23:09 +0100
commit1c70f3d967b79cc4d9a8ee645921c53e95b096b1 (patch)
tree08d9ef037f85f95270505f23538d7072407331c2 /tool
parentd84a306e86316b845b7fb8dfc971d9a577f00f22 (diff)
downloadjellything-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.rs103
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(())