aboutsummaryrefslogtreecommitdiffstats
path: root/old/ytc
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-08-21 10:49:23 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-08-21 11:28:43 +0200
commit1debeb77f7986de1b659dcfdc442de6415e1d9f5 (patch)
tree4df3e7c3f6a2d1ec116e4088c5ace7f143a8b05f /old/ytc
downloadyt-1debeb77f7986de1b659dcfdc442de6415e1d9f5.zip
chore: Initial Commit
This repository was migrated out of my nixos-config.
Diffstat (limited to 'old/ytc')
-rw-r--r--old/ytc/main.rs85
1 files changed, 85 insertions, 0 deletions
diff --git a/old/ytc/main.rs b/old/ytc/main.rs
new file mode 100644
index 0000000..e1359f9
--- /dev/null
+++ b/old/ytc/main.rs
@@ -0,0 +1,85 @@
+// yt - A fully featured command line YouTube client
+//
+// Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// This file is part of Yt.
+//
+// You should have received a copy of the License along with this program.
+// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+use std::{env, process::Command as StdCmd};
+
+use anyhow::{bail, Context, Result};
+use clap::Parser;
+use log::debug;
+use url::Url;
+use yt::{
+ downloader::{Downloadable, Downloader},
+ YtccListData,
+};
+
+use crate::args::{Args, Command};
+
+fn main() -> Result<()> {
+ let args = Args::parse();
+ cli_log::init_cli_log!();
+
+ let playspec: Vec<Downloadable> = match args.subcommand {
+ Command::Id { ids } => {
+ let mut output = Vec::with_capacity(ids.len());
+ for id in ids {
+ debug!("Adding {}", id);
+ let mut ytcc = StdCmd::new("ytcc");
+ ytcc.args([
+ "--output",
+ "json",
+ "list",
+ "--watched",
+ "--unwatched",
+ "--attributes",
+ "url",
+ "--ids",
+ id.to_string().as_str(),
+ ]);
+ let json = serde_json::from_slice::<Vec<YtccListData>>(
+ &ytcc.output().context("Failed to get url from id")?.stdout,
+ )
+ .context("Failed to deserialize json output")?;
+
+ if json.is_empty() {
+ bail!("Could not find a video with id: {}", id);
+ }
+ assert_eq!(json.len(), 1);
+ let json = json.first().expect("Has only one element");
+
+ debug!("Id resolved to: '{}'", &json.url);
+
+ output.push(Downloadable {
+ url: Url::parse(&json.url)?,
+ id: Some(json.id),
+ })
+ }
+ output
+ }
+ Command::Url { urls } => {
+ let mut output = Vec::with_capacity(urls.len());
+ for url in urls {
+ output.push(Downloadable {
+ url: Url::parse(&url).context("Failed to parse url")?,
+ id: None,
+ })
+ }
+ output
+ }
+ };
+
+ debug!("Initializing downloader");
+ let downloader = Downloader::new(playspec)?;
+
+ downloader
+ .consume()
+ .context("Failed to consume downloader")?;
+
+ Ok(())
+}