diff options
| author | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-07-01 16:09:24 +0900 |
|---|---|---|
| committer | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-07-01 16:09:24 +0900 |
| commit | 51934c19746f1d5a901c1eb6d49b7c354723951c (patch) | |
| tree | c7957bd357b136bfc6341fb23c9ac29291eb6dcb /ar/.local | |
| parent | fc06e37b9fd148b324bf7bdb0db26b8c3792dada (diff) | |
feat(qndl-artist): implement merge --apply (relocate, tag, map, reindex)
Diffstat (limited to 'ar/.local')
| -rwxr-xr-x | ar/.local/bin/qndl-artist | 34 | ||||
| -rw-r--r-- | ar/.local/bin/tests/test-qndl-artist.sh | 10 |
2 files changed, 44 insertions, 0 deletions
diff --git a/ar/.local/bin/qndl-artist b/ar/.local/bin/qndl-artist index 9c57cc2..e276ddc 100755 --- a/ar/.local/bin/qndl-artist +++ b/ar/.local/bin/qndl-artist @@ -138,6 +138,40 @@ _merge_preview() { done } +# 맵에 변형→표준 append (이미 있으면 생략). +_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 + printf '%s\t%s\n' "$_v" "$_c" >> "$ALIASES" +} + +cmd_merge_apply() { + _groups="$1" + printf '%s\n' "$_groups" | while IFS="$(printf '\t')" read -r _canon _rest; do + [ -z "$_canon" ] && continue + _oldifs="$IFS"; IFS="$(printf '\t')" + for _mem in $_rest; do + [ "$_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" + done + find "$MUSIC/$_mem" -type d -empty -delete 2>/dev/null || true + _map_add "$_mem" "$_canon" + IFS="$(printf '\t')" + done + IFS="$_oldifs" + done + + 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 + fi + printf 'merge --apply 완료.\n' +} + cmd_merge() { _apply=0 [ "${1:-}" = "--apply" ] && _apply=1 diff --git a/ar/.local/bin/tests/test-qndl-artist.sh b/ar/.local/bin/tests/test-qndl-artist.sh index 6c846ee..0d5ee9a 100644 --- a/ar/.local/bin/tests/test-qndl-artist.sh +++ b/ar/.local/bin/tests/test-qndl-artist.sh @@ -70,4 +70,14 @@ eq "merge dry: MC=영문혼합" "yes" "$(printf '%s' "$DRY" | grep -q '→ M eq "merge dry: 단독 미포함" "no" "$(printf '%s' "$DRY" | grep -q 'Lauv' && echo yes || echo no)" eq "merge dry: 비파괴" "yes" "$([ -f "$XDG_MUSIC_DIR/4MEN/A/a.mp3" ] && echo yes || echo no)" +# --- merge --apply --- +"$BIN" merge --apply >/dev/null 2>&1 +eq "apply: 4MEN 사라짐" "no" "$([ -d "$XDG_MUSIC_DIR/4MEN" ] && echo yes || echo no)" +eq "apply: 4Men에 병합" "yes" "$([ -f "$XDG_MUSIC_DIR/4Men/A/a.mp3" ] && echo yes || echo no)" +eq "apply: MC 표준폴더 생성" "yes" "$([ -d "$XDG_MUSIC_DIR/M.C The Max" ] && echo yes || echo no)" +eq "apply: MC 한글폴더 제거" "no" "$([ -d "$XDG_MUSIC_DIR/엠씨더맥스 (M.C The Max)" ] && echo yes || echo no)" +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)" + exit $FAIL |
