|
|
@@ -3,10 +3,15 @@ import time
|
|
|
import vlc
|
|
|
from path import Path
|
|
|
|
|
|
+from core import logging_
|
|
|
+from core.exceptions import NotSupportedFile
|
|
|
from core.file_utilities import is_media_file_ext, hash_file
|
|
|
+from core.logging_ import Logger
|
|
|
from core.models import Track
|
|
|
from core.repositories import MusicFolderRepository, TrackRepository
|
|
|
|
|
|
+logger = Logger.get()
|
|
|
+
|
|
|
|
|
|
class Indexation:
|
|
|
def __init__(self):
|
|
|
@@ -18,15 +23,12 @@ class Indexation:
|
|
|
self.processed = set()
|
|
|
self.t0 = time.time()
|
|
|
|
|
|
- def start(self):
|
|
|
- self.index = {t.hash: t for t in self.track_repo.get_all()}
|
|
|
- self.processed = set()
|
|
|
- self.t0 = time.time()
|
|
|
- self.started = True
|
|
|
-
|
|
|
- def index_file(self, music_folder, filename):
|
|
|
- if not self.started:
|
|
|
- self.start()
|
|
|
+ def index_file(self, music_folder, filename, force_update=False):
|
|
|
+ filename = Path(filename)
|
|
|
+ if not filename.exists():
|
|
|
+ raise FileNotFoundError(f"File not found: {filename}")
|
|
|
+ if not is_media_file_ext(filename.ext):
|
|
|
+ raise NotSupportedFile(f"File's extension {filename.ext} is not supported")
|
|
|
|
|
|
vlc_media = vlc.Media(filename)
|
|
|
vlc_media.parse()
|
|
|
@@ -38,10 +40,13 @@ class Indexation:
|
|
|
print(" ... file already indexed, ignore: ", filename)
|
|
|
return
|
|
|
|
|
|
- if track_hash in self.index:
|
|
|
+ if self.index and track_hash in self.index:
|
|
|
track = self.index[track_hash]
|
|
|
else:
|
|
|
- track = Track()
|
|
|
+ track = next(iter(self.track_repo.get_by('hash', track_hash)), None) or Track()
|
|
|
+
|
|
|
+ if track.id and not force_update:
|
|
|
+ return track
|
|
|
|
|
|
track.profile_id = 0
|
|
|
track.music_folder_id = music_folder.id
|
|
|
@@ -60,51 +65,62 @@ class Indexation:
|
|
|
|
|
|
if track.id is not None:
|
|
|
self.track_repo.update(track)
|
|
|
- print('updated', filename)
|
|
|
+ logger.debug('Index - updated: %s' % filename)
|
|
|
else:
|
|
|
self.track_repo.create(track)
|
|
|
- print('created', filename)
|
|
|
+ logger.debug('Index - created: %s' % filename)
|
|
|
self.track_repo.commit()
|
|
|
|
|
|
- self.processed.add(track_hash)
|
|
|
+ return track
|
|
|
|
|
|
- def index_folder(self, music_folder):
|
|
|
-
|
|
|
- if not self.started:
|
|
|
- self.start()
|
|
|
+ def index_all(self, filter_music_folder_id=None, force_update=False):
|
|
|
+ self.index = {t.hash: t for t in self.track_repo.get_all()}
|
|
|
+ self.processed = set()
|
|
|
+ self.t0 = time.time()
|
|
|
+ self.started = True
|
|
|
|
|
|
- music_folder_path = Path(music_folder.path)
|
|
|
+ if filter_music_folder_id:
|
|
|
+ music_folders = [self.music_folder_repo.get_by_id(filter_music_folder_id)]
|
|
|
+ else:
|
|
|
+ music_folders = self.music_folder_repo.get_all()
|
|
|
|
|
|
- for filename in music_folder_path.walkfiles():
|
|
|
- if not is_media_file_ext(filename.ext):
|
|
|
- print(' ... ignored ... ', filename)
|
|
|
- continue
|
|
|
- self.index_file(music_folder, filename)
|
|
|
+ # add and update tracks
|
|
|
+ for music_folder in music_folders:
|
|
|
+ music_folder_path = Path(music_folder.path)
|
|
|
|
|
|
- def index_all(self):
|
|
|
- self.start()
|
|
|
+ for filename in music_folder_path.walkfiles():
|
|
|
+ if not is_media_file_ext(filename.ext):
|
|
|
+ continue
|
|
|
+ track = self.index_file(music_folder, filename, force_update=force_update)
|
|
|
+ self.processed.add(track.hash)
|
|
|
|
|
|
- music_folders = self.music_folder_repo.get_all()
|
|
|
- for music_folder in music_folders:
|
|
|
- self.index_folder(music_folder)
|
|
|
+ # mark missings
|
|
|
+ for hash_, track in self.index.items():
|
|
|
+ if hash_ in self.processed:
|
|
|
+ continue
|
|
|
+ track.status = Track.STATUS_UNAVAILABLE
|
|
|
+ self.track_repo.update(track, True)
|
|
|
+ logger.debug('Index - marked as unavailable: %s' % track.path)
|
|
|
|
|
|
|
|
|
class Indexer:
|
|
|
|
|
|
@staticmethod
|
|
|
- def index_file(music_folder, path):
|
|
|
+ def index_file(music_folder, path, force_update=False):
|
|
|
indexation = Indexation()
|
|
|
- indexation.index_file(music_folder, path)
|
|
|
+ indexation.index_file(music_folder, path, force_update=force_update)
|
|
|
|
|
|
@staticmethod
|
|
|
- def index_folder(music_folder):
|
|
|
+ def index_folder(music_folder, force_update=False):
|
|
|
+ logger.debug('** Start indexation on folder %s' % music_folder.id)
|
|
|
indexation = Indexation()
|
|
|
- indexation.index_folder(music_folder)
|
|
|
+ indexation.index_all(filter_music_folder_id=music_folder.id, force_update=force_update)
|
|
|
|
|
|
@staticmethod
|
|
|
- def index_all():
|
|
|
+ def index_all(force_update=False):
|
|
|
+ logger.debug('** Start complete indexation')
|
|
|
indexation = Indexation()
|
|
|
- indexation.index_all()
|
|
|
+ indexation.index_all(force_update=force_update)
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|