tubetop2: Added a better, caching version of tubetop
Remember how I said I'd rewrite it in Python? I lied.
This commit is contained in:
parent
6f011428ee
commit
f99b15b938
128
tubetop2.bash
Executable file
128
tubetop2.bash
Executable file
@ -0,0 +1,128 @@
|
||||
#! /bin/bash
|
||||
#
|
||||
# tubetop2
|
||||
# Copyright (C) 2018 rehashedsalt <salt@lap-th-e560-0>
|
||||
#
|
||||
# Distributed under terms of the MIT license.
|
||||
#
|
||||
|
||||
# Define some functions
|
||||
function tubetop2-play {
|
||||
if [ -z ${1+x} ]; then return 1; fi
|
||||
pkill -x xwinwrap
|
||||
xwinwrap -ni -fs -b -nf -ov -- mpv -wid WID --title="$name" --loop-playlist=inf "$1"
|
||||
return 0
|
||||
}
|
||||
|
||||
function tubetop2-download {
|
||||
if [ -z ${1+x} ]; then return 1; fi
|
||||
videoname="$(youtube-dl -e $1)"
|
||||
videoname="${videoname//[^ a-zA-Z0-9:\[\]|()_-]/}"
|
||||
video="$cachedir/$videoname.mp4"
|
||||
youtube-dl -w "$1" -f 'bestvideo[ext=mp4]+bestaudio[ext=mp4]/best[ext=mp4]' -o "$video"
|
||||
errorcode=$?
|
||||
if ! [ -r "$video" ]; then
|
||||
notify-high "Download Failed" "Video $1 failed to download. youtube-dl gave error code $errorcode." "dialog-error"
|
||||
return 2
|
||||
fi
|
||||
if ! [ "$errorcode" == "0" ]; then
|
||||
notify-high "Error" "An error occured while downloading $1. youtube-dl gave error code $errorcode." "dialog-error"
|
||||
return $errorcode
|
||||
fi
|
||||
notify-high "Download Finished" "\"$videoname\" is now ready to be embedded." "dialog-information"
|
||||
return 0
|
||||
}
|
||||
|
||||
function notify-normal {
|
||||
if [ -z ${1+x} ] || [ -z ${2+x} ] || [ -z ${3+x} ]; then return 1; fi
|
||||
notify-send -u low -t 3000 -i "$3" -a "$name" "$1" "$2"
|
||||
}
|
||||
|
||||
function notify-high {
|
||||
if [ -z ${1+x} ] || [ -z ${2+x} ] || [ -z ${3+x} ]; then return 1; fi
|
||||
notify-send -u normal -t 10000 -i "$3" -a "$name" "$1" "$2"
|
||||
}
|
||||
|
||||
function log {
|
||||
if [ -z ${1+x} ] || [ -z ${2+x} ]; then return 1; fi
|
||||
printf "$name: $1: $2\n"
|
||||
}
|
||||
|
||||
name="$(basename $0 .bash)"
|
||||
|
||||
# Figure out where to store the videos
|
||||
if [ -z ${XDG_DATA_HOME+x} ]; then
|
||||
cachedir="$HOME/.local/share/$name"
|
||||
else
|
||||
cachedir="$XDG_DATA_HOME/$name"
|
||||
fi
|
||||
log 4 "Operating out of \"$cachedir\""
|
||||
|
||||
# Make that location if it doesn't exist
|
||||
if ! [ -d "$cachedir" ]; then
|
||||
mkdir -p "$cachedir"
|
||||
log 3 "Cache directory didn't exist, so it was made"
|
||||
fi
|
||||
|
||||
# Add a symlink in the user's Videos folder, but only once
|
||||
if ! [ -f "$cachedir/.symlink" ] && [ -d "$HOME/Videos" ]; then
|
||||
log 3 "Added symbolic link to videos in user's Videos folder"
|
||||
ln -s "$cachedir" "$HOME/Videos/Tubetop Videos"
|
||||
touch "$cachedir/.symlink"
|
||||
fi
|
||||
|
||||
# If we were called with --kill, kill all running tubetops
|
||||
if [ "$1" == "--kill" ]; then
|
||||
log 3 "Launched in kill mode. Killing xwinwrap"
|
||||
if pkill xwinwrap; then
|
||||
notify-high "Stopped" "Stopped playing all embedded desktop videos" "user-trash"
|
||||
exit 0
|
||||
else
|
||||
log 0 "Could not find any instances of xwinwrap"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Get a list of all the videos we have
|
||||
log 3 "Getting a list of videos"
|
||||
videos=$(find "$cachedir" -type f -name \*.mp4)
|
||||
# Build a sanitized list to present to the user
|
||||
if ! [ "$videos" == "" ]; then
|
||||
log 4 "Videos:\n$videos"
|
||||
videos_clean=""
|
||||
while read video; do
|
||||
if ! [ "$videos_clean" == "" ]; then
|
||||
videos_clean="$videos_clean"$'\n'
|
||||
fi
|
||||
video_name="$(basename "$video" .mp4)"
|
||||
log 5 "Renaming \"$video\" to \"$video_name\""
|
||||
videos_clean="$videos_clean$video_name"
|
||||
done <<< "$videos"
|
||||
log 4 "Videos, cleaned:\n$videos_clean"
|
||||
fi
|
||||
|
||||
# Make a decision
|
||||
log 3 "Prompting the user..."
|
||||
choice="$(rofi -dmenu -p $name <<< "$videos_clean")"
|
||||
|
||||
# Validate the input
|
||||
if [ "$choice" == "" ]; then
|
||||
log 0 "User responded with empty string. Terminating."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log 3 "User responded with $choice"
|
||||
|
||||
# If the decision is remote, download it. Otherwise, play it
|
||||
if ! [ -r "$cachedir/$choice.mp4" ]; then
|
||||
log 3 "Decided to download $choice"
|
||||
notify-normal "Downloading Video" "Video \"$choice\" is being downloaded. It will be available shortly." "drive-harddisk"
|
||||
tubetop2-download "$choice"
|
||||
else
|
||||
log 3 "Decided to play \"$choice\" from local files"
|
||||
notify-normal "Playing Video" "Embedding \"$choice\" into the desktop." "computer"
|
||||
tubetop2-play "$cachedir/$choice.mp4"
|
||||
fi
|
||||
log 0 "Quitting"
|
||||
exit 0
|
||||
|
Loading…
Reference in New Issue
Block a user