| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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
|