54 Commits

Author SHA1 Message Date
pax
ee9d67e853 fix releases links again 2026-04-09 23:28:05 -05:00
pax
8ee7a2704b fix releases link in readme 2026-04-09 23:14:51 -05:00
pax
c02cc4fc38 Update README.md 2026-04-10 03:39:08 +00:00
pax
f63ac4c6d8 Releases URL points to gitea/github respectively 2026-04-10 03:34:28 +00:00
pax
6833ae701d Releases URL points to gitea/github respectively 2026-04-09 22:32:21 -05:00
pax
cc7ac67cac Update readme for v0.2.4 2026-04-09 22:29:36 -05:00
pax
003a2b221e Updated README 2026-04-09 16:38:45 -05:00
pax
75caf8c520 Updated README to drop the Windows screenshots and swap positions 2026-04-09 00:37:30 -05:00
pax
1b66b03a30 Untrack tests/ directory and related dev tooling
Removes the tests/ folder from git tracking and adds it to .gitignore.
The 81 tests (16 Phase A core + 65 popout state machine) stay on
disk as local-only working notes, the same way docs/ and project.md
are gitignored. Running them is `pytest tests/` from the project
root inside .venv as before — nothing about the tests themselves
changed, just whether they're version-controlled.

Reverts the related additions in pyproject.toml and README.md from
commit bf14466 (Phase A baseline) so the public surface doesn't
reference a tests/ folder that no longer ships:

  - pyproject.toml: drops [project.optional-dependencies] test extra
    and [tool.pytest.ini_options]. pytest + pytest-asyncio are still
    installed in the local .venv via the previous pip install -e ".[test]"
    so the suite keeps running locally; new clones won't get them
    automatically.

  - README.md: drops the "Run tests:" section from the Linux install
    block. The README's install instructions return to their pre-
    Phase-A state.

  - .gitignore: adds `tests/` alongside the existing `docs/` and
    `project.md` lines (the same convention used for the refactor
    inventory / plan / notes / final report docs).

The 12 test files removed from tracking (`git rm -r --cached`):
  tests/__init__.py
  tests/conftest.py
  tests/core/__init__.py
  tests/core/test_cache.py
  tests/core/test_concurrency.py
  tests/core/test_config.py
  tests/core/test_db.py
  tests/core/api/__init__.py
  tests/core/api/test_base.py
  tests/gui/__init__.py
  tests/gui/popout/__init__.py
  tests/gui/popout/test_state.py

Verification:
  - tests/ still exists on disk
  - `pytest tests/` still runs and passes 81 / 81 in 0.11s
  - `git ls-files tests/` returns nothing
  - `git status` is clean
2026-04-08 20:47:50 -05:00
pax
bf14466382 Add Phase A test suite for core/ primitives
First regression-test layer for booru-viewer. Pure Python — no Qt, no
mpv, no network, no real filesystem outside tmp_path. Locks in the
security and concurrency invariants from the 54ccc40 + eb58d76 hardening
commits ahead of the upcoming popout state machine refactor (Prompt 3),
which needs a stable baseline to refactor against.

16 tests across five files mirroring the source layout under
booru_viewer/core/:

- tests/core/test_db.py (4):
  - _validate_folder_name rejection rules (.., /foo, \\foo, .hidden,
    ~user, empty) and acceptance categories (unicode, spaces, parens)
  - add_bookmark INSERT OR IGNORE collision returns the existing row
    id (locks in the lastrowid=0 fix)
  - get_bookmarks LIKE escaping (literal cat_ear does not match catear)

- tests/core/test_cache.py (7):
  - _referer_for hostname suffix matching (gelbooru.com / donmai.us
    apex rewrite, both exact-match and subdomain)
  - _referer_for rejects substring attackers
    (imgblahgelbooru.attacker.com does NOT pick up the booru referer)
  - ugoira frame-count and uncompressed-size caps refuse zip bombs
    before any decompression
  - _do_download MAX_DOWNLOAD_BYTES enforced both at the
    Content-Length pre-check AND in the chunk-loop running total
  - _is_valid_media returns True on OSError (no delete + redownload
    loop on transient EBUSY)

- tests/core/test_config.py (2):
  - saved_folder_dir rejects literal .. and ../escape
  - find_library_files walks root + 1 level, filters by
    MEDIA_EXTENSIONS, exact post-id stem match

- tests/core/test_concurrency.py (2):
  - get_app_loop raises RuntimeError before set_app_loop is called
  - run_on_app_loop round-trips a coroutine result from a worker
    thread loop back to the test thread

- tests/core/api/test_base.py (1):
  - BooruClient._shared_client lazy singleton constructor-once under
    10-thread first-call race

Plus tests/conftest.py with fixtures: tmp_db, tmp_library,
reset_app_loop, reset_shared_clients. All fixtures use tmp_path or
reset module-level globals around the test so the suite is parallel-
safe.

pyproject.toml:
- New [project.optional-dependencies] test extra: pytest>=8.0,
  pytest-asyncio>=0.23
- New [tool.pytest.ini_options]: asyncio_mode = "auto",
  testpaths = ["tests"]

README.md:
- Linux install section gains "Run tests" with the
  pip install -e ".[test]" + pytest tests/ invocation

Phase B (post-sweep VideoPlayer regression tests for the seek slider
pin, _pending_mute lazy replay, and volume replay) is deferred to
Prompt 3's state machine work — VideoPlayer cannot be instantiated
without QApplication and a real mpv, which is out of scope for a
unit test suite. Once the state machine carves the pure-Python state
out of VideoPlayer, those tests become trivial against the helper
module.

Suite runs in 0.07s (16 tests). Independent of Qt/mpv/network/ffmpeg.

Test cases for Prompt 3:
- (already covered) — this IS the test suite Prompt 3 builds on top of
2026-04-08 18:50:00 -05:00
pax
3f2c8aefe3 README: positioning rewrite, Why section, split Bookmarks/Library, theming + backup notes
- Replace tagline with positioning ("for people who keep what they save and rice what they run") and fold backend names into the factual sub-line in strict alphabetical order
- Add Why booru-viewer section between Screenshots and Features: names ahoviewer / Grabber / Hydrus, lays out the labor axis (who does the filing) and the desktop axis (Hyprland/Wayland targeting)
- Split intertwined Bookmarks & Library section into two distinct sections. Bookmarks gets the browser-star framing with the bookmark-folder vs library-folder separation noted; Library absorbs save/promotion/folder content and gets the tag-search bullet
- Add three-tab callout at the top of Features mapping Browse/Bookmarks/Library to commitment levels
- Browsing thumbnail grid bullet absorbs grid-wide features (multi-select, bulk context menus, drag-out)
- Theming: note that each bundled theme ships in rounded and square variants
- Data Locations: backup recipe explaining the saved/ + booru.db split and recovery path
2026-04-07 18:58:35 -05:00
pax
72150fc98b Add BOORU_VIEWER_NO_HYPR_RULES + BOORU_VIEWER_NO_POPOUT_ASPECT_LOCK env vars for ricers with their own windowrules 2026-04-07 12:27:22 -05:00
pax
56cb5ce1df Scroll tilt navigates one cell/post in grid, preview, and popout 2026-04-07 08:50:13 -05:00
pax
2fbf2f6472 0.2.0: mpv backend, popout viewer, preview toolbar, API retry, SearchState refactor
Video:
- Replace Qt Multimedia with mpv via python-mpv + OpenGL render API
- Hardware-accelerated decoding, frame-accurate seeking, proper EOF detection
- Translucent overlay controls in both preview and popout
- LC_NUMERIC=C for mpv locale compatibility

Popout viewer (renamed from slideshow):
- Floating toolbar + controls overlay with auto-hide (2s)
- Window auto-resizes to content aspect ratio on navigation
- Hyprland: hyprctl resizewindowpixel + keep_aspect_ratio prop
- Window geometry persisted to DB across sessions
- Smart F11 exit sizing (60% monitor, centered)

Preview toolbar:
- Bookmark, Save, BL Tag, BL Post, Popout buttons above preview
- Save opens folder picker menu, shows Save/Unsave state
- Blacklist actions have confirmation dialogs
- Per-tab button visibility (Library: Save + Popout only)
- Cross-tab state management with grid selection clearing

Search & pagination:
- SearchState dataclass replaces 8 scattered attrs + defensive getattr
- Media type filter dropdown (All/Animated/Video/GIF/Audio)
- API retry with backoff on 429/503/timeout
- Infinite scroll dedup fix (local seen set per backfill round)
- Prev/Next buttons hide at boundaries, "(end)" status indicator

Grid:
- Rubber band drag selection
- Saved/bookmarked dots update instantly across all tabs
- Library/bookmarks emit signals on file deletion for cross-tab sync

