about summary refs log tree commit diff stats
path: root/sys/nixpkgs/pkgs/yt/src/bin/yts/main.rs
blob: 788ecab271e24b42a0ad538884171acabc8d6bbe (plain) (blame)
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(())
}