Open wikipedia and songfacts from right click menu.

Also reorganised right click menu.
This commit is contained in:
Keith Edmunds 2022-08-15 17:06:01 +01:00
parent 6ddb40d146
commit 01a9ce342a
6 changed files with 91 additions and 17 deletions

View File

@ -41,7 +41,6 @@ class Config(object):
FADE_STEPS = 20 FADE_STEPS = 20
FADE_TIME = 3000 FADE_TIME = 3000
INFO_TAB_TITLE_LENGTH = 15 INFO_TAB_TITLE_LENGTH = 15
INFO_TAB_URL = "https://www.wikipedia.org/w/index.php?search=%s"
LAST_PLAYED_TODAY_STRING = "Today" LAST_PLAYED_TODAY_STRING = "Today"
LOG_LEVEL_STDERR = logging.DEBUG LOG_LEVEL_STDERR = logging.DEBUG
LOG_LEVEL_SYSLOG = logging.DEBUG LOG_LEVEL_SYSLOG = logging.DEBUG
@ -51,7 +50,7 @@ class Config(object):
MAIL_SERVER = os.environ.get('MAIL_SERVER') or "woodlands.midnighthax.com" MAIL_SERVER = os.environ.get('MAIL_SERVER') or "woodlands.midnighthax.com"
MAIL_USERNAME = os.environ.get('MAIL_USERNAME') MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS') is not None MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS') is not None
MAX_INFO_TABS = 3 MAX_INFO_TABS = 5
MAX_MISSING_FILES_TO_REPORT = 10 MAX_MISSING_FILES_TO_REPORT = 10
MILLISECOND_SIGFIGS = 0 MILLISECOND_SIGFIGS = 0
MYSQL_CONNECT = os.environ.get('MYSQL_CONNECT') or "mysql+mysqldb://musicmuster:musicmuster@localhost/musicmuster_v2" # noqa E501 MYSQL_CONNECT = os.environ.get('MYSQL_CONNECT') or "mysql+mysqldb://musicmuster:musicmuster@localhost/musicmuster_v2" # noqa E501
@ -67,7 +66,7 @@ class Config(object):
TRACK_TIME_FORMAT = "%H:%M:%S" TRACK_TIME_FORMAT = "%H:%M:%S"
VOLUME_VLC_DEFAULT = 75 VOLUME_VLC_DEFAULT = 75
VOLUME_VLC_DROP3db = 65 VOLUME_VLC_DROP3db = 65
WEB_ZOOM_FACTOR = 1.4 WEB_ZOOM_FACTOR = 1.2
config = Config config = Config

View File

@ -1,6 +1,7 @@
import urllib.parse import urllib.parse
from datetime import datetime from datetime import datetime
from slugify import slugify # type: ignore
from typing import Dict, Optional from typing import Dict, Optional
from PyQt5.QtCore import QUrl from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineView from PyQt5.QtWebEngineWidgets import QWebEngineView
@ -20,7 +21,23 @@ class InfoTabs(QTabWidget):
# re-use the oldest one later) # re-use the oldest one later)
self.last_update: Dict[QWebEngineView, datetime] = {} self.last_update: Dict[QWebEngineView, datetime] = {}
def open_tab(self, title: str) -> None: def open_in_songfacts(self, title):
"""Search Songfacts for title"""
slug = slugify(title, replacements=([["'", ""]]))
url = f"https://www.songfacts.com/search/songs/{slug}"
self.open_tab(url, title)
def open_in_wikipedia(self, title):
"""Search Wikipedia for title"""
str = urllib.parse.quote_plus(title)
url = f"https://www.wikipedia.org/w/index.php?search={str}"
self.open_tab(url, title)
def open_tab(self, url: str, title: str) -> None:
""" """
Open passed URL. Create new tab if we're below the maximum Open passed URL. Create new tab if we're below the maximum
number otherwise reuse oldest content tab. number otherwise reuse oldest content tab.
@ -36,12 +53,12 @@ class InfoTabs(QTabWidget):
else: else:
# Reuse oldest widget # Reuse oldest widget
widget = min(self.last_update, key=self.last_update.get) widget = min(
self.last_update, key=self.last_update.get # type: ignore
)
tab_index = self.indexOf(widget) tab_index = self.indexOf(widget)
self.setTabText(tab_index, short_title) self.setTabText(tab_index, short_title)
txt = urllib.parse.quote_plus(title)
url = Config.INFO_TAB_URL % txt
widget.setUrl(QUrl(url)) widget.setUrl(QUrl(url))
self.last_update[widget] = datetime.now() self.last_update[widget] = datetime.now()

