summaryrefslogtreecommitdiff
path: root/yt-player.sh
diff options
context:
space:
mode:
Diffstat (limited to 'yt-player.sh')
-rwxr-xr-xyt-player.sh183
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