diff --git a/main.py b/main.py index df7fee2..0e26e92 100644 --- a/main.py +++ b/main.py @@ -21,8 +21,7 @@ from PyQt5.QtWidgets import ( from PyQt5.QtCore import QUrl, QTimer, Qt from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QAudioProbe from PyQt5.QtGui import QCloseEvent, QPixmap -from utils import scan_for_music -from utils import delete_and_create_library_database +from utils import scan_for_music, delete_and_create_library_database, initialize_db from components import PreferencesWindow, AudioVisualizer # Create ui.py file from Qt Designer @@ -98,10 +97,9 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow): self.open_preferences ) # Open preferences menu # QUICK ACTIONS MENU - self.actionScanLibraries.triggered.connect(self.scan_libraries) # Scan library - self.actionClearDatabase.triggered.connect( - self.clear_database - ) # Clear database + self.actionScanLibraries.triggered.connect(self.scan_libraries) + self.actionDeleteLibrary.triggered.connect(self.clear_database) + self.actionDeleteDatabase.triggered.connect(self.delete_database) ## tableView triggers self.tableView.doubleClicked.connect( self.play_audio_file @@ -364,6 +362,32 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow): delete_and_create_library_database() self.tableView.fetch_library() + def delete_database(self) -> None: + """Deletes the entire database""" + reply = QMessageBox.question( + self, + "Confirmation", + "Delete database?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.Yes, + ) + if reply: + initialize_db() + self.tableView.fetch_library() + + def reinitialize_database(self) -> None: + """Clears all tables in database and recreates""" + reply = QMessageBox.question( + self, + "Confirmation", + "Recreate the database?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.Yes, + ) + if reply: + initialize_db() + self.tableView.fetch_library() + def process_probe(self, buff) -> None: buff.startTime() self.update_audio_visualization() diff --git a/ui.py b/ui.py index 99ef281..e40c87f 100644 --- a/ui.py +++ b/ui.py @@ -154,7 +154,7 @@ class Ui_MainWindow(object): self.verticalLayout_3.setStretch(3, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1152, 21)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1152, 41)) self.menubar.setObjectName("menubar") self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile.setObjectName("menuFile") @@ -172,14 +172,17 @@ class Ui_MainWindow(object): self.actionPreferences.setObjectName("actionPreferences") self.actionScanLibraries = QtWidgets.QAction(MainWindow) self.actionScanLibraries.setObjectName("actionScanLibraries") - self.actionClearDatabase = QtWidgets.QAction(MainWindow) - self.actionClearDatabase.setObjectName("actionClearDatabase") + self.actionDeleteLibrary = QtWidgets.QAction(MainWindow) + self.actionDeleteLibrary.setObjectName("actionDeleteLibrary") self.actionOpenFiles = QtWidgets.QAction(MainWindow) self.actionOpenFiles.setObjectName("actionOpenFiles") + self.actionDeleteDatabase = QtWidgets.QAction(MainWindow) + self.actionDeleteDatabase.setObjectName("actionDeleteDatabase") self.menuFile.addAction(self.actionOpenFiles) self.menuEdit.addAction(self.actionPreferences) self.menuQuick_Actions.addAction(self.actionScanLibraries) - self.menuQuick_Actions.addAction(self.actionClearDatabase) + self.menuQuick_Actions.addAction(self.actionDeleteLibrary) + self.menuQuick_Actions.addAction(self.actionDeleteDatabase) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuEdit.menuAction()) self.menubar.addAction(self.menuView.menuAction()) @@ -207,7 +210,8 @@ class Ui_MainWindow(object): self.actionPreferences.setText(_translate("MainWindow", "Preferences")) self.actionPreferences.setStatusTip(_translate("MainWindow", "Open preferences")) self.actionScanLibraries.setText(_translate("MainWindow", "Scan libraries")) - self.actionClearDatabase.setText(_translate("MainWindow", "Clear Database")) + self.actionDeleteLibrary.setText(_translate("MainWindow", "Delete Library")) self.actionOpenFiles.setText(_translate("MainWindow", "Open file(s)")) + self.actionDeleteDatabase.setText(_translate("MainWindow", "Delete Database")) from components import AlbumArtGraphicsView, MusicTable from pyqtgraph import PlotWidget diff --git a/ui.ui b/ui.ui index caa3623..b8c8cef 100644 --- a/ui.ui +++ b/ui.ui @@ -274,7 +274,7 @@ 0 0 1152 - 21 + 41 @@ -299,7 +299,8 @@ Quick-Actions - + + @@ -320,9 +321,9 @@ Scan libraries - + - Clear Database + Delete Library @@ -330,6 +331,11 @@ Open file(s) + + + Delete Database + + diff --git a/utils/__init__.py b/utils/__init__.py index 1d2dcb7..3f0a03f 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -1,4 +1,5 @@ from .id3_timestamp_to_datetime import id3_timestamp_to_datetime +from .initialize_db import initialize_db from .safe_get import safe_get from .get_album_art import get_album_art from .get_id3_tags import get_id3_tags diff --git a/utils/delete_and_create_library_database.py b/utils/delete_and_create_library_database.py index 27a6370..52caa51 100644 --- a/utils/delete_and_create_library_database.py +++ b/utils/delete_and_create_library_database.py @@ -1,9 +1,11 @@ import DBA + def delete_and_create_library_database(): - with open('utils/delete_and_create_library.sql', 'r') as file: + """Clears all songs in database""" + with open("utils/delete_and_create_library.sql", "r") as file: lines = file.read() - for statement in lines.split(';'): - print(f'executing [{statement}]') + for statement in lines.split(";"): + print(f"executing [{statement}]") with DBA.DBAccess() as db: db.execute(statement, ()) diff --git a/utils/initialize_db.py b/utils/initialize_db.py new file mode 100644 index 0000000..f6fccca --- /dev/null +++ b/utils/initialize_db.py @@ -0,0 +1,11 @@ +import DBA + + +def initialize_db(): + """Recreates everything in the database""" + with open("utils/init.sql", "r") as file: + lines = file.read() + for statement in lines.split(";"): + print(f"executing [{statement}]") + with DBA.DBAccess() as db: + db.execute(statement, ())