5.2 KiB
5.2 KiB
Changelog
0.2.0
New: mpv video backend
- Replaced Qt Multimedia (QMediaPlayer/QVideoWidget) with embedded mpv via
python-mpv - OpenGL render API (
MpvRenderContext) for Wayland-native compositing — no XWayland needed - Proper hardware-accelerated decoding (
hwdec=auto) - Reliable aspect ratio handling — portrait videos scale correctly
- Proper end-of-file detection via
eof-reachedproperty observer instead of fragile position-jump heuristic - Frame-accurate seeking with
absolute+exactandrelative+exact keep-open=yesholds last frame on video end instead of flashing black- Windows: bundle
mpv-2.dllin PyInstaller build
New: popout viewer (renamed from slideshow)
- Renamed "Slideshow" to "Popout" throughout UI
- Toolbar and video controls float over media with translucent background (
rgba(0,0,0,160)) - Auto-hide after 2 seconds of inactivity, reappear on mouse move
- Ctrl+H manual toggle
- Media fills entire window — no layout shift when UI appears/disappears
- Video controls only show for video posts, hidden for images/GIFs
- Smart F11 exit: window sizes to 60% of monitor, maintaining content aspect ratio
- Window auto-resizes to content aspect ratio on navigation (height adjusts, position stays)
- Window geometry and fullscreen state persisted to DB across sessions
- Hyprland-specific: uses
hyprctl resizewindowpixel+setprop keep_aspect_ratioto lock window to content aspect ratio (works both floating and tiled) - Default site setting in Settings > General
New: preview toolbar
- Action bar above the preview panel: Bookmark, Save, BL Tag, BL Post, Popout
- Appears when a post is active, hidden when preview is cleared
- Save button opens folder picker menu (Unsorted / existing folders / + New Folder)
- Save/Unsave state shown on button text
- Bookmark/Unbookmark state shown on button text
- Per-tab button visibility: Library tab only shows Save + Popout
- All actions work from any tab (Browse, Bookmarks, Library)
- Blacklist tag and blacklist post show confirmation dialogs
- "Unsave from Library" only appears in context menu when post is saved
New: media type filter
- Replaced "Animated" checkbox with dropdown: All / Animated / Video / GIF / Audio
- Each option appends the corresponding booru tag to the search query
New: thumbnail cache limits
- Added "Max thumbnail cache" setting (default 500 MB)
- Auto-evicts oldest thumbnails when limit is reached
Improved: state synchronization
- Saving/unsaving updates grid thumbnail dots instantly (browse, bookmarks, library)
- Unbookmarking refreshes the bookmarks tab immediately
- Saving from browse/bookmarks refreshes the library tab when async save completes
- Library items set
_current_poston click so toolbar actions work correctly - Preview toolbar tracks bookmark and save state across all tabs
- Tab switching clears grid selections to prevent cross-tab action conflicts
- Bookmark state updates after async bookmark completes (not before)
Improved: infinite scroll
- Fixed missing posts when media type filters reduce results per page
- Local dedup set (
seen) prevents cross-page duplicates within backfill without pollutingshown_post_ids - Page counter only advances when results are returned, not when filtering empties them
- Backfill loop increased to 10 max pages with 300ms delay between API calls (first call instant)
Improved: pagination
- Status bar shows "(end)" when search returns fewer results than page size
- Prev/Next buttons hide when at page boundaries instead of just disabling
- Source URLs clickable in info panel, truncated at 60 chars for display
Changed: scroll tilt navigation
- Scroll tilt left/right now navigates between posts everywhere — grid, embedded preview, and popout — mirroring the L/R keys
- Grid: moves selection one cell, falls through to
nav_before_start/nav_past_endat the edges - Preview/popout: emits the existing
navigatesignal (±1) - Vertical scroll still adjusts video volume on the video stack; tilt and vertical can no longer interfere
- Fixed: tilting over the image preview no longer zooms the image out (latent bug —
angleDelta().y() == 0on pure tilt fell into the zoom-out branch) page_forward/page_backgrid signals removed (only consumer was the old tilt handler)
Improved: video controls
- Seek step changed from 5s to ~3s for
,and.keys ,and.seek keys now work in the main preview panel, not just popout- Translucent overlay style on video controls in both preview and popout
- Volume slider fixed at 60px to not compete with seek slider at small sizes
New: API retry logic
- Single retry with backoff on HTTP 429 (rate limit) and 503 (service unavailable)
- Retries on request timeout
- Respects
Retry-Afterheader (capped at 5s) - Applied to all API requests (search, get_post, autocomplete) across all four clients
- Downloads are not retried (large payloads, separate client)
Refactor: SearchState dataclass
- Consolidated 8 scattered search state attributes into a single
SearchStatedataclass - Eliminated all defensive
getattr/hasattrpatterns (8 instances) - State resets cleanly on new search — no stale infinite scroll data
Dependencies
- Added
python-mpv>=1.0 - Removed dependency on
PySide6.QtMultimediaandPySide6.QtMultimediaWidgets