1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
use anyhow::{bail, Context, Result};
use clap::Parser;
use std::{
env,
io::{BufRead, BufReader, Write},
process::Command as StdCmd,
};
use tempfile::NamedTempFile;
use yt::{constants::HELP_STR, ytcc_drop, Line, LineCommand, YtccListData};
use crate::args::{Args, Command, OrderCommand};
mod args;
fn main() -> Result<()> {
let args = Args::parse();
cli_log::init_cli_log!();
let ordering = match args.subcommand.unwrap_or(Command::Order {
command: OrderCommand::Date {
desc: true,
asc: false,
},
}) {
Command::Order { command } => match command {
OrderCommand::Date { desc, asc } => {
if desc {
vec!["--order-by".into(), "publish_date".into(), "desc".into()]
} else if asc {
vec!["--order-by".into(), "publish_date".into(), "asc".into()]
} else {
vec!["--order-by".into(), "publish_date".into(), "desc".into()]
}
}
OrderCommand::Raw { value } => [vec!["--order-by".into()], value].concat(),
},
};
let json_map = {
let mut ytcc = StdCmd::new("ytcc");
ytcc.args(["--output", "json", "list"]);
ytcc.args(ordering);
serde_json::from_slice::<Vec<YtccListData>>(
&ytcc.output().context("Failed to json from ytcc")?.stdout,
)
.context("Failed to deserialize json output")?
};
let mut edit_file = NamedTempFile::new().context("Failed to get tempfile")?;
let file: String = json_map
.iter()
.map(|line| {
format!(
"pick {} \"{}\" <{}> [{}]\n",
line.id,
line.title,
line.playlists
.iter()
.map(|p| &p.name[..])
.collect::<Vec<&str>>()
.join(", "),
line.duration.trim()
)
})
.collect();
for line in file.lines() {
writeln!(&edit_file, "{}", line)?;
}
write!(&edit_file, "{}", HELP_STR)?;
edit_file.flush().context("Failed to flush edit file")?;
let read_file = edit_file.reopen()?;
let mut nvim = StdCmd::new("nvim");
nvim.arg(edit_file.path());
let status = nvim.status().context("Falied to run nvim")?;
if !status.success() {
bail!("Nvim exited with error status: {}", status)
}
let mut watching = Vec::new();
let reader = BufReader::new(&read_file);
for line in reader.lines() {
let line = line.context("Failed to read line")?;
if line.starts_with("#") {
continue;
} else if line.trim().len() == 0 {
// empty line
continue;
}
let line = Line::from(line.as_str());
match line.cmd {
LineCommand::Pick => (),
LineCommand::Drop => {
ytcc_drop(line.id).with_context(|| format!("Failed to drop: {}", line.id))?
}
LineCommand::Watch => watching.push(line.id),
}
}
dbg!(&watching);
Ok(())
}
|