add directory for playlists & add list function
This commit is contained in:
		
							parent
							
								
									9b8cca6de5
								
							
						
					
					
						commit
						b47033a965
					
				
							
								
								
									
										91
									
								
								yt
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								yt
									
									
									
									
									
								
							| @ -19,24 +19,35 @@ | |||||||
| set -e | set -e | ||||||
| 
 | 
 | ||||||
| test -z "$DEBUG" || set -x | test -z "$DEBUG" || set -x | ||||||
|  | test -z "$XDG_CACHE_HOME" && cachefile="$HOME/.cache/yt.cache" \ | ||||||
|  | 	|| cachefile="$XDG_CACHE_HOME/yt.cache" | ||||||
|  | test -z "$YT_PL_DIR" \ | ||||||
|  | 	|| test -n "$XDG_DATA_HOME" && YT_PL_DIR="$XDG_DATA_HOME/yt" \ | ||||||
|  | 	|| YT_PL_DIR="$HOME/.local/share/yt" | ||||||
| 
 | 
 | ||||||
| argv0="$0" | argv0="$0" | ||||||
| com="$1" | com="$1" | ||||||
| 
 | 
 | ||||||
| cachefile="$XDG_CACHE_HOME/yt.cache" |  | ||||||
| FMT='%(title)s – %(channel)s (%(duration>%H:%M:%S)s) [%(webpage_url)s]' | FMT='%(title)s – %(channel)s (%(duration>%H:%M:%S)s) [%(webpage_url)s]' | ||||||
| WBAPI='https://archive.org/wayback/available?url=' | WBAPI='https://archive.org/wayback/available?url=' | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| add() { # adds a video to a playlist file | add() { # adds a video to a playlist file | ||||||
| 	while test -n "$2"; do | 	while test -f "$YT_PL_DIR/$2.m3u"; do | ||||||
| 		if test -n "$(grep -e "$1" "$2")" | 		file="$YT_PL_DIR/$2.m3u" | ||||||
|  | 		video="$(printf '%s\n' "$1" \ | ||||||
|  | 			| sed -e 's/youtu\.be\//www.youtube\.com\/watch?q=/g' -e 's/\?[^q].*$//g')" | ||||||
|  | 		printf '%s\n' "$video" | ||||||
|  | 
 | ||||||
|  | 		if test -n "$(grep -e "$video" "$file")" | ||||||
| 		then | 		then | ||||||
| 			printf "%s: %s: %s: Video already in playlist.\n" "$argv0" "$2" "$1" | 			printf "%s: %s: %s: Video already in playlist.\n" \ | ||||||
|  | 				"$argv0" "$file" "$video" | ||||||
| 			exit | 			exit | ||||||
| 		else | 		else | ||||||
| 			cache "$1" | 			cache "$video" | ||||||
| 			archive "$1" | 			archive "$video" | ||||||
| 			printf "%s\n" "$1" >> "$2" | 			printf "%s\n" "$video" >> "$file" | ||||||
| 		fi | 		fi | ||||||
| 
 | 
 | ||||||
