From 4e42855c5915645014036c03d2618efd65c680bc Mon Sep 17 00:00:00 2001 From: YoursFunny Date: Mon, 21 Sep 2026 17:15:27 +0800 Subject: [PATCH] refactor(x-media): drop Media's write-only title field Every adapter set title (mostly None) on all three Media variants and nothing ever read it: the bot's CachedMedia carries kind/file_id/url, and the one read was misskey's own test. Removing it also drops misskey's DriveFile.name, which existed only to feed it. Fetched::title (the post's own headline, which captions do use) is untouched. --- crates/x-media/src/media.rs | 3 --- crates/x-media/src/site/bilibili/interface.rs | 2 -- crates/x-media/src/site/bsky/interface.rs | 3 --- crates/x-media/src/site/misskey/interface.rs | 6 ------ crates/x-media/src/site/misskey/model.rs | 2 -- crates/x-media/src/site/pixiv/api.rs | 1 - crates/x-media/src/site/pixiv/interface.rs | 2 -- crates/x-media/src/site/twitter/interface.rs | 3 --- crates/xmedia-bot/src/handlers/commands.rs | 3 --- 9 files changed, 25 deletions(-) diff --git a/crates/x-media/src/media.rs b/crates/x-media/src/media.rs index d920ce4..1899f69 100644 --- a/crates/x-media/src/media.rs +++ b/crates/x-media/src/media.rs @@ -37,18 +37,15 @@ impl Media { #[derive(Debug)] pub enum Media { Illustration { - title: Option, url: String, thumbnail_url: Option, fallback_url: Option, }, Video { - title: Option, url: String, thumbnail_url: String, }, Animated { - title: Option, url: String, thumbnail_url: String, }, diff --git a/crates/x-media/src/site/bilibili/interface.rs b/crates/x-media/src/site/bilibili/interface.rs index be15176..614a3ba 100644 --- a/crates/x-media/src/site/bilibili/interface.rs +++ b/crates/x-media/src/site/bilibili/interface.rs @@ -458,7 +458,6 @@ fn image(url: &str) -> Option { } Some(if url.ends_with(".gif") { Media::Animated { - title: None, url, // Left empty on purpose: the `@518w.jpg` variant is unverified for // animated sources, and Telegram generates a frame preview itself. @@ -466,7 +465,6 @@ fn image(url: &str) -> Option { } } else { Media::Illustration { - title: None, // Written before `url` moves so the formatting borrows it. thumbnail_url: Some(format!("{url}{THUMB_SUFFIX}")), url, diff --git a/crates/x-media/src/site/bsky/interface.rs b/crates/x-media/src/site/bsky/interface.rs index 93d1560..68d6af6 100644 --- a/crates/x-media/src/site/bsky/interface.rs +++ b/crates/x-media/src/site/bsky/interface.rs @@ -73,7 +73,6 @@ pub async fn fetch_from_url(url: &str) -> Result { _ => String::new(), }; media.push(Media::Video { - title: None, url: mp4_path.to_string_lossy().into_owned(), thumbnail_url, }); @@ -354,7 +353,6 @@ impl Post { match embed { model::Media::Images { images } => { media.extend(images.into_iter().map(|image| Media::Illustration { - title: None, url: image.fullsize, thumbnail_url: Some(image.thumb), fallback_url: None, @@ -365,7 +363,6 @@ impl Post { thumbnail, } => { media.push(Media::Video { - title: None, url: playlist, thumbnail_url: thumbnail, }); diff --git a/crates/x-media/src/site/misskey/interface.rs b/crates/x-media/src/site/misskey/interface.rs index fd8c7ff..2eda48a 100644 --- a/crates/x-media/src/site/misskey/interface.rs +++ b/crates/x-media/src/site/misskey/interface.rs @@ -160,21 +160,17 @@ fn caption(url: &str, author_url: &str, author: &str, text: &str) -> String { /// are skipped (twitter's `_ => {}` precedent). GIF must be matched before /// the generic image arm. fn media_from_file(file: &model::DriveFile) -> Option { - let title = file.name.clone(); match file.mime_type.as_str() { "image/gif" => Some(Media::Animated { - title, url: file.url.clone(), thumbnail_url: file.thumbnail_url.clone().unwrap_or_default(), }), mime if mime.starts_with("image/") => Some(Media::Illustration { - title, url: file.url.clone(), thumbnail_url: file.thumbnail_url.clone(), fallback_url: None, }), mime if mime.starts_with("video/") => Some(Media::Video { - title, url: file.url.clone(), thumbnail_url: file.thumbnail_url.clone().unwrap_or_default(), }), @@ -253,12 +249,10 @@ mod tests { assert_eq!(fetched.media.len(), 1); match &fetched.media[0] { Media::Illustration { - title, url, thumbnail_url, fallback_url, } => { - assert_eq!(title.as_deref(), Some("pic.webp")); assert_eq!(url, "https://media.misskeyusercontent.jp/io/a.webp"); assert_eq!( thumbnail_url.as_deref(), diff --git a/crates/x-media/src/site/misskey/model.rs b/crates/x-media/src/site/misskey/model.rs index 8c4963b..22273aa 100644 --- a/crates/x-media/src/site/misskey/model.rs +++ b/crates/x-media/src/site/misskey/model.rs @@ -30,6 +30,4 @@ pub(crate) struct DriveFile { pub(crate) thumbnail_url: Option, #[serde(default, rename = "isSensitive")] pub(crate) is_sensitive: bool, - #[serde(default)] - pub(crate) name: Option, } diff --git a/crates/x-media/src/site/pixiv/api.rs b/crates/x-media/src/site/pixiv/api.rs index 588361d..b222476 100644 --- a/crates/x-media/src/site/pixiv/api.rs +++ b/crates/x-media/src/site/pixiv/api.rs @@ -149,7 +149,6 @@ impl PixivAPI { match self.ugoira_video(illust_id).await { Ok(Some((mp4_path, _keep_alive))) => { illustration.media.push(Media::Video { - title: None, url: mp4_path, thumbnail_url: model.image_urls.medium.clone(), }); diff --git a/crates/x-media/src/site/pixiv/interface.rs b/crates/x-media/src/site/pixiv/interface.rs index 3d46aa8..b81afd7 100644 --- a/crates/x-media/src/site/pixiv/interface.rs +++ b/crates/x-media/src/site/pixiv/interface.rs @@ -235,7 +235,6 @@ impl Illustration { .original .clone() .map(|original| Media::Illustration { - title: None, url: original, thumbnail_url: Some(page.image_urls.medium.clone()), fallback_url: Some(page.image_urls.large.clone()), @@ -248,7 +247,6 @@ impl Illustration { .or(model.image_urls.original.clone()) { media.push(Media::Illustration { - title: None, url: original, thumbnail_url: Some(model.image_urls.medium.clone()), fallback_url: Some(model.image_urls.large.clone()), diff --git a/crates/x-media/src/site/twitter/interface.rs b/crates/x-media/src/site/twitter/interface.rs index ed0c3e4..d870c02 100644 --- a/crates/x-media/src/site/twitter/interface.rs +++ b/crates/x-media/src/site/twitter/interface.rs @@ -236,7 +236,6 @@ impl Tweet { for item in json.media_details { match item.media_type.as_str() { "photo" => media.push(Media::Illustration { - title: None, url: original_twimg_url(&item.media_url_https), thumbnail_url: None, // The param-less base URL is a reduced-size variant; @@ -244,12 +243,10 @@ impl Tweet { fallback_url: Some(item.media_url_https.clone()), }), "video" => media.push(Media::Video { - title: None, url: mp4_variant(&item), thumbnail_url: item.media_url_https, }), "animated_gif" => media.push(Media::Animated { - title: None, url: mp4_variant(&item), thumbnail_url: item.media_url_https, }), diff --git a/crates/xmedia-bot/src/handlers/commands.rs b/crates/xmedia-bot/src/handlers/commands.rs index acb9dee..89bc751 100644 --- a/crates/xmedia-bot/src/handlers/commands.rs +++ b/crates/xmedia-bot/src/handlers/commands.rs @@ -816,13 +816,11 @@ mod tests { fn debug_report_renders_fields_and_media() { let media = vec![ Media::Illustration { - title: None, url: "https://cdn.example/1.jpg".into(), thumbnail_url: None, fallback_url: None, }, Media::Video { - title: None, url: "https://cdn.example/2.mp4".into(), thumbnail_url: "https://cdn.example/2.jpg".into(), }, @@ -915,7 +913,6 @@ mod tests { // 200 media lines ≈ 8 KB, comfortably over the cap. let media: Vec = (0..200) .map(|i| Media::Illustration { - title: None, url: format!("https://cdn.example/{i}.jpg"), thumbnail_url: None, fallback_url: None,