From bde3e5a48bd34c5ed87f8570d075f5368a2ded93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=84min=20Baumeler?= Date: Mon, 4 Aug 2025 16:59:51 +0200 Subject: [PATCH] load local data --- src/main.sh | 20 ++++++++++++++ src/sh/cache.sh | 21 ++++++++++++++ src/sh/helper.sh | 4 +++ src/sh/local.sh | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+) diff --git a/src/main.sh b/src/main.sh index 2f53510..387455a 100755 --- a/src/main.sh +++ b/src/main.sh @@ -46,6 +46,26 @@ if [ "${MUSICDIR:-}" ]; then fi exit 0 fi + + if [ "${1:-}" = "--load-local" ]; then + load_local + exit 0 + fi + + if [ "${1:-}" = "--list-releases" ]; then + list_releases + exit 0 + fi + + if [ "${1:-}" = "--list-releasegroups" ]; then + list_releasegroups + exit 0 + fi + + if [ "${1:-}" = "--list-artists" ]; then + list_artists + exit 0 + fi fi if [ "${1:-}" = "--internal-preview-artist" ]; then diff --git a/src/sh/cache.sh b/src/sh/cache.sh index 69fe9df..f54f26b 100644 --- a/src/sh/cache.sh +++ b/src/sh/cache.sh @@ -138,3 +138,24 @@ cache_delete_artist() { # Get release groups echo "NOT IMPLEMENTED" >/dev/stderr } + +# Check if main items are in cache +# argument $1: type +# argument $2: MusicBrainz ID +in_cache() { + case "$1" in + "$TYPE_ARTIST") + fn="$artist_filename" + ;; + "$TYPE_RELEASEGROUP") + fn="$releasegroup_filename" + ;; + "$TYPE_RELEASE") + fn="$release_filename" + ;; + *) + return 1 + ;; + esac + [ "$(__get_json "$1" "$2" "$fn")" ] && return 0 || return 1 +} diff --git a/src/sh/helper.sh b/src/sh/helper.sh index 9f82f30..a5ac490 100644 --- a/src/sh/helper.sh +++ b/src/sh/helper.sh @@ -1,3 +1,7 @@ err() { echo "ERROR: ${1:-}" } + +info() { + echo "Info: ${1:-}" +} diff --git a/src/sh/local.sh b/src/sh/local.sh index 7cf9a7f..1bf9997 100644 --- a/src/sh/local.sh +++ b/src/sh/local.sh @@ -40,3 +40,74 @@ decorate() { return 1 fi } + +# Load missing cache entries (batch mode) +# argument $1: type +# argument $2: File with one ID per line +__batch_load_missing() { + tmpf=$(mktemp) + while IFS= read -r mbid; do + if ! in_cache "$1" "$mbid"; then + echo "$mbid" >>"$tmpf" + fi + done <"$2" + if [ -s "$tmpf" ]; then + lines=$(wc -l "$tmpf" | cut -d ' ' -f 1) + [ "$lines" -gt 0 ] && info "Caching $lines items..." + while IFS= read -r mbid; do + case "$1" in + "$TYPE_ARTIST") + mb_artist "$mbid" >/dev/null + ;; + "$TYPE_RELEASEGROUP") + mb_releasegroup "$mbid" >/dev/null + ;; + "$TYPE_RELEASE") + mb_release "$mbid" >/dev/null + ;; + esac + sleep 1 + done <"$tmpf" + fi + rm -f "$tmpf" +} + +LOCALDATADIR="$HOME/.cache/$APP_NAME/local" +LOCALDATA_ARTISTS="$LOCALDATADIR/artists" +LOCALDATA_RELEASEGROUPS="$LOCALDATADIR/releasegroups" +LOCALDATA_RELEASES="$LOCALDATADIR/releases" + +# Load local music +# input $1: directory for temporary files +load_local() { + [ -d "$LOCALDATADIR" ] || mkdir -p "$LOCALDATADIR" + find "$MUSICDIR" -type f -name "$DECORATION_FILENAME" -exec cat {} \+ | $JQ -r '.releaseid' >"$LOCALDATA_RELEASES" + __batch_load_missing "$TYPE_RELEASE" "$LOCALDATA_RELEASES" + # Get release groups and album artists + while IFS= read -r rid; do + mb=$(mb_release "$rid") + echo "$mb" | $JQ -r '."release-group".id' >>"$LOCALDATA_RELEASEGROUPS" + echo "$mb" | $JQ -r '."release-group"."artist-credit" | map(.artist.id) | join("\n")' >>"$LOCALDATA_ARTISTS" + done <"$LOCALDATA_RELEASES" + tf=$(mktemp) + sort "$LOCALDATA_RELEASEGROUPS" | uniq >"$tf" && mv "$tf" "$LOCALDATA_RELEASEGROUPS" + sort "$LOCALDATA_ARTISTS" | uniq >"$tf" && mv "$tf" "$LOCALDATA_ARTISTS" + # Populate cache with missing data + __batch_load_missing "$TYPE_RELEASEGROUP" "$LOCALDATA_RELEASEGROUPS" + __batch_load_missing "$TYPE_ARTIST" "$LOCALDATA_ARTISTS" +} + +# List all releases +list_releases() { + cat "$LOCALDATA_RELEASES" +} + +# List all release groups +list_releasegroups() { + cat "$LOCALDATA_RELEASEGROUPS" +} + +# List all album artists +list_artists() { + cat "$LOCALDATA_ARTISTS" +}