and_cesbo icon

HLS Downloader

and_cesbo | PRO | 12/18/18 08:44:14 AM UTC | 0 ⭐ | 524 👁️ | Never ⏰ | []
Bash |

1.63 KB

|

None

|

0 👍

/

0 👎

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