Add comprehensive AppImage metadata extraction, display, and bug fixes

- Add AppStream XML parser (quick-xml) to extract rich metadata from bundled
  metainfo/appdata files: description, developer, license, URLs, keywords,
  categories, content rating, release history, and MIME types
- Database migration v9: 16 new columns for extended metadata storage
- Extended inspector to parse AppStream XML, desktop entry extended fields,
  and detect binary signatures without executing AppImages
- Redesigned detail view overview tab with 8 conditional groups: About,
  Description, Links, Release History, Usage, Capabilities, File Info
- Fix crash on exit caused by stale GLib SourceId removal in debounce timers
- Fix wayland.rs executing AppImages directly to detect squashfs offset,
  replaced with safe binary scan via find_squashfs_offset_for()
- Fix scan skipping re-analysis of apps missing new metadata fields
This commit is contained in:
lashman
2026-02-27 18:31:07 +02:00
parent 39b773fed5
commit 1bb7a3bdc0
13 changed files with 1239 additions and 24 deletions

View File

@@ -876,7 +876,12 @@ impl DriftwoodWindow {
let mtime_unchanged = modified.as_deref() == ex.file_modified.as_deref();
let analysis_done = ex.analysis_status.as_deref() == Some("complete");
let has_icon = ex.icon_path.is_some();
if size_unchanged && mtime_unchanged && analysis_done && has_icon {
// Also re-analyze if AppStream metadata was never extracted
// (covers upgrades from older schema versions)
let has_appstream = ex.appstream_id.is_some()
|| ex.generic_name.is_some()
|| ex.has_signature;
if size_unchanged && mtime_unchanged && analysis_done && has_icon && has_appstream {
skipped_count += 1;
continue;
}
@@ -965,9 +970,13 @@ impl DriftwoodWindow {
}
let window_weak4 = window_weak3.clone();
let refresh_timer_clear = refresh_timer.clone();
let timer_id = glib::timeout_add_local_once(
std::time::Duration::from_millis(300),
move || {
// Clear the stored SourceId so nobody tries to remove a fired timer
refresh_timer_clear.set(None);
if let Some(window) = window_weak4.upgrade() {
let db = window.database();
let lib_view = window.imp().library_view.get().unwrap();