indexer.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import time
  2. from queue import Queue
  3. from threading import Thread, Lock
  4. import vlc
  5. from path import Path
  6. from core.exceptions import NotSupportedFile
  7. from core.file_utilities import is_media_file_ext, hash_file
  8. from core.logging_ import Logger
  9. from core.models import Track
  10. from core.repositories import MusicFolderRepository, TrackRepository
  11. logger = Logger.get()
  12. class Discoverer(Thread):
  13. def __init__(self, indexer):
  14. Thread.__init__(self)
  15. self.indexer = indexer
  16. def run(self):
  17. music_folder_repo = MusicFolderRepository()
  18. while 1:
  19. for music_folder in music_folder_repo.get_all():
  20. music_folder_path = Path(music_folder.path)
  21. for filename in music_folder_path.walkfiles():
  22. if is_media_file_ext(filename.ext):
  23. self.indexer.put(filename)
  24. time.sleep(1)
  25. class Cleaner(Thread):
  26. def __init__(self, indexer):
  27. Thread.__init__(self)
  28. self.indexer = indexer
  29. def run(self):
  30. track_repo = TrackRepository()
  31. while 1:
  32. pass
  33. class Indexer(Thread):
  34. def __init__(self):
  35. Thread.__init__(self)
  36. self.queue = Queue()
  37. discoverer = Discoverer(self)
  38. def run(self):
  39. while 1:
  40. filename = self.queue.get()
  41. self.index(filename)
  42. def put(self, filename):
  43. self.queue.put(filename)
  44. @staticmethod
  45. def index(filename):
  46. filename = Path(filename)
  47. if not filename.exists():
  48. raise FileNotFoundError(f"File not found: {filename}")
  49. if not is_media_file_ext(filename.ext):
  50. raise NotSupportedFile(f"File's extension {filename.ext} is not supported")
  51. track_repo = TrackRepository()
  52. vlc_media = vlc.Media(filename)
  53. vlc_media.parse()
  54. track_infos = vlc_media.get_tracks_info()
  55. track_hash = hash_file(filename)
  56. track = track_repo.get_by_hash(track_hash)
  57. if not track:
  58. track = Track()
  59. track.title = vlc_media.get_meta(vlc.Meta.Title)
  60. track.format = filename.ext
  61. track.artist = vlc_media.get_meta(vlc.Meta.AlbumArtist) or vlc_media.get_meta(vlc.Meta.Artist)
  62. track.album = vlc_media.get_meta(vlc.Meta.Album)
  63. track.track_num = vlc_media.get_meta(vlc.Meta.TrackNumber)
  64. # track.year = vlc_media.get_meta(vlc.Meta.Date)
  65. # track.duration = vlc_media.get_meta(vlc.Meta.Date)
  66. # track.size = 0
  67. track.note = ""
  68. track.status = Track.STATUS_FOUND
  69. track.path = filename
  70. track.hash = track_hash
  71. if track.id is None:
  72. track_repo.create(track)
  73. logger.debug('Index - updated: %s' % filename)
  74. track_repo.commit()
  75. if __name__ == '__main__':
  76. pass