From ec497b911e40def43ad82a6e6f355a0f914f5bec Mon Sep 17 00:00:00 2001 From: kevadesu <kevadesu@costmiku.net> Date: Sat, 10 Jun 2023 21:19:12 +0200 Subject: [PATCH] lel --- roll.sh | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100755 roll.sh diff --git a/roll.sh b/roll.sh new file mode 100755 index 0000000..ba506f0 --- /dev/null +++ b/roll.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# Rick Astley in your Terminal. +# By Serene and Justine Tunney <3 +version='1.2' +rick='https://keroserene.net/lol' +video="$rick/astley80.full.bz2" +# TODO: I'll let someone with mac or windows machine send a pull request +# to get gsm going again :) +audio_gsm="$rick/roll.gsm" +audio_raw="$rick/roll.s16" +audpid=0 +NEVER_GONNA='curl -s -L http://bit.ly/10hA8iC | bash' +MAKE_YOU_CRY="$HOME/.bashrc" +red='\x1b[38;5;9m' +yell='\x1b[38;5;216m' +green='\x1b[38;5;10m' +purp='\x1b[38;5;171m' +echo -en '\x1b[s' # Save cursor. + +has?() { hash $1 2>/dev/null; } +cleanup() { (( audpid > 1 )) && kill $audpid 2>/dev/null; } +quit() { echo -e "\x1b[2J \x1b[0H ${purp}<3 \x1b[?25h \x1b[u \x1b[m"; } + +usage () { + echo -en "${green}Rick Astley performs ♪ Never Gonna Give You Up ♪ on STDOUT." + echo -e " ${purp}[v$version]" + echo -e "${yell}Usage: ./astley.sh [OPTIONS...]" + echo -e "${purp}OPTIONS : ${yell}" + echo -e " help - Show this message." + echo -e " inject - Append to ${purp}${USER}${yell}'s bashrc. (Recommended :D)" +} +for arg in "$@"; do + if [[ "$arg" == "help"* || "$arg" == "-h"* || "$arg" == "--h"* ]]; then + usage && exit + elif [[ "$arg" == "inject" ]]; then + echo -en "${red}[Inject] " + echo $NEVER_GONNA >> $MAKE_YOU_CRY + echo -e "${green}Appended to $MAKE_YOU_CRY. <3" + echo -en "${yell}If you've astley overdosed, " + echo -e "delete the line ${purp}\"$NEVER_GONNA\"${yell}." + exit + else + echo -e "${red}Unrecognized option: \"$arg\"" + usage && exit + fi +done +trap "cleanup" INT +trap "quit" EXIT + +# Bean streamin' - agnostic to curl or wget availability. +obtainium() { + if has? curl; then curl -s $1 + elif has? wget; then wget -q -O - $1 + else echo "Cannot has internets. :(" && exit + fi +} +echo -en "\x1b[?25l \x1b[2J \x1b[H" # Hide cursor, clear screen. + +#echo -e "${yell}Fetching audio..." +if has? afplay; then + # On Mac OS, if |afplay| available, pre-fetch compressed audio. + [ -f /tmp/roll.s16 ] || obtainium $audio_raw >/tmp/roll.s16 + afplay /tmp/roll.s16 & +elif has? aplay; then + # On Linux, if |aplay| available, stream raw sound. + obtainium $audio_raw | aplay -Dplug:default -q -f S16_LE -r 8000 & +elif has? play; then + # On Cygwin, if |play| is available (via sox), pre-fetch compressed audio. + obtainium $audio_gsm >/tmp/roll.gsm.wav + play -q /tmp/roll.gsm.wav & +fi +audpid=$! + +#echo -e "${yell}Fetching video..." +# Sync FPS to reality as best as possible. Mac's freebsd version of date cannot +# has nanoseconds so inject python. :/ +python <(cat <<EOF +import sys +import time +fps = 25; time_per_frame = 1.0 / fps +buf = ''; frame = 0; next_frame = 0 +begin = time.time() +try: + for i, line in enumerate(sys.stdin): + if i % 32 == 0: + frame += 1 + sys.stdout.write(buf); buf = '' + elapsed = time.time() - begin + repose = (frame * time_per_frame) - elapsed + if repose > 0.0: + time.sleep(repose) + next_frame = elapsed / time_per_frame + if frame >= next_frame: + buf += line +except KeyboardInterrupt: + pass +EOF +) < <(obtainium $video | bunzip2 -q 2> /dev/null)