From 035443bd6980482b8b63a7d150ec50e5ec98530f Mon Sep 17 00:00:00 2001 From: TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> Date: Wed, 1 Jul 2026 16:20:31 +0900 Subject: fix(qndl-artist): isolate mpd reindex in tests, report merge failures, harden map append --- ar/.local/bin/qndl-artist | 20 ++++++++++++++++---- ar/.local/bin/tests/test-qndl-artist.sh | 8 ++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) (limited to 'ar/.local/bin') diff --git a/ar/.local/bin/qndl-artist b/ar/.local/bin/qndl-artist index e276ddc..3ef8bbb 100755 --- a/ar/.local/bin/qndl-artist +++ b/ar/.local/bin/qndl-artist @@ -4,6 +4,7 @@ export LC_ALL="${LC_ALL:-C.UTF-8}" MUSIC="${XDG_MUSIC_DIR:-$HOME/Music}" ALIASES="${QNDL_ALIASES:-${XDG_DOTFILES_DIR:-$HOME/.dotfiles}/global/Music/artist-aliases.tsv}" +PLAYLIST="${QNDL_MPD_PLAYLIST:-$HOME/.config/mpd/playlists/entire.m3u}" # 이름 → 표준명. 맵 정확일치 → 기존 폴더 대소문자무시 매칭 → 원본. cmd_normalize() { @@ -143,11 +144,16 @@ _map_add() { _v="$1"; _c="$2" [ -f "$ALIASES" ] || { mkdir -p "$(dirname "$ALIASES")"; : > "$ALIASES"; } awk -F'\t' -v v="$_v" '$1==v{f=1} END{exit f?0:1}' "$ALIASES" && return 0 + # 파일이 개행으로 끝나지 않으면 마지막 줄과 이어붙는 손상을 방지 + if [ -s "$ALIASES" ] && [ -n "$(tail -c1 "$ALIASES")" ]; then + printf '\n' >> "$ALIASES" + fi printf '%s\t%s\n' "$_v" "$_c" >> "$ALIASES" } cmd_merge_apply() { _groups="$1" + _failtmp="$(mktemp)" || return 1 printf '%s\n' "$_groups" | while IFS="$(printf '\t')" read -r _canon _rest; do [ -z "$_canon" ] && continue _oldifs="$IFS"; IFS="$(printf '\t')" @@ -155,7 +161,7 @@ cmd_merge_apply() { [ "$_mem" = "$_canon" ] && continue IFS="$_oldifs" find "$MUSIC/$_mem" -type f -name '*.mp3' 2>/dev/null | while IFS= read -r _f; do - cmd_apply "$_f" "$_canon" + cmd_apply "$_f" "$_canon" || printf 'x\n' >> "$_failtmp" done find "$MUSIC/$_mem" -type d -empty -delete 2>/dev/null || true _map_add "$_mem" "$_canon" @@ -163,13 +169,19 @@ cmd_merge_apply() { done IFS="$_oldifs" done + _fails="$(wc -l < "$_failtmp" | tr -d ' ')" + rm -f "$_failtmp" if command -v mpc >/dev/null 2>&1; then mpc update --wait >/dev/null 2>&1 && - find "$MUSIC" -name '*.mp3' | sed "s|$MUSIC/||" | sort \ - > "$HOME/.config/mpd/playlists/entire.m3u" 2>/dev/null || true + find "$MUSIC" -type f -name '*.mp3' | sed "s|$MUSIC/||" | sort \ + > "$PLAYLIST" 2>/dev/null || true + fi + if [ "${_fails:-0}" -gt 0 ]; then + printf 'merge --apply 완료 (%s개 실패/스킵).\n' "$_fails" + else + printf 'merge --apply 완료.\n' fi - printf 'merge --apply 완료.\n' } cmd_merge() { diff --git a/ar/.local/bin/tests/test-qndl-artist.sh b/ar/.local/bin/tests/test-qndl-artist.sh index 0d5ee9a..e842907 100644 --- a/ar/.local/bin/tests/test-qndl-artist.sh +++ b/ar/.local/bin/tests/test-qndl-artist.sh @@ -14,6 +14,13 @@ tag_of() { ffprobe -v error -show_entries format_tags="$2" -of default=noprint_w # --- fixtures --- TMP="$(mktemp -d)" trap 'rm -rf "$TMP"' EXIT + +# isolate mpd reindex: stub mpc + temp playlist so tests never touch real mpd/playlist +mkdir -p "$TMP/bin" +printf '#!/bin/sh\nexit 0\n' > "$TMP/bin/mpc"; chmod +x "$TMP/bin/mpc" +PATH="$TMP/bin:$PATH"; export PATH +export QNDL_MPD_PLAYLIST="$TMP/entire.m3u" + export XDG_MUSIC_DIR="$TMP/Music" export QNDL_ALIASES="$TMP/aliases.tsv" mkdir -p "$XDG_MUSIC_DIR" @@ -79,5 +86,6 @@ eq "apply: MC 한글폴더 제거" "no" "$([ -d "$XDG_MUSIC_DIR/엠씨더맥 eq "apply: album_artist 통일" "4Men" "$(tag_of "$XDG_MUSIC_DIR/4Men/A/a.mp3" album_artist)" eq "apply: 맵 기록" "yes" "$(awk -F'\t' '$1=="4MEN" && $2=="4Men"{print "yes"; exit}' "$QNDL_ALIASES")" eq "apply: idempotent 재실행" "No case/paren duplicate groups found." "$("$BIN" merge)" +eq "apply: mpd 재인덱스는 격리된 플레이리스트로" "yes" "$([ -s "$QNDL_MPD_PLAYLIST" ] && echo yes || echo no)" exit $FAIL -- cgit v1.2.3