From aea3a6cdc3f6c8396420ec85c64b523b945f2f86 Mon Sep 17 00:00:00 2001 From: tsi-billypom Date: Fri, 16 Aug 2024 11:16:55 -0400 Subject: [PATCH] what --- components/AddToPlaylistWindow.py | 12 ++++-- components/ExportPlaylistWindow.py | 68 ++++++++++++++++++++++++++++++ components/MusicTable.py | 10 +---- components/__init__.py | 1 + main.py | 17 ++++++++ playlist_example.m3u | 12 ------ sample_config.ini | 4 +- ui.py | 4 ++ ui.ui | 6 +++ 9 files changed, 108 insertions(+), 26 deletions(-) create mode 100644 components/ExportPlaylistWindow.py delete mode 100644 playlist_example.m3u diff --git a/components/AddToPlaylistWindow.py b/components/AddToPlaylistWindow.py index 66848e8..53a2b7d 100644 --- a/components/AddToPlaylistWindow.py +++ b/components/AddToPlaylistWindow.py @@ -15,16 +15,22 @@ import logging class AddToPlaylistWindow(QDialog): - def __init__(self, list_options: dict, song_db_ids: list): + def __init__(self, song_db_ids: list): super(AddToPlaylistWindow, self).__init__() self.song_db_ids = song_db_ids self.setWindowTitle("Add songs to playlist:") - self.setMinimumSize(400, 400) + # self.setMinimumSize(400, 400) layout = QVBoxLayout() + playlist_dict: dict = {} + with DBA.DBAccess() as db: + data = db.query("SELECT id, name from playlist;", ()) + for row in data: + playlist_dict[row[0]] = row[1] + self.item_dict = {} self.listWidget = QListWidget(self) - for i, (k, v) in enumerate(list_options.items()): + for i, (k, v) in enumerate(playlist_dict.items()): item_text = f"{i} | {v}" item = QListWidgetItem(item_text) self.listWidget.addItem(item) diff --git a/components/ExportPlaylistWindow.py b/components/ExportPlaylistWindow.py new file mode 100644 index 0000000..157b16c --- /dev/null +++ b/components/ExportPlaylistWindow.py @@ -0,0 +1,68 @@ +import logging +from PyQt5.QtWidgets import ( + QDialog, + QHBoxLayout, + QLineEdit, + QLabel, + QPushButton, + QVBoxLayout, + QListWidget, + QListWidgetItem, +) +from PyQt5.QtGui import QFont +import DBA + + +class ExportPlaylistWindow(QDialog): + def __init__(self): + super(ExportPlaylistWindow, self).__init__() + self.setWindowTitle("Export playlist") + layout = QVBoxLayout() + # button_layout = QHBoxLayout() + + playlist_dict = {} + with DBA.DBAccess() as db: + data = db.query("SELECT id, name from playlist;", ()) + for row in data: + playlist_dict[row[0]] = row[1] + + self.item_dict = {} + self.listWidget = QListWidget(self) + for i, (k, v) in enumerate(playlist_dict.items()): + item_text = f"{i} | {v}" + item = QListWidgetItem(item_text) + self.listWidget.addItem(item) + self.item_dict[item_text] = k + + # add ui elements to window + label = QLabel("Playlists") + label.setFont(QFont("Sans", weight=QFont.Bold)) + layout.addWidget(label) + layout.addWidget(self.listWidget) + + # Save button + save_button = QPushButton("Export") + save_button.clicked.connect(self.save) + layout.addWidget(save_button) + self.setLayout(layout) + self.show() + + def save(self) -> None: + """Exports the chosen database playlist to a .m3u file""" + value = self.input.text() + if value == "" or value is None: + self.close() + return + else: + try: + with DBA.DBAccess() as db: + db.execute("INSERT INTO playlist (name) VALUES (?);", (value,)) + except Exception as e: + logging.error( + f"CreatePlaylistWindow.py save() | Could not create playlist: {e}" + ) + self.close() + + def cancel(self) -> None: + self.close() + return diff --git a/components/MusicTable.py b/components/MusicTable.py index 11c25e5..3d56ba9 100644 --- a/components/MusicTable.py +++ b/components/MusicTable.py @@ -175,15 +175,7 @@ class MusicTable(QTableView): def add_selected_files_to_playlist(self): """Opens a playlist choice menu and adds the currently selected files to the chosen playlist""" - playlist_dict = {} - print(type(playlist_dict)) - with DBA.DBAccess() as db: - data = db.query("SELECT id, name from playlist;", ()) - for row in data: - playlist_dict[row[0]] = row[1] - playlist_choice_window = AddToPlaylistWindow( - playlist_dict, self.get_selected_songs_db_ids() - ) + playlist_choice_window = AddToPlaylistWindow(self.get_selected_songs_db_ids()) playlist_choice_window.exec_() def show_lyrics_menu(self): diff --git a/components/__init__.py b/components/__init__.py index ed9e8d5..0735531 100644 --- a/components/__init__.py +++ b/components/__init__.py @@ -7,3 +7,4 @@ from .LyricsWindow import LyricsWindow from .AddToPlaylistWindow import AddToPlaylistWindow from .CreatePlaylistWindow import CreatePlaylistWindow from .PlaylistsPane import PlaylistsPane +from .ExportPlaylistWindow import ExportPlaylistWindow diff --git a/main.py b/main.py index c899c08..ba886ce 100644 --- a/main.py +++ b/main.py @@ -28,6 +28,7 @@ from components import ( PreferencesWindow, AudioVisualizer, CreatePlaylistWindow, + ExportPlaylistWindow, ) # Create ui.py file from Qt Designer @@ -97,6 +98,7 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow): # FILE MENU self.actionOpenFiles.triggered.connect(self.open_files) # Open files window self.actionNewPlaylist.triggered.connect(self.create_playlist) + self.actionExportPlaylist.triggered.connect(self.export_playlist) # EDIT MENU # VIEW MENU self.actionPreferences.triggered.connect( @@ -358,6 +360,21 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow): create_playlist_window = CreatePlaylistWindow() create_playlist_window.exec_() + def import_playlist(self) -> None: + """ + Imports a .m3u file, given a base path attempts to match playlist files to + database records that currently exist + """ + pass + + def export_playlist(self) -> None: + """ + Export playlist window + Takes a certain database playlist and turns it into a .m3u file + """ + export_playlist_window = ExportPlaylistWindow() + export_playlist_window.exec_() + def open_preferences(self) -> None: """Opens the preferences window""" preferences_window = PreferencesWindow(self.config) diff --git a/playlist_example.m3u b/playlist_example.m3u deleted file mode 100644 index 7bbdca9..0000000 --- a/playlist_example.m3u +++ /dev/null @@ -1,12 +0,0 @@ -#EXTM3U -#PLAYLIST:Playlist title -#EXTINF:100, Artist - Title -/path/to/file.mp3 -#EXTINF:[length_of_song_in_seconds], Artist - Title -/path/to/file.mp3 - -# apparently also m3u can just be a list -#EXTM3U -/path/to/song.mp3 -/path/to/song.mp3 -/path/to/song.mp3 diff --git a/sample_config.ini b/sample_config.ini index 5949539..7255209 100644 --- a/sample_config.ini +++ b/sample_config.ini @@ -13,5 +13,5 @@ extensions = mp3,wav,ogg,flac [table] # Music table options -columns = title,artist,album,genre,codec,album_date,filepath -column_widths = 181,116,222,76,74,72,287 +columns = title,artist,album,track_number,genre,codec,album_date,filepath +column_widths = 181,116,222,76,74,72,287,150 diff --git a/ui.py b/ui.py index 1e1c66f..e0aacae 100644 --- a/ui.py +++ b/ui.py @@ -192,8 +192,11 @@ class Ui_MainWindow(object): self.actionDeleteDatabase.setObjectName("actionDeleteDatabase") self.actionNewPlaylist = QtWidgets.QAction(MainWindow) self.actionNewPlaylist.setObjectName("actionNewPlaylist") + self.actionExportPlaylist = QtWidgets.QAction(MainWindow) + self.actionExportPlaylist.setObjectName("actionExportPlaylist") self.menuFile.addAction(self.actionOpenFiles) self.menuFile.addAction(self.actionNewPlaylist) + self.menuFile.addAction(self.actionExportPlaylist) self.menuEdit.addAction(self.actionPreferences) self.menuQuick_Actions.addAction(self.actionScanLibraries) self.menuQuick_Actions.addAction(self.actionDeleteLibrary) @@ -229,5 +232,6 @@ class Ui_MainWindow(object): self.actionOpenFiles.setText(_translate("MainWindow", "Open file(s)")) self.actionDeleteDatabase.setText(_translate("MainWindow", "Delete Database")) self.actionNewPlaylist.setText(_translate("MainWindow", "New playlist")) + self.actionExportPlaylist.setText(_translate("MainWindow", "Export playlist")) from components import AlbumArtGraphicsView, MusicTable, PlaylistsPane from pyqtgraph import PlotWidget diff --git a/ui.ui b/ui.ui index 3d3685d..2078078 100644 --- a/ui.ui +++ b/ui.ui @@ -308,6 +308,7 @@ + @@ -367,6 +368,11 @@ New playlist + + + Export playlist + +