+ data
+ (seq-map
+ (lambda (i)
+ (let-alist i
+ (if (not limit)
+ (format "%s | %s |\n" .name .id)
+ (format "%s | %s | %s (%s%s) | %s |\n"
+ .score .name
+ (if .disambiguation .disambiguation "")
+ (if .life-span.begin
+ (format "%s " .life-span.begin) "")
+ (if .life-span.end
+ (format "—%s" .life-span.end)
+ "ongoing")
+ .id))))
+ .labels))))
+
+
+;;;###autoload
+(defun musicbrainz-search-recording (query &optional limit)
+ "Search for a recording using QUERY and show matches.
+Optionally return LIMIT number of results."
+ (let ((data (musicbrainz-search "recording" query limit)))
+ (let-alist
+ data
+ (seq-map
+ (lambda (i)
+ (let-alist i
+ (format "%s | %s, %s | [[https://musicbrainz.org/release/%s][%s]] |\n"
+ .score .title (musicbrainz--unwrap-0 .artist-credit) .id .id)))
+ .recordings))))
+
+
+(defun musicbrainz--unwrap-0 (entity)
+ "Unwrap (fragile) .artist-credit ENTITY -> .name more or less."
+ (format "%s" (cdar (aref entity 0))))
+
+;;;###autoload
+(defun musicbrainz-search-release (query &optional limit)
+ "Search for a release using QUERY and show matches.
+Optionally return LIMIT number of results."
+ (let ((data (musicbrainz-search "release" query limit)))
+ (let-alist
+ data
+ (seq-map
+ (lambda (i)
+ (let-alist i
+ (format "%s | %s, %s | [[https://musicbrainz.org/release/%s][%s]] |\n"
+ .score .title (musicbrainz--unwrap-0 .artist-credit) .id .id)))
+ .releases))))
+
+
+;;; ;; ;; ; ; ; ; ; ;
+;;
+;; Lookups
+;; https://musicbrainz.org/doc/MusicBrainz_API#Lookups
+;;
+;;; ;; ;; ; ;
+
+;;;###autoload
+(defun musicbrainz-lookup (entity mbid &optional inc)
+ "Search (lookup not browse) the MusicBrainz database for ENTITY with MBID.
+Optionally add an INC list.
+
+Subqueries
+ /ws/2/area
+ /ws/2/artist recordings, releases, release-groups, works
+ /ws/2/collection user-collections (includes private collections, requires authentication)
+ /ws/2/event
+ /ws/2/genre
+ /ws/2/instrument
+ /ws/2/label releases
+ /ws/2/place
+ /ws/2/recording artists, releases, isrcs, url-rels
+ /ws/2/release artists, collections, labels, recordings, release-groups
+ /ws/2/release-group artists, releases
+ /ws/2/series
+ /ws/2/work
+ /ws/2/url"
+
+ (message "musicbrainz: lookup: %s/%s" entity mbid)
+ (if (and (musicbrainz-core-entity-p entity)
+ (musicbrainz-mbid-p mbid))
+ (let* ((add (if inc inc ""))
+ (response
+ (request-response-data
+ (request
+ (url-encode-url
+ (format "%s/%s/%s?inc=%s&fmt=json"
+ musicbrainz-api-url entity mbid add))
+ :type "GET"
+ :parser 'json-read
+ :sync t
+ :success (cl-function
+ (lambda (&key data &allow-other-keys)
+ (message "%s data: %s" entity mbid)))))))
+ response)
+ (error "MusicBrainz: search requires a valid MBID and entity (i.e. one of %s)"
+ musicbrainz-entities-core)))
+
+
+;; specific MBID subrequests (limited to 25 results?)
+
+(defun musicbrainz-lookup-artist (mbid)
+ "MusicBrainz lookup for artist with MBID."
+ (let ((response
+ (musicbrainz-lookup "artist" mbid)))
+ (let-alist response
+ (format "| %s | %s | %s | [[https://musicbrainz.org/artist/%s][%s]] |\n"
+ .name .disambiguation .type .id .id))))
+
+
+(defun musicbrainz-lookup-release (mbid)
+ "MusicBrainz lookup for release with MBID."
+ (let ((response
+ (musicbrainz-lookup "release" mbid)))
+ (let-alist response
+ (format "| %s | %s | %s | [[https://musicbrainz.org/release/%s][%s]] |\n"
+ .date .title .packaging .id .id))))
+
+(defun musicbrainz-lookup-recording (mbid)
+ "MusicBrainz lookup for recording with MBID."
+ (let ((response
+ (musicbrainz-lookup "recording" mbid)))
+ (let-alist response
+ (format "%s | [[https://musicbrainz.org/recording/%s][%s]] |\n"
+ .title .id .id))))
+
+
+(defun musicbrainz-lookup-artist-releases (mbid)
+ "MusicBrainz lookup for releases from artist with MBID."
+ (let ((response
+ (musicbrainz-lookup "artist" mbid "releases")))
+ (let-alist response
+ (seq-map
+ (lambda (i)
+ (let-alist i
+ (format "%s | %s | %s | [[https://musicbrainz.org/release/%s][%s]] |\n"
+ .date .title .packaging .id .id)))
+ .releases))))
+
+
+(defun musicbrainz-lookup-artist-recordings (mbid)
+ "MusicBrainz lookup for recordings from artist with MBID."
+ (let ((response
+ (musicbrainz-lookup "artist" mbid "recordings")))
+ (let-alist response
+ (seq-map
+ (lambda (i)
+ (let-alist i
+ (format "%s | [[https://musicbrainz.org/recording/%s][%s]] |\n"
+ .title .id .id)))
+ .recordings))))