about summary refs log tree commit diff stats
path: root/hm/soispha/pkgs/scripts/specific/ytcc/ytc
blob: 8306be7eb7d3f23ad93660db47b8f189fba876bf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env dash

# shellcheck source=/dev/null
SHELL_LIBRARY_VERSION="1.10.2" . %SHELL_LIBRARY_PATH

# CONSTANTS {{{
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}'
}

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
# }}}

if [ "$1" = "id" ]; then
    # This is here to keep the sorting in tack
    shift 1
    bases="$(mktmp)";
    for id in "$@"; do
        ytcc --output json list --attributes url --ids "$id" | jq --raw-output 'map("\(.url);\(.id)") | join("\n")' >> "$bases";
    done
else
    die "The first arg must be id, but it was: '$1'"
fi

[ -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 < "$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