#!/bin/bash # .env contains a line like # BASE64_BEARER_TOKEN='' source .env OUTFILE_PATTERN="./videos/video_INDEX.mp4" read -r -d '' API_URL <<- 'EOM' https://euwe-1.api.microsoftstream.com/api/videos? $top=100 & $skip=0 & $orderby=metrics/trendingScore desc & $filter= published{SPACE} and{SPACE} ( ( state eq 'Completed' and contentSource ne 'livestream' ){SPACE} or{SPACE} ( contentSource eq 'livestream'{SPACE} and not ( state eq 'Completed'{SPACE} and not liveEvent/LiveEventOptions/OnDemandOptions/EnablePlayback ) ) ) & api-version=1.4-private EOM API_URL="$( printf '%s' "${API_URL}" | sed 's/{SPACE}/ /g' | tr -d '\n' )" mkdir -p "$(dirname "${OUTFILE_PATTERN}")" || { printf '\033[31m%s\033[m\n' 'Aborting'; exit; } m3u8_manifest_urls=$( wget --no-verbose --quiet -O- --header="authorization: Bearer ${BASE64_BEARER_TOKEN}" "${API_URL}" | \ jq -r '.value[].playbackUrls | map(select(.mimeType == "application/vnd.apple.mpegurl")) | .[].playbackUrl' ) if [ -z "${m3u8_manifest_urls}" ]; then printf '\033[31m%s\033[m\n' 'Error GETting manifest urls (response empty) or Bearer token invalid/expired. Exiting.' exit fi idx=1 total=$(printf '%s\n' "${m3u8_manifest_urls}" | wc -l) ISF="\n" for m3u8_manifest_url in ${m3u8_manifest_urls}; do m3u8_highest_res_url=$( curl --silent "${m3u8_manifest_url}" | tail -n1 | rev | cut -c3- | rev | cut -d'&' -f2 | cut -c13- | sed 's/keyframes/fragments/g' ) outfile="$(printf '%s' "${OUTFILE_PATTERN}" | sed "s/INDEX/${idx}/g")" printf '\033[32m%s\033[m\n' "Download '${outfile}' (${idx}/${total})" ffmpeg -hide_banner -loglevel error -headers "authorization: Bearer ${BASE64_BEARER_TOKEN}" -i "${m3u8_highest_res_url}" -progress - -c copy "${outfile}" | grep --line-buffered 'out_time=' | sed -u -e 's/out_time=//g' | xargs -I{} printf '{}\r' printf '\n\033[33m%s\033[m\n' "Done" idx=$(( idx + 1 )) done