# 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-reached` property observer instead of fragile position-jump heuristic - Frame-accurate seeking with `absolute+exact` and `relative+exact` - `keep-open=yes` holds last frame on video end instead of flashing black - Windows: bundle `mpv-2.dll` in 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_ratio` to 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_post` on 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 polluting `shown_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_end` at the edges - Preview/popout: emits the existing `navigate` signal (±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() == 0` on pure tilt fell into the zoom-out branch) - `page_forward` / `page_back` grid 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-After` header (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 `SearchState` dataclass - Eliminated all defensive `getattr`/`hasattr` patterns (8 instances) - State resets cleanly on new search — no stale infinite scroll data ### Dependencies - Added `python-mpv>=1.0` - Removed dependency on `PySide6.QtMultimedia` and `PySide6.QtMultimediaWidgets`