support partial library rebuilds
This commit is contained in:
parent
f171721915
commit
7643a13b54
44
database.py
44
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`.
|
||||
|
|
Loading…
Reference in New Issue
Block a user