diff --git a/src/main.rs b/src/main.rs index dd1044c..ab1dbef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -57,18 +57,35 @@ fn main() -> Result<(), Box> { debug!("Cached cover failure"); None } else { - let url = lb.cover_art(&track, &artist, release_name.as_deref(), 0); + let youtube_cover_url = metadata.additional_info.as_ref() + .and_then(|info| info.music_service_name.as_ref()) + .filter( + |service| + ["YouTube", "YouTube Music"].contains(&service.as_str()) + ) + .and_then(|_| metadata.additional_info.as_ref()) + .and_then(|info| info.origin_url.as_ref()) + .and_then(|url| extract_youtube_video_id(url)) + .map(|video_id| format!( + "https://img.youtube.com/vi/{}/sddefault.jpg", + video_id + )); - match url { - Ok(a) => { - cover_cache.insert(hash_key, a.clone()); - Some(a) - }, - Err(e) => { - error!("Error fetching cover_art: {}", e); - cover_failure_cache.insert(hash_key); - None - }, + if let Some(url) = youtube_cover_url { + cover_cache.insert(hash_key.clone(), url.clone()); + Some(url) + } else { + match lb.cover_art(&track, &artist, release_name.as_deref(), 0) { + Ok(url) => { + cover_cache.insert(hash_key.clone(), url.clone()); + Some(url) + }, + Err(e) => { + error!("Error fetching cover_art: {}", e); + cover_failure_cache.insert(hash_key); + None + }, + } } }; @@ -80,10 +97,10 @@ fn main() -> Result<(), Box> { .state(artist.clone()) .details(track.clone()); - if let Some(url) = cover_art { + if let Some(cover_url) = cover_art { t = t.assets(|ass| { ass - .large_image(url) + .large_image(cover_url) .large_text(format!("{} - {}", &track, &artist)) }) } @@ -96,3 +113,29 @@ fn main() -> Result<(), Box> { thread::sleep(time::Duration::from_secs(15)); } } + +fn extract_youtube_video_id(url: &str) -> Option<&str> { + let patterns = [ + "youtube.com/watch?v=", + "youtu.be/", + "youtube.com/v/", + "youtube.com/embed/", + ]; + + for pattern in patterns.iter() { + if let Some(pos) = url.find(pattern) { + let start = pos + pattern.len(); + let end = url[start..] + .find(|c: char| !c.is_alphanumeric() && c != '_' && c != '-') + .map(|end_pos| start + end_pos) + .unwrap_or(url.len()); + + let video_id = &url[start..end]; + if !video_id.is_empty() { + return Some(video_id); + } + } + } + + None +}