libraryscanner.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from mutagen.easyid3 import EasyID3
  4. from mutagen.mp3 import MP3
  5. import mutagen._util
  6. import os
  7. from watchdog.observers import Observer
  8. from watchdog.events import FileSystemEventHandler
  9. class LibraryScanner:
  10. def __init__(self, Database, librarypath):
  11. """Init class """
  12. self.url = librarypath
  13. self.db = Database
  14. self.scanRecursif()
  15. ob = Observer()
  16. ob.schedule(Filehandler(self), self.url, recursive=True)
  17. ob.start()
  18. def scanRecursif(self):
  19. print("Scanning library "+self.url+" recursively...")
  20. # musicdirs = [os.path.join(self.url,o) for o in os.listdir(self.url) if os.path.isdir(os.path.join(self.url,o))]
  21. self.db.turnoffautocommit()
  22. for root, directories, filenames in os.walk(self.url):
  23. self.scandir(filenames,root)
  24. def scandir(self,filenames, root):
  25. for filename in filenames:
  26. if filename.lower().endswith(('.mp3')):
  27. path = os.path.join(root,filename)
  28. try:
  29. print(path, end='\r')
  30. id3 = EasyID3(path)
  31. audio = MP3(path)
  32. print(audio.info.length)
  33. self.db.insertMultipleSongs(self.getValue(id3, "genre"),path.replace("'", '\\\''),self.getValue(id3, "title"),self.getValue(id3, "artist"),self.getValue(id3, "album"),self.getValue(id3, "performer"),self.getValue(id3, "tracknumber"),self.getValue(id3, "date"),str(audio.info.length))
  34. except (mutagen.id3._util.ID3NoHeaderError):
  35. print("Error reading ID3 tag", end='\r')
  36. def insertSong(self, path):
  37. try:
  38. id3 = EasyID3(path)
  39. self.db.executeQuery(b"INSERT INTO `tracks` (`genre`, `trackUrl`, `trackName`, `artistName`, `albumName`, `albumArtist`, `trackNumber`, `year`, `duration`) VALUES ('" + self.getValue(id3,"genre") + b"'," + b"'" + path.replace("'", '\\\'').encode('utf8') + b"'," + b"'" + self.getValue(id3, "title") + b"'," + b"'" + self.getValue(id3, "artist") + b"'," + b"'" + self.getValue(id3, "album") + b"'," + b"'" + self.getValue(id3, "performer") + b"'," + b"'" + self.getValue(id3, "tracknumber") + b"'," + b"'" + self.getValue(id3, "date") + b"'," + b"'0') " +
  40. b" ON DUPLICATE KEY UPDATE `genre`=VALUES(`genre`) , `trackName` = VALUES(`trackName`) , `artistName` = VALUES(`artistName`) ,`albumName` = VALUES(`albumName`) , `albumArtist` = VALUES(`albumArtist`) , `trackNumber` = VALUES(`trackNumber`) , `year` = VALUES(`year`) , `duration` = VALUES(`duration`)")
  41. except (mutagen.id3._util.ID3NoHeaderError):
  42. pass
  43. def removeSong(self,path):
  44. self.db.removeSong(path)
  45. def getValue(self, id3, value):
  46. try:
  47. return id3[value][0].replace("'", "\\'")
  48. except (KeyError, IndexError, ValueError):
  49. print("Error reading value of ID3 tag", end='\r')
  50. return ""
  51. class Filehandler(FileSystemEventHandler):
  52. def __init__(self, LibraryScanner):
  53. self.libscanner = LibraryScanner
  54. def process(self, event):
  55. if not(event.is_directory):
  56. if os.path.isfile(event.src_path) and event.src_path.lower().endswith(('.mp3','.flac', 'm4a')):
  57. self.libscanner.insertSong(event.src_path)
  58. else:
  59. self.libscanner.removeSong(event.src_path)
  60. def on_modified(self, event):
  61. self.process(event)
  62. def on_created(self, event):
  63. self.process(event)