config: find_library_files now matches templated filenames
When given an optional db handle, find_library_files queries library_meta for templated filenames belonging to the post and matches them alongside the legacy digit-stem stem == str(post_id) heuristic. Without db it degrades to the legacy-only behavior, so existing callers don't break — but every caller in the gui layer has a Database instance and will be updated to pass it. This is the foundation for the bookmark/browse saved-dot indicator fix and the delete_from_library fix in the next three commits.
This commit is contained in:
parent
28348fa9ab
commit
6f59de0c64
@ -128,28 +128,59 @@ def library_folders() -> list[str]:
|
|||||||
return sorted(d.name for d in root.iterdir() if d.is_dir())
|
return sorted(d.name for d in root.iterdir() if d.is_dir())
|
||||||
|
|
||||||
|
|
||||||
def find_library_files(post_id: int) -> list[Path]:
|
def find_library_files(post_id: int, db=None) -> list[Path]:
|
||||||
"""Return all library files matching `post_id` across every folder.
|
"""Return all library files matching `post_id` across every folder.
|
||||||
|
|
||||||
The library has a flat shape: root + one level of subdirectories.
|
The library has a flat shape: root + one level of subdirectories.
|
||||||
We walk it shallowly (one iterdir of root + one iterdir per subdir)
|
Walks shallowly (one iterdir of root + one iterdir per subdir)
|
||||||
looking for any media file whose stem equals str(post_id). Used by:
|
and matches files in two ways:
|
||||||
- "is this post saved?" badges (any match → yes)
|
1. Legacy v0.2.3 layout: stem equals str(post_id) (e.g. 12345.jpg).
|
||||||
- delete_from_library (delete every match — handles duplicates left
|
2. Templated layout (post-refactor): basename appears in
|
||||||
by the old save-to-folder copy bug in a single click)
|
`library_meta.filename` for this post_id.
|
||||||
- the move-aware _save_to_library / library "Move to Folder" actions
|
|
||||||
|
The templated match requires `db` — when None, only the legacy
|
||||||
|
digit-stem path runs. Pass `db=self._db` from any caller that
|
||||||
|
has a Database instance handy (essentially every gui caller).
|
||||||
|
Used by:
|
||||||
|
- delete_from_library (delete every copy on disk)
|
||||||
|
- main_window's bookmark→library preview lookup
|
||||||
|
- the unified save flow's pre-existing-copy detection (now
|
||||||
|
handled inside save_post_file via _same_post_on_disk)
|
||||||
"""
|
"""
|
||||||
matches: list[Path] = []
|
matches: list[Path] = []
|
||||||
root = saved_dir()
|
root = saved_dir()
|
||||||
if not root.is_dir():
|
if not root.is_dir():
|
||||||
return matches
|
return matches
|
||||||
|
|
||||||
stem = str(post_id)
|
stem = str(post_id)
|
||||||
|
|
||||||
|
# Templated filenames stored for this post, if a db handle was passed.
|
||||||
|
templated: set[str] = set()
|
||||||
|
if db is not None:
|
||||||
|
try:
|
||||||
|
rows = db.conn.execute(
|
||||||
|
"SELECT filename FROM library_meta WHERE post_id = ? AND filename != ''",
|
||||||
|
(post_id,),
|
||||||
|
).fetchall()
|
||||||
|
templated = {r["filename"] for r in rows}
|
||||||
|
except Exception:
|
||||||
|
pass # DB issue → degrade to digit-stem-only matching
|
||||||
|
|
||||||
|
def _matches(p: Path) -> bool:
|
||||||
|
if p.suffix.lower() not in MEDIA_EXTENSIONS:
|
||||||
|
return False
|
||||||
|
if p.stem == stem:
|
||||||
|
return True
|
||||||
|
if p.name in templated:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
for entry in root.iterdir():
|
for entry in root.iterdir():
|
||||||
if entry.is_file() and entry.stem == stem and entry.suffix.lower() in MEDIA_EXTENSIONS:
|
if entry.is_file() and _matches(entry):
|
||||||
matches.append(entry)
|
matches.append(entry)
|
||||||
elif entry.is_dir():
|
elif entry.is_dir():
|
||||||
for sub in entry.iterdir():
|
for sub in entry.iterdir():
|
||||||
if sub.is_file() and sub.stem == stem and sub.suffix.lower() in MEDIA_EXTENSIONS:
|
if sub.is_file() and _matches(sub):
|
||||||
matches.append(sub)
|
matches.append(sub)
|
||||||
return matches
|
return matches
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user