Added BASH script that organizes downloading videos
This commit is contained in:
parent
23e7f53bd3
commit
de89f90c00
487
bin/auto-youtube-dl.sh
Executable file
487
bin/auto-youtube-dl.sh
Executable file
@ -0,0 +1,487 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
export PATH=$PATH:/usr/local/bin:/usr/local/sbin
|
||||||
|
|
||||||
|
# This is a high quality bash script to have simple files instead of multiple
|
||||||
|
# youtube-dl terminal sessions. Create the file and forget about any issues,
|
||||||
|
# they will be handled by this script.
|
||||||
|
#
|
||||||
|
# Supports Cygwin.
|
||||||
|
#
|
||||||
|
# Finely written documentation is below, here are only color definitions
|
||||||
|
|
||||||
|
# formats
|
||||||
|
_RST_='\033[0m' # resets color and format
|
||||||
|
_RVS_='\033[27m'
|
||||||
|
_BLD='\033[1m'
|
||||||
|
_DIM='\033[2m'
|
||||||
|
_UND='\033[4m'
|
||||||
|
_BlK='\033[5m'
|
||||||
|
_RVS='\033[7m'
|
||||||
|
_HID='\033[8m'
|
||||||
|
_BU='\033[1m\033[4m'
|
||||||
|
|
||||||
|
# Regular Colors
|
||||||
|
C_BLACK='\033[0;30m'
|
||||||
|
C_RED='\033[0;31m'
|
||||||
|
C_GREEN='\033[0;32m'
|
||||||
|
C_YELLOW='\033[1;33m'
|
||||||
|
C_BLUE='\033[0;34m'
|
||||||
|
C_MAGENTA='\033[0;35m'
|
||||||
|
C_CYAN='\033[0;36m'
|
||||||
|
C_WHITE='\033[1;37m'
|
||||||
|
C_BROWN='\033[0;33m'
|
||||||
|
C_GRAY='\033[0;30m'
|
||||||
|
|
||||||
|
# High Intensty
|
||||||
|
CI_BLACK='\033[1;30m'
|
||||||
|
CI_RED='\033[1;31m'
|
||||||
|
CI_GREEN='\033[1;32m'
|
||||||
|
CI_BLUE='\033[1;34m'
|
||||||
|
CI_MAGENTA='\033[1;35m'
|
||||||
|
CI_CYAN='\033[1;36m'
|
||||||
|
CI_BROWN='\033[1;33m'
|
||||||
|
CI_GRAY='\033[1;30m'
|
||||||
|
|
||||||
|
export _RST_ _RVS_ _BLD _DIM _UND _BlK _RVS _HID _BU C_BLACK C_RED C_GREEN C_YELLOW C_BLUE C_MAGENTA C_CYAN C_WHITE C_BROWN C_GRAY CI_BLACK CI_RED CI_GREEN CI_BLUE CI_MAGENTA CI_CYAN CI_BROWN CI_GRAY
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# The script will automatically download multiple videos from Youtube, Vimeo
|
||||||
|
# and other sites supported by youtube-dl
|
||||||
|
#
|
||||||
|
# The queue is intended to be a Dropbox subdirectory, with text files, each
|
||||||
|
# containing the URL of the video to download
|
||||||
|
#
|
||||||
|
# The download will restart many times, at least for 48 hours
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Here is more information on available advanced functions
|
||||||
|
# - third line in the .txt file can contain youtube-dl options (e.g. -r 100k)
|
||||||
|
# - you can edit the text file (it will have *.used extension after the download starts)
|
||||||
|
# and change the options, and auto-youtube-dl will restart the download (just saving
|
||||||
|
# without changing the file will also cause restart); this works when there is
|
||||||
|
# the crontab entry for this script
|
||||||
|
# - on second line, you can put BASH commands; they will be executed ahead of the
|
||||||
|
# download (example: "sleep 120")
|
||||||
|
# - on fourth line, auto-youtube-dl will put video's title and duration
|
||||||
|
# - each download will be restarted after each 15 minutes to clean out any stalls
|
||||||
|
# inside youtube-dl or on the network
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Example: .txt file can look like this:
|
||||||
|
#
|
||||||
|
# www.youtube.com/watch?v=Foo
|
||||||
|
# sleep 120
|
||||||
|
# -r 100k
|
||||||
|
# An example title 1:09
|
||||||
|
#
|
||||||
|
# Fourth line is the added one.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Much below is an approach to make you change name of directories
|
||||||
|
# instead of defining paths.
|
||||||
|
#
|
||||||
|
# If you have your Dropbox (Google, etc.) directory in /usr/local/var/Dropbox
|
||||||
|
# or similar fussy location, then you will know what to do anyway (hint: change
|
||||||
|
# BPATH* to /usr/local/var)
|
||||||
|
#
|
||||||
|
# The difficulty is Windows - Unix portability. This is the cause for
|
||||||
|
# existence of BPATH and BPATH2.
|
||||||
|
#
|
||||||
|
# You should need only to define:
|
||||||
|
# - CLOUD_DIR
|
||||||
|
# - QUEUE_SUBDIR
|
||||||
|
# - VIDEO_DOWNLOAD_SUBDIR
|
||||||
|
# - optional: MOVE_AFTER_DOWNLOAD_PATH
|
||||||
|
#
|
||||||
|
# The rest will be deduced and created in your Windows/Unix user directory
|
||||||
|
#
|
||||||
|
# Check out the FORMATS variable, by default it is set to medium quality
|
||||||
|
#
|
||||||
|
|
||||||
|
# Types of variables:
|
||||||
|
# *_DIR: relative to $HOME and then to %USERPROFILE%, i.e. to $BPATH, $BPATH2
|
||||||
|
# *_SUBDIR: relative to corresponding DIR
|
||||||
|
# *_PATH: absolute path
|
||||||
|
|
||||||
|
# Base paths (unix - $HOME, windows - $USERPROFILE)
|
||||||
|
BPATH="$HOME"
|
||||||
|
BPATH2="$USERPROFILE"
|
||||||
|
|
||||||
|
CLOUD_DIR="Dropbox" # as ever: searched for in $BPATH, then $BPATH2
|
||||||
|
QUEUE_SUBDIR="var/youtube-dl" # Under CLOUD_DIR. Holds the .txt with the URL to download
|
||||||
|
VIDEO_DOCUMENTS_DIR="Movies" # As ever: $BPATH/*, then $BPATH2/*
|
||||||
|
VIDEO_DOCUMENTS_DIR2="Videos" # (four combinations, first existing is being used)
|
||||||
|
VIDEO_DOWNLOAD_SUBDIR="youtube" # Under $VIDEO_DOCUMENTS_DIR* (the first one found). Target download directory
|
||||||
|
|
||||||
|
# Result of having "Movies" and "Dropbox" dirs under "/home/foo" path
|
||||||
|
# /home/foo/Dropbox/var/youtube-dl - queue directory (with the .txt files)
|
||||||
|
# /home/foo/Movies/youtube - target download directory
|
||||||
|
|
||||||
|
# Move fully downloaded file into this path
|
||||||
|
# MOVE_AFTER_DOWNLOAD_PATH="/home/foo/iTunes auto add/"
|
||||||
|
|
||||||
|
# Example crontab entry:
|
||||||
|
# * * * * * /usr/local/bin/auto-youtube-dl.sh >> /var/auto-ydl.log 2>&1
|
||||||
|
|
||||||
|
SLEEP_TIME=50
|
||||||
|
FORMATS="18/504x336/22/35/34/h264-sd/43/h264-hd/flv/vp6-sd/0/low/high"
|
||||||
|
OPTIONS=( --add-metadata --restrict-filenames --no-playlist --socket-timeout 60 --no-call-home )
|
||||||
|
TITLE_DURATION_OPTIONS=( --get-title --get-duration --no-playlist --socket-timeout 60 --no-call-home )
|
||||||
|
YDL_NAME_PATTERN='%(title)s.%(ext)s' # Used when explicit query of video's title fails
|
||||||
|
|
||||||
|
# EXAMPLE OUTPUT of file:
|
||||||
|
#
|
||||||
|
# https://www.youtube.com/watch?v=_vK84lvwQwo
|
||||||
|
# sleep 5
|
||||||
|
# -r 10k
|
||||||
|
# Atari Basic programming example 3:00
|
||||||
|
#
|
||||||
|
# :
|
||||||
|
|
||||||
|
# ./auto-youtube-dl.sh
|
||||||
|
# [pid: 57243] 2015-07-29 12:36:56 -------------------- example.txt sleep 5 -r 10k
|
||||||
|
# [pid: 57243] 2015-07-29 12:37:03 `Atari Basic programming example' [3:00s] : _vK84lvwQwo
|
||||||
|
#
|
||||||
|
# [pid: 57243] 2015-07-29 12:37:03 STARTING download of <<example.txt>> with the command: youtube-dl -r 10k -f 18/504x336/22/35/34/h264-sd/43/h264-hd/flv/vp6-sd/0/low/high --no-progress --add-metadata --restrict-filenames --no-playlist --socket-timeout 60 --no-call-home -o /home/foo/Movies/youtube/Atari_Basic_programming_example.%(ext)s https://www.youtube.com/watch?v=_vK84lvwQwo
|
||||||
|
# [pid: 57243] 2015-07-29 12:37:03 youtube-dl PID is 57320
|
||||||
|
# [youtube] _vK84lvwQwo: Downloading webpage
|
||||||
|
# [youtube] _vK84lvwQwo: Extracting video information
|
||||||
|
# [youtube] _vK84lvwQwo: Downloading DASH manifest
|
||||||
|
# [download] Destination: /home/foo/Movies/youtube/Atari_Basic_programming_example.mp4
|
||||||
|
#
|
||||||
|
# (now updated the file changing -r 10k to -r 200k)
|
||||||
|
#
|
||||||
|
# [pid: 57243] 2015-07-29 12:39:21 Requeueing <<example.txt>>
|
||||||
|
# [pid: 57243] 2015-07-29 12:39:21 Download of <<example.txt>> halted at attempt 1 / 3456
|
||||||
|
#
|
||||||
|
# [pid: 57243] 2015-07-29 12:39:24 Aborted <<example.txt>> : `Atari Basic programming example' [3:00s] : _vK84lvwQwo
|
||||||
|
#
|
||||||
|
# Running ./auto-youtube-dl.sh again would use the updated file, and then you would in the end see:
|
||||||
|
#
|
||||||
|
# [download] Download completed
|
||||||
|
# [ffmpeg] Adding metadata to '/home/foo/Movies/youtube/Atari_Basic_programming_example.mp4'
|
||||||
|
# [pid: 57641] 2015-07-29 12:39:47 Download of <<example.txt>> successful (# of attempts: 1, time: 0m)
|
||||||
|
# [pid: 57641] 2015-07-29 12:39:47 Atari_Basic_programming_example.mp4 MOVED
|
||||||
|
#
|
||||||
|
# The "MOVED" line is the result of having MOVE_AFTER_DOWNLOAD_PATH set
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Below is the main script's body
|
||||||
|
##
|
||||||
|
|
||||||
|
|
||||||
|
# Store PID of this script's shell
|
||||||
|
MAIN_PID=$$
|
||||||
|
|
||||||
|
#
|
||||||
|
# Helper functions
|
||||||
|
#
|
||||||
|
mydate() {
|
||||||
|
echo "[pid: $MAIN_PID] `date '+%Y-%m-%d %H%:%M:%S'`"
|
||||||
|
}
|
||||||
|
|
||||||
|
timestamp() {
|
||||||
|
date +"%s"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Gets list of children pids
|
||||||
|
get_children_pids() {
|
||||||
|
ps -o ppid,pid -A | egrep '^ *'$1' ' | awk '{ print $2 }'
|
||||||
|
}
|
||||||
|
|
||||||
|
# If the queue file has changed, then requeue it again
|
||||||
|
# and quit to restart the download
|
||||||
|
check_for_update() {
|
||||||
|
[ ! -f "/tmp/ydlstart.$MAIN_PID" ] && return
|
||||||
|
queue_file="$(</tmp/ydlstart.$MAIN_PID)"
|
||||||
|
|
||||||
|
# Queue file updated?
|
||||||
|
if [ "/tmp/ydlstart.$MAIN_PID" -ot "${queue_file%.txt}.used" ]; then
|
||||||
|
# Rename the queue file back to ".txt" extension and quit
|
||||||
|
echo -e "`mydate` ${C_YELLOW}Requeueing${_RST_} <<${CI_GREEN}`basename "$queue_file"`${_RST_}>>"
|
||||||
|
|
||||||
|
YPID=$(echo "`cat 2>/dev/null /tmp/ydlpid.$MAIN_PID`" | sed -e 's/$/ -0/' | bc)
|
||||||
|
[ "$YPID" -gt 100 ] && kill 2>/dev/null -15 "$YPID"
|
||||||
|
|
||||||
|
sleep 3
|
||||||
|
mv -f "${queue_file%.txt}.used" "$queue_file"
|
||||||
|
kill 2>/dev/null -15 "$MAIN_PID"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Repeately restart the download after some time to wipe
|
||||||
|
# out any stalls inside youtube-dl or on the network.
|
||||||
|
trim_process() {
|
||||||
|
while (( 1 )); do
|
||||||
|
# Wait 5 seconds 20 times, checking for update of the .txt (now .used) file
|
||||||
|
wait_repeats=20
|
||||||
|
while (( wait_repeats-- )); do
|
||||||
|
check_for_update
|
||||||
|
sleep $(( SLEEP_TIME / 10 ))
|
||||||
|
done
|
||||||
|
|
||||||
|
YPID=$(echo "`cat 2>/dev/null /tmp/ydlpid.$MAIN_PID`" | sed -e 's/$/ -0/' | bc)
|
||||||
|
if [ "$YPID" -gt 100 ]; then
|
||||||
|
# Use bc to remove leading zeros by subtracting 0, and
|
||||||
|
# in case of empty input, to just put "0" in the result
|
||||||
|
TIME=$(echo "`ps -o etime= -p $YPID`" | sed -e 's/[^0-9]//g' -e 's/$/ -0/' | bc)
|
||||||
|
|
||||||
|
# Break the download if it runs for 00:15:00 or more
|
||||||
|
[ "$TIME" -le 1500 ] && continue
|
||||||
|
|
||||||
|
# Here are the terminating signals
|
||||||
|
rm -f /tmp/ydlpid.$MAIN_PID
|
||||||
|
kill 2>/dev/null -15 "$YPID" && sleep 4
|
||||||
|
kill 2>/dev/null -9 "$YPID"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Stops background processes
|
||||||
|
cleanup() {
|
||||||
|
# Stop youtube-dl if it runs
|
||||||
|
YDL_PID=`echo $YDL_PID | sed 's/[^0-9].*/0/g'`
|
||||||
|
(( YDL_PID = YDL_PID + 0 ))
|
||||||
|
[ "$YDL_PID" -gt 100 ] && kill 2>/dev/null -15 "$YDL_PID"
|
||||||
|
|
||||||
|
# Detect any other children
|
||||||
|
for i in `get_children_pids $MAIN_PID`; do
|
||||||
|
kill 2>/dev/null -15 "$i"
|
||||||
|
done
|
||||||
|
for i in `get_children_pids $MAIN_PID`; do
|
||||||
|
LANG=C sleep 0.5
|
||||||
|
kill 2>/dev/null -9 "$i"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Remove temporary files
|
||||||
|
rm -f /tmp/ydl.$MAIN_PID /tmp/ydlpid.$MAIN_PID /tmp/ydlstart.$MAIN_PID
|
||||||
|
}
|
||||||
|
|
||||||
|
# Cleans up children processes, outputs message
|
||||||
|
interrupted_exit() {
|
||||||
|
# Inform about being aborted
|
||||||
|
echo -e "\n`mydate` ${C_RED}Aborted${_RST_} <<${CI_GREEN}${filename}${_RST_}>> :"\
|
||||||
|
"${C_RED}\`$vtitle'${_RST_} [${C_CYAN}${vduration}s${_RST_}] : $urlid"
|
||||||
|
|
||||||
|
exit 100
|
||||||
|
}
|
||||||
|
|
||||||
|
trap "interrupted_exit" SIGINT SIGTERM
|
||||||
|
trap "cleanup" EXIT
|
||||||
|
|
||||||
|
#
|
||||||
|
# 1. Establish queue dir
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ -d "$BPATH/$CLOUD_DIR" ]; then
|
||||||
|
QUEUE_PATH="$BPATH/$CLOUD_DIR/$QUEUE_SUBDIR"
|
||||||
|
elif [ -d "$BPATH2/$CLOUD_DIR" ]; then
|
||||||
|
QUEUE_PATH="$BPATH2/$CLOUD_DIR/$QUEUE_SUBDIR"
|
||||||
|
else
|
||||||
|
echo "Error: no cloud dir '$CLOUD_DIR' found either in '$BPATH' or '$BPATH2'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$QUEUE_PATH"
|
||||||
|
|
||||||
|
#
|
||||||
|
# 2. Establish destination download dir
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ -d "$BPATH/$VIDEO_DOCUMENTS_DIR/$VIDEO_DOWNLOAD_SUBDIR" ]; then
|
||||||
|
OUTPUT_VIDEO_PATH="$BPATH/$VIDEO_DOCUMENTS_DIR/$VIDEO_DOWNLOAD_SUBDIR"
|
||||||
|
elif [ -d "$BPATH2/$VIDEO_DOCUMENTS_DIR/$VIDEO_DOWNLOAD_SUBDIR" ]; then
|
||||||
|
OUTPUT_VIDEO_PATH="$BPATH2/$VIDEO_DOCUMENTS_DIR/$VIDEO_DOWNLOAD_SUBDIR"
|
||||||
|
else
|
||||||
|
if [ -d "$BPATH/$VIDEO_DOCUMENTS_DIR" ]; then
|
||||||
|
OUTPUT_VIDEO_PATH="$BPATH/$VIDEO_DOCUMENTS_DIR/$VIDEO_DOWNLOAD_SUBDIR"
|
||||||
|
elif [ -d "$BPATH2/$VIDEO_DOCUMENTS_DIR" ]; then
|
||||||
|
OUTPUT_VIDEO_PATH="$BPATH2/$VIDEO_DOCUMENTS_DIR/$VIDEO_DOWNLOAD_SUBDIR"
|
||||||
|
else
|
||||||
|
if [ -d "$BPATH/$VIDEO_DOCUMENTS_DIR2/$VIDEO_DOWNLOAD_SUBDIR" ]; then
|
||||||
|
OUTPUT_VIDEO_PATH="$BPATH/$VIDEO_DOCUMENTS_DIR2/$VIDEO_DOWNLOAD_SUBDIR"
|
||||||
|
elif [ -d "$BPATH2/$VIDEO_DOCUMENTS_DIR2/$VIDEO_DOWNLOAD_SUBDIR" ]; then
|
||||||
|
OUTPUT_VIDEO_PATH="$BPATH2/$VIDEO_DOCUMENTS_DIR2/$VIDEO_DOWNLOAD_SUBDIR"
|
||||||
|
else
|
||||||
|
if [ -d "$BPATH/$VIDEO_DOCUMENTS_DIR2" ]; then
|
||||||
|
OUTPUT_VIDEO_PATH="$BPATH/$VIDEO_DOCUMENTS_DIR2/$VIDEO_DOWNLOAD_SUBDIR"
|
||||||
|
elif [ -d "$BPATH2/$VIDEO_DOCUMENTS_DIR2" ]; then
|
||||||
|
OUTPUT_VIDEO_PATH="$BPATH2/$VIDEO_DOCUMENTS_DIR2/$VIDEO_DOWNLOAD_SUBDIR"
|
||||||
|
else
|
||||||
|
echo "No video dir '$VIDEO_DOCUMENTS_DIR' or '$VIDEO_DOCUMENTS_DIR2' found in '$BPATH' and '$BPATH2'"
|
||||||
|
echo "And no download dir '$VIDEO_DOWNLOAD_SUBDIR' could be created"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
mkdir -p "$OUTPUT_VIDEO_PATH"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$1" = "-v" ]; then
|
||||||
|
echo "`mydate` QUEUE_PATH: $QUEUE_PATH"
|
||||||
|
echo "`mydate` OUTPUT_VIDEO_PATH: $OUTPUT_VIDEO_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Variable to store youtube-dl PID
|
||||||
|
YDL_PID="0"
|
||||||
|
|
||||||
|
# This is minimum 48 hours of waiting for re-download
|
||||||
|
# (plus the time of actual downloading)
|
||||||
|
MAXRETRIES=$(( 48*3600 / SLEEP_TIME ))
|
||||||
|
RETRY=0
|
||||||
|
# Title isn't needed for actual download so try only a few times
|
||||||
|
TITLEMAXRETRIES=10
|
||||||
|
TITLERETRY=0
|
||||||
|
|
||||||
|
function move_finished {
|
||||||
|
[ "$MOVE_AFTER_DOWNLOAD_PATH" = "" ] && return
|
||||||
|
[ ! -d "$MOVE_AFTER_DOWNLOAD_PATH" ] && return
|
||||||
|
cd $OUTPUT_VIDEO_PATH || return
|
||||||
|
|
||||||
|
# Wait for ffmpeg to finish writing meta data
|
||||||
|
if ls | grep -F .temp. >/dev/null 2>&1; then
|
||||||
|
sleep 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
{
|
||||||
|
MVOUTPUT=`mv 2>/dev/null -vf *.mp4 *.flv *.m4a "$MOVE_AFTER_DOWNLOAD_PATH"`
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! -z "$MVOUTPUT" ]; then
|
||||||
|
echo -e "`mydate` ${C_BLUE}${MVOUTPUT}" | sed 's/->.*$/MOVED/g'
|
||||||
|
echo -e ${_RST_}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
move_finished
|
||||||
|
|
||||||
|
ALREADY_RUNNING=`ps -ae | grep -v grep | egrep -c '/bin/bash.*n1auto-youtube-dl.*'`
|
||||||
|
(( ALREADY_RUNNING = ALREADY_RUNNING - 1 ))
|
||||||
|
if [[ $ALREADY_RUNNING -gt 5 ]]; then
|
||||||
|
# Are there any priority (a-...) files?
|
||||||
|
files=`ls 2>/dev/null $QUEUE_PATH | grep 2>/dev/null '^a-[^ ]*.txt'`
|
||||||
|
if [ -z "$files" ]; then
|
||||||
|
echo "`mydate` Too many downloads ($ALREADY_RUNNING), exiting"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$1" = "-v" ]; then
|
||||||
|
# If no terminal (i.e. -t 1 is false) then use basic
|
||||||
|
# progress bar that isn't animated (--newline option)
|
||||||
|
[ -t 1 ] || OPTIONS=( --newline "${OPTIONS[@]}" )
|
||||||
|
else
|
||||||
|
# Quiet mode
|
||||||
|
OPTIONS=( --no-progress "${OPTIONS[@]}" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prepend the $FORMATS
|
||||||
|
OPTIONS=( -f "$FORMATS" "${OPTIONS[@]}" )
|
||||||
|
|
||||||
|
trim_process &
|
||||||
|
|
||||||
|
cd "$OUTPUT_VIDEO_PATH"
|
||||||
|
|
||||||
|
# Iterate over txt fils inside $QUEUE_PATH
|
||||||
|
for queue_file in $QUEUE_PATH/*.txt; do
|
||||||
|
# Check if some other auto-youtube-dl instance already iterated further
|
||||||
|
# TODO: Fix race conditions
|
||||||
|
[ -f $queue_file ] || break
|
||||||
|
|
||||||
|
{ read -r video_url; read -r cmds; read -r opts; } <<<"$(<$queue_file)"
|
||||||
|
mv -f "$queue_file" "${queue_file%.txt}.used"
|
||||||
|
|
||||||
|
filename=`basename "$queue_file"`
|
||||||
|
echo "`mydate` -------------------- $filename $cmds $opts"
|
||||||
|
|
||||||
|
# User wants to run some code?
|
||||||
|
[ ! -z "$cmds" ] && eval "$cmds"
|
||||||
|
|
||||||
|
# User wants to change youtube-dl opts?
|
||||||
|
if [ ! -z "$opts" ]; then
|
||||||
|
YOPTIONS=( `echo "$opts" "${OPTIONS[@]}" | sed 's/ -/#-/g' | tr '#' '\n' | awk '!a[$1]++'` )
|
||||||
|
else
|
||||||
|
YOPTIONS=( "${OPTIONS[@]}" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Will be left with this value when explicit query of video's title fails
|
||||||
|
OUTNAME="$YDL_NAME_PATTERN"
|
||||||
|
|
||||||
|
# Get video's title and duration
|
||||||
|
while (( TITLERETRY++ < TITLEMAXRETRIES )); do
|
||||||
|
# Run youtube-dl in background so that main process can still receive signals
|
||||||
|
youtube-dl "${TITLE_DURATION_OPTIONS[@]}" "$video_url" > /tmp/ydl.$MAIN_PID &
|
||||||
|
wait $!
|
||||||
|
{ read -r vtitle; read -r vduration; } <<<"$(</tmp/ydl.$MAIN_PID)"
|
||||||
|
rm -f /tmp/ydl.$MAIN_PID
|
||||||
|
|
||||||
|
: "${vduration:=--:--}"
|
||||||
|
|
||||||
|
if [ ! -z "$vtitle" ]; then
|
||||||
|
OUTNAME=`echo "$vtitle" | sed -e 's/[^a-zA-Z0-9._-][^a-zA-Z0-9._-]*/_/g' -e 's/_*$//' -e 's/^_*//'`.'%(ext)s'
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "`mydate` Prefetch of title and duration for <<${CI_GREEN}${filename}${_RST_}>> erroneously stopped"\
|
||||||
|
"[attempt ${CI_GREEN}#${TITLERETRY}${_RST_} / $TITLEMAXRETRIES]"
|
||||||
|
|
||||||
|
sleep $SLEEP_TIME &
|
||||||
|
wait $!
|
||||||
|
done
|
||||||
|
TITLERETRY=0
|
||||||
|
|
||||||
|
# Append video's title and duration to the queue file
|
||||||
|
echo -e "$video_url\\n$cmds\\n$opts\\n$vtitle $vduration" > "${queue_file%.txt}.used"
|
||||||
|
echo "$queue_file" > "/tmp/ydlstart.$MAIN_PID"
|
||||||
|
|
||||||
|
# Output a main message, emphasized by red color, containing title, duration and a video id
|
||||||
|
urlid="${video_url##*/}"
|
||||||
|
urlid="${urlid#*=}"
|
||||||
|
urlid=`echo "$urlid" | sed -e 's/index=[0-9]*//' -e 's/list=[a-zA-Z0-9_\-]*//' -e 's/.*v=//' -e 's/&//g'`
|
||||||
|
echo -e "`mydate` ${CI_RED}\`$vtitle'${_RST_} [${C_CYAN}${vduration}s${_RST_}] : $urlid\n"
|
||||||
|
|
||||||
|
START_TIME=`timestamp`
|
||||||
|
while (( RETRY ++ < MAXRETRIES )); do
|
||||||
|
MSG="Repeating (try #$RETRY) download of <<${CI_GREEN}${filename}${_RST_}>>"
|
||||||
|
if [ "$RETRY" = "1" ]; then
|
||||||
|
MSG="${CI_GREEN}STARTING$_RST_ download of <<${CI_GREEN}${filename}${_RST_}>>"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "`mydate` $MSG with the command:"\
|
||||||
|
youtube-dl "${YOPTIONS[@]}" -o "$OUTPUT_VIDEO_PATH/$OUTNAME" "$CI_BLUE$video_url$_RST_"
|
||||||
|
youtube-dl "${YOPTIONS[@]}" -o "$OUTPUT_VIDEO_PATH/$OUTNAME" "$video_url" &
|
||||||
|
|
||||||
|
YDL_PID=$!
|
||||||
|
echo "`mydate` youtube-dl PID is $YDL_PID"
|
||||||
|
echo "$YDL_PID" > /tmp/ydlpid.$MAIN_PID
|
||||||
|
|
||||||
|
if wait $YDL_PID; then
|
||||||
|
DOWNLOAD_TIME=`timestamp`
|
||||||
|
(( DOWNLOAD_TIME = (DOWNLOAD_TIME - START_TIME) / 60 ))
|
||||||
|
echo -e "`mydate` ${C_YELLOW}Download of <<$filename>> successful"\
|
||||||
|
"(# of attempts: $RETRY, time: ${DOWNLOAD_TIME}m)$_RST_"
|
||||||
|
RETRY=0
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo -e "`mydate` Download of <<${CI_GREEN}${filename}${_RST_}>>"\
|
||||||
|
"halted at attempt ${CI_GREEN}${RETRY}${_RST_} / $MAXRETRIES"
|
||||||
|
|
||||||
|
if [ -f /tmp/ydlpid.$MAIN_PID ]; then
|
||||||
|
sleep $SLEEP_TIME &
|
||||||
|
wait $!
|
||||||
|
else
|
||||||
|
echo -e "`mydate` ${CI_GREEN}[Intended restart]${_RST_}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
move_finished
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user