Inleiding
Een tijd geleden schreef ik over een download-script voor de live-stream van NPO-nieuws, het kanaal met 24/7 nieuws van de nederlandse publieke omroep. Sindsdien is er een hoop veranderd in het aanbod van de NPO, waardoor mijn script niet meer naar behoren werkte.
In eerste instantie probeerde ik op eigen houtje de streams op het spoor te komen door de broncode en het netwerkverkeer door te lichten. Ik kwam niet verder dan een onbetrouwbaar downloadscript dat soms wel, maar meestal niet functioneerde. Dit moest anders!
Update (2)
Vanaf begin 2019 is alle content van de NPO beveiligd met DRM-technologie. Hierdoor is het wel in een browser of via hun eigen app te bekijken, maar niet te voor offline gebruik te downloaden. Jammer, maar helaas.
YouTube-DL
Toen kwam ik het youtube-dl-project op het spoor. Deze mensen hadden al het 'vuile werk' inzake streams al opgeknapt en boden legio mogelijkheden om er voor en na het downloaden mee te stoeien. Ze bleken zelfs al een module aan boord te hebben voor de NPO…
Er waren wel nog een aantal handelingen nodig om de stream in VLC te kunnen bekijken:
- download-URL bepalen met behulp van
youtube-dl
- met
avconv
(ffmpeg
) het bestand downloaden als.ts
-transportstream - met VLC deze transportstream openen en weergeven
- na afloop,
avconv
afschieten en het tijdelijke bestand verwijderen
Update
Met dank aan Eldert Francke is er voor het direct bekijken van de live-streams een kortere oplossing, die ook nog eens de beste beeldkwaliteit levert (hier als voorbeeld de stream van NPO2):
youtube-dl -o - "https://www.npo.nl/live/npo-2" | vlc -
Jos van den Oever wees mij in een reactie op een nog korter en mogelijk eleganter commando om de live streams van NPO te bekijken. Hij maakt gebruik van mpv.
mpv "https://www.npo.nl/live/npo-1"
Wrapper-script
Aldus besloot ik in Bash een wrapper-script te schrijven, dat al deze stappen comfortabel samenvat. Hiermee kan ik nu de reguliere (1, 2, 3) en thema-kanalen van de NPO (Nieuws, Cultura) live bekijken zonder browser, dan wel downloaden.
#!/bin/bash
#
# Script for viewing the NPO-livestreams using a temporary file as buffer,
# utilizing youtube-dl (https://rg3.github.io/youtube-dl/)
#
USAGE="Usage: $( basename ${0} ) [-h] [-k] -s npo-1|npo-2|npo-3|npo-nieuws|npo-cultura
-h Show this usage message
-k Keep the downloaded transport stream
-s Stream to download and view
";
KEEPFILE=0;
STREAMTOVIEW='';
# Process commandline arguments
while getopts "h?ks:" opt; do
case "$opt" in
k) KEEPFILE=1;
;;
s) STREAMTOVIEW=$OPTARG
;;
h|\?|*)
echo "${USAGE}";
exit 0;
;;
esac
done
if [ "${STREAMTOVIEW}x" == "x" ]; then
echo "Please choose one of the streams to view.
";
echo "${USAGE}";
exit 1;
fi
URL="$( youtube-dl --get-url "https://www.npo.nl/live/${STREAMTOVIEW}" 2>/dev/null )";
# Could the URL be determined?
if [ ${?} -ne 0 ]; then
echo "Error downloading stream.";
exit 1;
fi
# Make a temporary transportstream buffer
TEMPFILE="$( mktemp /tmp/tmpXXXXXXXX.ts )";
# Start the download and conversion
avconv -y -i "${URL}" "${TEMPFILE}" 2>/dev/null &
# Capture the process ID
AVCONVPID=$!;
# Give it time to buffer some data
sleep 2;
# Start the media viewer
vlc "${TEMPFILE}" 2>/dev/null;
# Kill the download process
kill -2 ${AVCONVPID};
# Clean-up
if [ ${KEEPFILE} -eq 1 ]; then
echo "Keeping temporary file: ${TEMPFILE}";
else
rm "${TEMPFILE}";
fi
exit 0;