diff options
Diffstat (limited to 'yt-player.sh')
-rwxr-xr-x | yt-player.sh | 183 |
1 files changed, 134 insertions, 49 deletions
diff --git a/yt-player.sh b/yt-player.sh index a5f21b8..b0f4f51 100755 --- a/yt-player.sh +++ b/yt-player.sh @@ -1,69 +1,154 @@ #!/bin/sh - ## Do things with a YouTube URL. +## Config: +TERMINAL=alacritty +DOWNLOAD_DIR=~/videos/youtube +PAGER="rofi -location 2 -width 41 -e" + + +## Exit codes +NO_YOUTUBE_URL=3 +NO_ACTION=4 + + +## Get action for a single URL +get_action_single() { + action=$(dmenu -p "yt-player" << EOF +1. watch in player +2. listen in player +3. download video +4. download audio +5. print info +EOF + ) + echo "$action" | cut -d'.' -f1 +} + -## Config -terminal=alacritty +## Get action for multiple URLs +get_action_multi() { + # TODO: implement +} -## Notify the title and description of the URL -notify_info() { +## Check if url is a youtube url +check_if_youtube() { url="$1" - info=$(youtube-dl --get-title --get-description --get-duration "$url") + [ -z $url ] && return 1; + + count=$(echo "$1" | \ + grep -c -E "^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$" + ) + + [ "$count" -eq 1 ] && return 0; + return 1; +} + + +## Prompts user for URL +prompt_url() { + dmenu -p "YouTube URL" +} + + +## Grab url from clipboard/primary selection, else get via prompt +grab_url() { + local url + + if url=$(xclip -o -selection clipboard) && check_if_youtube $url; then + elif url=$(xclip -o) && check_if_youtube $url; then + elif url=$(prompt_url) && check_if_youtube $url; then + else + exit $NO_YOUTUBE_URL + fi + + echo $url +} + + +## Get title, description, and duration of URL +get_info() { + url="$1" + info=$(youtube-dl --get-title --get-description --get-duration $url) title=$(echo "$info" | head -n 1) description=$(echo "$info" | sed '1d;$d') duration=$(echo "$info" | tail -n 1) - notify-send "$title : $duration" "$description" + printf "(%s) %s\n\n%s" "$duration" "$title" "$description" } -## Main -notify_info "$1" && exit -option="$1" -case $option in - '-c') - url="$(xclip -o -selection clipboard)" - [ -z "$url" ] && exit $NO_URL_IN_CLIPBOARD - ;; - '-p') - url="$(xclip -o)" - [ -z "$url" ] && exit $NO_URL_IN_PRIMARY - ;; - '-u') - url="$2" - [ -z "$url" ] && exit $NO_URL_IN_SECOND_ARG - ;; - '-a') - $terminal -e mpv --no-video "$url" - ;; - '-da') - youtube-dl -x --audio-format flac --audio-quality 0 "$url" - ;; - '-v') - mpv --no-terminal "$url" - ;; - '-dv') - youtube-dl --add-metadata "$url" - ;; - *) - exit - ;; -esac +## Download video +download_video() { + url="$1" + info=$(get_info $url) + notify-send "Downloading video..." "$info" & + youtube-dl \ + -q \ + --add-metadata \ + -o "$DOWNLOAD_DIR/%(title)s_%(id)s.%(ext)s" \ + $url && notify-send "Video download done." "$info" & +} + + +## Download audio +download_audio() { + url="$1" + info=$(get_info $url) + notify-send "Downloading audio..." "$info" + youtube-dl \ + -q \ + --add-metadata \ + -o "$DOWNLOAD_DIR/%(title)s_%(id)s.%(ext)s" \ + -x \ + --audio-format flac \ + --audio-quality 0 \ + $url && notify-send "Audio download done." "$info" & +} + + +## Play video +play_video() { + url="$1" + notify-send "Playing video..." "$(get_info $url)" & + mpv --no-terminal $url & +} + + +## Play audio +play_audio() { + url="$1" + notify-send "Playing audio..." "$(get_info $url)" & + $TERMINAL -e mpv --no-video $url & +} -case $choice in - "Watch") - mpv "$url" --no-terminal & +## Print info with specified pager +print_info() { + url="$1" + info=$(get_info $url) + $PAGER "$info" +} + + +## Main +mkdir -p "$DOWNLOAD_DIR" +url=$(grab_url) +case "$(get_action_single)" in + 5) + print_info $url + ;; + 1) + play_video $url ;; - "Listen") - mpv "$url" --no-terminal --no-video & + 2) + play_audio $url ;; - "Download Video") - youtube-dl "$url" --add-metadata + 3) + download_video $url ;; - "Download Audio") - youtube-dl "$url" -x --audio-format flac --audio-quality 0 + 4) + download_audio $url ;; *) - exit + exit $NO_ACTION esac |