#!/bin/sh

##
## Här är ett par inställningar. Dem får du ändra.
##

# Körbart namn på mediaspelare. (Körs över av SVTPLAY_PLAYER.)

PLAYER=mplayer


# Parametrar till mediaspelaren
#
# Om du till exempel angivit mplayer som spelare, vill ha 100M
# cache för spelaren samt alltid fullskärm, så använder du detta:
#
#player_args="-fs -cache 100000"
#
# Eller så här, om du inte använder mplayer eller saknar preferenser.
#
#player_args=""
#
# (Variabeln körs över av SVTPLAY_PLAYER_ARGS.)

player_args=""


# Parameter för att tysta mediaspelaren
#
# Om du inte angivit mplayer ovan, berätta hur man får din mediaspelare
# att inte skriva något till terminalen. Detta behövs endast om du vill
# använda [-Q]. (Körs över av SVTPLAY_PLAYER_QUIET_ARG.)

player_quiet_arg="-really-quiet"


# Förinställd maximal bitrate
#
# Sätt högt för alltid högsta kvalitet. Sätt till 0 för lägsta.
# (Körs över av SVTPLAY_BITRATE.)

default_bitrate=99999



##
## Det här är däremot inte inställningar! Ändra inte mera nu.
##

rev=2011-04-25c

## Some defaults
get_bitrates=false
live=""
make_url=true
download=false
outfile=""
quit_after_url=false
quiet=false
call_quiet=false
scriptable=false
streamer_args=""
player_args=""
check_for_update=false

## Basic output functions.
stdout () {
	if [ X$quiet = Xfalse -o X$quiet = Xtrue -a X$scriptable = Xtrue ]; then
		echo "$*"
	fi
}
stderr () {
	if [ X$quiet = Xfalse ]; then
		echo "$*" 1>&2
	fi
}

usage () {
cat << EOF
SVTPlay.sh rev $rev
Användning: SVTPlay.sh [-cdhlqQrsux] [-b <bitrate>] [-o out.mp4] <url> <...>
EOF
}

