beyond live has recently made some changes to it's services which makes it difficult to rip streams.
firstly, as of jan 26 2025, content viewing will only work on windows+edge and osx/ios+safari. the purpose of this is to disable widevine in favour of playready/fairplay. thankfully this isn't actually a big deal since playready was cracked in 2024 and decryption keys can still easily be acquired.
secondly, the manifest url now has an authorisation token in it's request headers which updates every 2 minutes. this means that when you attempt to download the stream you will very quickly get a 403 error. this issue is far more annoying and doesn't have an easy work around. it's possible that you could write a script to request a fresh token from the api when the current one expires but I'm not savvy enough to do that myself and you can only interact with the api and test scripts in the short window of time when a stream is actually live.
the only solution I currently have is to sit there for the entire duration of the stream copying fresh tokens and restarting the download over and over. this also means you have to do manual segment merging which I've only ever gotten to work consistently on linux. I've written some scripts to help with both the downloading and merging processes but it's still a pain.
considering all this and the fact that the last time I purchased a concert ticket the stream did not load or play at all because they've broken their site so much and they even refused to refund me, I will no longer be using beyond live or updating this guide.
PATH
prp
api server is running, then open edge and enable the prp
extensionprp
extension, locate the page url in the keys
section and click +
to expand the entrympd
and key
variables in the bl.py
scriptprp
extension and reload the tabmanifest.mpd
entryrequest headers
on the right hand side and copy the authorization
valuepython bl.py
manifest.mpd
entry and paste it in as promptednote: make sure you work quickly when copy/pasting the fresh tokens. wait too long and you may miss downloading some segments!
at this point you should have all the segments downloaded, split up into almost 100 directories. these segments now have to be concatenated to become a playable file.
if you transfer the files over to linux, this can be done very easily with the cat
utility. I have also written a small merge script that can automate this process as well as the subtitle steps below. simply add it to your path, make it executable and run it in the directory containing all your segment directories.
as far as I'm aware the windows equivalent type
does not work the same way cat
does so you instead have to use ffmpeg
, but despite following the concatenation guide I simply can not get this working consistently. windows users are welcome to follow along with the general process below, but I can't guarantee you any success. you're on your own now, good luck.
mkdir vid aud
mv 001/0_*/_init_dec.mp4 vid
mv 001/1_*/_init_dec.mp4 aud
find . -type d -name '0_*' | while read -r f; do mv --update=none "$f"/*.m4s vid; done
find . -type d -name '1_*' | while read -r f; do mv --update=none "$f"/*.m4s aud; done
cat vid/*.m4s >> vid/_init_dec.mp4
cat aud/*.m4s >> aud/_init_dec.mp4
ffmpeg -i vid/_init_dec.mp4 -i aud/_init_dec.mp4 -c copy merge.mp4
subtitle segments can be concatenated in a similar way to the video and audio streams, but since they are raw ttml
they will also need to be converted to srt
using seconv
, which is provided by the subtitleedit-cli program.
unfortunately the subtitle timestamps are almost guaranteed to be completely messed up, so they are effectively useless as is and I wouldn't recommend muxing them in with your video and audio streams unless you've manually retimed them.
to handle all subtitle languages in one go, you can run a loop like so:
find 001 -mindepth 1 -type d | grep -vE '001/(0|1)_.*' | sed 's/.*_//' | while read -r lang; do
[ ! -d sub/"$lang" ] && mkdir -p sub/"$lang"
mv 001/*_"$lang"_*/_init.mp4 sub/"$lang"
find . -type d -name "*_${lang}_*" | while read -r f; do mv --update=none "$f"/*.m4s sub/"$lang"; done
cat sub/"$lang"/*.m4s >> sub/"$lang"/_init.mp4
seconv sub/"$lang"/_init.mp4 srt >/dev/null 2>&1 && mv sub/"$lang"/_init.srt "$lang".srt
done