View File

@ -813,8 +813,8 @@ class Window(QMainWindow, Ui_MainWindow):
# Update headers # Update headers
self.update_headers() self.update_headers()
# Populate 'info' tabs # Populate 'info' tabs with Wikipedia info
self.tabInfolist.open_tab(track.title) self.tabInfolist.open_in_wikipedia(track.title)
def tick(self) -> None: def tick(self) -> None:
""" """

View File

@ -235,13 +235,15 @@ class PlaylistTab(QTableWidget):
if item is not None: if item is not None:
row_number = item.row() row_number = item.row()
track_id = self._get_row_track_id(row_number) track_id = self._get_row_track_id(row_number)
if track_id: track_row = track_id > 0
header_row = not track_row
if track_row:
current = row_number == self._get_current_track_row() current = row_number == self._get_current_track_row()
next_row = row_number == self._get_next_track_row() next_row = row_number == self._get_next_track_row()
else: else:
current = next_row = False current = next_row = False
if track_id: if track_row:
# Info # Info
act_info = self.menu.addAction('Info') act_info = self.menu.addAction('Info')
act_info.triggered.connect( act_info.triggered.connect(
@ -281,26 +283,43 @@ class PlaylistTab(QTableWidget):
self.menu.addSeparator() self.menu.addSeparator()
# Look up in wikipedia
act_wikip = self.menu.addAction("Wikipedia")
act_wikip.triggered.connect(
lambda: self._wikipedia(row_number)
)
# Look up in songfacts
act_songfacts = self.menu.addAction("Songfacts")
act_songfacts.triggered.connect(
lambda: self._songfacts(row_number)
)
self.menu.addSeparator()
# Remove track # Remove track
act_remove_track = self.menu.addAction('Remove track') act_remove_track = self.menu.addAction('Remove track')
act_remove_track.triggered.connect( act_remove_track.triggered.connect(
lambda: self._remove_track(row_number) lambda: self._remove_track(row_number)
) )
if header_row:
else:
# Add track to section header (ie, make this a track # Add track to section header (ie, make this a track
# row) # row)
act_add_track = self.menu.addAction('Add track') act_add_track = self.menu.addAction('Add track')
act_add_track.triggered.connect(self._add_track) act_add_track.triggered.connect(self._add_track)
if not current and not next_row:
# Remove row
act_delete = self.menu.addAction('Remove row')
act_delete.triggered.connect(self._delete_rows)
self.menu.addSeparator()
if not current and not next_row: if not current and not next_row:
act_move = self.menu.addAction('Move to playlist...') act_move = self.menu.addAction('Move to playlist...')
act_move.triggered.connect(self.musicmuster.move_selected) act_move.triggered.connect(self.musicmuster.move_selected)
self.menu.addSeparator() self.menu.addSeparator()
# Remove row
act_delete = self.menu.addAction('Remove row')
act_delete.triggered.connect(self._delete_rows)
return super(PlaylistTab, self).eventFilter(source, event) return super(PlaylistTab, self).eventFilter(source, event)
@ -1706,6 +1725,13 @@ class PlaylistTab(QTableWidget):
caveat = " (to end of playlist)" caveat = " (to end of playlist)"
return ' [' + duration + caveat + ']' return ' [' + duration + caveat + ']'
def _songfacts(self, row_number: int) -> None:
"""Look up passed row title in songfacts and display info tab"""
title = self._get_row_title(row_number)
self.musicmuster.tabInfolist.open_in_songfacts(title)
def _update_note_text(self, playlist_row: PlaylistRows, def _update_note_text(self, playlist_row: PlaylistRows,
additional_text: str) -> None: additional_text: str) -> None:
"""Append additional_text to row display""" """Append additional_text to row display"""
@ -1744,3 +1770,10 @@ class PlaylistTab(QTableWidget):
item_duration.setText(ms_to_mmss(track.duration)) item_duration.setText(ms_to_mmss(track.duration))
self.update_display(session) self.update_display(session)
def _wikipedia(self, row_number: int) -> None:
"""Look up passed row title in Wikipedia and display info tab"""
title = self._get_row_title(row_number)
self.musicmuster.tabInfolist.open_in_wikipedia(title)

26
poetry.lock generated
View File

@ -481,6 +481,20 @@ pytest = ">=3.0.0"
dev = ["pre-commit", "tox"] dev = ["pre-commit", "tox"]
doc = ["sphinx", "sphinx-rtd-theme"] doc = ["sphinx", "sphinx-rtd-theme"]
[[package]]
name = "python-slugify"
version = "6.1.2"
description = "A Python slugify application that also handles Unicode"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
[package.dependencies]
text-unidecode = ">=1.3"
[package.extras]
unidecode = ["Unidecode (>=1.1.1)"]
[[package]] [[package]]
name = "python-vlc" name = "python-vlc"
version = "3.0.16120" version = "3.0.16120"
@ -557,6 +571,14 @@ pure-eval = "*"
[package.extras] [package.extras]
tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"]
[[package]]
name = "text-unidecode"
version = "1.3"
description = "The most basic Text::Unidecode port"
category = "main"
optional = false
python-versions = "*"
[[package]] [[package]]
name = "tinytag" name = "tinytag"
version = "1.8.1" version = "1.8.1"
@ -622,7 +644,7 @@ python-versions = "*"
[metadata] [metadata]
lock-version = "1.1" lock-version = "1.1"
python-versions = "^3.9" python-versions = "^3.9"
content-hash = "7754808d801630b110a46869b849a6ce205784f587d3c1d4ed2097553e4368c4" content-hash = "9b4cf9915bf250afd948596a6ba82794f82abf6a6d4891bc51845409632c15fb"
[metadata.files] [metadata.files]
alembic = [ alembic = [
@ -964,6 +986,7 @@ pytest-qt = [
{file = "pytest-qt-4.0.2.tar.gz", hash = "sha256:dfc5240dec7eb43b76bcb5f9a87eecae6ef83592af49f3af5f1d5d093acaa93e"}, {file = "pytest-qt-4.0.2.tar.gz", hash = "sha256:dfc5240dec7eb43b76bcb5f9a87eecae6ef83592af49f3af5f1d5d093acaa93e"},
{file = "pytest_qt-4.0.2-py2.py3-none-any.whl", hash = "sha256:e03847ac02a890ccaac0fde1748855b9dce425aceba62005c6cfced6cf7d5456"}, {file = "pytest_qt-4.0.2-py2.py3-none-any.whl", hash = "sha256:e03847ac02a890ccaac0fde1748855b9dce425aceba62005c6cfced6cf7d5456"},
] ]
python-slugify = []
python-vlc = [ python-vlc = [
{file = "python-vlc-3.0.16120.tar.gz", hash = "sha256:92f98fee088f72bd6d063b3b3312d0bd29b37e7ad65ddeb3a7303320300c2807"}, {file = "python-vlc-3.0.16120.tar.gz", hash = "sha256:92f98fee088f72bd6d063b3b3312d0bd29b37e7ad65ddeb3a7303320300c2807"},
{file = "python_vlc-3.0.16120-py3-none-any.whl", hash = "sha256:c409afb38fe9f788a663b4302ca583f31289ef0860ab2b1668da96bbe8f14bfc"}, {file = "python_vlc-3.0.16120-py3-none-any.whl", hash = "sha256:c409afb38fe9f788a663b4302ca583f31289ef0860ab2b1668da96bbe8f14bfc"},
@ -981,6 +1004,7 @@ stack-data = [
{file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"}, {file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"},
{file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"}, {file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"},
] ]
text-unidecode = []
tinytag = [ tinytag = [
{file = "tinytag-1.8.1.tar.gz", hash = "sha256:363ab3107831a5598b68aaa061aba915fb1c7b4254d770232e65d5db8487636d"}, {file = "tinytag-1.8.1.tar.gz", hash = "sha256:363ab3107831a5598b68aaa061aba915fb1c7b4254d770232e65d5db8487636d"},
] ]

View File

@ -18,6 +18,7 @@ PyQtWebEngine = "^5.15.5"
pydub = "^0.25.1" pydub = "^0.25.1"
PyQt5-sip = "^12.9.1" PyQt5-sip = "^12.9.1"
types-psutil = "^5.8.22" types-psutil = "^5.8.22"
python-slugify = "^6.1.2"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
ipdb = "^0.13.9" ipdb = "^0.13.9"