main_window: library tab info panel + preview work for templated files

Two more digit-stem-only callsites I missed in the saved-dot fix
sweep. _set_library_info and _show_library_post both did
'if not stem.isdigit(): return' before consulting library_meta or
building the toolbar Post. Templated files (post-template-refactor
saves like 12345_hatsune_miku.jpg) bailed out silently — clicking
one in the Library tab left the info panel showing the previous
selection's data and the toolbar actions did nothing.

Extracted a small helper _post_id_from_library_path that resolves
either layout: look up library_meta.filename first (templated),
fall back to int(stem) for legacy digit-stem files. Both call sites
go through the helper now.

Same pattern as the find_library_files / _is_post_in_library
fixes from the earlier saved-dot bug. With this commit there are
no remaining "is templated file in the library?" callsites that
fall back to digit-stem matching alone — every check is
format-agnostic via the DB.
This commit is contained in:
pax 2026-04-09 17:45:20 -05:00
parent a27672b95e
commit 81fc4d93eb

View File

@ -1447,16 +1447,32 @@ class BooruApp(QMainWindow):
if evicted_thumbs:
log.info(f"Auto-evicted {evicted_thumbs} thumbnails")
def _post_id_from_library_path(self, path: Path) -> int | None:
"""Resolve a library file path back to its post_id.
Templated filenames look up library_meta.filename (post-refactor
saves like 12345_hatsune_miku.jpg). Legacy v0.2.3 digit-stem
files (12345.jpg) use int(stem) directly. Returns None if
neither resolves e.g. an unrelated file dropped into the
library directory.
"""
pid = self._db.get_library_post_id_by_filename(path.name)
if pid is not None:
return pid
if path.stem.isdigit():
return int(path.stem)
return None
def _set_library_info(self, path: str) -> None:
"""Update info panel with library metadata for the given file."""
stem = Path(path).stem
if not stem.isdigit():
post_id = self._post_id_from_library_path(Path(path))
if post_id is None:
return
meta = self._db.get_library_meta(int(stem))
meta = self._db.get_library_meta(post_id)
if meta:
from ..core.api.base import Post
p = Post(
id=int(stem), file_url=meta.get("file_url", ""),
id=post_id, file_url=meta.get("file_url", ""),
preview_url=None, tags=meta.get("tags", ""),
score=meta.get("score", 0), rating=meta.get("rating"),
source=meta.get("source"), tag_categories=meta.get("tag_categories", {}),
@ -1475,10 +1491,11 @@ class BooruApp(QMainWindow):
self._set_preview_media(path, Path(path).name)
self._update_fullscreen(path, Path(path).name)
self._set_library_info(path)
# Build a Post from library metadata so toolbar actions work
stem = Path(path).stem
if stem.isdigit():
post_id = int(stem)
# Build a Post from library metadata so toolbar actions work.
# Templated filenames go through library_meta.filename;
# legacy digit-stem files use int(stem).
post_id = self._post_id_from_library_path(Path(path))
if post_id is not None:
from ..core.api.base import Post
meta = self._db.get_library_meta(post_id) or {}
post = Post(