Compare commits

..

No commits in common. "3e00e84319b03180c145e2372de779d5797e2f56" and "27cbf30da0c8169de84e13678a2d450e57a4ace5" have entirely different histories.

3 changed files with 43 additions and 129 deletions

View file

@ -2,6 +2,13 @@
# download a file if it does not exist in the archive alread
# 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() {
printf """
archive.sh: Hard linking your stuff.
@ -15,24 +22,19 @@ Point it to a link you want downloaded.
Options:
-h Display this help.
-h Display this help.
-d Directory to check for existence of file and archive to if needed.
If this is passed will not download existing archived files again.
-d Directory to check for existence of file and archive to if needed.
-f Directory to download to.
-c Clear existing download queue.
-f Directory to download to.
-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
youtube-dl program.
program.
"""
}
urls=("$@")
while getopts "t:f:d:hc" opt; do
while getopts "t:f:d:h" opt; do
case "$opt" in
# v) verbose=1
# ;;
@ -45,9 +47,6 @@ while getopts "t:f:d:hc" opt; do
d)
ARCHIVE_FOLDER="$OPTARG"
;;
c)
ONLY_DO=clear
;;
h | \? | *)
show_help
exit 0
@ -56,15 +55,7 @@ while getopts "t:f:d:hc" opt; do
done
shift $((OPTIND - 1))
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
_call_archive() {
command -v archive >/dev/null 2>&1 || {
echo "archive command not found."
exit 1
@ -73,119 +64,43 @@ _call_archive() { # 1=new_file, 2=archive_location
}
vid_ext="\(mp4\|avi\|webm\|mkv\|mpe?g\|3gp\|m4a\)"
_findfile() { # 1=directory, 2=file
find "$1" -type f -name "$2.*" | sed -ne "/$2\.$vid_ext$/Ip"
_findfile() {
dir="$1"
fname="$2"
find "$dir" -type f -name "$fname.*" | sed -ne "/$fname\.$vid_ext$/Ip"
}
_alreadyexists() { # 1=video_regex
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_TITLE="%(channel)s_%(title)s_%(id)s"
_download() {
"$YT_DL_CMD" \
-o "$DL_FOLDER/$YT_DL_TITLE.%(ext)s" \
"${YT_DL_OPTS[@]}" \
"$*"
"$url"
}
download() { # 1=url
# # download the video to download folder
if ! _alreadyexists "$yt_dl_fname"; then
_download_cmd "$*"
url="$*"
dl_fn=$("$YT_DL_CMD" --get-filename -o "$YT_DL_TITLE" "$url")
video_file_regex="${dl_fn}"
# yt-dl never knows the exact filename in advance
file=$(_findfile "$DL_FOLDER" "$yt_dl_fname")
if [ -z "$file" ]; then exit 1; 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
}
if [ -z "$dl_fn" ]; then
echo Could not get video filename, error with youtube-dl.
exit 1
fi
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
alreadyexists=$(_findfile "$ARCHIVE_FOLDER" "$video_file_regex")
queue_file="${XDG_CACHE_HOME:-$HOME/.cache}/vidl_queue"
if [ ! -f "$queue_file" ]; then
mkdir -p $(dirname "$queue_file")
touch "$queue_file"
fi
lock_dir="${XDG_CACHE_HOME:-$HOME/.cache}/vidl_lock"
}
# # download the video to download folder
if [ "$alreadyexists" = "" ] || [ -z "$alreadyexists" ]; then
_download
is_in_queue() { # 1=url
[ -f "$queue_file" ] || return 1
grep -q "$1" "$queue_file"
}
add_to_queue() { # 1=url
if is_in_queue "$1"; then return; fi
echo "$1" >>"$queue_file"
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"
# yt-dl never knows the exact filename in advance
file=$(_findfile "$DL_FOLDER" "$video_file_regex")
if [ -z "$file" ]; then exit 1; fi
_call_archive "$file" "$ARCHIVE_FOLDER"
# only link old file if one exists
else
echo "$alreadyexists" | while read -r file; do
echo "file $file exists, not downloading duplicate"
_call_archive "$file" "$DL_FOLDER"
done
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[@]}"
fi

View file

@ -1,5 +1,5 @@
rename-window dot-git
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"
send-keys "cd ~/.dotfiles; while true; do fd -t f --hidden | entr -cd git -c color.ui=always diff; done" C-m
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
send-keys "cd ~/.dotfiles; clear" C-m L C-m

View file

@ -1,5 +1,3 @@
include colorscheme
set recolor "true"
set selection-clipboard "clipboard"
@ -7,3 +5,4 @@ map r reload
map R rotate
map p print
include colorscheme