import time from queue import Queue from threading import Thread, Lock import vlc from path import Path 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 Discoverer(Thread): def __init__(self, indexer): Thread.__init__(self) self.indexer = indexer def run(self): music_folder_repo = MusicFolderRepository() while 1: for music_folder in music_folder_repo.get_all(): music_folder_path = Path(music_folder.path) for filename in music_folder_path.walkfiles(): if is_media_file_ext(filename.ext): self.indexer.put(filename) time.sleep(1) class Cleaner(Thread): def __init__(self, indexer): Thread.__init__(self) self.indexer = indexer def run(self): track_repo = TrackRepository() while 1: pass class Indexer(Thread): def __init__(self): Thread.__init__(self) self.queue = Queue() discoverer = Discoverer(self) def run(self): while 1: filename = self.queue.get() self.index(filename) def put(self, filename): self.queue.put(filename) @staticmethod def index(filename): 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") track_repo = TrackRepository() vlc_media = vlc.Media(filename) vlc_media.parse() track_infos = vlc_media.get_tracks_info() track_hash = hash_file(filename) track = track_repo.get_by_hash(track_hash) if not track: track = Track() 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 None: track_repo.create(track) logger.debug('Index - updated: %s' % filename) track_repo.commit() if __name__ == '__main__': pass