#!/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