summaryrefslogtreecommitdiff
path: root/yt.sh
blob: d422a66420f30ef3abb292914400afb9640064b7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/sh
## Do things with a YouTube URL.
## Config:
TERMINAL=alacritty
DOWNLOAD_DIR=~/videos/youtube
PAGER="rofi -location 2 -width 41 -e"
YOUTUBE_REGEX=".*((https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+)$"


## 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
}


## Get action for multiple URLs
get_action_multi() {
	# TODO: implement
}


## Check if url is a youtube url
check_if_youtube() {
	url="$1"
	echo $url | grep -qE "$YOUTUBE_REGEX" && 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() {
	if url=$(xclip -o -selection clipboard 2>/dev/null || echo) && check_if_youtube $url; then
	elif url=$(xclip -o 2>/dev/null || echo) && check_if_youtube $url; then
	elif url=$(grab_url_stdin) && check_if_youtube $url; then
	elif url=$(prompt_url) && check_if_youtube $url; then
	else
		exit $NO_YOUTUBE_URL
	fi

	echo $url
}


## Extract URL from stdin
grab_url_stdin() {
	sed -nE "s/$YOUTUBE_REGEX/\1/p"
}


## 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)
	printf "(%s) %s\n\n%s" "$duration" "$title" "$description"
}


## 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 --geometry=25%-10-40 --title="Streaming from YouTube" $url &
}


## Play audio
play_audio() {
	url="$1"
	notify-send "Playing audio..." "$(get_info $url)" &
	$TERMINAL -t "Streaming from YouTube" -e mpv --no-video $url &
}


## 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
		;;
	2)
		play_audio $url
		;;
	3)
		download_video $url
		;;
	4)
		download_audio $url
		;;
	*)
		exit $NO_ACTION
esac