diff --git a/app/config.py b/app/config.py index f3135f0..989e4f5 100644 --- a/app/config.py +++ b/app/config.py @@ -22,6 +22,7 @@ class Config(object): ERRORS_TO = ['kae@midnighthax.com'] FADE_STEPS = 20 FADE_TIME = 3000 + INFO_TAB_TITLE_LENGTH = 15 LOG_LEVEL_STDERR = logging.INFO LOG_LEVEL_SYSLOG = logging.DEBUG LOG_NAME = "musicmuster" @@ -30,6 +31,7 @@ class Config(object): MAIL_SERVER = os.environ.get('MAIL_SERVER') or "woodlands.midnighthax.com" MAIL_USERNAME = os.environ.get('MAIL_USERNAME') MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS') is not None + MAX_INFO_TABS = 3 MILLISECOND_SIGFIGS = 0 MYSQL_CONNECT = os.environ.get('MYSQL_CONNECT') or "mysql+mysqldb://musicmuster:musicmuster@localhost/musicmuster_dev" # noqa E501 NORMALISE_ON_IMPORT = True diff --git a/app/musicmuster.py b/app/musicmuster.py index f04ba4e..ea1c0b0 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -9,8 +9,9 @@ import urllib.parse from datetime import datetime, timedelta from log import DEBUG, EXCEPTION -from PyQt5.QtCore import Qt, QTimer +from PyQt5.QtCore import Qt, QTimer, QUrl from PyQt5.QtGui import QFontMetrics, QPainter +from PyQt5.QtWebEngineWidgets import QWebEngineView as QWebView from PyQt5.QtWidgets import ( QApplication, QDialog, @@ -63,6 +64,7 @@ class Window(QMainWindow, Ui_MainWindow): self.music = music.Music() self.current_track = None self.current_track_playlist_tab = None + self.info_tabs = {} self.next_track = None self.next_track_playlist_tab = None self.previous_track = None @@ -263,6 +265,42 @@ class Window(QMainWindow, Ui_MainWindow): # Enable controls self.enable_play_next_controls() + def ensure_info_tabs(self, title_list): + """ + Ensure we have info tabs for each of the passed titles + """ + + for title in title_list: + if title in self.info_tabs.keys(): + # We already have a tab for this track + continue + # import ipdb; ipdb.set_trace() + if len(self.info_tabs) >= Config.MAX_INFO_TABS: + # Find an unneeded info tab + try: + old_title = list( + set(self.info_tabs.keys()) - set(title_list) + )[0] + except IndexError: + DEBUG( + f"ensure_info_tabs({title_list}): unable to add " + f"{title=}" + ) + return + # Assign redundant widget a new title + widget = self.info_tabs[title] = self.info_tabs[old_title] + idx = self.tabPlaylist.indexOf(widget) + self.tabPlaylist.setTabText( + idx, title[:Config.INFO_TAB_TITLE_LENGTH]) + del self.info_tabs[old_title] + else: + widget = self.info_tabs[title] = QWebView() + self.tabPlaylist.addTab( + widget, title[:Config.INFO_TAB_TITLE_LENGTH]) + str = urllib.parse.quote_plus(title) + url = f"https://www.wikipedia.org/w/index.php?search={str}" + widget.setUrl(QUrl(url)) + def export_playlist_tab(self): "Export the current playlist to an m3u file" @@ -667,32 +705,39 @@ class Window(QMainWindow, Ui_MainWindow): self.stop_playing() def update_headers(self): - "Update last / current / next track headers" + """ + Update last / current / next track headers. + Ensure a Wikipedia tab for each title. + """ + + titles = [] try: self.hdrPreviousTrack.setText( - f"{self.previous_track.title} - " - f"{self.previous_track.artist}" + f"{self.previous_track.title} - {self.previous_track.artist}" ) + titles.append(self.previous_track.title) except AttributeError: self.hdrPreviousTrack.setText("") try: self.hdrCurrentTrack.setText( - f"{self.current_track.title} - " - f"{self.current_track.artist}" + f"{self.current_track.title} - {self.current_track.artist}" ) + titles.append(self.current_track.title) except AttributeError: self.hdrCurrentTrack.setText("") try: self.hdrNextTrack.setText( - f"{self.next_track.title} - " - f"{self.next_track.artist}" + f"{self.next_track.title} - {self.next_track.artist}" ) + titles.append(self.next_track.title) except AttributeError: self.hdrNextTrack.setText("") + self.ensure_info_tabs(titles) + class DbDialog(QDialog): def __init__(self, parent, session):