Take cover art from YT if possible
This commit is contained in:
+56
-13
@@ -57,18 +57,35 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||
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<dyn Error>> {
|
||||
.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<dyn Error>> {
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user