79 lines
3.5 KiB
Python
Executable File
79 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
from mutagen.easyid3 import EasyID3
|
|
from mutagen.mp3 import MP3
|
|
import mutagen._util
|
|
import os
|
|
from watchdog.observers import Observer
|
|
from watchdog.events import FileSystemEventHandler
|
|
|
|
class LibraryScanner:
|
|
|
|
def __init__(self, Database, librarypath):
|
|
"""Init class """
|
|
self.url = librarypath
|
|
self.db = Database
|
|
self.scanRecursif()
|
|
ob = Observer()
|
|
ob.schedule(Filehandler(self), self.url, recursive=True)
|
|
ob.start()
|
|
|
|
|
|
def scanRecursif(self):
|
|
print("Scanning library "+self.url+" recursively...")
|
|
# musicdirs = [os.path.join(self.url,o) for o in os.listdir(self.url) if os.path.isdir(os.path.join(self.url,o))]
|
|
self.db.turnoffautocommit()
|
|
for root, directories, filenames in os.walk(self.url):
|
|
self.scandir(filenames,root)
|
|
|
|
def scandir(self,filenames, root):
|
|
for filename in filenames:
|
|
if filename.lower().endswith(('.mp3')):
|
|
path = os.path.join(root,filename)
|
|
try:
|
|
print(path, end='\r')
|
|
id3 = EasyID3(path)
|
|
audio = MP3(path)
|
|
print(audio.info.length)
|
|
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))
|
|
except (mutagen.id3._util.ID3NoHeaderError):
|
|
print("Error reading ID3 tag", end='\r')
|
|
|
|
|
|
def insertSong(self, path):
|
|
try:
|
|
id3 = EasyID3(path)
|
|
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') " +
|
|
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`)")
|
|
|
|
except (mutagen.id3._util.ID3NoHeaderError):
|
|
pass
|
|
|
|
def removeSong(self,path):
|
|
self.db.removeSong(path)
|
|
|
|
def getValue(self, id3, value):
|
|
try:
|
|
return id3[value][0].replace("'", "\\'")
|
|
except (KeyError, IndexError, ValueError):
|
|
print("Error reading value of ID3 tag", end='\r')
|
|
return ""
|
|
|
|
|
|
class Filehandler(FileSystemEventHandler):
|
|
def __init__(self, LibraryScanner):
|
|
self.libscanner = LibraryScanner
|
|
|
|
def process(self, event):
|
|
if not(event.is_directory):
|
|
if os.path.isfile(event.src_path) and event.src_path.lower().endswith(('.mp3','.flac', 'm4a')):
|
|
self.libscanner.insertSong(event.src_path)
|
|
else:
|
|
self.libscanner.removeSong(event.src_path)
|
|
|
|
def on_modified(self, event):
|
|
self.process(event)
|
|
|
|
def on_created(self, event):
|
|
self.process(event)
|