Init
This commit is contained in:
commit
8a258f44e0
|
@ -0,0 +1,59 @@
|
|||
===============================================================================
|
||||
WYRICS Git some lyrics
|
||||
===============================================================================
|
||||
|
||||
Fetch lyrics for a song from lyrics.wikia.com with this script.
|
||||
You can fetch them by search queries, or by their URL.
|
||||
|
||||
|
||||
|
||||
----------------------------------------
|
||||
PRE-REQUISITES
|
||||
----------------------------------------
|
||||
You'll need:
|
||||
* "gendl" in your $PATH
|
||||
* a POSIX-compatible shell (tested with `pdksh` and `bash`)
|
||||
* "curl", "wget", or "ftp" installed
|
||||
* "lynx" installed
|
||||
|
||||
|
||||
|
||||
----------------------------------------
|
||||
USAGE
|
||||
----------------------------------------
|
||||
Just run "wyrics" like so:
|
||||
|
||||
wyrics -s "query"
|
||||
wyrics -u page_url
|
||||
|
||||
If you use the "-u" option, the lyrics will just be printed to stdout.
|
||||
|
||||
If you decide to use "-s", though, search results'll be displayed to your
|
||||
screen (via stderr)-- each numbered from 1-10.
|
||||
Just type a number, hit enter, and the lyrics'll pop up.
|
||||
|
||||
$ wyrics -s "boston"
|
||||
1 Boston
|
||||
2 Sonny:We're Better Than Boston
|
||||
3 Boston Manor:FY1
|
||||
4 Boston Manor:Halo
|
||||
5 Boston Manor:Wolf
|
||||
6 Boston Manor:Stick Up
|
||||
7 Boston Manor:If I Can't Have It No One Can
|
||||
8 Boston Manor:Square One
|
||||
9 Boston Manor:Driftwood
|
||||
10 Boston Manor:Forget Me Not
|
||||
>>
|
||||
|
||||
|
||||
If you want to save lyrics to a file, you'll need to redirect the
|
||||
output-- "wyrics -s 'bob' > BOB.txt"
|
||||
|
||||
|
||||
|
||||
----------------------------------------
|
||||
BORING STUFF
|
||||
----------------------------------------
|
||||
License is CC-0 (though, "gendl" is GPLv3)
|
||||
Author is Jenga Phoenix <jadedctrl@teknik.io>
|
||||
Sauce is at https://git.eunichx.us/wyrics
|
|
@ -0,0 +1,155 @@
|
|||
#!/bin/sh
|
||||
##############################
|
||||
# name: gendl
|
||||
# lisc: gnu gplv3
|
||||
# desc: download to stdout or
|
||||
# file, independent of
|
||||
# a specific downloader.
|
||||
# ftp/wget/curl support.
|
||||
# main: jadedctrl
|
||||
##############################
|
||||
|
||||
# usage: gendl [-o output] url
|
||||
|
||||
|
||||
|
||||
#---------------------------------------
|
||||
# backend bits
|
||||
|
||||
# NIL --> STRING
|
||||
# return the download program you're using
|
||||
function download_program
|
||||
{
|
||||
programs="ftp curl wget"
|
||||
current=""
|
||||
|
||||
for program in $programs
|
||||
do
|
||||
if whereis $program > /dev/null
|
||||
then
|
||||
current=$program
|
||||
fi
|
||||
done
|
||||
|
||||
if uname -s | grep -e "LibertyBSD" -e "OpenBSD" > /dev/null
|
||||
then
|
||||
current="ftp"
|
||||
fi
|
||||
|
||||
echo "$current"
|
||||
}
|
||||
|
||||
# STRING PATH --> NIL
|
||||
# download URL $1 to stdout
|
||||
function download_stdout
|
||||
{
|
||||
program=$(download_program)
|
||||
url=$1
|
||||
|
||||
case "$program" in
|
||||
"ftp")
|
||||
output="$(ftp -VMo- $url)"
|
||||
;;
|
||||
"curl")
|
||||
output="$(curl $url)"
|
||||
;;
|
||||
"wget")
|
||||
output="$(wget --quiet -O $url)"
|
||||
;;
|
||||
esac
|
||||
|
||||
return_code=$?
|
||||
|
||||
echo "$output"
|
||||
return $return_code
|
||||
}
|
||||
|
||||
# STRING PATH --> NIL
|
||||
# download URL $1 to path $2
|
||||
function download_file
|
||||
{
|
||||
program=$(download_program)
|
||||
url=$1
|
||||
path=$2
|
||||
|
||||
case "$program" in
|
||||
"ftp")
|
||||
ftp -VMU "." -o $path $url
|
||||
;;
|
||||
"curl")
|
||||
curl -o $path $url
|
||||
;;
|
||||
"wget")
|
||||
wget --quiet -O $path $url
|
||||
;;
|
||||
esac
|
||||
|
||||
return_code=$?
|
||||
|
||||
if test $return_code -ne 0 2>/dev/null
|
||||
then
|
||||
rm $path 2> /dev/null
|
||||
# for consistency in behavior; wget saves 404s anyway, whereas
|
||||
# ftp doesn't save anything from 404s, etc.
|
||||
fi
|
||||
|
||||
return $return_code
|
||||
}
|
||||
|
||||
|
||||
|
||||
# --------------------------------------
|
||||
# front-end string-manip
|
||||
|
||||
# STRING --> STRING
|
||||
# return the last word in a string
|
||||
function last_word
|
||||
{
|
||||
string="$1"
|
||||
|
||||
echo "$string" \
|
||||
| rev \
|
||||
| sed 's% .*%%' \
|
||||
| rev
|
||||
}
|
||||
|
||||
function usage
|
||||
{
|
||||
echo "usage: gendl [-o output] URL"
|
||||
}
|
||||
|
||||
|
||||
|
||||
# --------------------------------------
|
||||
# invocation
|
||||
|
||||
args="$(getopt o: $*)"
|
||||
if test -z "$@" 2>/dev/null
|
||||
then
|
||||
usage
|
||||
exit 2
|
||||
fi
|
||||
|
||||
|
||||
set -- $args
|
||||
while test $# -ne 0
|
||||
do
|
||||
case "$1"
|
||||
in
|
||||
-o)
|
||||
download_path="$2"; shift; shift;;
|
||||
--)
|
||||
shift; break;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
url="$(last_word "$@")"
|
||||
|
||||
|
||||
if test -n "$download_path" 2> /dev/null
|
||||
then
|
||||
download_file $url $download_path
|
||||
else
|
||||
download_stdout "$url"
|
||||
fi
|
|
@ -0,0 +1,228 @@
|
|||
#!/bin/sh
|
||||
########################################
|
||||
# name: wyrics
|
||||
# desc: fetch lyrics by URL or query
|
||||
# from lyrics.wikia.com
|
||||
# main: Jenga Phoenix
|
||||
# <jadedctrl@teknik.io>
|
||||
# lisc: CC 0
|
||||
########################################
|
||||
|
||||
# --------------------------------------
|
||||
# generic
|
||||
|
||||
# NIL --> STRING
|
||||
# read from stdin until eof hit; return all input
|
||||
# good for writing functions that take piped info
|
||||
function reade {
|
||||
local stack=""
|
||||
|
||||
while read input; do
|
||||
stack="$(printf '%s\n%s' "$stack" "$input")"
|
||||
done
|
||||
|
||||
echo "$stack"
|
||||
}
|
||||
|
||||
# NUMBER STRING --> [BOOLEAN]
|
||||
# have the user choose a number, up to a given max, with prompt.
|
||||
function number_choose {
|
||||
local max=$1
|
||||
local prompt="$2"
|
||||
|
||||
printf "$prompt" >&2
|
||||
read response
|
||||
|
||||
if test $response -lt $max; then
|
||||
return $response
|
||||
else
|
||||
number_choose $max "$prompt"
|
||||
fi
|
||||
}
|
||||
|
||||
# NUMBER NUMBER --> NUMBER
|
||||
# add two numbers together. pretty obvious.
|
||||
function add {
|
||||
local operator=$1
|
||||
local operatee=$2
|
||||
|
||||
echo "$1 + $2" \
|
||||
| bc
|
||||
}
|
||||
|
||||
# NUMBER NUMBER --> NUMBER
|
||||
# subtract two numbers. pretty obvious.
|
||||
function subtract {
|
||||
local operator=$1
|
||||
local operatee=$2
|
||||
|
||||
echo "$1 - $2" \
|
||||
| bc
|
||||
}
|
||||
|
||||
|
||||
|
||||
# --------------------------------------
|
||||
# searching
|
||||
|
||||
# STRING --> STRING
|
||||
# return a result-list from a search query
|
||||
function search {
|
||||
local query="$1"
|
||||
local query="$(echo "$query" | sed 's/ /+/g')"
|
||||
|
||||
gendl "https://lyrics.wikia.com/wiki/Special:Search?query=${query}" \
|
||||
| sed '1,/Results/d' \
|
||||
| grep "result-link" \
|
||||
| search_parse
|
||||
}
|
||||
|
||||
# |STRING --> STRING
|
||||
# take slightly-trimmed search HTML and turn it into result-list
|
||||
function search_parse {
|
||||
local html="$(reade)"
|
||||
|
||||
local stack=""
|
||||
local i=0
|
||||
IFS='
|
||||
'
|
||||
for line in $html; do
|
||||
i=$(add $i 1)
|
||||
local url="$(echo "$line" \
|
||||
| sed 's/.*href=\"//' \
|
||||
| sed 's/\" class.*//')"
|
||||
local title="$(echo "$line" \
|
||||
| sed 's%.*\" >%%' \
|
||||
| sed 's%</a>.*%%')"
|
||||
|
||||
if echo "$title" | grep "http" > /dev/null; then
|
||||
i=$(subtract $i 1)
|
||||
else
|
||||
stack="$(printf '%s\n%s@%s@%s' \
|
||||
"$stack" "$i" "$url" "$title")"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "$stack" \
|
||||
| head -11
|
||||
}
|
||||
|
||||
|
||||
|
||||
# --------------------------------------
|
||||
# result manipulation
|
||||
|
||||
# |STRING --> STRING
|
||||
# return the title of a result
|
||||
function result_title {
|
||||
local result="$(reade)"
|
||||
|
||||
echo "$result" \
|
||||
| awk -F "@" '{ print $3 }' \
|
||||
| tr -d '\n'
|
||||
}
|
||||
|
||||
# |STRING --> STRING
|
||||
# return the ID of a result
|
||||
function result_index {
|
||||
local result="$(reade)"
|
||||
|
||||
echo "$result" \
|
||||
| awk -F "@" '{ print $1 }' \
|
||||
| tr -d '\n'
|
||||
}
|
||||
|
||||
# |STRING --> STRING
|
||||
# return the URL of a result
|
||||
function result_url {
|
||||
local result="$(reade)"
|
||||
|
||||
echo "$result" \
|
||||
| awk -F "@" '{ print $2 }' \
|
||||
| tr -d '\n'
|
||||
}
|
||||
|
||||
# |STRING [STRING] --> STRING
|
||||
# display all results in a result-list to stderr.
|
||||
# if second argument is 'long', then URLs are printed, too.
|
||||
function results_display {
|
||||
local results="$(reade)"
|
||||
local long="$1"
|
||||
|
||||
IFS='
|
||||
'
|
||||
for result in $results; do
|
||||
local index="$(echo "$result" | result_index)"
|
||||
local title="$(echo "$result" | result_title)"
|
||||
local url="$(echo "$result" | result_url)"
|
||||
|
||||
echo "$index $title" >&2
|
||||
if test "$long" = "long"; then
|
||||
echo "$url" >&2
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
# STRING --> STRING
|
||||
# have the user choose a single result from the result-list
|
||||
function result_choose {
|
||||
local results="$1"
|
||||
local max="$(echo "$results" | wc -l)"
|
||||
|
||||
number_choose $max ">> "
|
||||
local response=$?
|
||||
|
||||
echo "$results" \
|
||||
| grep "^$response@"
|
||||
}
|
||||
|
||||
|
||||
|
||||
# --------------------------------------
|
||||
|
||||
# STRING --> STRING
|
||||
# return the lyrics of a given URL
|
||||
function lyrics {
|
||||
local url="$1"
|
||||
|
||||
gendl "$url" \
|
||||
| grep "class=\'lyricbox" \
|
||||
| sed 's/.*lyricbox.>//' \
|
||||
| sed 's/;<div.*//' \
|
||||
| lynx -stdin -dump \
|
||||
| sed 's/^ //g'
|
||||
}
|
||||
|
||||
|
||||
|
||||
# --------------------------------------
|
||||
# invocation
|
||||
|
||||
# NIL --> STRING
|
||||
# print usage and abort
|
||||
function usage {
|
||||
echo "usage: wyrics -s query"
|
||||
echo " wyrics -u url"
|
||||
exit 2
|
||||
}
|
||||
|
||||
# --------------------------------------
|
||||
|
||||
case "$1" in
|
||||
"-u")
|
||||
lyrics "$2"
|
||||
;;
|
||||
"-s")
|
||||
results="$(search "$2")"
|
||||
|
||||
echo "$results" | results_display
|
||||
url="$(result_choose "$results" | result_url)"
|
||||
|
||||
lyrics "$url"
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
|
||||
esac
|
Ŝarĝante…
Reference in New Issue