|
|
@@ -0,0 +1,111 @@
|
|
|
+import time
|
|
|
+
|
|
|
+import vlc
|
|
|
+from path import Path
|
|
|
+
|
|
|
+from core.file_utilities import is_media_file_ext, hash_file
|
|
|
+from core.models import Track
|
|
|
+from core.repositories import MusicFolderRepository, TrackRepository
|
|
|
+
|
|
|
+
|
|
|
+class Indexation:
|
|
|
+ def __init__(self):
|
|
|
+ self.started = False
|
|
|
+ self.music_folder_repo = MusicFolderRepository()
|
|
|
+ self.track_repo = TrackRepository()
|
|
|
+ self.music_folders = []
|
|
|
+ self.index = {}
|
|
|
+ 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()
|
|
|
+
|
|
|
+ vlc_media = vlc.Media(filename)
|
|
|
+ vlc_media.parse()
|
|
|
+ track_infos = vlc_media.get_tracks_info()
|
|
|
+
|
|
|
+ track_hash = hash_file(filename)
|
|
|
+
|
|
|
+ if track_hash in self.processed:
|
|
|
+ print(" ... file already indexed, ignore: ", filename)
|
|
|
+ return
|
|
|
+
|
|
|
+ if track_hash in self.index:
|
|
|
+ track = self.index[track_hash]
|
|
|
+ else:
|
|
|
+ track = Track()
|
|
|
+
|
|
|
+ track.profile_id = 0
|
|
|
+ track.music_folder_id = music_folder.id
|
|
|
+ track.title = vlc_media.get_meta(vlc.Meta.Title)
|
|
|
+ track.format = filename.ext
|
|
|
+ track.artist = vlc_media.get_meta(vlc.Meta.AlbumArtist) or vlc_media.get_meta(vlc.Meta.Artist)
|
|
|
+ track.album = vlc_media.get_meta(vlc.Meta.Album)
|
|
|
+ track.track_num = vlc_media.get_meta(vlc.Meta.TrackNumber)
|
|
|
+ # track.year = vlc_media.get_meta(vlc.Meta.Date)
|
|
|
+ # track.duration = vlc_media.get_meta(vlc.Meta.Date)
|
|
|
+ # track.size = 0
|
|
|
+ track.note = ""
|
|
|
+ track.status = Track.STATUS_FOUND
|
|
|
+ track.path = filename
|
|
|
+ track.hash = track_hash
|
|
|
+
|
|
|
+ if track.id is not None:
|
|
|
+ self.track_repo.update(track)
|
|
|
+ print('updated', filename)
|
|
|
+ else:
|
|
|
+ self.track_repo.create(track)
|
|
|
+ print('created', filename)
|
|
|
+ self.track_repo.commit()
|
|
|
+
|
|
|
+ self.processed.add(track_hash)
|
|
|
+
|
|
|
+ def index_folder(self, music_folder):
|
|
|
+
|
|
|
+ if not self.started:
|
|
|
+ self.start()
|
|
|
+
|
|
|
+ music_folder_path = Path(music_folder.path)
|
|
|
+
|
|
|
+ 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)
|
|
|
+
|
|
|
+ def index_all(self):
|
|
|
+ self.start()
|
|
|
+
|
|
|
+ music_folders = self.music_folder_repo.get_all()
|
|
|
+ for music_folder in music_folders:
|
|
|
+ self.index_folder(music_folder)
|
|
|
+
|
|
|
+
|
|
|
+class Indexer:
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def index_file(music_folder, path):
|
|
|
+ indexation = Indexation()
|
|
|
+ indexation.index_file(music_folder, path)
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def index_folder(music_folder):
|
|
|
+ indexation = Indexation()
|
|
|
+ indexation.index_folder(music_folder)
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def index_all():
|
|
|
+ indexation = Indexation()
|
|
|
+ indexation.index_all()
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ Indexer.index_all()
|