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()