summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/indexer/group_index.py
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-08-26 01:08:58 +0200
committerChristophe Besson <cbesson@gmail.com>2026-08-26 01:08:58 +0200
commit2d144d76cee55cf8faaacf196e716a0930dfd7e9 (patch)
tree1220d39cb30ccc8a58a80f85ba020b5b30bea9b7 /packages/meshbay-node/src/meshbay_node/indexer/group_index.py
parent704cfe37506fc5316c997b025004fbc9c4d2a47b (diff)
downloadmeshbay-2d144d76cee55cf8faaacf196e716a0930dfd7e9.tar.gz
fix(node,hub): key music/media metadata lookups by file_id, not path
IndexEntry.path is the *folder* a file is in (indexer.py's _virtual_dir docstring: "the directory a file appears in"), not the file itself. GroupIndex.get_entry_by_path() treated it as if it named one file, and every one of its four callers did too: _do_music_meta_request, _do_media_meta_request, _do_tmdb_override, and _admin_exec_tmdb_override. Any two files sharing a folder — an album is one folder with many tracks, a season is one folder with many episodes — collided: a lookup by path silently returned whichever entry the index happened to iterate to first, regardless of which file the client actually asked about. Found live (2026-08-25): three unrelated albums ("High Tone - Various", two "Le Peuple de l'Herbe" albums) all showed the same MusicBrainz cover, because all their representative tracks happened to sit in one "high_tone" folder alongside a track that legitimately matched that cover. A force-reload didn't help — the bug is server-side, not a stale client state. Fixed by keying these four request/response pairs by `file_id` (the entry's own content hash — already unique, already how every other lookup in the system identifies a file) instead of `path`, both in the wire messages (music_meta_req/resp, media_meta_req/resp, tmdb_override) and in music-app.js/video-app.js's own hooks. GroupIndex.get_entry_by_path is now unused and removed — GroupIndex.get_entry(file_id) already did the right thing. No test previously exercised either handler with two entries sharing a folder — the only existing coverage (test_tmdb_override_policy.py) gave each entry its own folder, so the bug never had a chance to show up. Added that scenario there and in two new test files, all confirmed failing against the pre-fix code before being confirmed green against the fix. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013XSohfUQQiaE77qyFLgSv3
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/indexer/group_index.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/indexer/group_index.py13
1 files changed, 0 insertions, 13 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/indexer/group_index.py b/packages/meshbay-node/src/meshbay_node/indexer/group_index.py
index 1ce4e0a..25081ef 100644
--- a/packages/meshbay-node/src/meshbay_node/indexer/group_index.py
+++ b/packages/meshbay-node/src/meshbay_node/indexer/group_index.py
@@ -78,19 +78,6 @@ class GroupIndex:
def get_entry(self, file_id: str) -> IndexEntry | None:
return self._entries.get(file_id)
- def get_entry_by_path(self, path: str) -> IndexEntry | None:
- """
- Linear scan — entries are keyed by content id, not path, and nothing
- before the Videos app needed to go the other way (a client always
- already has the id from index_sync/index_delta). Fine for an
- on-demand, per-tile lookup against a few thousand entries; revisit
- if a future caller makes this hot.
- """
- for entry in self._entries.values():
- if entry.path == path:
- return entry
- return None
-
@property
def entries(self) -> list[IndexEntry]:
return list(self._entries.values())