usage_long () {
	usage
cat << EOF
    -b  Maximal bitrate att spela upp eller ladda hem.
        Default är '$default_bitrate', lägsta tillgängliga fås med '0'.
    -c  Skriptbar output (för -s och -x).
    -d  Spara till fil (istället för att spela upp direkt).
    -h  Visa lång hjälptext. (Den du läser nu.)
    -l  Använd om det är en live-ström.
    -o  Filnamn att spara till. Default är som på sajten. Implicerar -d.
    -q  Skriptet pratar inte. (Dock tystas ej anropade program.)
    -Q  Som -q, men även anropade program tystas.
    -r  Använd om <url> är strömmen, inte dess sida.
    -s  Visa tillgängliga bitrates för strömmen.
    -u  Kolla efter ny version av SVTPlay.sh.
    -x  Torrkörning. Spelar eller tankar aldrig.

Några exempel följer.


UPPSPELNING

  Detta spelar upp del 3 av Klass 9A:

    \$ SVTPlay.sh http://svtplay.se/v/2325375/klass_9a/del_3_av_8


NEDLADDNING

  Detta sparar den roliga intervjun med Tobias Billström, till
  filen "billström.flv":

    \$ SVTPlay.sh -o billström.flv http://svtplay.se/v/2302467/


LIVE-SÄNDNINGAR

  Så här gör du för att se Aktuellts live-sändning:

    \$ SVTPlay.sh -l http://svtplay.se/t/102534/aktuellt

  Om Aktuellt inte sänder live för tillfället, så ta bort "-l":

    \$ SVTPlay.sh http://svtplay.se/t/102534/aktuellt

  Eftersom senaste sändningen av Aktuellt alltid ligger på den
  sidan så fungerar raden dessutom alltid.


BITRATES

  Så här kollar du vilka bitrates Aktuellt finns i:

    \$ SVTPlay.sh -s http://svtplay.se/t/102534/aktuellt
    Checking stream type...
    Found RTMP stream.
    Getting available bitrates...
      Page:       http://svtplay.se/t/102534/aktuellt
      Bitrates:   320 850

  Nu kör vi den lägre:

    \$ SVTPlay.sh -b 320 http://svtplay.se/t/102534/aktuellt

  Ett sätt att alltid få den lägsta kvaliteten är så här:

    \$ SVTPlay.sh -b 0 http://svtplay.se/t/102534/aktuellt


KÖRA RTMP-ADRESSER DIREKT

  Så här kan du lista ut rtmp-adressen till ett program:

    \$ SVTPlay.sh -x http://svtplay.se/t/102534/aktuellt
    Checking stream type....
    Found RTMP stream..
    Getting available bitrates....
    Using bitrate: 850.
    Stream: rtmp://fl11.c91005.cdn.qbrick.com/91005/_definst_/kl...

  Med "-r" kan man spela eller ladda ned en dylik rtmp- eller
  http-ström utan omsvep:

    \$ SVTPlay.sh -ro aktuellt.mp4 rtmp://fl11.c91005.cdn.qbrick...


ANVÄNDA SVTPlay.sh I SKRIPT

  För både "-s" och "-x" gäller att parametern "-c" bara
  matar ut det riktigt väsentliga.

    \$ SVTPlay.sh -cs http://svtplay.se/t/102534/aktuellt
    320 850
    \$ SVTPlay.sh -cx http://svtplay.se/t/102534/aktuellt
    rtmp://fl11.c91005.cdn.qbrick.com/91005/_definst_/kluster/20...


UPPDATERINGAR

  Om en ny version av SVTPlay.sh finns tillgänglig, så kan du
  till sist hämta den med någon av följande rader, beroende
  på om du har wget eller cURL installerat:

    \$ curl -o ny-SVTPLAY.sh \$(SVTPlay.sh -u)

    \$ wget -O ny-SVTPLAY.sh \$(SVTPlay.sh -u)


KONFIGURATION

  I stället för att konfigurera skriptet genom att ändra det, så
  kan du uppnå samma resultat med följande miljövariabler:

    SVTPLAY_PLAYER             Mediaspelare
                               Default: '$PLAYER'

    SVTPLAY_PLAYER_ARGS        Parametrar för mediaspelaren
                               Default: '$player_args'

    SVTPLAY_PLAYER_QUIET_ARG   Parameter för att tysta mediaspelaren
                               Default: '$player_quiet_arg'

    SVTPLAY_BITRATE            Förinställd maximal bitrate att använda
                               Default: '$default_bitrate'

    SVTPLAY_WIDESCREEN         "Lyfter" bilden på bredbildsskärmar
                               Fungerar endast med mplayer.
                               Default: 'false'

EOF

	exit 2
}

# Pick up environment vars
if [ X$SVTPLAY_WIDESCREEN = Xtrue ]; then
	wide="-vf expand=::0:0:1:8/5:"
else
	wide=""
fi
if [ X$SVTPLAY_PLAYER != X ]; then
	PLAYER=$SVTPLAY_PLAYER
fi
if [ X$SVTPLAY_PLAYER_ARGS != X ]; then
	player_args=$SVTPLAY_PLAYER_ARGS
fi
if [ X$SVTPLAY_PLAYER_QUIET_ARG != X ]; then
	player_quiet_arg=$SVTPLAY_PLAYER_QUIET_ARG
fi
if [ X$SVTPLAY_BITRATE != X ]; then
	default_bitrate=$SVTPLAY_BITRATE
fi

args=$(getopt b:cdhlo:qQrsux $*)

if [ $? -ne 0 ]; then
	usage
fi

set -- $args
while [ $# -ge 0 ]; do
	case "$1" in
		-b)
			default_bitrate="$2"; shift; shift;;
		-c)
			scriptable=true
			quiet=true
			call_quiet=true; shift;;
		-d)
			download=true; shift;;
		-h)
			usage_long; shift;;
			# NOT REACHED
		-l)
			live="--live"; shift;;
		-o)
			outfile="$2"
			download=true; shift; shift;;
		-q)
			quiet=true; shift;;
		-Q)
			quiet=true
			call_quiet=true; shift;;
		-r)
			make_url=false; shift;;
		-s)
			show_bitrates=true; shift;;
		-u)
			check_for_update=true; shift;;
		-x)
			quit_after_url=true; shift;;
		--)
			shift; break;;
	esac
