Compare commits
3 commits
27cbf30da0
...
3e00e84319
Author | SHA1 | Date | |
---|---|---|---|
3e00e84319 | |||
08d246272a | |||
b8fae73940 |
3 changed files with 129 additions and 43 deletions
|
@ -2,13 +2,6 @@
|
||||||
# download a file if it does not exist in the archive alread
|
# download a file if it does not exist in the archive alread
|
||||||
# otherwise just re-link it from the archive
|
# otherwise just re-link it from the archive
|
||||||
|
|
||||||
DL_FOLDER="${DL_FOLDER:-${XDG_VIDEOS_DIR:-$HOME/videos}}/inbox"
|
|
||||||
ARCHIVE_FOLDER="${ARCHIVE_FOLDER:-${XDG_VIDEOS_DIR:-$HOME/videos}}/archive"
|
|
||||||
YT_DL_CMD="${YT_DL_CMD:-yt-dlp}"
|
|
||||||
yt_default_opts=(-f "best[height\<=1080]" --retries 15 --embed-subs --sub-lang "en,de,es,fr")
|
|
||||||
declare -a YT_DL_OPTS=${YT_DL_OPTS:-( "${yt_default_opts[@]}" )}
|
|
||||||
YT_DL_TITLE="""${YT_DL_TITLE:-%(channel)s_%(title)s_%(id)s}"""
|
|
||||||
|
|
||||||
show_help() {
|
show_help() {
|
||||||
printf """
|
printf """
|
||||||
archive.sh: Hard linking your stuff.
|
archive.sh: Hard linking your stuff.
|
||||||
|
@ -22,19 +15,24 @@ Point it to a link you want downloaded.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
|
||||||
-h Display this help.
|
-h Display this help.
|
||||||
|
|
||||||
-d Directory to check for existence of file and archive to if needed.
|
-d Directory to check for existence of file and archive to if needed.
|
||||||
|
If this is passed will not download existing archived files again.
|
||||||
|
|
||||||
-f Directory to download to.
|
-f Directory to download to.
|
||||||
|
|
||||||
|
-c Clear existing download queue.
|
||||||
|
|
||||||
-t Point to youtube-dl command to use. Can be command or absolute link.
|
-t Point to youtube-dl command to use. Can be command or absolute link.
|
||||||
By default will use \`yt-dlp\` which is a more up to date fork of the
|
By default will use \`yt-dlp\` which is a more up to date fork of the
|
||||||
program.
|
youtube-dl program.
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
while getopts "t:f:d:h" opt; do
|
urls=("$@")
|
||||||
|
|
||||||
|
while getopts "t:f:d:hc" opt; do
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
# v) verbose=1
|
# v) verbose=1
|
||||||
# ;;
|
# ;;
|
||||||
|
@ -47,6 +45,9 @@ while getopts "t:f:d:h" opt; do
|
||||||
d)
|
d)
|
||||||
ARCHIVE_FOLDER="$OPTARG"
|
ARCHIVE_FOLDER="$OPTARG"
|
||||||
;;
|
;;
|
||||||
|
c)
|
||||||
|
ONLY_DO=clear
|
||||||
|
;;
|
||||||
h | \? | *)
|
h | \? | *)
|
||||||
show_help
|
show_help
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -55,7 +56,15 @@ while getopts "t:f:d:h" opt; do
|
||||||
done
|
done
|
||||||
shift $((OPTIND - 1))
|
shift $((OPTIND - 1))
|
||||||
|
|
||||||
_call_archive() {
|
get_ytdl_fname() {
|
||||||
|
yt_dl_fname=$("$YT_DL_CMD" --get-filename -o "$YT_DL_TITLE" "$*")
|
||||||
|
if [ -z "$yt_dl_fname" ]; then
|
||||||
|
echo Could not get video filename, error with youtube-dl.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_call_archive() { # 1=new_file, 2=archive_location
|
||||||
command -v archive >/dev/null 2>&1 || {
|
command -v archive >/dev/null 2>&1 || {
|
||||||
echo "archive command not found."
|
echo "archive command not found."
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -64,43 +73,119 @@ _call_archive() {
|
||||||
}
|
}
|
||||||
|
|
||||||
vid_ext="\(mp4\|avi\|webm\|mkv\|mpe?g\|3gp\|m4a\)"
|
vid_ext="\(mp4\|avi\|webm\|mkv\|mpe?g\|3gp\|m4a\)"
|
||||||
_findfile() {
|
_findfile() { # 1=directory, 2=file
|
||||||
dir="$1"
|
find "$1" -type f -name "$2.*" | sed -ne "/$2\.$vid_ext$/Ip"
|
||||||
fname="$2"
|
|
||||||
find "$dir" -type f -name "$fname.*" | sed -ne "/$fname\.$vid_ext$/Ip"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YT_DL_TITLE="%(channel)s_%(title)s_%(id)s"
|
_alreadyexists() { # 1=video_regex
|
||||||
_download() {
|
if [ ! -d "$ARCHIVE_FOLDER" ]; then return 0; fi
|
||||||
|
local found
|
||||||
|
found=$(_findfile "$ARCHIVE_FOLDER" "$1")
|
||||||
|
if [ -n "$found" ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_download_cmd() {
|
||||||
"$YT_DL_CMD" \
|
"$YT_DL_CMD" \
|
||||||
-o "$DL_FOLDER/$YT_DL_TITLE.%(ext)s" \
|
-o "$DL_FOLDER/$YT_DL_TITLE.%(ext)s" \
|
||||||
"${YT_DL_OPTS[@]}" \
|
"${YT_DL_OPTS[@]}" \
|
||||||
"$url"
|
"$*"
|
||||||
}
|
}
|
||||||
|
|
||||||
url="$*"
|
download() { # 1=url
|
||||||
dl_fn=$("$YT_DL_CMD" --get-filename -o "$YT_DL_TITLE" "$url")
|
# # download the video to download folder
|
||||||
video_file_regex="${dl_fn}"
|
if ! _alreadyexists "$yt_dl_fname"; then
|
||||||
|
_download_cmd "$*"
|
||||||
|
|
||||||
if [ -z "$dl_fn" ]; then
|
# yt-dl never knows the exact filename in advance
|
||||||
echo Could not get video filename, error with youtube-dl.
|
file=$(_findfile "$DL_FOLDER" "$yt_dl_fname")
|
||||||
exit 1
|
if [ -z "$file" ]; then exit 1; fi
|
||||||
fi
|
_call_archive "$file" "$ARCHIVE_FOLDER"
|
||||||
|
# only link old file if one exists
|
||||||
|
else
|
||||||
|
archive_file=$(_findfile "$ARCHIVE_FOLDER" "$yt_dl_fname")
|
||||||
|
echo "$archive_file" | while read -r file; do
|
||||||
|
echo "file $file exists, not downloading duplicate"
|
||||||
|
_call_archive "$file" "$DL_FOLDER"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
alreadyexists=$(_findfile "$ARCHIVE_FOLDER" "$video_file_regex")
|
setup() {
|
||||||
|
DL_FOLDER="${DL_FOLDER:-${XDG_VIDEOS_DIR:-$HOME/videos}}/inbox"
|
||||||
|
ARCHIVE_FOLDER="${ARCHIVE_FOLDER:-${XDG_VIDEOS_DIR:-$HOME/videos}}/archive"
|
||||||
|
YT_DL_CMD="${YT_DL_CMD:-yt-dlp}"
|
||||||
|
yt_default_opts=(-f "best[height\<=1080]" --retries 15 --embed-subs --sub-lang "en,de,es,fr")
|
||||||
|
declare -a YT_DL_OPTS=${YT_DL_OPTS:-( "${yt_default_opts[@]}" )}
|
||||||
|
YT_DL_TITLE="${YT_DL_TITLE:-%(channel)s_%(title)s_%(id)s}" # this title needs to be without extension
|
||||||
|
|
||||||
# # download the video to download folder
|
queue_file="${XDG_CACHE_HOME:-$HOME/.cache}/vidl_queue"
|
||||||
if [ "$alreadyexists" = "" ] || [ -z "$alreadyexists" ]; then
|
if [ ! -f "$queue_file" ]; then
|
||||||
_download
|
mkdir -p $(dirname "$queue_file")
|
||||||
|
touch "$queue_file"
|
||||||
|
fi
|
||||||
|
lock_dir="${XDG_CACHE_HOME:-$HOME/.cache}/vidl_lock"
|
||||||
|
}
|
||||||
|
|
||||||
# yt-dl never knows the exact filename in advance
|
is_in_queue() { # 1=url
|
||||||
file=$(_findfile "$DL_FOLDER" "$video_file_regex")
|
[ -f "$queue_file" ] || return 1
|
||||||
if [ -z "$file" ]; then exit 1; fi
|
grep -q "$1" "$queue_file"
|
||||||
_call_archive "$file" "$ARCHIVE_FOLDER"
|
}
|
||||||
# only link old file if one exists
|
|
||||||
else
|
add_to_queue() { # 1=url
|
||||||
echo "$alreadyexists" | while read -r file; do
|
if is_in_queue "$1"; then return; fi
|
||||||
echo "file $file exists, not downloading duplicate"
|
echo "$1" >>"$queue_file"
|
||||||
_call_archive "$file" "$DL_FOLDER"
|
echo "added $url to queue."
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_from_queue() { # 1=url
|
||||||
|
sed -i.bak -e "\|$1|d" "$queue_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_queue() {
|
||||||
|
rm "$queue_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_lock() {
|
||||||
|
if ! rmdir $lock_dir; then
|
||||||
|
echo "Failed to remove lock '$lock_dir'. Please remove manually before next run."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
is_only_instance() {
|
||||||
|
if mkdir $lock_dir 2>/dev/null; then
|
||||||
|
trap "remove_lock" EXIT
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
setup
|
||||||
|
if [ "$ONLY_DO" = "clear" ]; then
|
||||||
|
clear_queue
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
for url in $*; do
|
||||||
|
add_to_queue "$url"
|
||||||
done
|
done
|
||||||
fi
|
if is_only_instance; then
|
||||||
|
echo "Download starting..."
|
||||||
|
while read -r line; do
|
||||||
|
get_ytdl_fname "$line"
|
||||||
|
download "$line"
|
||||||
|
remove_from_queue "$line"
|
||||||
|
done <"$queue_file"
|
||||||
|
else
|
||||||
|
echo "Download already running, only adding to queue."
|
||||||
|
fi
|
||||||
|
echo "Download done..."
|
||||||
|
}
|
||||||
|
|
||||||
|
main "${urls[@]}"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
rename-window dot-git
|
rename-window dot-git
|
||||||
send-keys "cd ~/.dotfiles; while true; do fd -t f --hidden | entr -cd git -c color.ui=always diff; done" C-m
|
send-keys "cd ~/.dotfiles; while true; do [[ -z $(git status -s) ]] && { fd -t f --hidden | entr -cd tea issue ;} || { fd -t f --hidden | entr -cd git -c color.ui=always diff ;} ; done"
|
||||||
split-window -h "cd ~/.dotfiles; while true; do fd -t f --hidden --exclude .git/objects | entr -cd git -c color.ui=always status; done"
|
split-window -h "cd ~/.dotfiles; while true; do fd -t f --hidden --exclude .git/objects | entr -cd git -c color.ui=always status; done"
|
||||||
split-window -v
|
split-window -v
|
||||||
send-keys "cd ~/.dotfiles; clear" C-m L C-m
|
send-keys "cd ~/.dotfiles; clear" C-m L C-m
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
include colorscheme
|
||||||
|
|
||||||
set recolor "true"
|
set recolor "true"
|
||||||
set selection-clipboard "clipboard"
|
set selection-clipboard "clipboard"
|
||||||
|
|
||||||
|
@ -5,4 +7,3 @@ map r reload
|
||||||
map R rotate
|
map R rotate
|
||||||
map p print
|
map p print
|
||||||
|
|
||||||
include colorscheme
|
|
||||||
|
|
Loading…
Reference in a new issue