From c34856d13496d26c5d82e43852cb3eb71c2d40e0 Mon Sep 17 00:00:00 2001 From: emma Date: Tue, 12 Dec 2023 18:41:31 -0700 Subject: [PATCH] refactor and added sync functionality --- yt | 138 ++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 76 insertions(+), 62 deletions(-) diff --git a/yt b/yt index fcfef9d..16d3db8 100755 --- a/yt +++ b/yt @@ -27,14 +27,19 @@ test -n "$YT_PL_DIR" \ || test -n "$XDG_DATA_HOME" && YT_PL_DIR="$XDG_DATA_HOME/yt" \ || YT_PL_DIR="$HOME/.local/share/yt" +test -d "$YT_PL_DIR" \ + || mkdir -p "$YT_PL_DIR" + argv0="$0" com="$1" - +u='add | archive | clone | list | new | pick | play | search | sync | verify' FMT='%(title)s – %(channel)s (%(duration>%H:%M:%S)s) [%(webpage_url)s]' WBAPI='https://archive.org/wayback/available?url=' add() { # adds a video to a playlist file + test -z "$2" || test -n "$3" && usage 'add uri playlist' + while test -f "$YT_PL_DIR/$2.m3u"; do file="$YT_PL_DIR/$2.m3u" video="$(printf '%s\n' "$1" \ @@ -57,6 +62,8 @@ add() { # adds a video to a playlist file } archive() { # archives a video to the Wayback Machine + test -z "$1" && usage 'archive uri...' + while test -n "$1"; do if test -n "$(printf '%s\n' "$1" | grep -e 'web\.archive\.org')" then @@ -78,6 +85,8 @@ archive() { # archives a video to the Wayback Machine } cache() { # cache the video title for faster retrieval + test -z "$1" && usage 'cache video...' + test -e "$cachefile" || touch "$cachefile" while test -n "$1"; do @@ -88,12 +97,20 @@ cache() { # cache the video title for faster retrieval } clone() { # clones a YouTube playlist to a file - test -d "$YT_PL_DIR" || mkdir -p "$YT_PL_DIR" + test -z "$1" && usage 'clone uri [playlist]' - test -n "$2" && file="$2" \ - || file="$YT_PL_DIR/$(yt-dlp -s -I '1:1' --print '%(playlist)s' "$1").m3u" + title="$(yt-dlp -s -I '1:1' --print '%(playlist)s' "$1")" + + file="$YT_PL_DIR/$title.m3u" + creator="$(yt-dlp -s -I '1:1' --print '%(playlist_uploader)s' "$1")" + + videos="$(yt-dlp --flat-playlist "$1" --print url)" + prefix="$(printf "#EXTM3U\n#EXTART:%s\n#PLAYLIST:%s [%s]\n" \ + "$creator" "$title" "$1")" + + printf "%s: %s: Saving playlist to %s.\n" "$argv0" "$title" "$file" 1>&2 + printf '%s\n\n%s\n' "$prefix" "$videos" >"$file" - yt-dlp --flat-playlist "$1" --print url > "$file" verify "$file" } @@ -105,6 +122,8 @@ lines() { } list() { + test -n "$1" && usage 'list' + if test -z "$YTPICK"; then printf "%s: Please set \$YTPICK to your preferred picking tool." \ "$argv0" 1>&2 @@ -128,16 +147,23 @@ menu() { printf '%s/%s\n' "$dir" "$playlist" } -music() { # downloads a video, splitting by chapter and only saving the audio - while test -n "$1"; do - yt-dlp -vx --split-chapters -o \ - "chapter:%(fulltitle)s - %(section_number)s %(section_title)s.%(ext)s" \ - "$1" --audio-quality 0 >> log 2>&1 - shift - done +new() { + test -z "$1" && usage 'new playlist...' + + file="$YT_PL_DIR/$1.m3u" + + if test -f "$file"; then + printf "%s: %s: File exists." "$argv0" "$file" + elif test -d "$file"; then + printf "%s: %s: Is a directory." "$argv0" "$file" + else + touch "$file" + fi } pick() { # Pick a video to play from a playlist of videos + test -z "$1" && usage 'pick playlist...' + if test -z "$YTPICK"; then printf "%s: Please set \$YTPICK to your preferred picking tool." \ "$argv0" 1>&2 @@ -172,6 +198,8 @@ pick() { # Pick a video to play from a playlist of videos } play() { # play a video after caching its title + test -z "$1" && usage 'play uri...' + if test -z "$PLAYER"; then printf "%s: Please set \$PLAYER to your preferred video player." \ "$argv0" 1>&2 @@ -183,6 +211,8 @@ play() { # play a video after caching its title } queue() { + test -z "$1" && usage 'queue playlist...' + if test -z "$PLAYER"; then printf "%s: Please set \$PLAYER to your preferred video player." \ "$argv0" 1>&2 @@ -196,6 +226,8 @@ queue() { } search() { + test -z "$1" && usage 'search term [count]' + if test -z "$YTPICK"; then printf "%s: Please set \$YTPICK to your preferred picking tool." \ "$argv0" 1>&2 @@ -229,12 +261,40 @@ search() { fi } +sync() { + if test -z "$1" + then + set -- "$YT_PL_DIR"/*.m3u + else + P="$(printf '%s\n' "$YT_PL_DIR" | sed 's;\/;\\/;g')" + set -- $(printf "$@" | sed "s/.* /$P\/&\.m3u/g") + fi + + while test -n "$1"; do + file="$1" + + if test -f "$file"; then + URL="$(sed -n 's/^\#PLAYLIST:.* \[//p' <"$file" | tr -d ']')" + + if test -n "$URL"; then + mv "$file" "$file.old" + + clone "$URL" || mv "$file.old" "$file" + fi + fi + + shift + done +} + usage() { printf "Usage: %s %s\n" "$argv0" "$@" 1>&2 exit 64 # sysexits.h(3) EX_USAGE } verify() { # replaces videos with archived versions if they are not available + test -z "$1" && usage 'verify playlist...' + while test -f "$YT_PL_DIR/$1.m3u"; do file="$YT_PL_DIR/$1.m3u" @@ -284,57 +344,11 @@ for dep in \ do if ! command -v "$dep" >/dev/null then - printf "%s: %s: Missing dependency." "$argv0" "$dep" 1>&2 + printf "%s: %s: Missing dependency.\n" "$0" "$dep" 1>&2 exit 69 # syexits.h(3) EX_UNAVAILABLE fi done -case "$com" in - add) - shift 2>/dev/null || usage 'add uri file' - add "$@" - ;; - archive) - shift 2>/dev/null || usage 'archive uri...' - archive "$@" - ;; - cache) - shift 2>/dev/null || usage 'cache uri...' - cache "$@" - ;; - clone) - shift 2>/dev/null || usage 'clone uri [file]' - clone "$@" - ;; - list) - shift 2>/dev/null || usage 'list' - list "$@" - ;; - music) - shift 2>/dev/null || usage 'music uri...' - music "$@" - ;; - pick) - shift 2>/dev/null || usage 'pick file...' - pick "$@" - ;; - play) - shift 2>/dev/null || usage 'play uri...' - play "$@" - ;; - queue) - shift 2>/dev/null || usage 'queue file...' - queue "$@" - ;; - search) - shift 2>/dev/null || usage 'search term [count]' - search "$@" - ;; - verify) - shift 2>/dev/null || usage 'file...' - verify "$@" - ;; - *) - usage 'add | clone | list | music | pick | play | verify' - ;; -esac +test -n "$com" && shift || usage "$u" + +"$com" "$@"