83 lines
2.2 KiB
Bash
Executable File
83 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# .env contains a line like
|
|
# BASE64_BEARER_TOKEN='<literal base64 encoded string>'
|
|
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
|