Settings & misc:
- Default site option
- Max thumbnail cache setting (500MB default)
- Source URLs clickable in info panel
- Long URLs truncated to prevent splitter blowout
- Bulk save no longer auto-bookmarks
2026-04-06 13:43:46 -05:00
pax
b82b51bb40 Darken Ko-fi badge for better contrast 2026-04-05 23:28:09 -05:00
pax
52126401cb Fix Ko-fi badge — green right side for visible split 2026-04-05 23:27:38 -05:00
pax
61a39f55d0 Unify Ko-fi badge into single section 2026-04-05 23:26:10 -05:00
pax
cb43e53583 Add support text above Ko-fi button 2026-04-05 23:13:02 -05:00
pax
58931f6fc4 Move Ko-fi button to top of README 2026-04-05 23:12:32 -05:00
pax
fee94ccf46 Style Ko-fi badge to match green-on-black theme 2026-04-05 23:09:54 -05:00
pax
3986af0a7e Add Ko-fi donate button to README 2026-04-05 23:07:02 -05:00
pax
dc496a57ba Add tested sites list to README 2026-04-05 22:35:47 -05:00
pax
1aba26aa81 Simplify install path wording in README 2026-04-05 21:42:01 -05:00
pax
626785b965 Fix install path in README — localappdata, not program files 2026-04-05 21:41:25 -05:00
pax
838967f83f Bump version to 0.1.9, update README 2026-04-05 21:30:50 -05:00
pax
1983f6bc54 Add Inno Setup installer script, update README for installer 2026-04-05 17:56:09 -05:00
pax
9d11a403d7 Update README.md for v0.1.7 features 2026-04-05 15:51:30 -05:00
pax
ac2c15be29 Slideshow blacklist buttons, Ctrl+C copy, fix README code blocks
- BL Tag button in slideshow: opens categorized tag menu
- BL Post button in slideshow: blacklists current post
- Ctrl+C copies preview image to clipboard
- "Copy Image to Clipboard" in grid right-click menu
- Fix README code block formatting (missing closing backticks)
- Add ffmpeg back to Linux install deps
2026-04-05 14:04:15 -05:00
pax
a7a76018d8 Add scroll wheel volume and Ctrl+P to slideshow keybinds in README 2026-04-05 12:45:42 -05:00
pax
1cc7bc06c1 Privacy screen hides slideshow and pauses video, update keybinds
- Ctrl+P now hides slideshow window and pauses all video playback
- Slideshow restored when privacy screen is toggled off
- README keybinds: arrow keys + hjkl for preview navigation
2026-04-05 04:48:41 -05:00
pax
d87a060537 Document selection/hover highlight and fix README accuracy
- theme docs: selection-background-color controls border + hover
- README: fix ffmpeg mention, update library feature list
2026-04-05 04:38:57 -05:00
pax
660abe42e7 Replace ffmpeg with Qt-native video thumbnails
Use QMediaPlayer + QVideoSink to grab the first frame instead
of shelling out to ffmpeg. Removes ffmpeg as a dependency entirely.
2026-04-05 04:16:38 -05:00
pax
b1ce736abd Add video playback deps to Linux install (GStreamer/ffmpeg backend) 2026-04-05 04:10:42 -05:00
pax
7c657b68c1 Expand Linux install instructions in README
Per-distro package commands (Arch, Ubuntu, Fedora), venv setup,
desktop entry example, ffmpeg note for video thumbnails.
2026-04-05 04:09:25 -05:00
pax
192397f1ec Pre-release fixes for v0.1.5
- Fix Library slideshow navigation (was falling through to Browse)
- Fix bookmarks import signal using wrong variable name
- Fix "Favoriting" status message → "Bookmarking"
- Rename FavThumbSignals → BookmarkThumbSignals
- Update README: all Favorite→Bookmark, add Library section
- Add Library tab to keybinds documentation
2026-04-05 03:13:00 -05:00
pax
f13a2f6b28 Add scroll tilt to keybinds in README 2026-04-05 00:11:05 -05:00
pax
bd8b7c08a6 Add Everforest theme, theming documentation
- Everforest theme (green accent, earthy tones)
- themes/README.md: complete QSS reference for targeting every
  widget, state, and visual element
2026-04-04 23:02:44 -05:00
pax
fd5c163225 Add bundled themes with screenshots in README
5 included themes: Nord, Catppuccin Mocha, Gruvbox, Solarized Dark,
Tokyo Night. Copy any .qss from themes/ to custom.qss to use.
2026-04-04 22:57:00 -05:00
pax
4553ea8981 Add Windows 11 screenshots to README 2026-04-04 22:35:13 -05:00
pax
27368b1ebc Update Windows screenshots with tag categories visible 2026-04-04 22:27:32 -05:00
pax
70d9f12460 Add Privacy section to README 2026-04-04 21:07:02 -05:00
pax
0fb41b833a Link VP9 Video Extensions in README 2026-04-04 20:57:55 -05:00
pax
10ef710c1a Remove +/- zoom keybinds from README (non-functional) 2026-04-04 20:52:04 -05:00
pax
bde1465af4 Rewrite README to reflect all v0.1.0-v0.1.3 features 2026-04-04 20:50:30 -05:00
pax
967bdb4612 Update screenshot labels: Windows 10 light, Windows 11 dark 2026-04-04 18:38:08 -05:00
pax
4dfd2122a1 Add Windows dark theme screenshot to README 2026-04-04 17:05:20 -05:00
pax
538a42296e Move custom.qss mention below screenshots in README 2026-04-04 16:33:51 -05:00
pax
0046b34172 Label screenshots in README 2026-04-04 16:32:53 -05:00
pax
2ab5d191b6 Cap screenshot width in README 2026-04-04 16:12:02 -05:00
pax
da7db19c8b Make screenshot images non-clickable in README 2026-04-04 16:09:58 -05:00