summaryrefslogtreecommitdiff
path: root/ar/.local/bin/qndl-artist
diff options
context:
space:
mode:
Diffstat (limited to 'ar/.local/bin/qndl-artist')
-rwxr-xr-xar/.local/bin/qndl-artist20
1 files changed, 16 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() {