add radio-play option - annna - Annna the nice friendly bot.
(HTM) git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/annna/
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
---
(DIR) commit 43ac6c7ed634ca428ff807b06a9206ecf556c67f
(DIR) parent 73e548850a2dc3dc7288f60679b7f468874b57b5
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Fri, 9 Aug 2024 16:58:22 +0200
add radio-play option
Signed-off-by: Annna Robert-Houdin <annna@bitreich.org>
Diffstat:
M annna-message-common | 7 +++++++
A ytdl-mpd | 171 +++++++++++++++++++++++++++++++
2 files changed, 178 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/annna-message-common b/annna-message-common
@@ -542,6 +542,13 @@ case "${text}" in
suri="$(printf "%s\n" "${word}" | bitreich-speak)"
annna-say -s "${server}" -c "${channel}" "${suri}"
;;
+"${ircuser}, please radio play "*)
+ url="$(printf "%s\n" "${text}" | cut -c 25- | sed 's,\t, ,g')"
+ {
+ ytdl-mpd -a -m -q "$url"
+ annna-say -s "${server}" -c "${channel}" "Please listen on gophers://bitreich.org/9/radio/listen"
+ } &
+ ;;
"${ircuser}, please radio say "*)
word="$(printf "%s\n" "${text}" | cut -c 25- | sed 's,\t, ,g')"
annna-say -s "${server}" -c "${channel}" "Please listen on gophers://bitreich.org/9/radio/listen"
(DIR) diff --git a/ytdl-mpd b/ytdl-mpd
@@ -0,0 +1,171 @@
+#!/bin/sh
+# fetch a media file, tag it with metadata, and add it to mpd queue
+# requirements: yt-dlp, id3tag
+
+set -e
+
+musicroot="/br/radio/music"
+
+die() {
+ printf '%s: error: %s\n' "${0##*/}" "$1" >&2
+ exit 1
+}
+
+show_help() {
+ printf 'usage: %s [OPTIONS] [URL ..]\n' "${0##*/}"
+ echo "downloads music from the web and tags it. Playlists are supported."
+ echo "If no URLs are supplied as arguments, they are expected as stdin."
+ echo
+ echo "OPTIONS are one or more of the following:"
+ echo " -a add metadata without interaction"
+ echo " -h show this message"
+ echo " -m move output music file to $musicroot"
+ echo " -q add to mpd queue (requires -m)"
+ echo " -t download through torsocks(1)"
+ echo " -- do not consider any following arguments as options"
+}
+
+ytdl() {
+ $prefix yt-dlp \
+ --extract-audio \
+ --audio-quality 0 \
+ --audio-format mp3 \
+ --add-metadata \
+ --output "%(playlist_index)s - %(title)s.%(ext)s" \
+ "$1"
+}
+
+handle_url() {
+ oldpwd="$PWD"
+ outputdir="$(mktemp -d)"
+ mkdir -p "$outputdir"
+ cd "$outputdir"
+
+ album="$(ytdl "$1" | tee /dev/tty | grep 'Finished downloading' | sed 's/.*: //')"
+
+ if [ $? -ne 0 ]; then
+ die "youtube-dl error"
+ fi
+
+ if [ "$(ls *.mp3 2>/dev/null | wc -l)" -lt 1 ]; then
+ printf "youtube-dl error" "$1"
+ if [ -n "$DISPLAY" ]; then
+ notify -u CRITICAL "youtube-dl error" "$1"
+ fi
+ exit 1
+ fi
+
+ if [ "$auto" = 0 ]; then
+ printf "add metadata? [Y/n] "
+ read
+ else
+ REPLY=y
+ fi
+
+ case "$REPLY" in
+ N|n)
+ mv ./*.mp3 "$oldpwd/"
+ cd -
+ exit 0;;
+ esac
+
+ artist="Unknown Artist"
+ album="${album:-Unknown Album}"
+ track=1
+
+ # Loop over files with spaces
+ SAVEIFS=$IFS
+ IFS=$(printf '\n\b')
+ for f in *.mp3; do
+
+ [ "$track" = 1 ] && \
+ artist="$(printf '%s' "$f" | \
+ awk -F'-' '{gsub(/^ +/, "", $2); gsub(/ +$/, "", $2); print $2}')"
+
+ printf 'file: %s\n' "$f"
+
+ song=$(printf '%s' "$f" | sed 's/.* - //; s/^ //; s/\.mp3//')
+
+ if [ "$auto" = 0 ]; then
+ printf 'song [%s]: ' "$song"
+ read
+ song="${REPLY:-$song}"
+
+ printf 'track [%s]: ' "$track"
+ read
+ track="${REPLY:-$track}"
+
+ printf 'album [%s]: ' "$album"
+ read
+ album="${REPLY:-$album}"
+
+ printf 'artist [%s]: ' "$artist"
+ read
+ artist="${REPLY:-$artist}"
+ fi
+
+ id3tag --artist="$artist" --album="$album" \
+ --song="$song" --track="$track" \
+ "$f"
+
+ track=$(( track + 1 ))
+ done
+
+ IFS=$SAVEIFS
+
+ if [ "$move_music" = 1 ]; then
+ outdir="$musicroot/$artist/$album"
+ mkdir -p "$outdir"
+ mv ./*.mp3 "$outdir"
+ mpc update --wait >/dev/null
+ if [ "$queue" = 1 ]; then
+ mpc findadd \
+ artist "$artist" \
+ album "$album" \
+ title "$song"
+ fi
+ else
+ mv ./*.mp3 "$oldpwd/"
+ fi
+
+ rmdir "$outputdir"
+ cd - >/dev/null
+}
+
+prefix=""
+auto=0
+move_music=0
+queue=0
+while :; do
+ case "$1" in
+ -a)
+ auto=1;;
+ -h)
+ show_help
+ exit 0;;
+ -m)
+ move_music=1;;
+ -q)
+ queue=1;;
+ -t)
+ prefix="torsocks";;
+ --)
+ shift
+ break;;
+ -?*)
+ die "unknown option specified: $1";;
+ *)
+ break
+ esac
+ shift
+done
+
+if [ $# -lt 1 ]; then
+ urls="$(cat)"
+else
+ urls="$@"
+fi
+
+for u in "$urls"; do
+ handle_url "$u"
+done