aboutsummaryrefslogtreecommitdiffstats
path: root/hm/soispha/pkgs/scripts/specific/ytcc/ytc
diff options
context:
space:
mode:
Diffstat (limited to 'hm/soispha/pkgs/scripts/specific/ytcc/ytc')
-rwxr-xr-xhm/soispha/pkgs/scripts/specific/ytcc/ytc108
1 files changed, 108 insertions, 0 deletions
diff --git a/hm/soispha/pkgs/scripts/specific/ytcc/ytc b/hm/soispha/pkgs/scripts/specific/ytcc/ytc
new file mode 100755
index 00000000..c66ae96c
--- /dev/null
+++ b/hm/soispha/pkgs/scripts/specific/ytcc/ytc
@@ -0,0 +1,108 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="1.10.2" . %SHELL_LIBRARY_PATH
+CONCURRENT=4
+OUTPUT_PATH="/tmp/ytcc";
+STATUS_FILE="$XDG_RUNTIME_DIR/ytcc/running";
+STATUS_PATH="$(dirname "$STATUS_FILE")";
+
+col() {
+ echo "$1" | csvtool -t ';' -u ';' col "$2" -
+}
+
+play() {
+ msg2 "Playing: '$1'"
+
+ info_json="$(echo "$1" | sed 's|\(.*\)\.[a-z0-9]\+|\1.info.json|')";
+ [ -L "$STATUS_FILE" ] && rm "$STATUS_FILE"
+ ln -s "$(readlink -f "$info_json")" "$STATUS_FILE"
+
+ mpv "$1" --speed=2.7 --volume=75
+ output="$?";
+
+ if [ "$output" -eq 0 ]; then
+ msg2 "Removing: $1"
+ rm "$1"
+ msg2 "Marking: " "$2"
+ ytcc mark "$2"
+ fi
+ return "$output"
+}
+
+escape() {
+ echo "$1" | awk '{gsub(/;/, ","); print}'
+}
+
+bases="$(ytcc --output json list --attributes url --ids "$@" | jq --raw-output 'map("\(.url);\(.id)") | join("\n")')";
+
+yt_flags="$(mktmp)"
+cat << EOF > "$yt_flags"
+--format bestvideo[height<=?1080]+bestaudio/best
+--embed-chapters
+--progress
+--write-comments
+--extractor-args youtube:max_comments=150,all,100;comment_sort=top
+--write-info-json
+--sponsorblock-mark default
+--sponsorblock-remove sponsor
+EOF
+
+[ -d "$STATUS_PATH" ] || mkdir "$STATUS_PATH";
+[ -d "$OUTPUT_PATH" ] || mkdir "$OUTPUT_PATH";
+cd "$OUTPUT_PATH" || die "(Bug): Was created"
+
+filename_file="$(mktmp)";
+files_to_play="$(mktmp)";
+while read -r base; do
+ url="$(col "$base" 1)";
+ id="$(col "$base" 2)"
+
+ if [ "$old_filename" ]; then
+ echo "$(escape "$old_filename");$old_id" >> "$files_to_play"
+
+ # Check if the process (pid) exists
+ dbg "PID is '$pid'"
+ if ! kill -0 "$pid"; then
+ saved_base="$(head -n 1 "$files_to_play")";
+ sed -i '1d' "$files_to_play";
+ saved_name="$(col "$saved_base" 1)";
+ saved_id="$(col "$saved_base" 2)"
+
+ dbg "Started play for '$saved_name'"
+ play "$saved_name" "$saved_id" &
+ pid=$!
+ else
+ dbg "Storing for later '$old_filename'"
+ fi
+ fi
+
+ # The sub shell needs to be unquoted, as the arguments may not be treated as one.
+ # shellcheck disable=2046
+ yt-dlp $(cat "$yt_flags") --output "%(channel)s/%(title)s.%(ext)s" "$url" --print-to-file after_move:filepath "$filename_file"
+
+ filename="$(cat "$filename_file")"
+ printf "" > "$filename_file"
+
+ if [ "$old_filename" ]; then
+ if [ "$(wc -l < "$files_to_play")" -gt "$CONCURRENT" ]; then
+ msg2 "Waiting for '$pid' to finish as we already have '$(wc -l < "$files_to_play")' files cached"
+ wait "$pid"
+ fi
+ fi
+
+ old_filename="$filename";
+ old_id="$id";
+done < "$(tmp echo "$bases")"
+
+wait "$pid"
+echo "$(escape "$old_filename");$old_id" >> "$files_to_play"
+
+while read -r base; do
+ name="$(col "$base" 1)";
+ id="$(col "$base" 2)"
+
+ dbg "Started play for '$name'"
+ play "$name" "$id"
+done < "$files_to_play"
+# vim: ft=sh