You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							142 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
	
	
							142 lines
						
					
					
						
							3.3 KiB
						
					
					
				#!/bin/sh | 
						|
 | 
						|
# Downloader | 
						|
# Depends: aria2, youtube-dl | 
						|
 | 
						|
b=$(tput bold) | 
						|
blue=$(tput setf 1) | 
						|
red=$(tput setf 4) | 
						|
u=$(tput smul) | 
						|
n=$(tput sgr0) | 
						|
 | 
						|
help() { | 
						|
	cat << EOF | 
						|
${b}NAME${n} | 
						|
	dl - Downloader | 
						|
 | 
						|
${b}SYNOPSIS${n} | 
						|
	${b}dl${n} [${u}OPTION${n}...] [${u}URL${n}...] | 
						|
 | 
						|
${b}DESCRIPTION${n} | 
						|
	${b}dl${n} Download audio/video with youtube-dl, using aria2, for each URL. | 
						|
 | 
						|
	A ${u}URL${n} of "${b}-${n}" stands for standard input. | 
						|
 | 
						|
${b}OPTIONS${n} | 
						|
	${b}-h${n}	Display usage message and exit. | 
						|
 | 
						|
	${b}-a${n}	Download audio files from ${u}URL${n}. | 
						|
 | 
						|
	${b}-b${n}	Enable the best video quality. | 
						|
 | 
						|
	${b}-t${n}	Enable embedding of thumbnails into audio. | 
						|
 | 
						|
	${b}-v${n}	Download video files from ${u}URL${n}. | 
						|
EOF | 
						|
} | 
						|
 | 
						|
# Exit if no option is provided | 
						|
[ "$#" -eq 0 ] && help && exit 1 | 
						|
 | 
						|
script="$(basename "$0")" | 
						|
 | 
						|
# Option handling | 
						|
while getopts ':h?abtv' opt; do | 
						|
	case $opt in | 
						|
		h) | 
						|
			help | 
						|
			exit 0 | 
						|
			;; | 
						|
		a) | 
						|
			audioDownload="true" | 
						|
			;; | 
						|
		b) | 
						|
			videoBest="true" | 
						|
			;; | 
						|
		t) | 
						|
			audioThumbnail="true" | 
						|
			;; | 
						|
		v) | 
						|
			videoDownload="true" | 
						|
			;; | 
						|
		:) | 
						|
			echo "$script: option requires an argument '$OPTARG'" | 
						|
			echo "Try '$script -h' for more information." | 
						|
			exit 1 | 
						|
			;; | 
						|
		\?) | 
						|
			echo "$script: invalid option '$OPTARG'" | 
						|
			echo "Try '$script -h' for more information." | 
						|
			exit 1 | 
						|
			;; | 
						|
	esac | 
						|
done | 
						|
 | 
						|
embedAudioThumbnail() | 
						|
{ | 
						|
	# Get file name | 
						|
	fileName="$(youtube-dl --get-filename "$1")" | 
						|
	fileName="${fileName%.*}" | 
						|
 | 
						|
	# Convert thumbnail to actually be a jpg | 
						|
	yes y | ffmpeg -i "${fileName}.webp" "${fileName}_converted.jpg" > /dev/null 2>&1 | 
						|
	yes y | ffmpeg -i "${fileName}.jpg" "${fileName}_converted.jpg" > /dev/null 2>&1 | 
						|
 | 
						|
	# Embed thumbnail into mp3 | 
						|
	yes y | ffmpeg -i "${fileName}.mp3" -i "${fileName}_converted.jpg" \ | 
						|
				  -map 0:0 -map 1:0 -c copy -id3v2_version 3 \ | 
						|
				  -metadata:s:v title="Album cover" \ | 
						|
				  -metadata:s:v comment="Cover (front)" \ | 
						|
				  "${fileName}_embed.mp3" > /dev/null 2>&1 | 
						|
 | 
						|
	# Remove left over files | 
						|
	rm -f "./${fileName}_converted.jpg" "./${fileName}.jpg" "./${fileName}.mp3" | 
						|
	mv "${fileName}_embed.mp3" "${fileName}.mp3" | 
						|
} | 
						|
 | 
						|
downloadAudio() | 
						|
{ | 
						|
	[ -z "$1" ] && return 1 | 
						|
 | 
						|
	[ -n "$audioThumbnail" ] && thumbnail="--write-thumbnail" | 
						|
	youtube-dl --format bestaudio/best \ | 
						|
			   --extract-audio --audio-format mp3 --audio-quality 0 $thumbnail \ | 
						|
			   --external-downloader aria2c \ | 
						|
			   --cookies "$HOME/documents/youtube.com-cookies.txt" "$1" | 
						|
	[ -n "$audioThumbnail" ] && embedAudioThumbnail "$1" | 
						|
} | 
						|
 | 
						|
downloadVideo() | 
						|
{ | 
						|
	[ -z "$1" ] && return 1 | 
						|
 | 
						|
	[ -z "$videoBest" ] && videoLimit="[height<=?1080]" | 
						|
	youtube-dl --format "bestvideo${videoLimit}+bestaudio/best" \ | 
						|
			   --add-metadata \ | 
						|
			   --external-downloader aria2c \ | 
						|
			   --cookies "$HOME/documents/youtube.com-cookies.txt" "$1" | 
						|
} | 
						|
 | 
						|
handleUrls() | 
						|
{ | 
						|
	argumentUrls="$(echo "$@" | tr ' ' "\n")" | 
						|
	urls="$(echo "$argumentUrls" | sed 's/^-$//')" | 
						|
	[ "$argumentUrls" != "$urls" ] && urls="$(printf '%s\n%s' "$urls" "$(cat /dev/stdin)")" | 
						|
	parsedUrls="$(echo "$urls" | sed -nE 's#^(https?://\S+\.\S+)$#\1#p')" | 
						|
	[ "$urls" != "$parsedUrls" ] && printf '%sReceived invalid URL%s\n' "${b}${red}" "${n}" && exit 1 | 
						|
} | 
						|
 | 
						|
startDownloads() | 
						|
{ | 
						|
	# Start downloads | 
						|
	printf "%s::%s Downloading... %s \n" "${b}${blue}" "${n}${b}" "${n}" | 
						|
 | 
						|
	for url in $parsedUrls; do | 
						|
		[ -n "$audioDownload" ] && downloadAudio "$url" | 
						|
		[ -n "$videoDownload" ] && downloadVideo "$url" | 
						|
	done | 
						|
} | 
						|
 | 
						|
shift $((OPTIND - 1)) | 
						|
handleUrls "$@" | 
						|
startDownloads
 | 
						|
 |