| 		shift | 		shift | ||||||
| @ -58,18 +69,14 @@ archive() { # archives a video to the Wayback Machine | |||||||
| 			if [ "$wayback_url" != "null" ]; then shift; continue; fi | 			if [ "$wayback_url" != "null" ]; then shift; continue; fi | ||||||
| 
 | 
 | ||||||
| 			printf "%s: %s: Saving video to the Wayback Machine.\n" "$argv0" "$1" 1>&2 | 			printf "%s: %s: Saving video to the Wayback Machine.\n" "$argv0" "$1" 1>&2 | ||||||
| 			curl -s -d "url=$1" https://web.archive.org/{url} >/dev/null | 			curl -s -d "url=$1" 'https://web.archive.org/{url}' >/dev/null | ||||||
| 		fi | 		fi | ||||||
| 		shift | 		shift | ||||||
| 	done | 	done | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| cache() { # cache the video title for faster retrieval | cache() { # cache the video title for faster retrieval | ||||||
| 	if test -z "$XDG_CACHE_HOME"; then | 	test -e "$cachefile" || touch "$cachefile" | ||||||
| 		printf "%s: unable to create title cachefile: \$XDG_CACHE_HOME unset." \ |  | ||||||
| 			"$argv0" 2>&1 |  | ||||||
| 		exit 69 # sysexits.h(3) EX_UNAVAILABLE |  | ||||||
| 	fi |  | ||||||
| 
 | 
 | ||||||
| 	while test -n "$1"; do | 	while test -n "$1"; do | ||||||
| 		grep "$1" "$cachefile" 2>/dev/null 1>&2 || printf '%s\n' \ | 		grep "$1" "$cachefile" 2>/dev/null 1>&2 || printf '%s\n' \ | ||||||
| @ -79,8 +86,11 @@ cache() { # cache the video title for faster retrieval | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| clone() { # clones a YouTube playlist to a file | clone() { # clones a YouTube playlist to a file | ||||||
| 	yt-dlp --flat-playlist "$1" --print url > "$2" | 	test -d "$YT_PL_DIR" || mkdir -p "$YT_PL_DIR" | ||||||
| 	verify "$2" | 	file="$YT_PL_DIR/$2.m3u" | ||||||
|  | 
 | ||||||
|  | 	yt-dlp --flat-playlist "$1" --print url > "$file" | ||||||
|  | 	verify "$file" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| lines() { | lines() { | ||||||
| @ -90,6 +100,17 @@ lines() { | |||||||
| 	done | 	done | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | list() { | ||||||
|  | 	selection="$(ls "$YT_PL_DIR" | sed 's/\.m3u//g' | $YTPICK)" | ||||||
|  | 
 | ||||||
|  | 	while test -d "$YT_PL_DIR/$selection"; do | ||||||
|  | 		dir="$selection" | ||||||
|  | 		selection="$(ls "$YT_PL_DIR/$selection" | sed 's/\.m3u//g' | $YTPICK)" | ||||||
|  | 	done | ||||||
|  | 
 | ||||||
|  | 	pick "$dir/$selection" | ||||||
|  | } | ||||||
|  | 
 | ||||||
| music() { # downloads a video, splitting by chapter and only saving the audio | music() { # downloads a video, splitting by chapter and only saving the audio | ||||||
| 	while test -n "$1"; do | 	while test -n "$1"; do | ||||||
| 		yt-dlp -vx --split-chapters -o \ | 		yt-dlp -vx --split-chapters -o \ | ||||||
| @ -99,14 +120,17 @@ music() { # downloads a video, splitting by chapter and only saving the audio | |||||||
| 	done | 	done | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pick() { # Pick a video to play from a list of videos | pick() { # Pick a video to play from a playlist of videos | ||||||
| 	if test -z "$YTPICK"; then | 	if test -z "$YTPICK"; then | ||||||
| 		printf "%s: Please set \$YTPICK to your preferred picking tool." "$argv0" 1>&2 | 		printf "%s: Please set \$YTPICK to your preferred picking tool." \ | ||||||
|  | 			"$argv0" 1>&2 | ||||||
| 		exit 78 # sysexits.h(3) EX_CONFIG | 		exit 78 # sysexits.h(3) EX_CONFIG | ||||||
| 	fi | 	fi | ||||||
| 
 | 
 | ||||||
| 	while test -n "$1"; do | 	while test -f "$YT_PL_DIR/$1.m3u"; do | ||||||
| 		for line in $(lines "$1"); do | 		file="$YT_PL_DIR/$1.m3u" | ||||||
|  | 
 | ||||||
|  | 		for line in $(lines "$file"); do | ||||||
| 			if test -n "$(printf '%s\n' "$line" | sed -n '/^\#/p')" | 			if test -n "$(printf '%s\n' "$line" | sed -n '/^\#/p')" | ||||||
| 			then | 			then | ||||||
| 				continue | 				continue | ||||||
| @ -124,17 +148,18 @@ pick() { # Pick a video to play from a list of videos | |||||||
| 	done | 	done | ||||||
| 
 | 
 | ||||||
| 	chosen="$(printf '%s\n' "$list" | $YTPICK | sed -e 's/.*\[//g' -e 's/\]//g')" | 	chosen="$(printf '%s\n' "$list" | $YTPICK | sed -e 's/.*\[//g' -e 's/\]//g')" | ||||||
|  | 	printf "%s: %s: Playing stream.\n" "$argv0" "$chosen" 1>&2 | ||||||
| 	test -n "$chosen" && mpv "$chosen" | 	test -n "$chosen" && mpv "$chosen" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| play() { # play a video after caching its title | play() { # play a video after caching its title | ||||||
| 	cache $@ | 	cache "$@" | ||||||
| 	mpv $@ | 	mpv "$@" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| queue() { | queue() { | ||||||
| 	while test -n "$1"; do | 	while test -f "$YT_PL_DIR/$1.m3u"; do | ||||||
| 		mpv "$1" | 		mpv "$YT_PL_DIR/$1.m3u" | ||||||
| 		shift | 		shift | ||||||
| 	done | 	done | ||||||
| } | } | ||||||
| @ -145,8 +170,10 @@ usage() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| verify() { # replaces videos with archived versions if they are not available | verify() { # replaces videos with archived versions if they are not available | ||||||
| 	while test -n "$1"; do | 	while test -f "$YT_PL_DIR/$1.m3u"; do | ||||||
| 		for video in $(lines "$1"); do | 		file="$YT_PL_DIR/$1.m3u" | ||||||
|  | 
 | ||||||
|  | 		for video in $(lines "$file"); do | ||||||
| 			if test -n "$(yt-dlp -s "$video" 2>&1 \ | 			if test -n "$(yt-dlp -s "$video" 2>&1 \ | ||||||
| 				| grep -i -e 'video unavailable' -e 'private video' -e 'been removed')" | 				| grep -i -e 'video unavailable' -e 'private video' -e 'been removed')" | ||||||
| 			then | 			then | ||||||
| @ -162,16 +189,16 @@ verify() { # replaces videos with archived versions if they are not available | |||||||
| 					printf "%s: %s: Video not available on the Wayback Machine.\n" \ | 					printf "%s: %s: Video not available on the Wayback Machine.\n" \ | ||||||
| 						"$argv0" "$video" 1>&2 | 						"$argv0" "$video" 1>&2 | ||||||
| 					# replace the video link with a comment containing link | 					# replace the video link with a comment containing link | ||||||
| 					content="$(sed "s;^$video;\# $video;g" "$1")" | 					content="$(sed "s;^$video;\# $video;g" "$file")" | ||||||
| 
 | 
 | ||||||
| 					# write the new content buffer to file | 					# write the new content buffer to file | ||||||
| 					printf '%s\n' "$content" > "$1" | 					printf '%s\n' "$content" > "$file" | ||||||
| 				else | 				else | ||||||
| 					printf "%s: %s: Replacing link with Wayback link.\n" \ | 					printf "%s: %s: Replacing link with Wayback link.\n" \ | ||||||
| 						"$argv0" "$video" 1>&2 | 						"$argv0" "$video" 1>&2 | ||||||
| 
 | 
 | ||||||
| 					content="$(sed "s;^$video;$wayback_url;g" "$1")" | 					content="$(sed "s;^$video;$wayback_url;g" "$file")" | ||||||
| 					printf '%s\n' "$content" >"$1" | 					printf '%s\n' "$content" >"$file" | ||||||
| 					cache "$wayback_url" | 					cache "$wayback_url" | ||||||
| 				fi | 				fi | ||||||
| 			else | 			else | ||||||
| @ -215,6 +242,10 @@ case "$com" in | |||||||
| 		shift 2>/dev/null || usage 'clone uri file' | 		shift 2>/dev/null || usage 'clone uri file' | ||||||
| 		clone "$@" | 		clone "$@" | ||||||
| 		;; | 		;; | ||||||
|  | 	list) | ||||||
|  | 		shift 2>/dev/null || usage 'list' | ||||||
|  | 		list "$@" | ||||||
|  | 		;; | ||||||
| 	music) | 	music) | ||||||
| 		shift 2>/dev/null || usage 'music uri...' | 		shift 2>/dev/null || usage 'music uri...' | ||||||
| 		music "$@" | 		music "$@" | ||||||
| @ -236,6 +267,6 @@ case "$com" in | |||||||
| 		verify "$@" | 		verify "$@" | ||||||
| 		;; | 		;; | ||||||
| 	*) | 	*) | ||||||
| 		usage 'add | clone | music | pick | play | verify' | 		usage 'add | clone | list | music | pick | play | verify' | ||||||
| 		;; | 		;; | ||||||
| esac | esac | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user