[READ-ONLY] Mirror of https://github.com/probablykasper/kadium. App for staying ontop of YouTube channels' uploads kadium.kasper.space
linux macos notifications tauri windows youtube
0

Configure Feed

Select the types of activity you want to include in your feed.

Support `/user/` URLs when adding channels

Kasper (Nov 19, 2023, 12:09 PM +0100) 87ce45fb 2c8eb6f8

+33
+1
CHANGELOG.md
··· 1 1 # Changelog 2 2 3 3 ## Next 4 + - Add support for `/user/` URLs 4 5 - Fix some errors not being shown 5 6 - Fix notification identifiers 6 7 - Scroll to bottom after adding channel
+17
src-tauri/src/api.rs
··· 43 43 Err("No video returned".to_string()) 44 44 } 45 45 46 + pub async fn channel_id_from_username(username: &str, key: &str) -> Result<String, String> { 47 + let url = "https://youtube.googleapis.com/youtube/v3/channels".to_string() 48 + + "?part=contentDetails,id,snippet" 49 + + "&forUsername=" 50 + + username; 51 + let channels = yt_request::<channels::Response>(&url, key) 52 + .await 53 + .map_err(|e| format!("Failed to get video: {}", e))?; 54 + if channels.items.len() > 1 { 55 + return Err("YouTube username search returned in multiple channels".to_string()); 56 + } 57 + if let Some(channel) = channels.items.first() { 58 + return Ok(channel.id.clone()); 59 + } 60 + Err("No video returned".to_string()) 61 + } 62 + 46 63 pub mod channels { 47 64 use serde::Deserialize; 48 65
+15
src-tauri/src/data.rs
··· 157 157 } 158 158 Some(path_segments.next()?.to_string()) 159 159 } 160 + fn url_parse_username(value: &str) -> Option<String> { 161 + let url = Url::parse(value).ok()?; 162 + let host = url.host_str()?; 163 + if !host.ends_with("youtube.com") { 164 + return None; 165 + } 166 + let mut path_segments = url.path_segments()?; 167 + if path_segments.next()? != "user" { 168 + return None; 169 + } 170 + Some(path_segments.next()?.to_string()) 171 + } 160 172 161 173 #[command] 162 174 #[specta::specta] ··· 179 191 api::channel_id_from_video_id(&video_id, key).await? 180 192 } else if let Some(id) = url_parse_channel_id(&options.url) { 181 193 id 194 + } else if let Some(username) = url_parse_username(&options.url) { 195 + let key = &settings.api_key_or_default(); 196 + api::channel_id_from_username(&username, key).await? 182 197 } else { 183 198 return Err(invalid); 184 199 };