about summary refs log tree commit diff stats
path: root/src/subscribe
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-14 14:56:29 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-14 14:56:29 +0200
commit6c9286857ef8b314962b67f4a16a66e8c35531bc (patch)
tree9ced4485ec38b39f82cba258c06321a21c40000a /src/subscribe
parentbuild(Cargo.toml): Add further lints (diff)
downloadyt-6c9286857ef8b314962b67f4a16a66e8c35531bc.tar.gz
yt-6c9286857ef8b314962b67f4a16a66e8c35531bc.zip
refactor(treewide): Combine the separate crates in one workspace
Diffstat (limited to 'src/subscribe')
-rw-r--r--src/subscribe/mod.rs184
1 files changed, 0 insertions, 184 deletions
diff --git a/src/subscribe/mod.rs b/src/subscribe/mod.rs
deleted file mode 100644
index 74d88b4..0000000
--- a/src/subscribe/mod.rs
+++ /dev/null
@@ -1,184 +0,0 @@
-// 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::str::FromStr;
-
-use anyhow::{bail, Context, Result};
-use futures::FutureExt;
-use log::warn;
-use serde_json::{json, Value};
-use tokio::io::{AsyncBufRead, AsyncBufReadExt};
-use url::Url;
-use yt_dlp::wrapper::info_json::InfoType;
-
-use crate::{
-    app::App,
-    storage::subscriptions::{
-        add_subscription, check_url, get_subscriptions, remove_all_subscriptions,
-        remove_subscription, Subscription,
-    },
-};
-
-pub async fn unsubscribe(app: &App, name: String) -> Result<()> {
-    let present_subscriptions = get_subscriptions(app).await?;
-
-    if let Some(subscription) = present_subscriptions.0.get(&name) {
-        remove_subscription(app, subscription).await?;
-    } else {
-        bail!("Couldn't find subscription: '{}'", &name);
-    }
-
-    Ok(())
-}
-
-pub async fn import<W: AsyncBufRead + AsyncBufReadExt + Unpin>(
-    app: &App,
-    reader: W,
-    force: bool,
-) -> Result<()> {
-    if force {
-        remove_all_subscriptions(app).await?;
-    }
-
-    let mut lines = reader.lines();
-    while let Some(line) = lines.next_line().await? {
-        let url =
-            Url::from_str(&line).with_context(|| format!("Failed to parse '{}' as url", line))?;
-        match subscribe(app, None, url)
-            .await
-            .with_context(|| format!("Failed to subscribe to: '{}'", line))
-        {
-            Ok(_) => (),
-            Err(err) => eprintln!(
-                "Error while subscribing to '{}': '{}'",
-                line,
-                err.source().expect("Should have a source")
-            ),
-        }
-    }
-
-    Ok(())
-}
-
-pub async fn subscribe(app: &App, name: Option<String>, url: Url) -> Result<()> {
-    if !(url.as_str().ends_with("videos")
-        || url.as_str().ends_with("streams")
-        || url.as_str().ends_with("shorts")
-        || url.as_str().ends_with("videos/")
-        || url.as_str().ends_with("streams/")
-        || url.as_str().ends_with("shorts/"))
-        && url.as_str().contains("youtube.com")
-    {
-        warn!("Your youtbe url does not seem like it actually tracks a channels playlist (videos, streams, shorts). Adding subscriptions for each of them...");
-
-        let url = Url::parse(&(url.as_str().to_owned() + "/"))
-            .expect("This was an url, it should stay one");
-
-        if let Some(name) = name {
-            let out: Result<()> = async move {
-                actual_subscribe(
-                    app,
-                    Some(name.clone() + " {Videos}"),
-                    url.join("videos/").expect("Works"),
-                )
-                .await
-                .with_context(|| {
-                    format!("Failed to subscribe to '{}'", name.clone() + " {Videos}")
-                })?;
-
-                actual_subscribe(
-                    app,
-                    Some(name.clone() + " {Streams}"),
-                    url.join("streams/").expect("Works"),
-                )
-                .await
-                .with_context(|| {
-                    format!("Failed to subscribe to '{}'", name.clone() + " {Streams}")
-                })?;
-
-                actual_subscribe(
-                    app,
-                    Some(name.clone() + " {Shorts}"),
-                    url.join("shorts/").expect("Works"),
-                )
-                .await
-                .with_context(|| format!("Failed to subscribe to '{}'", name + " {Shorts}"))?;
-
-                Ok(())
-            }
-            .boxed()
-            .await;
-
-            out?
-        } else {
-            actual_subscribe(app, None, url.join("videos/").expect("Works"))
-                .await
-                .with_context(|| format!("Failed to subscribe to the '{}' variant", "{Videos}"))?;
-
-            actual_subscribe(app, None, url.join("streams/").expect("Works"))
-                .await
-                .with_context(|| format!("Failed to subscribe to the '{}' variant", "{Streams}"))?;
-
-            actual_subscribe(app, None, url.join("shorts/").expect("Works"))
-                .await
-                .with_context(|| format!("Failed to subscribe to the '{}' variant", "{Shorts}"))?;
-        }
-    } else {
-        actual_subscribe(app, name, url).await?;
-    }
-
-    Ok(())
-}
-
-async fn actual_subscribe(app: &App, name: Option<String>, url: Url) -> Result<()> {
-    if !check_url(&url).await? {
-        bail!("The url ('{}') does not represent a playlist!", &url)
-    };
-
-    let name = if let Some(name) = name {
-        name
-    } else {
-        let yt_opts = match json!( {
-            "playliststart": 1,
-            "playlistend": 10,
-            "noplaylist": false,
-            "extract_flat": "in_playlist",
-        }) {
-            Value::Object(map) => map,
-            _ => unreachable!("This is hardcoded"),
-        };
-
-        let info = yt_dlp::extract_info(&yt_opts, &url, false, false).await?;
-
-        if info._type == Some(InfoType::Playlist) {
-            info.title.expect("This should be some for a playlist")
-        } else {
-            bail!("The url ('{}') does not represent a playlist!", &url)
-        }
-    };
-
-    let present_subscriptions = get_subscriptions(app).await?;
-
-    if let Some(subs) = present_subscriptions.0.get(&name) {
-        bail!(
-            "The subscription '{}' could not be added, \
-                as another one with the same name ('{}') already exists. It links to the Url: '{}'",
-            name,
-            name,
-            subs.url
-        );
-    }
-
-    let sub = Subscription { name, url };
-
-    add_subscription(app, &sub).await?;
-
-    Ok(())
-}