Move unannotation into the binary

This commit is contained in:
Josh Hansen 2023-06-29 15:52:31 -07:00
parent 19cabebfb3
commit f5fe88e4ef
2 changed files with 55 additions and 20 deletions

View file

@ -8,29 +8,44 @@ use std::sync::{mpsc, Arc, RwLock};
use std::thread::{self, sleep}; use std::thread::{self, sleep};
use std::time::Duration; use std::time::Duration;
use clap::Parser; use clap::{Parser, Subcommand};
use cpal::traits::{DeviceTrait, StreamTrait}; use cpal::traits::{DeviceTrait, StreamTrait};
use cpal::{self, traits::HostTrait}; use cpal::{self, traits::HostTrait};
use cpal::{OutputCallbackInfo, StreamConfig}; use cpal::{OutputCallbackInfo, StreamConfig};
use crossterm::cursor::{Hide, MoveTo, MoveToColumn, MoveToNextLine, Show}; use crossterm::cursor::{Hide, MoveTo, MoveToColumn, MoveToNextLine, Show};
use crossterm::event::{Event, KeyCode, KeyModifiers, MediaKeyCode}; use crossterm::event::{Event, KeyCode, KeyModifiers, MediaKeyCode};
use crossterm::execute;
use crossterm::style::{Print, PrintStyledContent, Stylize}; use crossterm::style::{Print, PrintStyledContent, Stylize};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, size, Clear, ClearType, EnterAlternateScreen, ScrollUp, disable_raw_mode, enable_raw_mode, size, Clear, ClearType, EnterAlternateScreen, ScrollUp,
}; };
use crossterm::{execute, queue};
use minimp3::Decoder; use minimp3::Decoder;
use rand::{seq::SliceRandom, thread_rng}; use rand::{seq::SliceRandom, thread_rng};
use serde::Serialize; use serde::Serialize;
use simple_mutex::Mutex as FairMutex; 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)] #[derive(Parser)]
#[command(author, version, about, long_about = None)] #[command(author, version, about, long_about = None)]
struct Cli { struct Cli {
path: Vec<PathBuf>, #[command(subcommand)]
command: CliSubcommand,
#[arg(short = 'b', long = "bufsize", default_value_t = 1000000000)]
initial_buffer_size: usize,
} }
#[derive(Debug, PartialEq, Serialize)] #[derive(Debug, PartialEq, Serialize)]
@ -156,21 +171,34 @@ impl std::fmt::Display for Annotation {
} }
const MOVEMENT_DURATION_SECONDS: usize = 15; 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() { 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(); enable_raw_mode().unwrap();
let mut stdout = stdout(); let mut stdout = stdout();
execute!(stdout, Hide, EnterAlternateScreen).unwrap(); 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 (mut _terminal_columns, terminal_rows) = size().unwrap();
let terminal_rows = Arc::new(Cell::new(terminal_rows)); let terminal_rows = Arc::new(Cell::new(terminal_rows));
@ -185,9 +213,9 @@ fn main() {
let mut rng = thread_rng(); 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 path: Arc<FairMutex<Option<PathBuf>>> = Arc::new(FairMutex::new(None));
let idx: Arc<FairMutex<usize>> = Arc::new(FairMutex::new(0)); let idx: Arc<FairMutex<usize>> = Arc::new(FairMutex::new(0));
@ -197,7 +225,7 @@ fn main() {
let mut paused = false; let mut paused = false;
let buf: Arc<FairMutex<Vec<i16>>> = 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(); let host = cpal::default_host();
@ -557,5 +585,14 @@ fn main() {
for a in &annotations[..] { for a in &annotations[..] {
log(&format!("{}", a)); 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();
} }

View file

@ -1,2 +0,0 @@
#!/bin/sh
xattr -d user.ad-annotation $@