diff --git a/database.py b/database.py index 09908d1..a51bb7e 100644 --- a/database.py +++ b/database.py @@ -26,17 +26,6 @@ def db_execute(*args, **kwargs): DB_LOCK.release() return res -def db_execute_unsafe(*args, **kwargs): - """ - A non-thread-safe version of `db_execute()`. Only use if you're - certain there will be no competing threads for the database. - """ - with sqlite3.connect('musik.db') as con: - con.row_factory = sqlite3.Row - cur = con.cursor() - res = cur.execute(*args, **kwargs) - return res - def db_execute_many(*args, **kwargs): """ Same as `db_executei()` except with `cur.executemany()`. @@ -54,8 +43,9 @@ def init_database(): Initializes the database. """ try: - db_execute_unsafe("SELECT * FROM tracks LIMIT 1").fetchone() + db_execute("SELECT * FROM tracks LIMIT 1").fetchone() except sqlite3.OperationalError: + DB_LOCK.release() db_execute("CREATE TABLE tracks(" "filepath TEXT PRIMARY KEY," "artist TEXT," @@ -66,7 +56,8 @@ def init_database(): "tracknumber TEXT," "title TEXT," "genre TEXT," - "length TEXT" + "length TEXT," + "last_modified INTEGER" ")" ) build_library(MUSIC_DIR) @@ -81,11 +72,19 @@ def build_library(root_dir): if not os.path.splitext(file)[1][1:] in MUSIC_EXT: continue filepath = os.path.join(root_dir, dir_name, file) - filepaths.append(filepath) + last_modified = os.path.getmtime(filepath) + filepaths.append((filepath, last_modified)) + tracks_prev = db_execute("SELECT * FROM tracks") + tracks_prev = {track['filepath']: track for track in tracks_prev} global worker - def worker(filepath): + def worker(tup): """Worker for multi-processing tracks.""" + filepath, last_modified = tup + track_prev = tracks_prev.get(filepath) + if track_prev: + if track_prev['last_modified'] >= last_modified: + return tuple(track_prev) data = read_track(filepath) return data @@ -102,8 +101,9 @@ def build_library(root_dir): if percent >= prev_percent + 2.5: print(f"{percent}%") prev_percent = percent + db_execute("DELETE FROM tracks") db_execute_many( - "INSERT INTO tracks VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "INSERT INTO tracks VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", tracks ) print("Done") @@ -131,23 +131,13 @@ def read_track(filepath): genre = m.get('genre', [''])[0] length = str(int(m.info.length) // 60) + ":" length += str(int(m.info.length) % 60) + last_modified = os.path.getmtime(filepath) d = locals() d.pop('m') return tuple(d.values()) -def insert_track(data): - """ - Inserts a new item into the `tracks` table. `data` should be a tuple - containing an item for every column in the `tracks` table. See the - table declarion in `init_database()` for more information. - """ - db_execute( - "INSERT INTO tracks VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - data - ) - def get_artist_albums(artist): """ Returns a list of all albums produced by the specified `artist`. diff --git a/musik.py b/musik.py index 6b23047..6ce7324 100755 --- a/musik.py +++ b/musik.py @@ -116,4 +116,7 @@ def coverart(): if __name__ == "__main__": + import sys + if len(sys.argv) > 1: + database.build_library(database.MUSIC_DIR) app.run(host='0.0.0.0', port=5150)