indexer.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import time
  2. import vlc
  3. from path import Path
  4. from core.file_utilities import is_media_file_ext, hash_file
  5. from core.models import Track
  6. from core.repositories import MusicFolderRepository, TrackRepository
  7. class Indexation:
  8. def __init__(self):
  9. self.started = False
  10. self.music_folder_repo = MusicFolderRepository()
  11. self.track_repo = TrackRepository()
  12. self.music_folders = []
  13. self.index = {}
  14. self.processed = set()
  15. self.t0 = time.time()
  16. def start(self):
  17. self.index = {t.hash: t for t in self.track_repo.get_all()}
  18. self.processed = set()
  19. self.t0 = time.time()
  20. self.started = True
  21. def index_file(self, music_folder, filename):
  22. if not self.started:
  23. self.start()
  24. vlc_media = vlc.Media(filename)
  25. vlc_media.parse()
  26. track_infos = vlc_media.get_tracks_info()
  27. track_hash = hash_file(filename)
  28. if track_hash in self.processed:
  29. print(" ... file already indexed, ignore: ", filename)
  30. return
  31. if track_hash in self.index:
  32. track = self.index[track_hash]
  33. else:
  34. track = Track()
  35. track.profile_id = 0
  36. track.music_folder_id = music_folder.id
  37. track.title = vlc_media.get_meta(vlc.Meta.Title)
  38. track.format = filename.ext
  39. track.artist = vlc_media.get_meta(vlc.Meta.AlbumArtist) or vlc_media.get_meta(vlc.Meta.Artist)
  40. track.album = vlc_media.get_meta(vlc.Meta.Album)
  41. track.track_num = vlc_media.get_meta(vlc.Meta.TrackNumber)
  42. # track.year = vlc_media.get_meta(vlc.Meta.Date)
  43. # track.duration = vlc_media.get_meta(vlc.Meta.Date)
  44. # track.size = 0
  45. track.note = ""
  46. track.status = Track.STATUS_FOUND
  47. track.path = filename
  48. track.hash = track_hash
  49. if track.id is not None:
  50. self.track_repo.update(track)
  51. print('updated', filename)
  52. else:
  53. self.track_repo.create(track)
  54. print('created', filename)
  55. self.track_repo.commit()
  56. self.processed.add(track_hash)
  57. def index_folder(self, music_folder):
  58. if not self.started:
  59. self.start()
  60. music_folder_path = Path(music_folder.path)
  61. for filename in music_folder_path.walkfiles():
  62. if not is_media_file_ext(filename.ext):
  63. print(' ... ignored ... ', filename)
  64. continue
  65. self.index_file(music_folder, filename)
  66. def index_all(self):
  67. self.start()
  68. music_folders = self.music_folder_repo.get_all()
  69. for music_folder in music_folders:
  70. self.index_folder(music_folder)
  71. class Indexer:
  72. @staticmethod
  73. def index_file(music_folder, path):
  74. indexation = Indexation()
  75. indexation.index_file(music_folder, path)
  76. @staticmethod
  77. def index_folder(music_folder):
  78. indexation = Indexation()
  79. indexation.index_folder(music_folder)
  80. @staticmethod
  81. def index_all():
  82. indexation = Indexation()
  83. indexation.index_all()
  84. if __name__ == '__main__':
  85. Indexer.index_all()