#!/bin/bash
# Usage: hls-get.sh http://...
OUT_TS="dump.ts"
OLD_M3U8=""
LINK="$1"
M3U8=$(curl -s "$LINK")
forward_link() {
B="$1"
L="$2"
if echo "$L" | grep "^http[s]\{0,1\}://" ; then
echo "$L"
elif echo "$L" | grep "^/" ; then
U=$(echo "$B" | sed -e 's/^\(http[s]\{0,1\}:\/\/[^/]*\).*$/\1/')
echo "$U$L"
else
U=$(echo "$B" | sed -e 's/^\([^?]*\).*$/\1/' | sed -e 's/^\(.*\/\).*$/\1/')
echo "$U$L"
fi
}
SUBLINK=$(echo "$M3U8" | grep '^#EXT-X-STREAM-INF' -A1 | tail -n 1)
if [ -n "$SUBLINK" ] ; then
LINK=$(forward_link "$LINK" "$SUBLINK")
M3U8=$(curl -s "$LINK")
fi
wait_seq() {
SEQ=$(echo "$M3U8" | grep "^#EXT-X-MEDIA-SEQUENCE")
while [ 1 ] ; do
NEXT_M3U8=$(curl -s "$LINK")
if echo "$NEXT_M3U8" | grep -q "$SEQ" ; then
sleep 1
else
M3U8="$NEXT_M3U8"
break
fi
sleep 1
done
}
download_seq() {
SEQ=$(echo "$M3U8" | grep "^#EXT-X-MEDIA-SEQUENCE" | cut -d ":" -f 2)
echo "$(date '+%F %H') Downloading sequence: $SEQ" >&2
echo "$M3U8" | grep '^#EXTINF' -A1 | grep -v '^#' | while read TSLINK ; do
TSLINK=$(forward_link "$LINK" "$TSLINK")
FNAME=$(echo "$TSLINK" | sed -e 's/^.*\\\([^?]*\).*$/\1/')
if echo "$OLD_M3U8" | grep -q "$FNAME" ; then
: skip
else
echo "$(date '+%F %H') Downloading ts: $FNAME" >&2
curl -sS "$U$TSLINK" >>$OUT_TS
fi
done
OLD_M3U8="$M3U8"
wait_seq
}
: >$OUT_TS
while [ 1 ] ; do
download_seq || break
done
Comments