metadata: Drop unreliable mime-type

Only use a reliable mime-type. This requires that we load images earlier
in the pipe.

This also fixes warnings about mime types not being available on network
drives like SMB.

Fixes #513
Issue #534
This commit is contained in:
Sophie Herold 2025-12-03 22:35:13 +01:00
parent 40d68e898d
commit 3b11b0534e
8 changed files with 57 additions and 68 deletions

View file

@ -32,17 +32,22 @@ impl imp::LpImage {
}
/// Set filename after filename changed
async fn set_file_changed(&self, file: &gio::File) {
async fn set_file_changed(&self, old_file: &gio::File, new_file: &gio::File) {
let obj = self.obj();
let prev_mime_type = obj.metadata().unreliable_mime_type();
let old_filename_ext = old_file
.basename()
.map(|x| x.extension().map(|x| x.to_owned()));
let new_filename_ext = new_file
.basename()
.map(|x| x.extension().map(|x| x.to_owned()));
self.file.replace(Some(file.clone()));
self.file.replace(Some(new_file.clone()));
self.reload_file_info().await;
// Reload if mime type changed since other decoding path might be responsible
// Reload if file extension changed since other decoding path might be responsible
// now
if obj.metadata().unreliable_mime_type() != prev_mime_type {
obj.load(file).await;
if old_filename_ext != new_filename_ext {
obj.load(new_file).await;
return;
}
@ -223,6 +228,7 @@ impl imp::LpImage {
obj.load(&file).await;
});
} else {
let old_file = file_a.clone();
glib::spawn_future_local(async move {
if obj.error().is_some() {
// Tmp files might be renamed quickly after creation. In this case
@ -230,7 +236,7 @@ impl imp::LpImage {
// Therefore reload on name change loading caused an error.
obj.load(&file).await;
} else {
obj.imp().set_file_changed(&file).await;
obj.imp().set_file_changed(&old_file, &file).await;
}
});
}
@ -365,12 +371,7 @@ impl LpImage {
// Reset background color for reloads
imp.set_background_color(None);
let (decoder, decoder_update) = Decoder::new(
file.clone(),
self.metadata().unreliable_mime_type(),
tiles.clone(),
)
.await;
let (decoder, decoder_update) = Decoder::new(file.clone(), tiles.clone()).await;
let weak_obj = self.downgrade();
glib::spawn_future_local(async move {

View file

@ -231,7 +231,7 @@ impl LpImagePage {
imp.stack.set_visible_child(&*imp.error_page);
imp.error_more_info.set_visible(false);
} else if image.specific_error() == DecoderError::UnsupportedFormat {
let mime_type = image.metadata().unreliable_mime_type().unwrap_or_default();
let mime_type = image.metadata().mime_type().unwrap_or_default();
let content_type = gio::content_type_from_mime_type(&mime_type).unwrap_or_default();
let description = gio::content_type_get_description(&content_type).to_string();