fix(services/january): YouTube fallback

This commit is contained in:
Paul Makles
2024-10-02 11:31:55 +01:00
parent c596dd5458
commit afd8c906ba
3 changed files with 44 additions and 14 deletions

View File

@@ -66,6 +66,8 @@ async fn main() -> Result<(), std::io::Error> {
.nest("/", api::router().await); .nest("/", api::router().await);
// Configure TCP listener and bind // Configure TCP listener and bind
tracing::info!("Listening on 0.0.0.0:14705");
tracing::info!("Play around with the API: http://localhost:14705/scalar");
let address = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 14705)); let address = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 14705));
let listener = TcpListener::bind(&address).await?; let listener = TcpListener::bind(&address).await?;
axum::serve(listener, app.into_make_service()).await axum::serve(listener, app.into_make_service()).await

View File

@@ -156,7 +156,7 @@ impl Request {
let response = if let Some(Request { response, .. }) = request { let response = if let Some(Request { response, .. }) = request {
response response
} else { } else {
let Request { response, mime } = Request::new(&url).await?; let Request { response, mime } = Request::new(url).await?;
if matches!(mime.type_(), mime::VIDEO) { if matches!(mime.type_(), mime::VIDEO) {
response response
} else { } else {
@@ -262,4 +262,13 @@ impl Request {
Ok(Request { response, mime }) Ok(Request { response, mime })
} }
/// Check if something exists
pub async fn exists(url: &str) -> bool {
if let Ok(response) = CLIENT.head(url).send().await {
response.status().is_success()
} else {
false
}
}
} }

View File

@@ -207,25 +207,44 @@ pub fn populate_special(original_url: String, metadata: &mut WebsiteMetadata) {
id: captures[1].to_string(), id: captures[1].to_string(),
}) })
} else if let Some(captures) = RE_YOUTUBE.captures_iter(url).next() { } else if let Some(captures) = RE_YOUTUBE.captures_iter(url).next() {
let id = captures[1].to_string();
lazy_static! { lazy_static! {
static ref RE_TIMESTAMP: Regex = Regex::new("(?:\\?|&)(?:t|start)=([\\w]+)").unwrap(); static ref RE_TIMESTAMP: Regex = Regex::new("(?:\\?|&)(?:t|start)=([\\w]+)").unwrap();
} }
if let Some(video) = &metadata.video { // YouTube now blocks datacentre IPs from fetching information
if let Some(timestamp_captures) = RE_TIMESTAMP.captures_iter(&video.url).next() { // This is a fallback to prevent the embed from looking weird
if metadata.video.is_none() {
metadata.title.replace("YouTube".to_owned());
metadata.description.take();
metadata.colour.take();
metadata.icon_url.take();
metadata.site_name.take();
// Verify the video exists
// TODO: breaks axum :(
// if !crate::requests::Request::exists(&format!(
// "http://img.youtube.com/vi/{}/sddefault.jpg",
// id
// ))
// .await
// {
// return;
// }
}
if let Some(timestamp_captures) = RE_TIMESTAMP.captures_iter(url).next() {
Some(Special::YouTube { Some(Special::YouTube {
id: captures[1].to_string(), id,
timestamp: Some(timestamp_captures[1].to_string()), timestamp: Some(timestamp_captures[1].to_string()),
}) })
} else { } else {
Some(Special::YouTube { Some(Special::YouTube {
id: captures[1].to_string(), id,
timestamp: None, timestamp: None,
}) })
} }
} else {
None
}
} else if let Some(captures) = RE_LIGHTSPEED.captures_iter(url).next() { } else if let Some(captures) = RE_LIGHTSPEED.captures_iter(url).next() {
Some(Special::Lightspeed { Some(Special::Lightspeed {
id: captures[1].to_string(), id: captures[1].to_string(),