From c46cd9a57fd25994ed7c209bdd7ef4a51ac00870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=84min=20Baumeler?= Date: Tue, 26 Aug 2025 10:43:45 +0200 Subject: [PATCH] improved MB API wrappres --- src/main.sh | 1 + src/sh/api.sh | 156 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 104 insertions(+), 53 deletions(-) diff --git a/src/main.sh b/src/main.sh index 1c3b5a7..c9d0abd 100755 --- a/src/main.sh +++ b/src/main.sh @@ -366,6 +366,7 @@ esac while true; do case "${1:-}" in "--artist") + mb_artist "$2" >>/tmp/foo name="$(mb_artist "$2" | $JQ -r '.name')" secsymb="$(printf "$FORMAT_TYPE_HAS_SECONDARY" "")" sel=$( diff --git a/src/sh/api.sh b/src/sh/api.sh index 11663a9..33ba37d 100644 --- a/src/sh/api.sh +++ b/src/sh/api.sh @@ -1,93 +1,143 @@ +MB_MAX_RETRIES=10 MB_BROWSE_STEPS=100 +USER_AGENT="$APP_NAME/$APP_VERSION ($APP_WEBSITE)" +SLEEP_ON_ERROR=1 export MB_BROWSE_STEPS -api_mb_artist() { - $CURL \ - --get \ - --data fmt=json \ - --data inc="url-rels+artist-rels+aliases" \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ - "https://musicbrainz.org/ws/2/artist/$1" +__api_mb() { + tmpout=$(mktemp) + for _ in $(seq "$MB_MAX_RETRIES"); do + case "$1" in + "artist") + $CURL \ + --output "$tmpout" \ + --get \ + --data fmt=json \ + --data inc="url-rels+artist-rels+aliases" \ + -A "$USER_AGENT" \ + "https://musicbrainz.org/ws/2/artist/$2" + ;; + "releasegroup") + $CURL \ + --output "$tmpout" \ + --get \ + --data fmt=json \ + --data inc=artist-credits \ + -A "$USER_AGENT" \ + "https://musicbrainz.org/ws/2/release-group/$2" + ;; + "release") + $CURL \ + --output "$tmpout" \ + --get \ + --data fmt=json \ + --data inc="recordings+artist-credits+release-groups+labels" \ + -A "$USER_AGENT" \ + "https://musicbrainz.org/ws/2/release/$2" + ;; + "browse-artist-releasegroups") + $CURL \ + --output "$tmpout" \ + --get \ + --data fmt=json \ + --data inc=artist-credits \ + --data limit="$MB_BROWSE_STEPS" \ + --data offset="$3" \ + --data artist="$2" \ + -A "$USER_AGENT" \ + "https://musicbrainz.org/ws/2/release-group" + ;; + "browse-releasegroup-releases") + $CURL \ + --output "$tmpout" \ + --get \ + --data fmt=json \ + --data inc="artist-credits+labels+media+release-groups" \ + --data limit="$MB_BROWSE_STEPS" \ + --data offset="$3" \ + --data release-group="$2" \ + -A "$USER_AGENT" \ + "https://musicbrainz.org/ws/2/release" + ;; + "search-artist") + $CURL \ + --output "$tmpout" \ + --get \ + --data fmt=json \ + --data-urlencode query="$2" \ + -A "$USER_AGENT" \ + "https://musicbrainz.org/ws/2/artist" + ;; + "search-releasegroup") + $CURL \ + --output "$tmpout" \ + --get \ + --data fmt=json \ + --data inc=artist-credits \ + --data-urlencode query="$2" \ + -A "$USER_AGENT" \ + "https://musicbrainz.org/ws/2/release-group" + ;; + esac + if ! $JQ -e '.error' "$tmpout" >/dev/null 2>/dev/stdout; then + cat "$tmpout" + rm -f "$tmpout" + return 0 + else + sleep "$SLEEP_ON_ERROR" + fi + done + rm -f "$tmpout" + err "Failed to fetch MusicBrainz data for $1 $2" + return 1 } + +api_mb_artist() { + __api_mb "artist" "$1" +} + api_mb_releasegroup() { - $CURL \ - --get \ - --data fmt=json \ - --data inc=artist-credits \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ - "https://musicbrainz.org/ws/2/release-group/$1" + __api_mb "releasegroup" "$1" } api_mb_release() { - $CURL \ - --get \ - --data fmt=json \ - --data inc="recordings+artist-credits+release-groups+labels" \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ - "https://musicbrainz.org/ws/2/release/$1" + __api_mb "release" "$1" } api_mb_browse_artist_releasegroups() { - $CURL \ - --get \ - --data fmt=json \ - --data inc=artist-credits \ - --data limit="$MB_BROWSE_STEPS" \ - --data offset="${2:-0}" \ - --data artist="$1" \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ - "https://musicbrainz.org/ws/2/release-group" + __api_mb "browse-artist-releasegroups" "$1" "${2:-0}" } api_mb_browse_releasegroup_releases() { - $CURL \ - --get \ - --data fmt=json \ - --data inc="artist-credits+labels+media+release-groups" \ - --data limit="$MB_BROWSE_STEPS" \ - --data offset="${2:-0}" \ - --data release-group="$1" \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ - "https://musicbrainz.org/ws/2/release" + __api_mb "browse-releasegroup-releases" "$1" "${2:-0}" } # Argument: Search string api_mb_search_artist() { - $CURL \ - --get \ - --data fmt=json \ - --data-urlencode query="$1" \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ - "https://musicbrainz.org/ws/2/artist" + __api_mb "search-artist" "$1" } api_mb_search_releasegroup() { - $CURL \ - --get \ - --data fmt=json \ - --data inc=artist-credits \ - --data-urlencode query="$1" \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ - "https://musicbrainz.org/ws/2/release-group" + __api_mb "search-releasegroup" "$1" } api_discogs_artist() { $CURL \ --get \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ + -A "$USER_AGENT" \ "https://api.discogs.com/artists/$1" } api_wikidata_sitelinks() { $CURL \ --get \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ + -A "$USER_AGENT" \ "https://www.wikidata.org/w/rest.php/wikibase/v1/entities/items/$1/sitelinks" } api_wikipedia_en_summary() { $CURL \ --get \ - -A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ + -A "$USER_AGENT" \ "https://en.wikipedia.org/api/rest_v1/page/summary/$1" }