aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/indexer/indexer.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/indexer/indexer.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/indexer/indexer.py17
1 files changed, 17 insertions, 0 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/indexer/indexer.py b/packages/meshbay-node/src/meshbay_node/indexer/indexer.py
index 3ca34f6..10981c0 100644
--- a/packages/meshbay-node/src/meshbay_node/indexer/indexer.py
+++ b/packages/meshbay-node/src/meshbay_node/indexer/indexer.py
@@ -79,6 +79,19 @@ def _is_indexable(path: Path) -> bool:
)
+# Found live: a 1256-byte ".mp3" with no audio stream at all, just an ID3
+# tag — a truncated/corrupted rip, sitting between two good tracks of the
+# same album (docs/musicbay.md). A source this small claiming to be audio
+# is far more likely broken than real, so it is skipped before ever being
+# hashed rather than indexed and left to fail at playback time. Scoped to
+# audio only — a tiny real file of any other type is still worth indexing.
+MIN_AUDIO_SIZE_BYTES = 50 * 1024
+
+
+def _is_indexable_size(path: Path, size: int) -> bool:
+ return not (_detect_type(path) == "audio" and size < MIN_AUDIO_SIZE_BYTES)
+
+
_HASH_CHUNK = 8 * 1024 * 1024 # 8 MB streaming hash chunks
@@ -134,6 +147,8 @@ def _scan_file(root: Root, file_path: Path) -> IndexEntry | None:
return None
try:
stat = file_path.stat()
+ if not _is_indexable_size(file_path, stat.st_size):
+ return None
hasher = blake3.blake3()
# long_path is a no-op off Windows; there it is what lets a deep media
# library past MAX_PATH.
@@ -338,6 +353,8 @@ class DirectoryIndexer:
st = file_path.stat()
except OSError:
return None
+ if not _is_indexable_size(file_path, st.st_size):
+ return None
if self._cache is not None:
cached = await self._cache.lookup(str(file_path), st.st_size, st.st_mtime)