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