183 lines
2.9 KiB
Bash
Executable File
183 lines
2.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
argv0="$0"
|
|
|
|
PIGPEN="$(pig_pen)"
|
|
|
|
latin(){
|
|
case "$1" in
|
|
*json) jq '.feed.pig' <"$1" ;;
|
|
*xml) xq '.feed.pig' <"$1" ;;
|
|
esac
|
|
}
|
|
|
|
list_channels(){
|
|
pscat \
|
|
[ sh -c "for file in \"$PIGPEN\"/*.xml; \
|
|
do xq '{(.feed.link[0].\"@href\"): .feed.title}' \"\$file\"; \
|
|
done 2>/dev/null" ] \
|
|
[ sh -c "for file in \"$PIGPEN\"/*.json; \
|
|
do jq '{(.feed.link[0].\"@href\"): .feed.title}' \"\$file\"; \
|
|
done 2>/dev/null" ] \
|
|
[ printf "\n" ] \
|
|
| sed \
|
|
-e '/{/d' \
|
|
-e '/}/d' \
|
|
-e 's/^ \"//g' \
|
|
-e 's/\": \"/ /g' \
|
|
-e 's/\,$//g' \
|
|
-e 's/\"$//g'
|
|
}
|
|
|
|
list_videos(){
|
|
file="$(printf "$PIGPEN"/$( \
|
|
list_channels \
|
|
| sed "/$1/q" \
|
|
| tail -n 1 \
|
|
| cut -f 1 \
|
|
| xargs pig_name \
|
|
)*)"
|
|
case "$file" in
|
|
*json)
|
|
jq \
|
|
'reduce .feed.entry[] as $item (
|
|
{};
|
|
. + { ($item.link."@href"): $item.title }
|
|
)' "$file"
|
|
;;
|
|
*xml)
|
|
xq \
|
|
'reduce .feed.entry[] as $item (
|
|
{};
|
|
. + { ($item.link."@href"): $item.title }
|
|
)' "$file"
|
|
;;
|
|
*)
|
|
printf "No file found!\n" 1>&2
|
|
true
|
|
;;
|
|
esac | sed \
|
|
-e '1d' \
|
|
-e '$d' \
|
|
-e 's/\": \"/ /g' \
|
|
-e 's/^ \"//g' \
|
|
-e 's/\,$//g' \
|
|
-e 's/\"$//g' # this is really hacky
|
|
|
|
}
|
|
|
|
stow(){
|
|
name="$PIGPEN/$(pig_name "$1")"
|
|
pig_fetch "$1" | xq "$(
|
|
date '+%Y-%m-%dT%T' \
|
|
| xargs printf '
|
|
. * { feed: { pig: {
|
|
feed_url: "%b",
|
|
pet_sound: "choo",
|
|
stow_date: "%b",
|
|
version: "0"
|
|
} } }' "$1" \
|
|
)" >"$name.json"
|
|
rm -f "$name.xml"
|
|
}
|
|
|
|
watch(){
|
|
youtube-dl -F "$1"
|
|
printf "Pick a format [22]: "
|
|
input="$(head -n 1 | tr -d '\n')"
|
|
str isalnum "$input" \
|
|
&& str isdigit $input \
|
|
|| input=22 \
|
|
&& youtube-dl -f $input "$1" -o - \
|
|
| mpv -
|
|
}
|
|
|
|
usage(){
|
|
printf "\
|
|
Usage: %s
|
|
list_channels
|
|
list_videos [channel name]
|
|
listen [video URL]
|
|
refresh (channel name...)
|
|
subscribe [channel URL...]
|
|
watch [video URL]
|
|
watch_latest [channel name]
|
|
" "$argv0" 1>&2
|
|
}
|
|
|
|
case "$1" in
|
|
list_channels)
|
|
! str isvalue "$2" \
|
|
|| usage
|
|
list_channels
|
|
;;
|
|
list_videos) # do something with youtube-dl?
|
|
list_videos "$2"
|
|
;;
|
|
listen)
|
|
str isvalue "$2" \
|
|
|| usage
|
|
while str isvalue "$2"
|
|
do youtube-dl "$2" -f bestaudio -o - \
|
|
| mpv -
|
|
shift
|
|
done
|
|
;;
|
|
refresh)
|
|
if ! str isvalue "$2"
|
|
then for file in "$PIGPEN"/*
|
|
do stow "$( \
|
|
latin "$file" \
|
|
| jq -r '.feed_url' \
|
|
)"
|
|
done
|
|
else
|
|
while str isvalue "$2"
|
|
do stow "$( \
|
|
latin "$( \
|
|
list_channels \
|
|
| grep "$2" \
|
|
| cut -f 2 \
|
|
)" | jq '.feed_url' \
|
|
)"
|
|
shift
|
|
done
|
|
fi
|
|
;;
|
|
subscribe)
|
|
str isvalue "$2" \
|
|
|| usage
|
|
while str isvalue "$2"
|
|
do stow "http://www.youtube.com/feeds/videos.xml?channel_id=$(
|
|
youtube-dl \
|
|
--get-filename \
|
|
--playlist-items 1 \
|
|
-o '%(channel_id)s' \
|
|
"$2" \
|
|
)"
|
|
shift
|
|
done
|
|
;;
|
|
watch) # needs work
|
|
str isvalue "$2" \
|
|
|| usage
|
|
while str isvalue "$2"
|
|
do watch "$2"
|
|
done
|
|
;;
|
|
watch_latest)
|
|
str isvalue "$2" \
|
|
|| usage
|
|
watch "$( \
|
|
list_videos "$2" \
|
|
| head -n 1 \
|
|
| cut -f 1 \
|
|
)"
|
|
;;
|
|
*) usage ;;
|
|
esac
|
|
|
|
exit 0
|