done

## Need curl or wget
if [ X$(which curl) != X ]; then
	GET="$(which curl) -s"
	GETO="$(which curl) -o"
elif [ X$(which wget) != X ]; then
	GET="$(which wget) -q -O-"
	GETO="$(which wget) -O"
	echo WGET!
else
	stderr "Error: Found neither wget nor cURL in PATH."
	exit 1
fi

if [ X$check_for_update = Xtrue ]; then
	url="http://huggpunkt.org/files/download/SVTPlay.txt"
	current_rev=$($GET $url|grep "^rev="|sed "s/rev=//")
	if [ X"$current_rev" = X"$rev" ]; then
		stderr "You are up to date. ($rev)"
		exit 0
	else
		stderr "An update is available! ($rev -> $current_rev)"
		stdout "$url"
		exit 3
	fi
fi

## Need rtmpdump or flvstreamer
if [ X$(which rtmpdump) != X ]; then
	STREAMER="$(which rtmpdump)"
	streamer_quiet_arg="-q"
	dumpver=$(rtmpdump -h  2>&1 > /dev/null|grep RTMPDump|sed 's/RTMPDump v//')
	if [ X$dumpver != X2.3 ]; then
		stderr "Warning: RTMPDump v$dumpver is not supported by this script!"
		stderr "         Please consider installing RTMPDump v2.3."
	fi
elif [ X$(which flvstreamer) != X ]; then
	STREAMER="$(which flvstreamer)"
	streamer_quiet_arg="-q"
	stderr "Warning: FLVstreamer has only incomplete support for SVTPlay."
else
	stderr "Error: Found neither RTMPDump nor FLVstreamer in PATH."
	exit 1
fi

## Need sed
if [ X$(which sed) == X ]; then
	stderr "I need sed in PATH."
fi

