diff --git a/app.py b/app.py index e6c3e99..7115ebc 100755 --- a/app.py +++ b/app.py @@ -17,6 +17,29 @@ from tinytag import TinyTag from main_window_ui import Ui_MainWindow from dlg_search_database_ui import Ui_Dialog +from songdb import Tracks + +import sqlalchemy + +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base + +# "Constants" +DISPLAY_SQL = False +MYSQL_CONNECT = "mysql+mysqldb://songdb:songdb@localhost/songdb" + + +# Declare mapping +Base = declarative_base() + +engine = sqlalchemy.create_engine(f"{MYSQL_CONNECT}?charset=utf8", + encoding='utf-8', + echo=DISPLAY_SQL) +Base.metadata.create_all(engine) + +# Create a Session +Session = sessionmaker(bind=engine) +session = Session() class RepeatedTimer: def __init__(self, interval, function, *args, **kwargs): @@ -83,7 +106,7 @@ class Track: audio_segment - the segment to find silence in silence_threshold - the upper bound for how quiet is silent in dFBS chunk_size - chunk size for interating over the segment in ms -dlg_search_database_ui + https://github.com/jiaaro/pydub/blob/master/pydub/silence.py """ @@ -176,7 +199,7 @@ class Window(QMainWindow, Ui_MainWindow): # import ipdb; ipdb.set_trace() def selectDatabase(self): - dlg = DbDialog() + dlg = DbDialog(self) dlg.exec() def selectFile(self): @@ -204,14 +227,27 @@ class Window(QMainWindow, Ui_MainWindow): item = QTableWidgetItem(track.path) pl.setItem(row, 6, item) + class DbDialog(QDialog): def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_Dialog() self.ui.setupUi(self) - import ipdb; ipdb.set_trace() + self.ui.lineEdit.textEdited.connect(self.chars_typed) + # import ipdb; ipdb.set_trace() # self.lineEdit.clicked.connect(self.selectFile) + def chars_typed(self, s): + print(f"chars_typed({s})") + if len(s) >= 3: + # matches = Tracks.search_titles(s) + matches = session.query(Tracks).filter( + Tracks.title.ilike(f"%{s}%")).all() + if matches: + # import ipdb; ipdb.set_trace() + songs = [t.title for t in matches] + self.ui.listWidget.clear() + self.ui.listWidget.addItems(songs) diff --git a/dlg_search_database_ui.py b/dlg_search_database_ui.py index 29bd471..36df05f 100644 --- a/dlg_search_database_ui.py +++ b/dlg_search_database_ui.py @@ -2,39 +2,41 @@ # Form implementation generated from reading ui file 'ui/dlg_SearchDatabase.ui' # -# Created by: PyQt5 UI code generator 5.11.3 +# Created by: PyQt5 UI code generator 5.15.2 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + from PyQt5 import QtCore, QtGui, QtWidgets + class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(383, 272) - self.widget = QtWidgets.QWidget(Dialog) - self.widget.setGeometry(QtCore.QRect(10, 20, 361, 242)) - self.widget.setObjectName("widget") - self.verticalLayout = QtWidgets.QVBoxLayout(self.widget) - self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout_2 = QtWidgets.QGridLayout(Dialog) + self.gridLayout_2.setObjectName("gridLayout_2") + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setObjectName("gridLayout") - self.label = QtWidgets.QLabel(self.widget) + self.label = QtWidgets.QLabel(Dialog) self.label.setObjectName("label") self.gridLayout.addWidget(self.label, 0, 0, 1, 1) - self.lineEdit = QtWidgets.QLineEdit(self.widget) + self.lineEdit = QtWidgets.QLineEdit(Dialog) self.lineEdit.setObjectName("lineEdit") self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) self.verticalLayout.addLayout(self.gridLayout) - self.listWidget = QtWidgets.QListWidget(self.widget) + self.listWidget = QtWidgets.QListWidget(Dialog) self.listWidget.setObjectName("listWidget") self.verticalLayout.addWidget(self.listWidget) - self.buttonBox = QtWidgets.QDialogButtonBox(self.widget) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.verticalLayout.addWidget(self.buttonBox) + self.gridLayout_2.addLayout(self.verticalLayout, 0, 0, 1, 1) self.retranslateUi(Dialog) self.buttonBox.accepted.connect(Dialog.accept) @@ -45,4 +47,3 @@ class Ui_Dialog(object): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Dialog")) self.label.setText(_translate("Dialog", "Title:")) - diff --git a/songdb.py b/songdb.py index 6cd5198..46f4a2f 100755 --- a/songdb.py +++ b/songdb.py @@ -57,6 +57,15 @@ class Tracks(Base): return track + @staticmethod + def search_titles(text): + return Tracks.query.filter( + Tracks.title.ilike(text) + ).all() + + + + def main(): "Main loop" diff --git a/ui/dlg_SearchDatabase.ui b/ui/dlg_SearchDatabase.ui index d303eec..619eddd 100644 --- a/ui/dlg_SearchDatabase.ui +++ b/ui/dlg_SearchDatabase.ui @@ -13,45 +13,39 @@ Dialog - - - - 10 - 20 - 361 - 242 - - - - - - - - - Title: - - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - + + + + + + + + + Title: + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + +