1 # -*- mode: org; coding: utf-8; -*-
2 #+OPTIONS: toc:2 num:nil html-style:nil
4 #+title: MusicBrainz & ListenBrainz & others
7 - [[#musicbrainz][MusicBrainz]]
8 - [[#musicbrainz-api][MusicBrainz API]]
9 - [[#searching--browsing][searching & browsing]]
10 - [[#some-examples][some examples]]
11 - [[#cover-art][cover art]]
13 - [[#ambiguity][ambiguity]]
14 - [[#incompleteness][incompleteness]]
15 - [[#listenbrainz][ListenBrainz]]
16 - [[#listening][listening]]
17 - [[#examples][examples]]
18 - [[#incompleteness-1][incompleteness]]
19 - [[#otherbrainz][otherBrainz]]
20 - [[#further][further]]
24 [[file:img/musicbrainz-logo.svg]]
26 MusicBrainz is a community-maintained open source encyclopedia of [[https://musicbrainz.org/doc/About][music information]]. The REST-based [[https://musicbrainz.org/doc/MusicBrainz_API][webservice API]] can be used for direct access to MusicBrainz data with output in XML and JSON.
28 This code provides a simple, incomplete yet possibly useful interface to some of the MusicBrainz and ListenBrainz APIs from emacs for exploratory use in =org-mode= or behind the scenes sending listening metadata.
32 - Recording documentation: https://musicbrainz.org/doc/Recording
33 - Release documentation: https://musicbrainz.org/doc/Release
34 - Artist documentation: https://musicbrainz.org/doc/Artist
36 ** searching & browsing
38 Search supports the full [[https://lucene.apache.org/core/7_7_2/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description][Lucene search syntax]].
42 The API docs provide an example search for “Autechre albums & eps” using the URL https://musicbrainz.org/ws/2/release-group?artist=410c9baf-5469-44f6-9852-826524b80c61&type=album|ep
44 The equivalent function (which returns a raw response as an alist) would be…
45 #+BEGIN_SRC emacs-lisp
46 (musicbrainz-browse "release-group" "artist" "410c9baf-5469-44f6-9852-826524b80c61" "album|ep")
49 For slightly more legible output wrap with =musicbrainz-format=
50 #+BEGIN_SRC emacs-lisp
52 (musicbrainz-browse "release-group"
54 "410c9baf-5469-44f6-9852-826524b80c61"
58 A more interactive approach could start with =(musicbrainz-search "artist" "Autechre")= or =(musicbrainz-search-artist "Autechre")= Which returns an MBID required for the lookup =410c9baf-5469-44f6-9852-826524b80c61=
60 The MBID can be used for specific lookups (and checked if needed using =musicbrainz-mbid-p= )
62 #+BEGIN_SRC emacs-lisp
63 (musicbrainz-lookup "artist" "410c9baf-5469-44f6-9852-826524b80c61" "releases")
66 #+BEGIN_SRC emacs-lisp
67 (musicbrainz-lookup-artist "410c9baf-5469-44f6-9852-826524b80c61")
70 | Autechre | electronic music duo | Group | [[https://musicbrainz.org/artist/410c9baf-5469-44f6-9852-826524b80c61][410c9baf-5469-44f6-9852-826524b80c61]] |
72 #+BEGIN_SRC emacs-lisp
73 (musicbrainz-lookup-artist-releases "410c9baf-5469-44f6-9852-826524b80c61")
76 #+BEGIN_SRC emacs-lisp
77 (musicbrainz-lookup-artist-recordings "410c9baf-5469-44f6-9852-826524b80c61")
80 #+BEGIN_SRC emacs-lisp
81 (musicbrainz-lookup-release "ec1ecfcc-f529-43d1-8aa6-2c7051ede00c")
84 | 1990 | Autechre / Saw You | Cassette Case | [[https://musicbrainz.org/release/ec1ecfcc-f529-43d1-8aa6-2c7051ede00c][ec1ecfcc-f529-43d1-8aa6-2c7051ede00c]] |
86 #+BEGIN_SRC emacs-lisp
87 (musicbrainz-lookup-recording "83730176-89ec-41a5-a4b6-476998f6291c")
90 | [untitled] | [[https://musicbrainz.org/recording/83730176-89ec-41a5-a4b6-476998f6291c][83730176-89ec-41a5-a4b6-476998f6291c]] |
92 #+BEGIN_SRC emacs-lisp
93 (musicbrainz-search-label "Warp")
96 | Warp | [[https://musicbrainz.org/label/46f0f4cd-8aab-4b33-b698-f459faf64190][46f0f4cd-8aab-4b33-b698-f459faf64190]] |
98 #+BEGIN_SRC emacs-lisp
99 (musicbrainz-search-label "Music" 5)
102 | 100 | Sony Music | global brand, excluding JP, owned by Sony Music Entertainment (1991 ongoing) | [[https://musicbrainz.org/label/9e6b4d7f-4958-4db7-8504-d89e315836af][9e6b4d7f-4958-4db7-8504-d89e315836af]] |
103 | 96 | [no label] | Special purpose label – white labels, self-published releases and other “no label” releases (ongoing) | [[https://musicbrainz.org/label/157afde4-4bf5-4039-8ad2-5a15acc85176][157afde4-4bf5-4039-8ad2-5a15acc85176]] |
104 | 91 | Polydor | worldwide imprint, see annotation (1913-04-02 ongoing) | [[https://musicbrainz.org/label/ce24ab18-1bd6-4293-a486-546d13d6a5e2][ce24ab18-1bd6-4293-a486-546d13d6a5e2]] |
105 | 91 | Universal Music | plain logo: “Universal Music” (ongoing) | [[https://musicbrainz.org/label/13a464dc-b9fd-4d16-a4f4-d4316f6a46c7][13a464dc-b9fd-4d16-a4f4-d4316f6a46c7]] |
106 | 90 | ZYX Music | (1992 ongoing) | [[https://musicbrainz.org/label/6844efda-a451-431e-8cc1-48ab111b4711][6844efda-a451-431e-8cc1-48ab111b4711]] |
110 Cover art for a release may be available from the [[http://coverartarchive.org/][Cover Art Archive]] and can be accessed via the [[https://musicbrainz.org/doc/Cover_Art_Archive/API][API]]
112 #+BEGIN_SRC emacs-lisp
113 (musicbrainz-coverart "a929130a-535c-4827-8663-f048e1a7ca0d")
117 #+BEGIN_SRC emacs-lisp
118 (musicbrainz-coverart-front "a929130a-535c-4827-8663-f048e1a7ca0d")
122 #+BEGIN_SRC emacs-lisp
123 (musicbrainz-lookup-release "a929130a-535c-4827-8663-f048e1a7ca0d")
126 | Head Cleaning Cassette | Cassette Case | [[https://musicbrainz.org/release/a929130a-535c-4827-8663-f048e1a7ca0d][a929130a-535c-4827-8663-f048e1a7ca0d]] |
130 “One of MusicBrainz' aims is to be the universal lingua franca for music by providing a reliable and unambiguous form of music identification; this music identification is performed through the use of MusicBrainz Identifiers (MBIDs). An MBID is a 36 character Universally Unique Identifier that is permanently assigned to each entity in the database, i.e. artists, release groups, releases, recordings, works, labels, areas, places and URLs. MBIDs are also assigned to Tracks, though tracks do not share many other properties of entities.” https://musicbrainz.org/doc/MusicBrainz_Identifier
132 #+BEGIN_SRC emacs-lisp
133 (musicbrainz-artist-to-mbid "Autechre")
136 returns =410c9baf-5469-44f6-9852-826524b80c61=
138 #+BEGIN_SRC emacs-lisp
139 (musicbrainz-mbid-p "410c9baf-5469-44f6-9852-826524b80c61")
148 John Williams, the soundtrack composer and conductor, has an artist MBID of 53b106e7-0cc6-42cc-ac95-ed8d30a3a98e
149 John Williams, the classical guitar player, has an artist MBID of 8b8a38a9-a290-4560-84f6-3d4466e8d791
152 #+BEGIN_SRC emacs-lisp
153 (musicbrainz-disambiguate-artist "John Williams" 3)
156 | | Artist: John Williams | MBID |
157 | 100 | John Williams, American score composer | [[https://musicbrainz.org/artist/53b106e7-0cc6-42cc-ac95-ed8d30a3a98e][53b106e7-0cc6-42cc-ac95-ed8d30a3a98e]] |
158 | 94 | John Williams, classical guitarist | [[https://musicbrainz.org/artist/8b8a38a9-a290-4560-84f6-3d4466e8d791][8b8a38a9-a290-4560-84f6-3d4466e8d791]] |
159 | 92 | John Williams, English A&R executive, producer, songwriter... | [[https://musicbrainz.org/artist/eb5d7680-0c00-4b0c-b6eb-9605ff77723d][eb5d7680-0c00-4b0c-b6eb-9605ff77723d]] |
161 There are several “Bad Seeds”
163 #+BEGIN_SRC emacs-lisp
164 (musicbrainz-artist-to-mbid "Bad Seeds")
167 Which returns the MBID =7feb02f2-51fa-422d-838e-2c14ecb4c7b8= for “Tomorrows Bad Seeds”, however…
169 #+BEGIN_SRC emacs-lisp
170 (musicbrainz-disambiguate-artist "Bad Seeds" 7)
173 | | Artist: Bad Seeds | MBID |
174 | 100 | Tomorrows Bad Seeds, nil | [[https://musicbrainz.org/artist/7feb02f2-51fa-422d-838e-2c14ecb4c7b8][7feb02f2-51fa-422d-838e-2c14ecb4c7b8]] |
175 | 98 | The Bad Seeds, 60s Texas rock band | [[https://musicbrainz.org/artist/3e593712-9f70-4b7a-b21b-466016998a3d][3e593712-9f70-4b7a-b21b-466016998a3d]] |
176 | 98 | The Bad Seeds, 60's US garage rock band from Erlanger, KY | [[https://musicbrainz.org/artist/34bc9a97-fa78-424e-8ca8-a904f978f041][34bc9a97-fa78-424e-8ca8-a904f978f041]] |
177 | 98 | The Bad Seeds, backing band for Nick Cave | [[https://musicbrainz.org/artist/eb2a8edc-5670-4896-82be-87db38de9583][eb2a8edc-5670-4896-82be-87db38de9583]] |
178 | 86 | Nick Cave & the Bad Seeds, nil | [[https://musicbrainz.org/artist/172e1f1a-504d-4488-b053-6344ba63e6d0][172e1f1a-504d-4488-b053-6344ba63e6d0]] |
179 | 50 | The Lightning Seeds, nil | [[https://musicbrainz.org/artist/1ba601a0-3401-4b28-8ddd-9af8203661e8][1ba601a0-3401-4b28-8ddd-9af8203661e8]] |
180 | 49 | Seeds, UK dancehall | [[https://musicbrainz.org/artist/a03cf587-a3d3-4847-ac41-e488f779a313][a03cf587-a3d3-4847-ac41-e488f779a313]] |
182 #+BEGIN_SRC emacs-lisp
183 (musicbrainz-lookup-artist "172e1f1a-504d-4488-b053-6344ba63e6d0")
188 general, specific and partial API coverage
190 *** Searching & browsing
192 Search supports the full [[https://lucene.apache.org/core/7_7_2/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description][Lucene search syntax]] in queries.
194 | (musicbrainz-search /type/ /query/ &optional /limit/ /offset/) | see =musicbrainz-search-types= |
195 | (musicbrainz-browse /entity/ /link/ /query/ &optional /type/) | and =musicbrainz-entities-*= |
197 | (musicbrainz-search-artist /artist/ &optional /limit/) | |
198 | (musicbrainz-artist-to-mbid /artist/) | |
199 | (musicbrainz-disambiguate-artist /artist/ &optional /limit/) | |
200 | (musicbrainz-search-label /label/ &optional /limit/) | |
201 | (musicbrainz-search-recording /query/ &optional /limit/) | |
202 | (musicbrainz-search-release /query/ &optional /limit/) | |
203 | (musicbrainz-search-work /query/ &optional /limit/) | |
205 *** Lookup queries & subqueries
207 | (musicbrainz-lookup /entity/ /MBID/ &optional /inc/) | valid entities listed in =musicbrainz-entities-core= |
209 | *Functions & formatted output* | example MBID |
210 | (musicbrainz-lookup-area /MBID/) | [[https://musicbrainz.org/area/c9ac1239-e832-41bc-9930-e252a1fd1105][c9ac1239-e832-41bc-9930-e252a1fd1105]] |
211 | (musicbrainz-lookup-artist /MBID/) | [[https://musicbrainz.org/artist/410c9baf-5469-44f6-9852-826524b80c61][410c9baf-5469-44f6-9852-826524b80c61]] |
212 | (musicbrainz-lookup-artist-recordings /MBID/) | … |
213 | (musicbrainz-lookup-artist-releases /MBID/) | … |
214 | (musicbrainz-lookup-artist-release-groups /MBID/) | … |
215 | (musicbrainz-lookup-artist-works /MBID/) | … |
216 | (musicbrainz-lookup-collection /MBID/) | … |
217 | (musicbrainz-lookup-collection-user-collections /MBID/) | … |
218 | (musicbrainz-lookup-event /MBID/) | [[https://musicbrainz.org/event/7c132556-e902-4481-b9cb-ec76a175628a][7c132556-e902-4481-b9cb-ec76a175628a]] |
219 | (musicbrainz-lookup-genre /MBID/) | [[https://musicbrainz.org/genre/68c81274-5770-4e7b-a4bf-ab0d7d425d99][68c81274-5770-4e7b-a4bf-ab0d7d425d99]] |
220 | (musicbrainz-lookup-instrument /MBID/) | [[https://musicbrainz.org/instrument/303d4f1a-f799-4c42-9bac-dbedd9139e91][303d4f1a-f799-4c42-9bac-dbedd9139e91]] |
221 | (musicbrainz-lookup-label /MBID/) | [[https://musicbrainz.org/label/8943d408-940c-403b-a01d-9036c227d50f][8943d408-940c-403b-a01d-9036c227d50f]] |
222 | (musicbrainz-lookup-label-releases /MBID/) | … |
223 | (musicbrainz-lookup-place /MBID/) | [[https://musicbrainz.org/place/73cba8a4-cacb-45b9-8e02-654f716e2e7a][73cba8a4-cacb-45b9-8e02-654f716e2e7a]] |
224 | (musicbrainz-lookup-recording /MBID/) | [[https://musicbrainz.org/recording/ef8b34c1-8548-472c-872f-03e0d8d3bb37][ef8b34c1-8548-472c-872f-03e0d8d3bb37]] |
225 | (musicbrainz-lookup-recording-artists /MBID/) | … |
226 | (musicbrainz-lookup-recording-releases /MBID/) | … |
227 | (musicbrainz-lookup-recording-isrcs /MBID/) | … |
228 | (musicbrainz-lookup-recording-url-rels /MBID/) | … |
229 | (musicbrainz-lookup-release /MBID/) | … |
230 | (musicbrainz-lookup-release-artists /MBID/) | … |
231 | (musicbrainz-lookup-release-collections /MBID/) | … |
232 | (musicbrainz-lookup-release-labels /MBID/) | … |
233 | (musicbrainz-lookup-release-recordings /MBID/) | … |
234 | (musicbrainz-lookup-release-release-groups /MBID/) | … |
235 | (musicbrainz-lookup-release-group /MBID/) | [[https://musicbrainz.org/release-group/fe4acfe9-6d1e-3565-8857-fb16ddc492ab][fe4acfe9-6d1e-3565-8857-fb16ddc492ab]] |
236 | (musicbrainz-lookup-release-group-artists /MBID/) | … |
237 | (musicbrainz-lookup-release-group-releases /MBID/) | … |
238 | (musicbrainz-lookup-series /MBID/) | … |
239 | (musicbrainz-lookup-work /MBID/) | [[https://musicbrainz.org/work/4ee2545d-2be5-3841-b568-0b4554eccc67][4ee2545d-2be5-3841-b568-0b4554eccc67]] |
240 | (musicbrainz-lookup-url /MBID/) | … |
246 [[file:img/listenbrainz-logo.svg]]
250 - https://listenbrainz.org
251 - https://listenbrainz.readthedocs.io/
255 #+BEGIN_SRC emacs-lisp
256 (setq listenbrainz-api-token "000-000-000")
259 #+BEGIN_SRC emacs-lisp
260 (listenbrainz-validate-token listenbrainz-api-token)
263 #+BEGIN_SRC emacs-lisp
264 (listenbrainz-listens "zzzkt")
267 #+BEGIN_SRC emacs-lisp
268 (listenbrainz-listens "zzzkt" 33)
271 #+BEGIN_SRC emacs-lisp
272 (listenbrainz-submit-single-listen "Matthew Thomas" "Taema" "Architecture")
275 #+BEGIN_SRC emacs-lisp
276 (listenbrainz-submit-single-listen "farmersmanual" "808808008088 (11)")
279 #+BEGIN_SRC emacs-lisp
280 (listenbrainz-submit-playing-now "farmersmanual" "808808008088 (11)")
283 #+BEGIN_SRC emacs-lisp
284 (listenbrainz-playing-now "zzzkt")
287 #+BEGIN_SRC emacs-lisp
288 (listenbrainz-stats-artists "zzzkt")
291 #+BEGIN_SRC emacs-lisp
292 (listenbrainz-stats-releases "zzzkt")
295 #+BEGIN_SRC emacs-lisp
296 (listenbrainz-stats-recordings "zzzkt" 13 "month")
300 *** Core API endpoints
302 https://listenbrainz.readthedocs.io/en/production/dev/api/#core-api-endpoints
304 | POST /1/submit-listens | listenbrainz-submit-listen |
305 | | listenbrainz-submit-single-listen |
306 | | listenbrainz-submit-playing-now |
307 | GET /1/validate-token | listenbrainz-validate-token |
308 | POST /1/delete-listen | - |
309 | GET /1/user/(playlist_user_name)/playlists/collaborator | - |
310 | GET /1/user/(playlist_user_name)/playlists/createdfor | - |
311 | GET /1/users/(user_list)/recent-listens | - |
312 | GET /1/user/(user_name)/similar-users | - |
313 | GET /1/user/(user_name)/listen-count | - |
314 | GET /1/user/(user_name)/playing-now | listenbrainz-playing-now |
315 | GET /1/user/(user_name)/similar-to/(other_user_name) | - |
316 | GET /1/user/(playlist_user_name)/playlists | - |
317 | GET /1/user/(user_name)/listens | listenbrainz-listens |
318 | GET /1/latest-import | - |
319 | POST /1/latest-import | - |
321 *** Feedback API Endpoints
323 https://listenbrainz.readthedocs.io/en/production/dev/api/#feedback-api-endpoints
325 | POST /1/feedback/recording-feedback | - |
326 | GET /1/feedback/recording/(recording_msid)/get-feedback | - |
327 | GET /1/feedback/user/(user_name)/get-feedback-for-recordings | – |
328 | GET /1/feedback/user/(user_name)/get-feedback | - |
330 *** Recording Recommendation API Endpoints
332 https://listenbrainz.readthedocs.io/en/production/dev/api/#core-api-endpoints
334 | GET /1/cf/recommendation/user/(user_name)/recording | - |
336 *** Recording Recommendation Feedback API Endpoints
338 https://listenbrainz.readthedocs.io/en/production/dev/api/#recording-recommendation-feedback-api-endpoints
340 | POST /1/recommendation/feedback/submit | - |
341 | POST /1/recommendation/feedback/delete | - |
342 | GET /1/recommendation/feedback/user/(user_name)/recordings | - |
343 | GET /1/recommendation/feedback/user/(user_name) | - |
345 *** Statistics API Endpoints
347 https://listenbrainz.readthedocs.io/en/production/dev/api/#statistics-api-endpoints
349 | GET /1/stats/sitewide/artists | - |
350 | GET /1/stats/user/(user_name)/listening-activity | - |
351 | GET /1/stats/user/(user_name)/daily-activity | - |
352 | GET /1/stats/user/(user_name)/recordings | listenbrainz-stats-recordings |
353 | GET /1/stats/user/(user_name)/artist-map | - |
354 | GET /1/stats/user/(user_name)/releases | listenbrainz-stats-releases |
355 | GET /1/stats/user/(user_name)/artists | listenbrainz-stats-artists |
357 *** Status API Endpoints
359 https://listenbrainz.readthedocs.io/en/production/dev/api/#status-api-endpoints
361 | GET /1/status/get-dump-info | - |
363 *** User Timeline API Endpoints
365 https://listenbrainz.readthedocs.io/en/production/dev/api/#user-timeline-api-endpoints
367 | POST /1/user/(user_name)/timeline-event/create/notification | - |
368 | POST /1/user/(user_name)/timeline-event/create/recording | - |
369 | POST /1/user/(user_name)/feed/events/delete | - |
370 | GET /1/user/(user_name)/feed/events | - |
372 *** Social API Endpoints
374 https://listenbrainz.readthedocs.io/en/production/dev/api/#social-api-endpoints
376 | GET /1/user/(user_name)/followers | listenbrainz-followers |
377 | GET /1/user/(user_name)/following | listenbrainz-following |
378 | POST /1/user/(user_name)/unfollow | - |
379 | POST /1/user/(user_name)/follow | - |
381 *** Pinned Recording API Endpoints
383 https://listenbrainz.readthedocs.io/en/production/dev/api/#pinned-recording-api-endpoints
385 | POST /1/pin/unpin | - |
387 | POST /1/pin/delete/(row_id) | - |
388 | GET /1/(user_name)/pins/following | - |
389 | GET /1/(user_name)/pins | - |
393 - [[https://critiquebrainz.org/][CritiqueBrainz]]
394 - [[https://bookbrainz.org/][BookBrainz]] → https://api.test.bookbrainz.org/1/docs/
395 - [[https://listenbrainz.org/messybrainz/][MessyBrainz]]
396 - [[https://coverartarchive.org/][Cover art archive]]
399 - https://labs.api.listenbrainz.org/
400 - https://troi.readthedocs.io/en/latest/
401 - https://listenbrainz.org/user/troi-bot/playlists/
402 - https://github.com/metabrainz/bono-data-sets/blob/main/top_discoveries.py