132 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| # Copyright (C) 2020 Ortega Froysa, Nicolás <nicolas@ortegas.org> All rights reserved.
 | |
| # Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
 | |
| #
 | |
| # This software is provided 'as-is', without any express or implied
 | |
| # warranty. In no event will the authors be held liable for any damages
 | |
| # arising from the use of this software.
 | |
| #
 | |
| # Permission is granted to anyone to use this software for any purpose,
 | |
| # including commercial applications, and to alter it and redistribute it
 | |
| # freely, subject to the following restrictions:
 | |
| #
 | |
| # 1. The origin of this software must not be misrepresented; you must not
 | |
| #    claim that you wrote the original software. If you use this software
 | |
| #    in a product, an acknowledgment in the product documentation would be
 | |
| #    appreciated but is not required.
 | |
| #
 | |
| # 2. Altered source versions must be plainly marked as such, and must not be
 | |
| #    misrepresented as being the original software.
 | |
| #
 | |
| # 3. This notice may not be removed or altered from any source
 | |
| #    distribution.
 | |
| 
 | |
| link_file="$XDG_CONFIG_HOME/lofi-link"
 | |
| 
 | |
| print_help() {
 | |
| 	echo "USAGE: play-lofi [commands]
 | |
| A program to play a lofi stream from Invidious (a YouTube proxy). When
 | |
| given no options, it plays from the stream URL in '\$XDG_CONFIG_HOME/
 | |
| lofi-link'. If the file does not exist it will give you a selection of
 | |
| streams to choose from.
 | |
| 
 | |
| Commands:
 | |
| 	new         choose a new stream URL
 | |
| 	set <url>   set stream URL
 | |
| 	help        show this help information"
 | |
| }
 | |
| 
 | |
| new_link() {
 | |
| 	local results=$(curl -s "https://invidio.us/search?q=lofi+radio" |
 | |
| 		grep "<p>.*watch" | tr -d "\n" | tr -s " ")
 | |
| 	results=${results//\<p\>\<a href\=\"/\"https:\/\/invidio.us}
 | |
| 	results=${results//\"\>/\" \"}
 | |
| 	results=${results//\<\/a\>\<\/p\>/\" æ }
 | |
| 	results=${results::-2} # remove that last separator
 | |
| 
 | |
| 	# NOTE: I chose æ because never in a million years will that
 | |
| 	# character be in the title of a lofi video stream.
 | |
| 	IFS="æ" read -r -a streams <<< $results
 | |
| 
 | |
| 	echo "Streams:"
 | |
| 	local id=1
 | |
| 	for i in "${streams[@]}"
 | |
| 	do
 | |
| 		title=${i//*\" \"/\"}
 | |
| 		echo "$id) ${title:1:-2}"
 | |
| 		((id++))
 | |
| 	done
 | |
| 	opt=0
 | |
| 	while [ "$opt" -gt "${#streams[@]}" ] || [ "$opt" -lt "1" ]
 | |
| 	do
 | |
| 		printf "Selection: "
 | |
| 		read opt
 | |
| 	done
 | |
| 	link=${streams[$opt]}
 | |
| 	link=${link//\" \"*/}
 | |
| 	link=${link//*\"/}
 | |
| 	echo $link > $link_file
 | |
| }
 | |
| 
 | |
| # argument parsing
 | |
| if [ "$#" -eq "1" ]
 | |
| then
 | |
| 	case $1 in
 | |
| 		"help")
 | |
| 			print_help
 | |
| 			exit 0;;
 | |
| 		"new")
 | |
| 			new_link;;
 | |
| 		*)
 | |
| 			echo "Unknown command '$1'. Run 'play-lofi help' for a list of commands."
 | |
| 			exit 1;;
 | |
| 	esac
 | |
| elif [ "$#" -eq "2" ]
 | |
| then
 | |
| 	if [ "$1" = "set" ]
 | |
| 	then
 | |
| 		echo "$2" > $link_file
 | |
| 		exit 0
 | |
| 	else
 | |
| 		echo "Unknown command '$1 $2'. Run 'play-lofi help' for a list of commands."
 | |
| 		exit 1
 | |
| 	fi
 | |
| elif [ "$#" -gt "2" ]
 | |
| then
 | |
| 	echo "Too many arguments. Run 'play-lofi help' for a list of commands."
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # check for link file
 | |
| if ! [ -e "$link_file" ]
 | |
| then
 | |
| 	echo "No link file found in '$link_file'."
 | |
| 	while [ "$option" != "y" ] && [ "$option" != "n" ]
 | |
| 	do
 | |
| 		printf "Would you like to create one? [y/n] "
 | |
| 		read option
 | |
| 	done
 | |
| 	[ "$option" = "n" ] && exit 1
 | |
| 	new_link
 | |
| 	echo "New link file created."
 | |
| fi
 | |
| 
 | |
| link=$(cat $link_file)
 | |
| 
 | |
| # check if video is available
 | |
| output=$(curl -s $link | grep "This video is unavailable.")
 | |
| if [ -n "$output" ]
 | |
| then
 | |
| 	echo "The stream link '$link' is unavailable."
 | |
| 	while [ "$option" != "y" ] && [ "$option" != "n" ]
 | |
| 	do
 | |
| 		printf "Would you like to find a new one? [y/n] "
 | |
| 		read option
 | |
| 	done
 | |
| 	[ "$option" = "n" ] && exit 1
 | |
| 	new_link
 | |
| 	echo "New link saved."
 | |
| fi
 | |
| 
 | |
| mpv --no-video --msg-level=ffmpeg=no $link
 |