ytdl-mpd - annna - Annna the nice friendly bot. | |
git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws6… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
--- | |
ytdl-mpd (3096B) | |
--- | |
1 #!/bin/sh | |
2 # fetch a media file, tag it with metadata, and add it to mpd queue | |
3 # requirements: yt-dlp, id3tag | |
4 | |
5 set -e | |
6 | |
7 musicroot="/br/radio/music" | |
8 | |
9 die() { | |
10 printf '%s: error: %s\n' "${0##*/}" "$1" >&2 | |
11 exit 1 | |
12 } | |
13 | |
14 show_help() { | |
15 printf 'usage: %s [OPTIONS] [URL ..]\n' "${0##*/}" | |
16 echo "downloads music from the web and tags it. Playlists are su… | |
17 echo "If no URLs are supplied as arguments, they are expected as… | |
18 echo | |
19 echo "OPTIONS are one or more of the following:" | |
20 echo " -a add metadata without interaction" | |
21 echo " -h show this message" | |
22 echo " -m move output music file to $musicroot" | |
23 echo " -q add to mpd queue (requires -m)" | |
24 echo " -t download through torsocks(1)" | |
25 echo " -- do not consider any following arguments as options" | |
26 } | |
27 | |
28 ytdl() { | |
29 $prefix yt-dlp \ | |
30 --extract-audio \ | |
31 --audio-quality 0 \ | |
32 --audio-format mp3 \ | |
33 --add-metadata \ | |
34 --output "%(playlist_index)s - %(title)s.%(ext)s" \ | |
35 "$1" | |
36 } | |
37 | |
38 handle_url() { | |
39 oldpwd="$PWD" | |
40 outputdir="$(mktemp -d)" | |
41 mkdir -p "$outputdir" | |
42 cd "$outputdir" | |
43 | |
44 album="$(ytdl "$1" | grep 'Finished downloading' | sed 's/.*: //… | |
45 | |
46 if [ $? -ne 0 ]; then | |
47 die "youtube-dl error" | |
48 fi | |
49 | |
50 if [ "$(ls *.mp3 2>/dev/null | wc -l)" -lt 1 ]; then | |
51 printf "youtube-dl error" "$1" | |
52 if [ -n "$DISPLAY" ]; then | |
53 notify -u CRITICAL "youtube-dl error" "$1" | |
54 fi | |
55 exit 1 | |
56 fi | |
57 | |
58 if [ "$auto" = 0 ]; then | |
59 printf "add metadata? [Y/n] " | |
60 read | |
61 else | |
62 REPLY=y | |
63 fi | |
64 | |
65 case "$REPLY" in | |
66 N|n) | |
67 mv ./*.mp3 "$oldpwd/" | |
68 cd - | |
69 exit 0;; | |
70 esac | |
71 | |
72 artist="Unknown Artist" | |
73 album="${album:-Unknown Album}" | |
74 track=1 | |
75 | |
76 # Loop over files with spaces | |
77 SAVEIFS=$IFS | |
78 IFS=$(printf '\n\b') | |
79 for f in *.mp3; do | |
80 | |
81 [ "$track" = 1 ] && \ | |
82 artist="$(printf '%s' "$f" | \ | |
83 awk -F'-' '{gsub(/^ +/, "", $2); gsub(/ … | |
84 | |
85 | |
86 song=$(printf '%s' "$f" | sed 's/.* - //; s/^ //; s/\.mp… | |
87 | |
88 if [ "$auto" = 0 ]; then | |
89 printf 'file: %s\n' "$f" | |
90 | |
91 printf 'song [%s]: ' "$song" | |
92 read | |
93 song="${REPLY:-$song}" | |
94 | |
95 printf 'track [%s]: ' "$track" | |
96 read | |
97 track="${REPLY:-$track}" | |
98 | |
99 printf 'album [%s]: ' "$album" | |
100 read | |
101 album="${REPLY:-$album}" | |
102 | |
103 printf 'artist [%s]: ' "$artist" | |
104 read | |
105 artist="${REPLY:-$artist}" | |
106 fi | |
107 | |
108 id3tag --artist="$artist" --album="$album" \ | |
109 --song="$song" --track="$track" \ | |
110 "$f" 2>&1 >/dev/null | |
111 | |
112 track=$(( track + 1 )) | |
113 | |
114 if [ "$move_music" = 1 ]; then | |
115 outdir="$musicroot/$artist/$album" | |
116 mkdir -p "$outdir" | |
117 mv "${f}" "$outdir" | |
118 mpc update --wait >/dev/null | |
119 if [ "$queue" = 1 ]; then | |
120 mpc findadd \ | |
121 artist "$artist" \ | |
122 album "$album" \ | |
123 title "$song" | |
124 fi | |
125 else | |
126 mv "${f}" "$oldpwd/" | |
127 fi | |
128 done | |
129 | |
130 IFS=$SAVEIFS | |
131 | |
132 rmdir "$outputdir" | |
133 cd - >/dev/null | |
134 } | |
135 | |
136 prefix="" | |
137 auto=0 | |
138 move_music=0 | |
139 queue=0 | |
140 while :; do | |
141 case "$1" in | |
142 -a) | |
143 auto=1;; | |
144 -h) | |
145 show_help | |
146 exit 0;; | |
147 -m) | |
148 move_music=1;; | |
149 -q) | |
150 queue=1;; | |
151 -t) | |
152 prefix="torsocks";; | |
153 --) | |
154 shift | |
155 break;; | |
156 -?*) | |
157 die "unknown option specified: $1";; | |
158 *) | |
159 break | |
160 esac | |
161 shift | |
162 done | |
163 | |
164 if [ $# -lt 1 ]; then | |
165 urls="$(cat)" | |
166 else | |
167 urls="$@" | |
168 fi | |
169 | |
170 for u in "$urls"; do | |
171 handle_url "$u" | |
172 done |