It mentions it here, but I’ve been doing comments in the setlist. Is this actually in the schema and not implemented on the event edit page?
Events are similar to artists in that you don’t create the annotation from the main edit form, but with a separate “Add annotation” link from the sidebar.
I did not see that, thanks
Well… I found a bug in musicbrainzngs. It doesn’t think ‘annotation’ is proper include for an event even though it is. A tiny edit later and… I still have something broke. It’s late, I’m tired..
mbxml.py in musicbrainzngs needed a tiny edit, too. Ok, now I can sleep…
>>> metadata = dict()
>>> perfvars.add_album_performance_metadata(metadata, '99301bda-f462-41d3-ae27-658b57772dda')
>>> pprint.pp(metadata,width=120)
{'~release_performance1_name': 'Madison Square Garden, New York, NY',
'~release_performance1_date': '1973-07-28',
'~release_performance1_annotation': 'part of the Song Remains the Same taping',
'~release_performance1_location_addr': '4 Pennsylvania Plaza, New York, NY 10001',
'~release_performance1_location_gps': '40.750556,-73.993611',
'~release_performance1_location': 'Madison Square Garden',
'~release_performance1_location_unwound': 'Madison Square Garden, Midtown Manhattan, Manhattan, New York, US-NY, US',
...
'~release_performance_count': 3}
>>>
That is basically abandonware by now, so I’m not surprised - I expect it has a lot more stuff missing.
Hi, are there dox that describe how to use Picard’s album.tagger.webservice._get_by_id() for a plugin? Or is this “Use the source, Luke”? With the name starting with an underscore, that makes it private, right?
Basically, I need to redo this file for webservice. I’m imagining something overly complex with condition waits
def get_release_group (ws, mbid):
# if pending condition.wait
# if not error return release_group_cache[mbid]
# elif timeout retry?
# else
# set pending
# ws.get_release_group_by_id(...,on_complete,...)
#
# def on_complete(response, reply, error):
# if not error
# release_group_cache[mbid] = response['release_group']
# unset pending
# condition.set ?
pass
Oh, I can get URLs, too. This is fancy. Cover art, next? Maybe ![]()
Should I just build my own?
from picard.webservice.api_helpers import APIHelper
class PluginCachingWebService(APIHelper):
def __init__ (self, webservice):
super().__init__(webservice)
self.release_group_cache = dict()
self.release_cache = dict()
self.event_cache = dict()
self.place_cache = dict()
self.area_cache = dict()
def clear_cache(self):
del self.release_group_cache,self.release_cache,self.event_cache,self.place_cache,self.area_cache
self.release_group_cache = dict()
self.release_cache = dict()
self.event_cache = dict()
self.place_cache = dict()
self.area_cache = dict()
def get_release_by_id(self,mbid):
pass
def get_release_group_by_id(self,mbid):
pass
def get_event_by_id(self,mbid):
pass
def get_place_by_id(self,mbid):
pass
def get_area_by_id(self,mbid):
pass
ourWS = PluginCachingWebService(album.tagger.webservice)
event = ourWS.get_event_by_id(mbid)
@Sophist I need your advice on what to do about replacing musicbrainzngs in a plugin
It’s working quite well pulling apart all the events on this release
davygrvy@puukukui:~/PlayArea/MB stuff$ python3
Python 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pprint
>>> import perfvars
>>> metadata = dict()
>>> perfvars.add_album_performance_metadata(metadata, '18f55f2f-daae-40a1-9d5c-0842e7dc030a')
>>> pprint.pp(metadata,width=120)
{'~release_performance1_name': "Alexis Korner's Rhythm and Blues / World Service",
'~release_performance1_date': '1969-03-19',
'~release_performance1_homepage': 'https://www.ledzeppelin.com/show/maida-vale-bbc-studios-march-19-1969',
'~release_performance1_location_addr': 'Delaware Road, London W9 2LG, United Kingdom',
'~release_performance1_location_gps': '51.5258,-0.1904',
'~release_performance1_location': 'Maida Vale Studios: Studio 4',
'~release_performance1_location_unwound': 'Maida Vale Studios: Studio 4, Maida Vale Studios, BBC Studios, London, '
'GB-ENG, GB',
'~release_performance2_name': "Chris Grant's Tasty Pop Sundae",
'~release_performance2_date': '1969-06-16',
'~release_performance2_homepage': 'https://www.ledzeppelin.com/show/aeolian-hall-bbc-june-16-1969',
'~release_performance2_location_addr': 'New Bond Street',
'~release_performance2_location': 'Aeolian Hall Studio 2',
'~release_performance2_location_unwound': 'Aeolian Hall Studio 2, Aeolian Hall, BBC Studios, London, GB-ENG, GB',
'~release_performance3_name': 'In Concert with John Peel (BBC)',
'~release_performance3_date': '1971-04-01',
'~release_performance3_homepage': 'https://www.ledzeppelin.com/show/paris-cinema-theatre-april-1-1971',
'~release_performance3_location_addr': '12 Lower Regent Street',
'~release_performance3_location_gps': '51.508389,-0.133389',
'~release_performance3_location': 'Paris Theatre',
'~release_performance3_location_unwound': 'Paris Theatre, BBC Studios, London, GB-ENG, GB',
'~release_performance4_name': "John Peel's Top Gear",
'~release_performance4_date': '1969-03-03',
'~release_performance4_homepage': 'https://www.ledzeppelin.com/show/playhouse-theatre-march-3-1969',
'~release_performance4_location_addr': 'Northumberland Ave, London WC2N 5DE, UK',
'~release_performance4_location_gps': '51.506944,-0.123611',
'~release_performance4_location': 'Playhouse Theatre',
'~release_performance4_location_unwound': 'Playhouse Theatre, BBC Studios, London, GB-ENG, GB',
'~release_performance5_name': "John Peel's Top Gear",
'~release_performance5_date': '1969-06-24',
'~release_performance5_homepage': 'https://www.ledzeppelin.com/show/maida-vale-bbc-studios-june-24-1969',
'~release_performance5_location_addr': 'Delaware Road, London W9 2LG, United Kingdom',
'~release_performance5_location_gps': '51.5258,-0.1904',
'~release_performance5_location': 'Maida Vale Studios: Studio 4',
'~release_performance5_location_unwound': 'Maida Vale Studios: Studio 4, Maida Vale Studios, BBC Studios, London, '
'GB-ENG, GB',
'~release_performance6_name': 'Julie Felix Show',
'~release_performance6_date': '1970-04-23',
'~release_performance6_homepage': 'https://www.ledzeppelin.com/show/bbc-tv-lime-grove-studios-april-23-1970',
'~release_performance6_location_addr': "Shepherd's Bush, West London, England",
'~release_performance6_location_gps': '51.503611,-0.227222',
'~release_performance6_location': 'BBC Lime Grove',
'~release_performance6_location_unwound': 'BBC Lime Grove, BBC Studios, London, GB-ENG, GB',
'~release_performance7_name': 'Radio One In Concert',
'~release_performance7_date': '1969-06-27',
'~release_performance7_homepage': 'https://www.ledzeppelin.com/show/playhouse-theatre-june-27-1969',
'~release_performance7_location_addr': 'Northumberland Ave, London WC2N 5DE, UK',
'~release_performance7_location_gps': '51.506944,-0.123611',
'~release_performance7_location': 'Playhouse Theatre',
'~release_performance7_location_unwound': 'Playhouse Theatre, BBC Studios, London, GB-ENG, GB',
'~release_performance_count': 7}
>>>
Oh, wow, neet. I can do this ![]()
EDIT: maybe not…
EDIT2: Gotcha! https://eventartarchive.org/event/30f5416d-bb62-4827-9e9f-605a1368cd5c
does webservice do smart caching by doing a HEAD request first, then a following GET if Last-Modified is newer in the headers?
