Populate image/audio attachment body with a filename, not with text

Various clients (including newer versions of Element Web), do not like
it when the `body` field of the attachment is not a file name.

For images, a preview may not be shown and downloading the attachment
may suggest that the whole long text is used as a filename (which is odd).

There is value (improved accessibility, etc.)
in adding better descriptions (especially to generated images),
but given that it's currently problematic, I'm getting rid of it.
It's better and safer if we stick to using filenames.
This commit is contained in:
Slavi Pantaleev
2025-01-24 11:35:08 +02:00
parent 5e6a600895
commit ec1879d212
5 changed files with 22 additions and 7 deletions

View File

@@ -10,6 +10,7 @@ use crate::conversation::create_llm_conversation_for_matrix_thread;
use crate::conversation::matrix::MatrixMessageProcessingParams;
use crate::strings;
use crate::{entity::MessageContext, Bot};
use crate::controller::utils::mime::get_file_extension;
// We may make this configurable (per room, etc.) in the future, but for now it's hardcoded.
const STICKER_SIZE: &str = "256x256";
@@ -81,7 +82,7 @@ pub async fn handle_image(
.await;
}
let attachment_body_text = format!("Generated image based on: {}", actual_prompt);
let attachment_body_text = format!("generated-image.{}", get_file_extension(&response.mime_type));
let mut event_content = matrix_link
.media()
@@ -157,7 +158,7 @@ pub async fn handle_sticker(
.instrument(span)
.await?;
let attachment_body_text = format!("Generated sticker image based on: {}", original_prompt);
let attachment_body_text = format!("generated-sticker.{}", get_file_extension(&response.mime_type));
let mut event_content = matrix_link
.media()

View File

@@ -0,0 +1,16 @@
use mxlink::mime;
pub fn get_file_extension(mime_type: &mime::Mime) -> String {
match (mime_type.type_(), mime_type.subtype()) {
(mime::AUDIO, mime::BASIC) => "au",
(mime::AUDIO, mime::MPEG) => "mp3",
(mime::AUDIO, mime::MP4) => "m4a",
(mime::AUDIO, mime::OGG) => "ogg",
(mime::IMAGE, mime::BMP) => "bmp",
(mime::IMAGE, mime::GIF) => "gif",
(mime::IMAGE, mime::JPEG) => "jpg",
(mime::IMAGE, mime::PNG) => "png",
(mime::IMAGE, mime::SVG) => "svg",
_ => "bin",
}.to_string()
}

View File

@@ -7,6 +7,7 @@ use crate::{
pub mod agent;
pub mod text_to_speech;
pub(super) mod mime;
pub async fn get_text_body_or_complain<'a>(
bot: &Bot,

View File

@@ -3,6 +3,7 @@ use mxlink::{MatrixLink, MessageResponseType};
use tracing::Instrument;
use crate::controller::utils::mime::get_file_extension;
use crate::{
agent::{provider::TextToSpeechParams, AgentInstance, AgentPurpose, ControllerTrait},
entity::MessageContext,
@@ -117,7 +118,7 @@ async fn do_generate_and_send_tts_for_message(
}
};
let attachment_body_text = strings::text_to_speech::alternate_body_text();
let attachment_body_text = format!("generated-speech.{}", get_file_extension(&text_to_speech_result.mime_type));
let event_content = matrix_link
.media()

View File

@@ -1,7 +1,3 @@
pub fn alternate_body_text() -> String {
"Generated speech from text".to_owned()
}
pub fn redaction_reason_done() -> &'static str {
"Done with speech-to-text"
}