wlvfs/wlvfs

240 lines
8.7 KiB
Bash
Executable File

#!/usr/bin/env sh
cleanup() {
killall youtube-dl
}
trap cleanup INT TERM
usage() {
echo "Usage: $0 [-f <file>] [-u] [-h] [-p]" 1>&2
echo "" 1>&2
printf \
"\tThis program manages your subscriptions with the given file with -f or\n" 1>&2
printf \
"\tby default using \$YT_SUBS or \$HOME/yt-subs, respectively.\n\n" 1>&2
printf "\t-u To update now previous video upload speeds\n" 1>&2
printf \
"\t-e To play the videos when at the end instead of progressivaly\n" 1>&2
printf "\t-h Show this help text\n" 1>&2
printf "\t-p Preserve old wlvfs_videos file.\n" 1>&2
exit 1
}
while getopts ":upef:" option; do
case "${option}" in
u)
update_now="1"
;;
e)
play_at_the_end="1"
;;
f)
subs_file="${OPTARG}"
;;
p)
preserve_oldvideos="1"
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
scripts_folder="$(dirname "$(readlink -f "$0")")/scripts"
videos_file="${XDG_DATA_HOME:-$HOME/.local/share}/wlvfs_videos"
if [ -z "$subs_file" ]; then
if [ -z "$YT_SUBS" ]; then
subs_file="${XDG_CONFIG_HOME:-$HOME/.config}/yt-subs"
else
subs_file="$YT_SUBS"
fi
fi
# In order to print it too on a file, so that I can track where it is
{
# Preprocessing
grep -vE '^#|^$' "$subs_file" | while read -r line; do
channel=$(echo "$line" | awk '{print $1}')
last_video=$(echo "$line" | awk '{print $2}')
update_date=$(echo "$line" | awk '{print $3}')
upload_frequency=$(echo "$line" | awk '{print $4}')
prev_upload_frequency=$(echo "$line" | awk '{print $5}')
manual_preference=$(echo "$line" | awk '{print $6}')
already_updated=$(echo "$line" | awk '{print $7}')
new_last_video="$last_video"
new_update_date="$update_date"
new_upload_frequency="$upload_frequency"
new_prev_upload_frequency="$prev_upload_frequency"
new_manual_preference="$manual_preference"
num_w=$(echo "$line" | wc -w)
[ "$num_w" -lt 6 ] && {
echo "Preprocessing: $channel"
printf "\t%b\n" "$line"
case $num_w in
1)
new_last_video=$(youtube-dl --get-id \
"https://invidio.us/channel/$channel" 2>/dev/null \
| head -n 1)
if [ -z "$new_last_video" ]; then
new_last_video="-"
new_update_date="-"
else
new_update_date=$(sh "$scripts_folder/video-upload-date.sh" \
"$new_last_video")
while [ -z "$new_update_date" ]; do
new_update_date=$(sh \
"$scripts_folder/video-upload-date.sh" \
"$new_last_video")
done
fi
new_upload_frequency=0
new_prev_upload_frequency=0
new_manual_preference=0
;;
2)
if [ "$last_video" = "-" ]; then
new_last_video=$(youtube-dl --get-id \
"https://invidio.us/channel/$channel" 2>/dev/null \
| head -n 1)
[ -z "$new_last_video" ] && new_last_video="-"
new_update_date=$(sh "$scripts_folder/video-upload-date.sh" \
"$new_last_video")
while [ -z "$new_update_date" ]; do
new_update_date=$(sh \
"$scripts_folder/video-upload-date.sh" \
"$new_last_video")
done
new_upload_frequency=0
new_prev_upload_frequency=0
new_manual_preference=0
else
new_update_date=$(sh "$scripts_folder/video-upload-date.sh" \
"$new_last_video")
while [ -z "$new_update_date" ]; do
new_update_date=$(sh \
"$scripts_folder/video-upload-date.sh" \
"$new_last_video")
done
new_upload_frequency=0
new_prev_upload_frequency=0
new_manual_preference=0
fi
;;
3)
new_upload_frequency=0
new_prev_upload_frequency=0
new_manual_preference=0
;;
4)
new_prev_upload_frequency=0
new_manual_preference=0
;;
5)
new_manual_preference=0
;;
esac
sed -E "s|($channel)(\t$last_video)?(\t$update_date)?(\t$upload_frequency)?(\t$prev_upload_frequency)?(\t$manual_preference)?|$channel\t$new_last_video\t$new_update_date\t$new_upload_frequency\t$new_prev_upload_frequency\t$new_manual_preference|" "$subs_file" -i
}
[ "$(echo "$(date +%j) % 14" | bc)" -ne 0 ] &&
[ -n "$already_updated" ] && {
echo "Preprocessing: $channel"
sed -E 's|(.*)(\t!updated)$|\1|' "$subs_file" -i
}
done
# Processing
if [ -z "$preserve_oldvideos" ]; then
rm "$videos_file" 2> /dev/null
else
(sh "$scripts_folder/play-videos-from-file.sh" "$videos_file" &&
rm "$videos_file") &
fi
grep -vE '^#|^$' "$subs_file" | sort -rg -k 6 -k 5 -k 4 | while read -r line; do
channel=$(echo "$line" | awk '{print $1}')
last_video=$(echo "$line" | awk '{print $2}')
update_date=$(echo "$line" | awk '{print $3}')
upload_frequency=$(echo "$line" | awk '{print $4}')
prev_upload_frequency=$(echo "$line" | awk '{print $5}')
manual_preference=$(echo "$line" | awk '{print $6}')
already_updated=$(echo "$line" | awk '{print $7}')
echo "Processing: $channel on Preference: $manual_preference - $prev_upload_frequency"
temp="/tmp/wlvfs"
dateafter="$update_date"
[ "$update_date" = "-" ] && dateafter=""
fifo="/tmp/wlvfs$(date +%s%N)"
mkfifo "$fifo"
sh "$scripts_folder/no-response-timeout.sh" -f 128 -r 10 \
sh "$scripts_folder/channel-videos-after.sh" \
"https://youtube.com/channel/$channel" "$last_video" "$dateafter" | tee "$temp" > "$fifo" &
while read -r video && [ -n "$video" ]; do
printf "\tFound video: %s\n" "$video"
if [ ! -f "$videos_file" ]; then
echo "ytdl://$video" >> "$videos_file"
if [ -z "$play_at_the_end" ]; then
(sh "$scripts_folder/play-videos-from-file.sh" "$videos_file"&&
rm "$videos_file") &
fi
else
echo "ytdl://$video" >> "$videos_file"
{
sleep 5
[ ! -f "$videos_file" ] && echo "ytdl://$video" >> \
"$videos_file"
} &
fi
done < "$fifo"
new_last_video=$(head -n 1 "$temp")
if [ -z "$new_last_video" ]; then
new_last_video="$last_video"
new_upload_frequency="$upload_frequency"
new_update_date="$update_date"
else
new_update_date=$(sh "$scripts_folder/video-upload-date.sh" "$new_last_video")
while [ -z "$new_update_date" ]; do
new_update_date=$(sh "$scripts_folder/video-upload-date.sh" "$new_last_video")
done
new_upload_frequency=$(( $(wc -l "$temp" | \
awk '{print $1}') + upload_frequency ))
fi
if [ -z "$already_updated" ] &&
{ [ "$update_now" ]||[ "$(echo "$(date +%j) % 14" | bc)" -eq 0 ];}
then
sed -E \
"s|$channel\t$last_video\t$update_date\t$upload_frequency\t$prev_upload_frequency|$channel\t$new_last_video\t$new_update_date\t0\t$new_upload_frequency|;s|(^$channel.*$)|\1\t!updated|" \
"$subs_file" -i
else
sed \
"s|$channel\t$last_video\t$update_date\t$upload_frequency\t$prev_upload_frequency|$channel\t$new_last_video\t$new_update_date\t$new_upload_frequency\t$prev_upload_frequency|" \
"$subs_file" -i
fi
done
} | tee "/tmp/wlvfs-log"
notify-send "Watch Subs" "Done"