Skip to content

Commit

Permalink
Some discogs fixes and adding wikimedia support (#879)
Browse files Browse the repository at this point in the history
  • Loading branch information
aw-was-here committed Jul 9, 2023
1 parent adf3680 commit 1fff6a2
Show file tree
Hide file tree
Showing 25 changed files with 3,449 additions and 49 deletions.
1 change: 1 addition & 0 deletions nowplaying.pyproject
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"nowplaying/resources/artistextras_fanarttv_ui.ui",
"nowplaying/resources/artistextras_theaudiodb_ui.ui",
"nowplaying/resources/artistextras_ui.ui",
"nowplaying/resources/artistextras_wikimedia_ui.ui",
"nowplaying/resources/discordbot_ui.ui",
"nowplaying/resources/filter_ui.ui",
"nowplaying/resources/general_ui.ui",
Expand Down
58 changes: 35 additions & 23 deletions nowplaying/artistextras/discogs.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,36 +37,47 @@ def _setup_client(self):
return True
return False

def _find_discogs_artist_releaselist(self, metadata):
def _find_discogs_website(self, metadata):
''' use websites listing to find discogs entries '''

artistname = metadata['artist']
if not self.client and not self._setup_client():
return artistname

if not self.client or not metadata.get('artistwebsites'):
return artistname

artistnum = 0
discogs_websites = [url for url in metadata['artistwebsites'] if 'discogs' in url]
if len(discogs_websites) == 1:
artistnum = discogs_websites[0].split('/')[-1]
artist = self.client.artist(artistnum)
artistname = str(artist.name)
logging.debug('Found a singular discogs artist URL using %s instead of %s', artistname,
metadata['artist'])
elif len(discogs_websites) > 1:
for website in discogs_websites:
artistnum = website.split('/')[-1]
artist = self.client.artist(artistnum)
webartistname = str(artist.name)
if nowplaying.utils.normalize(webartistname) == nowplaying.utils.normalize(
metadata['artist']):
logging.debug(
'Found near exact match discogs artist URL %s using %s instead of %s',
website, webartistname, metadata['artist'])
artistname = webartistname
break
return artistname

def _find_discogs_artist_releaselist(self, metadata):
''' given metadata, find the releases for an artist '''
if not self.client and not self._setup_client():
return None

if not self.client:
return None

artistnum = 0
artistname = metadata['artist']
# 'https://www.discogs.com/artist/<ARTISTNUM>'
if metadata.get('artistwebsites'):
discogs_website = [url for url in metadata['artistwebsites'] if 'discogs' in url]
if len(discogs_website) == 1:
artistnum = discogs_website[0].split('/')[-1]
artist = self.client.artist(artistnum)
artistname = str(artist.name)
logging.debug('Found a singular discogs artist URL using %s instead of %s',
artistname, metadata['artist'])
elif len(discogs_website) > 1:
for website in discogs_website:
artistnum = website.split('/')[-1]
artist = self.client.artist(artistnum)
webartistname = str(artist.name)
if nowplaying.utils.normalize(webartistname) == nowplaying.utils.normalize(
metadata['artist']):
logging.debug(
'Found near exact match discogs artist URL %s using %s instead of %s',
website, webartistname, metadata['artist'])
artistname = webartistname
artistname = self._find_discogs_website(metadata)

try:
logging.debug('Fetching %s - %s', artistname, metadata['album'])
Expand Down Expand Up @@ -105,6 +116,7 @@ def download(self, metadata=None, imagecache=None): # pylint: disable=too-many-
return None

oldartist = metadata['artist']
artistresultlist = None
for variation in nowplaying.utils.artist_name_variations(metadata['artist']):
metadata['artist'] = variation
artistresultlist = self._find_discogs_artist_releaselist(metadata)
Expand Down
85 changes: 85 additions & 0 deletions nowplaying/artistextras/wikimedia.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#!/usr/bin/env python3
''' start of support of discogs '''

import logging
from nowplaying.vendor import wptools

from nowplaying.artistextras import ArtistExtrasPlugin

class Plugin(ArtistExtrasPlugin):
''' handler for discogs '''

def __init__(self, config=None, qsettings=None):
super().__init__(config=config, qsettings=qsettings)
self.displayname = "Wikimedia"

def download(self, metadata=None, imagecache=None):
''' download content '''

mymeta = {}
print(metadata['artistwebsites'])
if not metadata.get('artistwebsites'):
logging.debug('No artistwebsites.')
return None

wikidata_websites = [url for url in metadata['artistwebsites'] if 'wikidata' in url]
for website in wikidata_websites:
entity = website.split('/')[-1]
page = wptools.page(wikibase=entity, silent=True)
page.get()

if page.data['extext'] and self.config.cparser.value('wikimedia/bio', type=bool):
mymeta['artistlongbio'] = page.data['extext']
if page.data['claims'].get('P434'):
mymeta['musicbrainzartistid'] = page.data['claims'].get('P434')
mymeta['artistwebsites'] = []
if page.data['claims'].get('P1953'):
mymeta['artistwebsites'].append(
f"https://discogs.com/artist/{page.data['claims'].get('P1953')[0]}")
mymeta['artistfanarturls'] = []
thumbs = []
if page.images():
for image in page.images(['kind', 'url']):
if image['kind'] in ['wikidata-image', 'parse-image'
] and self.config.cparser.value('wikimedia/fanart',
type=bool):
mymeta['artistfanarturls'].append(image['url'])
elif image['kind'] == 'query-thumbnail':
thumbs.append(image['url'])

if thumbs and self.config.cparser.value('wikimedia/thumbnails', type=bool):
imagecache.fill_queue(config=self.config,
artist=metadata['artist'],
imagetype='artistthumb',
urllist=thumbs)
return mymeta

def providerinfo(self): # pylint: disable=no-self-use
''' return list of what is provided by this plug-in '''
return ['artistlongbio', 'wikimedia-artistfanarturls', 'artistwebsites']

def load_settingsui(self, qwidget):
''' draw the plugin's settings page '''
if self.config.cparser.value('wikimedia/enabled', type=bool):
qwidget.wikimedia_checkbox.setChecked(True)
else:
qwidget.wikimedia_checkbox.setChecked(False)

for field in ['bio', 'fanart', 'thumbnails', 'websites']:
func = getattr(qwidget, f'{field}_checkbox')
func.setChecked(self.config.cparser.value(f'wikimedia/{field}', type=bool))

def save_settingsui(self, qwidget):
''' take the settings page and save it '''

self.config.cparser.setValue('wikimedia/enabled', qwidget.wikimedia_checkbox.isChecked())

for field in ['bio', 'fanart', 'thumbnails', 'websites']:
func = getattr(qwidget, f'{field}_checkbox')
self.config.cparser.setValue(f'wikimedia/{field}', func.isChecked())

def defaults(self, qsettings):
for field in ['bio', 'fanart', 'thumbnails', 'websites']:
qsettings.setValue(f'wikimedia/{field}', False)

qsettings.setValue('wikimedia/enabled', False)
17 changes: 11 additions & 6 deletions nowplaying/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,15 +243,17 @@ def plugins_load_settingsui(self, qtwidgets):
for plugintype, plugtypelist in self.plugins.items():
for key in plugtypelist:
widgetkey = key.split('.')[-1]
self.pluginobjs[plugintype][key].load_settingsui(
qtwidgets[f'{plugintype}_{widgetkey}'])
if qtwidgets[f'{plugintype}_{widgetkey}']:
self.pluginobjs[plugintype][key].load_settingsui(
qtwidgets[f'{plugintype}_{widgetkey}'])

def plugins_verify_settingsui(self, inputname, qtwidgets):
''' configure the defaults for plugins '''
for plugintype, plugtypelist in self.plugins.items():
for key in plugtypelist:
widgetkey = key.split('.')[-1]
if (widgetkey == inputname and plugintype == 'inputs') or (plugintype != 'inputs'):
if (widgetkey == inputname and plugintype == 'inputs'
) or (plugintype != 'inputs') and qtwidgets[f'{plugintype}_{widgetkey}']:
self.pluginobjs[plugintype][key].verify_settingsui(
qtwidgets[f'{plugintype}_{widgetkey}'])

Expand All @@ -260,12 +262,15 @@ def plugins_save_settingsui(self, qtwidgets):
for plugintype, plugtypelist in self.plugins.items():
for key in plugtypelist:
widgetkey = key.split('.')[-1]
self.pluginobjs[plugintype][key].save_settingsui(
qtwidgets[f'{plugintype}_{widgetkey}'])
if qtwidgets[f'{plugintype}_{widgetkey}']:
self.pluginobjs[plugintype][key].save_settingsui(
qtwidgets[f'{plugintype}_{widgetkey}'])

def plugins_description(self, plugintype, plugin, qtwidget):
''' configure the defaults for input plugins '''
self.pluginobjs[plugintype][f'nowplaying.{plugintype}.{plugin}'].desc_settingsui(qtwidget)
if qtwidget:
self.pluginobjs[plugintype][f'nowplaying.{plugintype}.{plugin}'].desc_settingsui(
qtwidget)

# pylint: disable=too-many-arguments
def put(self, initialized, notif, loglevel):
Expand Down
8 changes: 3 additions & 5 deletions nowplaying/musicbrainz.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# pylint: disable=invalid-name
''' support for musicbrainz '''

import contextlib
import logging
import logging.config
import logging.handlers
Expand Down Expand Up @@ -146,13 +147,10 @@ def isrc(self, isrclist):
mbdata = {}

for isrc in isrclist:
try:
with contextlib.suppress(Exception):
mbdata = musicbrainzngs.get_recordings_by_isrc(isrc,
includes=['releases'],
release_status=['official'])
except Exception: # pylint: disable=broad-except
pass

if not mbdata:
for isrc in isrclist:
try:
Expand Down Expand Up @@ -331,7 +329,7 @@ def _websites(self, idlist):
type=bool):
sitelist.append(urlrel['target'])
logging.debug('placed %s', dest)
return sitelist
return list(dict.fromkeys(sitelist))

def providerinfo(self): # pylint: disable=no-self-use
''' return list of what is provided by this recognition system '''
Expand Down
Loading

0 comments on commit 1fff6a2

Please sign in to comment.