227 Commits

Author SHA1 Message Date
pax
0092007fc1 Center video widget in layout 2026-04-05 20:34:43 -05:00
pax
06ccdd475d Auto-detect video orientation — constrain correct dimension
Compares video aspect ratio to container ratio. Wider videos
get height constrained, taller videos get width constrained.
Works for both preview and slideshow automatically.
2026-04-05 20:30:54 -05:00
pax
3f2bc67b46 Slideshow: constrain video width to eliminate side bars
Preview constrains height (eliminates top/bottom bars).
Slideshow constrains width (eliminates side bars).
Both use video aspect ratio from first frame.
2026-04-05 20:28:43 -05:00
pax
6d6a33f99f Fix slideshow video sizing, revert video hide
- Slideshow video player: auto_size_video=False, no height constraint
- Revert video widget hide/show (caused info panel issues)
- Preview video still auto-sizes to aspect ratio
2026-04-05 20:24:39 -05:00
pax
bc0ddcb221 Hide video widget until first frame to prevent black flash 2026-04-05 20:20:31 -05:00
pax
843d49e4a3 Auto-size video widget to match video aspect ratio
Detects video dimensions from first frame via QVideoSink,
sets max height on the video widget to eliminate black bars.
Resets on each new video. Uses KeepAspectRatio mode.
2026-04-05 20:18:36 -05:00
pax
30de2fa6ed Video widget transparent background — matches QSS theme
Removes black letterboxing around videos in themed mode.
2026-04-05 20:10:25 -05:00
pax
e895f5e702 Match score button height to input box 2026-04-05 20:07:24 -05:00
pax
00613ae534 Fix score buttons under QSS — override padding inline
QSS themes set large padding (14px) on QPushButton which hides
the -/+ text in 25px buttons. Inline style overrides to 2px/6px.
2026-04-05 20:05:44 -05:00
pax
a6866d8c0b Revert "Widen score +/- buttons to 30px for QSS padding"
This reverts commit b549f5d8b3637d7019bc607efe58e4cb8ac89e4f.
2026-04-05 20:04:38 -05:00
pax
b549f5d8b3 Widen score +/- buttons to 30px for QSS padding 2026-04-05 20:03:33 -05:00
pax
d385b8acee Rename prefetch modes, cap Aggressive to 3 rows radius
- Adjacent → Nearby (4 cardinals)
- Full page → Aggressive (3 row radius ring, not entire grid)
- Prevents fetching 500 images in infinite scroll mode
2026-04-05 20:01:33 -05:00
pax
83bec9d649 Don't prefetch full images on infinite scroll drain
Infinite scroll only needs thumbnails (already fetched inline).
Full image prefetch only triggers on post click and initial search.
2026-04-05 19:56:27 -05:00
pax
0aa5d139d3 Prefetch modes: Off / Adjacent (4 cardinals) / Full page (spiral)
- Off: no prefetching
- Adjacent: simultaneous left/right/up/down (4 posts)
- Full page: ring expansion in all 8 directions
Dropdown in Settings > General replaces the old checkbox.
2026-04-05 19:55:21 -05:00
pax
81b609f55e Trigger cache eviction after infinite scroll page drain
Prevents unbounded cache growth during long infinite scroll
sessions. Runs after each batch of posts finishes loading.
2026-04-05 19:50:04 -05:00
pax
39733e4865 Convert animated PNG and WebP to GIF for Qt playback
PIL extracts frames with durations, saves as animated GIF.
Non-animated PNG/WebP kept as-is. Converted on download and
on cache access (for already-cached files). Same pattern as
ugoira zip conversion.
2026-04-05 19:41:34 -05:00
pax
ee329519de Handle non-JSON API responses gracefully
Some boorus return empty/HTML responses for tag-limited queries.
All API clients now catch JSON parse errors and return empty
results instead of crashing.
2026-04-05 19:31:43 -05:00
pax
c93cd9b97c Animated filter: server-side tag only, remove client-side scanning
Uses 'animated' as a search tag (server handles it). Removed
client-side extension filter and backfill cap increases. Fast
and doesn't hit rate limits.
2026-04-05 19:20:25 -05:00
pax
d22547ad34 Animated filter: scan up to 50 pages, don't stop on short batches
Short API pages (< limit) no longer stop the scan when animated
filter is on — keeps looking through more pages. Only stops on
truly empty API response or 50 page cap.
2026-04-05 19:12:55 -05:00
pax
c035308030 Animated filter: client-side only, 20 page backfill cap
Removed server-side tag (wastes a search slot). Client-side
filter with 20 page backfill when animated is checked (vs 5
normally) to find enough animated posts.
2026-04-05 19:09:41 -05:00
pax
fe5dde7a2f Use 'animated' tag for all boorus — universal support 2026-04-05 19:07:06 -05:00
pax
33e10e8079 Animated filter: server-side filetype tag for full results
Danbooru/e621: filetype:gif,mp4,webm,zip
Gelbooru/Moebooru: animated tag
Client-side filter kept as fallback safety net.
2026-04-05 19:04:52 -05:00
pax
c577d7005a Add Animated checkbox — filters to only show video/gif/animated posts
Client-side filter by file extension. Works with backfill and
infinite scroll. Unchecked shows everything, checked shows only
gif/mp4/webm/mkv/mov/zip(ugoira).
2026-04-05 19:00:03 -05:00
pax
05e0a1783f Use - and + for score buttons instead of Unicode triangles 2026-04-05 18:41:39 -05:00
pax
f6452683ff Add red data removal checkbox to uninstaller
Optional checkbox in bold red: REMOVE ALL USER DATA (BOOKMARKS,
CACHE, LIBRARY — DATA LOSS). Unchecked by default. Deletes
%APPDATA%/booru-viewer if checked.
2026-04-05 18:31:13 -05:00
pax
8ebed2f281 Replace score spinbox arrows with side-by-side buttons
Hides QSpinBox arrows (break under QSS) and adds two separate
QPushButtons with triangle characters. Theme-friendly since
they're styled as normal buttons.
2026-04-05 18:27:14 -05:00
pax
602a71d534 Reset shared HTTP clients on startup to prevent event loop closed error
Cacheless mode closes the app while clients may still reference
the old event loop. Resetting to None on startup forces fresh
client creation on the new event loop.
2026-04-05 18:20:20 -05:00
pax
9c07fbd880 v0.1.8 v0.1.8 2026-04-05 18:15:15 -05:00
pax
73a21b86a4 Fix installer.iss — Windows line endings, simpler config 2026-04-05 18:00:55 -05:00
pax
1983f6bc54 Add Inno Setup installer script, update README for installer v0.1.7 2026-04-05 17:56:09 -05:00
pax
760dc290d8 Clear preview on new search 2026-04-05 17:52:15 -05:00
pax
1807f77dd4 Fix Gelbooru CDN — pass Referer header per-request
Shared client doesn't set Referer globally since it varies per
domain. Now passed as per-request header so Gelbooru CDN doesn't
return HTML captcha pages.
2026-04-05 17:45:57 -05:00
pax
bfed81159b Optimize PyInstaller: noarchive, optimize=2, no UPX
Loose .pyc files avoid zip decompression, optimize=2 strips
docstrings, no UPX avoids decompression overhead at launch.
2026-04-05 17:42:03 -05:00
pax
4ea171986b Switch to --onedir for faster startup on Windows 2026-04-05 17:36:08 -05:00
pax
ce92e6d57f Fix infinite scroll when content doesn't fill viewport
Detect when scrollbar max is 0 (no scroll needed) and auto-load
more posts. Checks after initial search and after each drain.
2026-04-05 17:35:01 -05:00
pax
21980fdbc7 Auto-load next page after drain if still at bottom 2026-04-05 17:27:33 -05:00
pax
96c57d16a9 Share HTTP client across all API calls for Windows performance
Single shared httpx.AsyncClient for all BooruClient instances
(Danbooru, Gelbooru, Moebooru) with connection pooling.
E621 gets its own shared client (custom User-Agent required).
Site detection also reuses the shared client.
Eliminates per-request TLS handshakes on Windows.
2026-04-05 17:22:30 -05:00
pax
4987765520 Code audit fixes: crash guards, memory caps, unused imports, bounds checks
- Fix pop(0) crash on empty append queue
- Cap page cache to 10 pages (pagination mode only)
- Bounds check before data[0] in gelbooru/moebooru get_post
- Move json import to top level in db.py
- Remove unused imports (Slot, contextmanager)
- Safe dict access in _row_to_bookmark
- Remove redundant datetime import in save_library_meta
- Add threading import for future DB locking
2026-04-05 17:18:27 -05:00
pax
1e87ca4216 Fix missing field import in db.py 2026-04-05 17:12:02 -05:00
pax
d2aae5cd82 Store tag categories in bookmarks, tag click switches to Browse
- Bookmarks DB now stores tag_categories as JSON
- Migration adds column to existing favorites table
- Bookmark info panel uses stored categories directly
- Falls back to library_meta if bookmark has no categories
- Tag click in info panel: clears preview, switches to Browse, searches
2026-04-05 17:09:01 -05:00
pax
87c42f806e Fix library/bookmark info panel, save indicator, DB migration
- Migrate library_meta to add tag_categories column
- Info panel always updates (not gated on isVisible)
- Library info shows status bar with score/rating
- Save indicator: changed elif to if so Saved always triggers
- Bookmark info panel always populated
2026-04-05 16:58:22 -05:00
pax
29ffe0be7a Store tag categories in library metadata, unsave from bookmarks
- tag_categories stored as JSON in library_meta table
- Library and Bookmarks info panels show categorized tags
- Bookmarks falls back to library_meta for categories
- Added Unsave from Library to bookmarks right-click menu
2026-04-05 16:46:48 -05:00
pax
96740acb4c Show correct tags in info panel for Library and Bookmarks
Library looks up metadata from library_meta table by post ID.
Bookmarks creates a Post from the bookmark's stored tags/score/rating.
2026-04-05 16:39:39 -05:00
pax
337d5d8087 Library metadata: store tags on save, search by tag in Library
- library_meta table stores tags, score, rating, source per post
- Metadata saved automatically when saving from Browse
- Search box in Library tab filters by tags via DB lookup
- Works with all file types
2026-04-05 16:37:12 -05:00
pax
ea089075e6 Copy browse thumbnail to library cache on save
When saving a post to library, copies the booru preview thumbnail
to thumbnails/library/ so the Library tab shows it instantly
without needing to regenerate.
2026-04-05 16:28:53 -05:00
pax
4512cba629 Priority downloads — clicked post pauses prefetch
When a post is activated, prefetch pauses via asyncio.Event.
The clicked post downloads at full speed without competing.
Prefetch resumes after the download completes.
2026-04-05 16:26:29 -05:00
pax
ee9d06755f Connection pooling for thumbnails, wider score spinbox
Shared httpx.AsyncClient reuses TLS connections across thumbnail
downloads — avoids 40 separate TLS handshakes per page on Windows.
Score spinbox widened to 90px with explicit arrow buttons.
2026-04-05 16:19:10 -05:00
pax
9d11a403d7 Update README.md for v0.1.7 features 2026-04-05 15:51:30 -05:00
pax
e59e405d73 v0.1.7 — Unified QMimeData clipboard across all tabs 2026-04-05 15:44:00 -05:00
pax
7b6a9ab911 Use QMimeData for clipboard — same as drag and drop
Sets both file URL and image data on clipboard so it works
with file managers (paste as file) and image apps (paste as
image). No more wl-copy dependency for copying.
v0.1.6
2026-04-05 15:40:16 -05:00