• v0.2.7 289e4c2fdb

    v0.2.7 Stable

    pax released this 2026-04-15 00:03:22 +00:00 | 27 commits to main since this release

    v0.2.7

    Fixed

    • Popout always reopened as floating even when tiled at close — Hyprland tiled state is now persisted and restored via settiled on reopen
    • Video stutter on network streams — cache_pause_initial was blocking first frame, reverted cache_pause changes and kept larger demuxer buffer
    • Rubber band selection state getting stuck across interrupted drags
    • LIKE wildcards in search_library_meta not being escaped
    • Copy File to Clipboard broken in preview pane and popout; added Copy Image URL action
    • Thumbnail cleanup and Post ID sort broken for templated filenames in library
    • Save/unsave bookmark UX — no flash on toggle, correct dot indicators
    • Autocomplete broken for multi-tag queries
    • Search not resetting to page 1 on new query
    • Fade animation cleanup crashing FlowLayout.clear
    • Privacy toggle not preserving video pause state
    • Bookmarks grid not refreshing on unsave
    • _cached_path not set for streaming videos
    • Standard icon column showing in QMessageBox dialogs
    • Popout aspect lock for bookmarks now reads actual image dimensions instead of guessing
    • GPU resource leak on Mesa/Intel drivers — mpv_render_context_free now runs with the owning GL context current (NVIDIA tolerated the bug, other drivers did not)
    • Popout teardown AttributeError when centralWidget() or QApplication.instance() returned None during init/shutdown race
    • Category fetcher rejects XML responses containing <!DOCTYPE or <!ENTITY before parsing, blocking XXE and billion-laughs payloads from user-configured sites
    • VRAM not released on popout close — video_player now drops the hwdec surface pool on stop and popout runs explicit mpv cleanup before teardown
    • Popout open animation was being suppressed by the no_anim aspect-lock workaround — first fit after open now lets Hyprland's windowsIn/popin play; subsequent navigation fits still suppress anim to avoid resize flicker
    • Thumbnail grid blanking out after Hyprland tiled resize until a scroll/click — viewport is now force-updated at the end of ThumbnailGrid.resizeEvent so the Qt Wayland buffer stays in sync with the new geometry
    • Library video thumbnails captured from a black opening frame — mpv now seeks to 10% before the first frame decode so title cards, fade-ins, and codec warmup no longer produce a black thumbnail (delete ~/.cache/booru-viewer/thumbnails/library/ to regenerate existing entries)

    Changed

    • Uncached videos now download via httpx in parallel with mpv streaming — file is cached immediately for copy/paste without waiting for playback to finish
    • Library video thumbnails use mpv instead of ffmpeg — drops the ffmpeg dependency entirely
    • Save/Unsave from Library mutually exclusive in context menus, preview pane, and popout
    • S key guard consistent with B/F behavior
    • Tag count limits removed from info panel
    • Ctrl+S and Ctrl+D menu shortcuts removed (conflict-prone)
    • Thumbnail fade-in shortened from 200ms to 80ms
    • Default demuxer buffer reduced to 50MiB; streaming URLs still get 150MiB
    • Minimum width set on thumbnail grid
    • Popout overlay hover zone enlarged
    • Settings dialog gets an Apply button; thumbnail size and flip layout apply live
    • Tab selection preserved on view switch
    • Scroll delta accumulated for volume control and zoom (smoother with hi-res scroll wheels)
    • Force Fusion widget style when no custom.qss is present
    • Dark Fusion palette applied as fallback when no system Qt theme file (Trolltech.conf) is detected; KDE/GNOME users keep their own palette
    • Behavior change: popout re-fits window to current content's aspect and resets zoom when leaving a tiled layout to a different-aspect image or video; previously restored the old floating geometry with the wrong aspect lock

    Performance

    • Thumbnails re-decoded from disk on size change instead of holding full pixmaps in memory
    • Off-screen thumbnail pixmaps recycled (decoded on demand from cached path)
    • Lookup sets cached across infinite scroll appends; invalidated on bookmark/save
    • auto_evict_cache throttled to once per 30s
    • Stale prefetch spirals cancelled on new click
    • Single-pass directory walk in cache eviction functions
    • GTK dialog platform detection cached instead of recreating Database per call

    Removed

    • Dead code: core/images.py
    • TODO.md
    • Unused imports across main_window, grid, settings, dialogs, sites, search_controller, video_player, info_panel
    • Dead mid variable in grid.paintEvent, dead get_connection_log import in settings._build_network_tab
    Downloads