|
|
@@ -56,7 +56,7 @@ class Indexer(Thread):
|
|
|
buffer = deque()
|
|
|
|
|
|
# -- Walk through music folders
|
|
|
- # Index new files
|
|
|
+ # Put new files in buffer
|
|
|
for music_folder in music_folders:
|
|
|
music_folder_path = Path(music_folder.path)
|
|
|
|
|
|
@@ -89,7 +89,7 @@ class Indexer(Thread):
|
|
|
buffer.append(track.id)
|
|
|
del index[filename]
|
|
|
|
|
|
- # Index missing files
|
|
|
+ # Put missing files in buffer
|
|
|
for filename, track in index.items():
|
|
|
if track.id in buffer:
|
|
|
continue
|
|
|
@@ -104,7 +104,7 @@ class Indexer(Thread):
|
|
|
while buffer:
|
|
|
filename_or_id = buffer.pop()
|
|
|
try:
|
|
|
- track = self.index(track_repo, filename_or_id)
|
|
|
+ track = self.index(track_repo, filename_or_id, tracks)
|
|
|
tracks.append(track)
|
|
|
except AlreadyIndexed:
|
|
|
pass
|
|
|
@@ -124,9 +124,11 @@ class Indexer(Thread):
|
|
|
logger.info(f"{len(tracks)} tracks indexed")
|
|
|
|
|
|
@staticmethod
|
|
|
- def index(track_repo, filename_or_track_id):
|
|
|
+ def index(track_repo, filename_or_track_id, previously_indexed=None):
|
|
|
""" index a media file from the filesystem or a track id """
|
|
|
|
|
|
+ previously_indexed = previously_indexed or []
|
|
|
+
|
|
|
if type(filename_or_track_id) is int:
|
|
|
track = track_repo.get_by_id(filename_or_track_id)
|
|
|
filename = Path(track.path)
|
|
|
@@ -145,6 +147,9 @@ class Indexer(Thread):
|
|
|
|
|
|
track_hash = hash_file(filename)
|
|
|
|
|
|
+ if any(t.hash == track_hash for t in previously_indexed):
|
|
|
+ raise AlreadyIndexed(f"File already indexed")
|
|
|
+
|
|
|
track = track_repo.get_by_hash(track_hash)
|
|
|
if not track:
|
|
|
track = Track()
|
|
|
@@ -155,7 +160,7 @@ class Indexer(Thread):
|
|
|
vlc_media.parse()
|
|
|
|
|
|
title = vlc_media.get_meta(vlc.Meta.Title)
|
|
|
- if not title or title == '(null)':
|
|
|
+ if not title or title == '(null)' or title == filename.name:
|
|
|
title = filename.stripext().name
|
|
|
track.title = title
|
|
|
track.format = filename.ext
|