-
v0.2.8 Stable
released this
2026-08-19 22:26:14 -05:00 | 39 commits to main since this releasev0.2.8
Added
- Settings → Cache: Clear Tag Cache button — wipes the per-site
tag_typesrows (including the__batch_api_probe__sentinel) so Gelbooru/Moebooru backends re-probe and re-populate tag categories from scratch. Useful when a stale cache from an earlier build leaves some category types mis-labelled or missing
Changed
- Windows installer now ships
licenses\LGPL-2.1.txtandlicenses\THIRD-PARTY-NOTICES.txtalongside the app, naming the exact libmpv build, its source and checksum, and how to swap the DLL — the attribution and relink terms LGPL section 6 asks for when redistributing the library - Windows installer now bundles the LGPL build of libmpv instead of the GPL build. booru-viewer decodes video and never encodes it, so the GPL-only x264/x265 encoders were unused weight in an MIT-licensed app; H.264/HEVC/AV1/VP9 decoding is unaffected
- Thumbnail drag-start threshold raised from 10px to 30px to match the rubber band's gate — small mouse wobbles on a thumb no longer trigger a file drag
- Settings → Cache layout: Clear Tag Cache moved into row 1 alongside Clear Thumbnails and Clear Image Cache as a 3-wide non-destructive row; destructive Clear Everything + Evict stay in row 2
Fixed
- rule34.xxx misdetected as
danbooru, then failing Test Connection withHTTP 403 Forbidden. rule34 now serves a WAF HTML block page (403) at/posts.json, anddetect_site_typeread any 401/403 there as "Danbooru behind auth". The Danbooru and Moebooru probes now only treat 401/403 as conclusive when the body is actually JSON, so WAF-guarded Gelbooru-family hosts fall through to the Gelbooru probe. Behavior change: rule34.xxx detects asgelbooru - Gelbooru-shape sites answering HTTP 200 with a bare JSON string were reported as a search with zero results. rule34 now requires
api_key+user_idand replies"Missing authentication..."at 200, whichraise_for_status()cannot see;GelbooruClientnow raisesBooruAuthErrorinstead, and the Gelbooru probe treats that shape as a positive match. Behavior change: a missing or rejected API key surfaces as an error rather than an empty grid - Grid blanked out after splitter drag or tile/float toggle until the next scroll —
ThumbnailGrid.resizeEventnow re-runs_recycle_offscreenagainst the new geometry so thumbs whose pixmap was evicted by a column-count shift get refreshed into view. Behavior change: no more blank grid after resize - Status bar overwrote the per-post info set by
_on_post_selectedwith"N results — Loaded"the moment the image finished downloading, hiding tag counts / post ID until the user re-clicked;on_image_donenow preserves the incominginfostring category_fetcher._do_ensureno longer permanently flips_batch_api_worksto False when a transient network error drops a tag-API request mid-call; the unprobed path now routes through_probe_batch_api, which distinguishes clean 200-with-zero-matches (structurally broken, flip) from timeout/HTTP-error (transient, retry next call)- Bookmark→library save and bookmark Save As now plumb the active site's
CategoryFetcherthrough to the filename template, so%artist%/%character%tokens render correctly instead of silently dropping out when saving a post that wasn't previewed first - Info panel no longer silently drops tags that failed to land in a cached category — any tag from
post.tag_listnot rendered under a known category section now appears in an "Other" bucket, so partial cache coverage can't make individual tags invisible BooruClient._requestretries now coverhttpx.RemoteProtocolErrorandhttpx.ReadErrorin addition to the existing timeout/connect/network set — an overloaded booru that drops the TCP connection mid-response no longer fails the whole search on the first try- VRAM retained when no video is playing —
stop()now frees the GL render context (textures + FBOs) instead of just dropping the hwdec surface pool. Context is recreated lazily on nextplay_file()viaensure_gl_init()(~5ms, invisible behind network fetch)
Refactored
category_fetcherbatch tag-API params are now built by a shared_build_tag_api_paramshelper instead of duplicated acrossfetch_via_tag_apiand_probe_batch_apidetect.detect_site_type— removed the leftoverif True:indent marker; no behavior changecore.http.make_client— single constructor for the threehttpx.AsyncClientinstances (cache download pool, API pool, detect probe). Each call site still keeps its own singleton and connection pool; only the construction is shared- Silent
except: passsites inpopout/window,video_player, andwindow_statenow carry one-line comments naming the absorbed failure and the graceful fallback (or were downgraded tolog.debug(..., exc_info=True)). No behavior change - Popout docstrings purged of in-flight-refactor commit markers (
skeleton,14a,14b,future commit) that referred to now-landed state-machine extraction; load-bearing commit 14b reference kept in_dispatch_and_applyas it still protects against reintroducing the bug core/cache.pytempfile cleanup:BaseExceptioncatch now documents why it's intentionally broader thanExceptionapi/e621andapi/moebooruJSON parse guards narrowed from bareexcepttoValueErrorgui/media/video_player.py—import timehoisted to module topgui/post_actions.is_in_library— deadtry/exceptstripped
Removed
- Unused
Favoritealias incore/db.py— callers migrated toBookmarkin 0.2.5, nothing referenced the fallback anymore
Downloads
- Settings → Cache: Clear Tag Cache button — wipes the per-site