1
0

Take cover art from YT if possible

This commit is contained in:
2026-01-14 23:50:21 +03:00
parent 3d6ba1ef09
commit 1f80b99e4e
+56 -13
View File
@@ -57,18 +57,35 @@ fn main() -> Result<(), Box<dyn Error>> {
debug!("Cached cover failure"); debug!("Cached cover failure");
None None
} else { } 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 { if let Some(url) = youtube_cover_url {
Ok(a) => { cover_cache.insert(hash_key.clone(), url.clone());
cover_cache.insert(hash_key, a.clone()); Some(url)
Some(a) } else {
}, match lb.cover_art(&track, &artist, release_name.as_deref(), 0) {
Err(e) => { Ok(url) => {
error!("Error fetching cover_art: {}", e); cover_cache.insert(hash_key.clone(), url.clone());
cover_failure_cache.insert(hash_key); Some(url)
None },
}, Err(e) => {
error!("Error fetching cover_art: {}", e);
cover_failure_cache.insert(hash_key);
None
},
}
} }
}; };
@@ -80,10 +97,10 @@ fn main() -> Result<(), Box<dyn Error>> {
.state(artist.clone()) .state(artist.clone())
.details(track.clone()); .details(track.clone());
if let Some(url) = cover_art { if let Some(cover_url) = cover_art {
t = t.assets(|ass| { t = t.assets(|ass| {
ass ass
.large_image(url) .large_image(cover_url)
.large_text(format!("{} - {}", &track, &artist)) .large_text(format!("{} - {}", &track, &artist))
}) })
} }
@@ -96,3 +113,29 @@ fn main() -> Result<(), Box<dyn Error>> {
thread::sleep(time::Duration::from_secs(15)); 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
}