240 lines
8.7 KiB
Bash
Executable File
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"
|