for stream; do
	stderr "Checking stream type..."

	if [ X$make_url = Xtrue ]; then
		http=$($GET "$stream"|grep pathflv|\
			sed "s/.*pathflv=\(http:.*\.flv\).*/\1/"|uniq)
		rtmp=$($GET "$stream"|grep dynamicStreams|\
			sed 's/.*dynamicStreams=url:\(rtmpe\{0,1\}:[^&]*\).*/\1/'|uniq)

		if [ "X$rtmp" = X ]; then
			stream="$http"
			http=true
			stderr "Found HTTP stream."
		else
			streams="$rtmp"
			http=false
			stderr "Found RTMP stream."
		fi
	else
		if [ $(echo "X$stream"|grep rtmp) != X ]; then
			http=false
			stderr "Found RTMP stream."
		else
			http=true
			stderr "Found HTTP stream."
		fi
	fi


	##
	##  RTMP
	##

	if [ X$http = Xfalse -a X$make_url = Xtrue ]; then
		stderr "Getting available bitrates..."
		counter=1
		bitrates=""
		while true; do
			isstream=$(echo "$streams"|cut -d'|' -f$counter|cut -d, -f1)
			if [ X$isstream = X ]; then
				break;
			fi
			bitrate=$(echo "$streams"|cut -d'|' -f$counter|\
				cut -d, -f2|cut -d: -f2)
			bitrates=$bitrate" "$bitrates
			counter=$(($counter+1))
		done

		# Sometimes SWF verification is needed...
		swfPlayer=$($GET $stream|grep '<param name="movie"'|sed 's/.*value="\([^"]*\).*/\1/')
		if [ X$swfPlayer != X ]; then
			swfPlayer="http://svtplay.se$swfPlayer"
			swfVfy="--swfVfy $swfPlayer"
			streamer_args=$streamer_args" $swfVfy"
		else
			swfPlayer=""
			swfVfy=""
		fi

		if [ X$show_bitrates = Xtrue ]; then
			stderr "  Page:       $stream"
			stderr "  Player:     $swfPlayer"
			stderr "  Bitrates:   $bitrates"
			if [ X$scriptable = Xtrue ]; then
				stdout "$bitrates"
			fi
			continue
		fi

		# Pick bitrate. Default is considered maximum. If too low,
		# lowest available bitrate is used.
		use_bitrate=0
		low_bitrate=99999
		for bitrate in $bitrates; do
			if [ $low_bitrate -gt $bitrate ]; then
				low_bitrate=$bitrate
			fi
			if [ $bitrate -le $default_bitrate \
					-a $use_bitrate -le $default_bitrate ]; then
				use_bitrate=$bitrate
			fi
		done

		if [ $use_bitrate -eq 0 ]; then
			use_bitrate=$low_bitrate
		fi

		stream=$(echo "$streams"|\
			sed "s/.*\(rtmpe\{0,1\}:[^,]*\),bitrate:$use_bitrate.*/\1/")

		if [ $use_bitrate -eq 0 -o X"$stream" = X ]; then
			stderr "Bitrate selection error!"
			exit 1
		fi

		stderr "Using bitrate: $use_bitrate"
	else
		if [ X$show_bitrates = Xtrue ]; then
			stderr "Bitrates not supported HTTP streams."
		fi
	fi

	if [ X$show_bitrates = Xtrue ]; then
		exit 0
	fi

	stderr "Stream: $stream"
	if [ X$scriptable = Xtrue ]; then
		stdout "$stream"
	fi
	if [ X$quit_after_url = Xtrue ]; then
		exit
	fi

	if [ X$call_quiet = Xtrue ]; then
		streamer_args=$streamer_args" $streamer_quiet_arg"
		player_args=$player_args" $player_quiet_arg"
	fi

	if [ X$download = Xfalse ]; then
		if [ X$http = Xfalse ]; then
			rm $HOME/.teve-fifo
			mkfifo $HOME/.teve-fifo
			$STREAMER $streamer_args $live -o $HOME/.teve-fifo -r "$stream"&
			streamer_pid=$!
			$PLAYER $player_args $wide $cache -- $HOME/.teve-fifo
			kill -9 $streamer_pid	# rtmpdump gillar att hänga kvar
		else
			$PLAYER $player_args $wide $cache -- "$stream"
		fi
	else
		if [ X$outfile = X ]; then
			outfile=$(basename "$stream")
		fi
		if [ X$http = Xfalse ]; then
			$STREAMER $streamer_args $live -o "$outfile" -r "$stream"
			if [ X$live = X ]; then
				$STREAMER $streamer_args -o "$outfile" -r "$stream" --resume
			fi
		else
			$GETO "$outfile" "$stream"
		fi
	fi
done

exit

# Copyright (c) 2011 Jesper Räftegård <jesper alfakrull huggpunkt.org>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# CHANGELOG
# 2011-04-25c  Vissa program kräver swfVfy, så nu stöds detta.
# 2011-04-25b  RTMPDump v2.3 eller högre tycks krävas.
# 2011-04-25   CL-parametrar ska ha prioritet före ENV-vars.
# 2011-03-10   Konfiguration via miljövariabler. Snabbare hjälp.
# 2011-03-09b  Utökad och flyttad hjälptext.
# 2011-03-09   Skriptet kan kolla efter uppdateringar av sig självt.
# 2011-03-08   Behöver inte extended regexps i sed längre + buggfix.
# 2011-03-07c  Diverse buggfixar.
# 2011-03-07b  Acceptera sed-varianter med enbart -E (inte -r).
# 2011-03-07   Strukturera ändringarna från 2011-03-06c något.
# 2011-03-06d  Buggfix.
# 2011-03-06c  Använd stderr för bättre skriptabilitet.
# 2011-03-06b  Anpassa till uppdatering på SVTPlay.se.
# 2011-03-06   Alla har inte cURL -- acceptera wget.
# 2011-03-05   Hjälp-text för bitrate-funktionerna.
# 2011-03-03b  Funktionalitet för olika bitrates.
# 2011-03-03   Bättre Bourne-kompatibilitet.
# 2011-02-28   Ett par förtydliganden i dokumentationen.
# 2011-02-17   Skriptet fungerar med GNU sed.
# 2011-02-16   rtmpe-strömmar går nu att hämta.
# 2011-02-15   Första versionen.
