Created
November 21, 2021 19:17
-
-
Save bil0u/887c0d4d358da65a88542d5b136b1739 to your computer and use it in GitHub Desktop.
[Rickroll] Troll program to start a rickroll in your terminal #troll
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Rick Astley in your Terminal. | |
# By Serene Han and Justine Tunney <3 | |
version='1.1' | |
rick='http://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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment