summaryrefslogtreecommitdiff
path: root/ar
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-07-01 16:20:31 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-07-01 16:20:31 +0900
commit035443bd6980482b8b63a7d150ec50e5ec98530f (patch)
treed65f3ddcabc1d56b960ba361708d52db7f9a477c /ar
parent51934c19746f1d5a901c1eb6d49b7c354723951c (diff)
fix(qndl-artist): isolate mpd reindex in tests, report merge failures, harden map append
Diffstat (limited to 'ar')
-rwxr-xr-xar/.local/bin/qndl-artist20
-rw-r--r--ar/.local/bin/tests/test-qndl-artist.sh8
2 files changed, 24 insertions, 4 deletions
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