Move unannotation into the binary
This commit is contained in:
parent
19cabebfb3
commit
f5fe88e4ef
2 changed files with 55 additions and 20 deletions
73
src/main.rs
73
src/main.rs
|
@ -8,29 +8,44 @@ use std::sync::{mpsc, Arc, RwLock};
|
|||
use std::thread::{self, sleep};
|
||||
use std::time::Duration;
|
||||
|
||||
use clap::Parser;
|
||||
use clap::{Parser, Subcommand};
|
||||
use cpal::traits::{DeviceTrait, StreamTrait};
|
||||
use cpal::{self, traits::HostTrait};
|
||||
use cpal::{OutputCallbackInfo, StreamConfig};
|
||||
use crossterm::cursor::{Hide, MoveTo, MoveToColumn, MoveToNextLine, Show};
|
||||
use crossterm::event::{Event, KeyCode, KeyModifiers, MediaKeyCode};
|
||||
use crossterm::execute;
|
||||
use crossterm::style::{Print, PrintStyledContent, Stylize};
|
||||
use crossterm::terminal::{
|
||||
disable_raw_mode, enable_raw_mode, size, Clear, ClearType, EnterAlternateScreen, ScrollUp,
|
||||
};
|
||||
use crossterm::{execute, queue};
|
||||
use minimp3::Decoder;
|
||||
use rand::{seq::SliceRandom, thread_rng};
|
||||
use serde::Serialize;
|
||||
use simple_mutex::Mutex as FairMutex;
|
||||
|
||||
#[derive(Subcommand)]
|
||||
enum CliSubcommand {
|
||||
#[command(name = "t", name = "tate", about = "Annotate audio files")]
|
||||
Annotate {
|
||||
path: Vec<PathBuf>,
|
||||
#[arg(
|
||||
short = 'b',
|
||||
long = "bufsize",
|
||||
default_value_t = 1000000000,
|
||||
help = "Initial size of audio buffer"
|
||||
)]
|
||||
initial_buffer_size: usize,
|
||||
},
|
||||
#[command(name = "u", name = "untate", about = "Unannotate audio files")]
|
||||
Unannotate { path: Vec<PathBuf> },
|
||||
}
|
||||
|
||||
#[derive(Parser)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
struct Cli {
|
||||
path: Vec<PathBuf>,
|
||||
|
||||
#[arg(short = 'b', long = "bufsize", default_value_t = 1000000000)]
|
||||
initial_buffer_size: usize,
|
||||
#[command(subcommand)]
|
||||
command: CliSubcommand,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize)]
|
||||
|
@ -156,21 +171,34 @@ impl std::fmt::Display for Annotation {
|
|||
}
|
||||
|
||||
const MOVEMENT_DURATION_SECONDS: usize = 15;
|
||||
const XATTR_NAME: &'static str = "user.ad-annotation";
|
||||
|
||||
/// Cleanly exit the program
|
||||
fn quit() {
|
||||
disable_raw_mode().unwrap();
|
||||
execute!(std::io::stdout(), MoveToNextLine(2), MoveToColumn(0), Show).unwrap();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut cli = Cli::parse();
|
||||
let cli = Cli::parse();
|
||||
|
||||
match cli.command {
|
||||
CliSubcommand::Annotate {
|
||||
path,
|
||||
initial_buffer_size,
|
||||
} => annotate(path, initial_buffer_size),
|
||||
CliSubcommand::Unannotate { path } => {
|
||||
unannotate(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn annotate(mut path: Vec<PathBuf>, initial_buffer_size: usize) {
|
||||
enable_raw_mode().unwrap();
|
||||
let mut stdout = stdout();
|
||||
execute!(stdout, Hide, EnterAlternateScreen).unwrap();
|
||||
|
||||
/// Cleanly exit the program
|
||||
fn quit() {
|
||||
disable_raw_mode().unwrap();
|
||||
execute!(std::io::stdout(), MoveToNextLine(2), MoveToColumn(0), Show).unwrap();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
let (mut _terminal_columns, terminal_rows) = size().unwrap();
|
||||
let terminal_rows = Arc::new(Cell::new(terminal_rows));
|
||||
|
||||
|
@ -185,9 +213,9 @@ fn main() {
|
|||
|
||||
let mut rng = thread_rng();
|
||||
|
||||
cli.path.shuffle(&mut rng);
|
||||
path.shuffle(&mut rng);
|
||||
|
||||
let mut path_iter = cli.path.into_iter();
|
||||
let mut path_iter = path.into_iter();
|
||||
let path: Arc<FairMutex<Option<PathBuf>>> = Arc::new(FairMutex::new(None));
|
||||
|
||||
let idx: Arc<FairMutex<usize>> = Arc::new(FairMutex::new(0));
|
||||
|
@ -197,7 +225,7 @@ fn main() {
|
|||
let mut paused = false;
|
||||
|
||||
let buf: Arc<FairMutex<Vec<i16>>> =
|
||||
Arc::new(FairMutex::new(Vec::with_capacity(cli.initial_buffer_size)));
|
||||
Arc::new(FairMutex::new(Vec::with_capacity(initial_buffer_size)));
|
||||
|
||||
let host = cpal::default_host();
|
||||
|
||||
|
@ -557,5 +585,14 @@ fn main() {
|
|||
for a in &annotations[..] {
|
||||
log(&format!("{}", a));
|
||||
}
|
||||
} // end loop
|
||||
} // end input processing loop
|
||||
}
|
||||
|
||||
fn unannotate(path: Vec<PathBuf>) {
|
||||
let mut stdout = std::io::stdout();
|
||||
for path in path.iter() {
|
||||
xattr::remove(path.as_path(), XATTR_NAME).unwrap();
|
||||
execute!(stdout, Print(format!("Unannotated {}", path.display()))).unwrap();
|
||||
}
|
||||
quit();
|
||||
}
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
#!/bin/sh
|
||||
xattr -d user.ad-annotation $@
|
Loading…
Reference in a new issue