musicpom/utils/add_files_to_database.py
billypom on debian d3313db6ab stuff
2025-04-16 23:03:04 -04:00

122 lines
4.1 KiB
Python

from PyQt5.QtWidgets import QMessageBox
from mutagen.id3 import ID3
import DBA
from logging import debug
from utils import get_id3_tags, convert_id3_timestamp_to_datetime
from configparser import ConfigParser
from pathlib import Path
from appdirs import user_config_dir
def add_files_to_database(files, progress_callback=None):
"""
Adds audio file(s) to the sqllite db "song" table
Args:
files: list() of fully qualified paths to audio file(s)
progress_callback: emit data for user feedback
Returns:
True on success, else False
"""
config = ConfigParser()
cfg_file = (
Path(user_config_dir(appname="musicpom", appauthor="billypom")) / "config.ini"
)
config.read(cfg_file)
if not files:
return False, {'Failure': 'All operations failed in add_files_to_database()'}
extensions = config.get("settings", "extensions").split(",")
failed_dict = {}
insert_data = [] # To store data for batch insert
for filepath in files:
if any(filepath.lower().endswith(ext) for ext in extensions):
if progress_callback:
progress_callback.emit(filepath)
filename = filepath.split("/")[-1]
audio, details = get_id3_tags(filepath)
# print('got id3 tags')
# print(type(audio))
# print(audio)
if not isinstance(audio, ID3):
failed_dict[filepath] = details
continue
try:
title = audio["TIT2"].text[0]
except KeyError:
title = filename
try:
artist = audio["TPE1"].text[0]
except KeyError:
artist = ""
try:
album = audio["TALB"].text[0]
except KeyError:
album = ""
try:
track_number = audio["TRCK"].text[0]
except KeyError:
track_number = None
try:
genre = audio["TCON"].text[0]
except KeyError:
genre = ""
try:
date = convert_id3_timestamp_to_datetime(audio["TDRC"].text[0])
except KeyError:
date = ""
try:
bitrate = audio["TBIT"].text[0]
except KeyError:
bitrate = ""
# Append data tuple to insert_data list
insert_data.append(
(
filepath,
title,
album,
artist,
track_number,
genre,
filename.split(".")[-1],
date,
bitrate,
)
)
# Check if batch size is reached
if len(insert_data) >= 1000:
debug(f"inserting a LOT of songs: {len(insert_data)}")
with DBA.DBAccess() as db:
db.executemany(
"INSERT OR IGNORE INTO song (filepath, title, album, artist, track_number, genre, codec, album_date, bitrate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
insert_data,
)
insert_data = [] # Reset the insert_data list
else:
# continue adding files if we havent reached big length
continue
# Insert any remaining data
debug("i check for insert data")
if insert_data:
debug(f"inserting some songs: {len(insert_data)}")
with DBA.DBAccess() as db:
db.executemany(
"INSERT OR IGNORE INTO song (filepath, title, album, artist, track_number, genre, codec, album_date, bitrate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
insert_data,
)
return True, failed_dict
# id int unsigned auto_increment,
# title varchar(255),
# album varchar(255),
# artist varchar(255),
# genre varchar(255),
# codec varchar(15),
# album_date date,
# bitrate int unsigned,
# date_added TIMESTAMP default CURRENT_TIMESTAMP,
# scan_for_music(config.get('directories', 'library1'))