Streaming Geoblocked Contents without VPN

Lukas Prasuhn
3 min readJan 2, 2019

--

So the UEFA Euro cup 2016 is on and I am sitting here in Tokyo wanting to watch the games. I could get cable or go to sport bars. Getting cable just for the games is not worth the money and hanging around in bars at night (the games will show from around 11pm to 5am here) is not a favorable option as well.

Luckily everything can be streamed by the internet nowadays. However, it is difficult to get access to free streams (that are legal). Germany’s public television stations ARD and ZDF provide such streams but due to geoblocking they can only be watched from within the country.

So what options do I have to access these streams from Tokyo?

1. The VPN approach

The simplest solution is to get a VPN server in Germany, setup the client on my local machine and access the stream as I would in Germany. Most tutorials on the internet seem to advocate this.

It didn’t work out for me though. I tried to setup an OpenVPN client and server and accessed the stream. It was playing for about 15–30 seconds before the stream disconnected. Maybe I have a bad internet connection or should have tried different settings.

Eventually I gave up in favor of the following solution.

2. Relaying the streams with VLC

The ARD/ZDF streams are not encrypted nor require any special software to be played. It is possible to access them from a server in Germany with VLC and re-stream the data (without geoblocking).

Getting the stream URLs

The URLs can be found by a quick Google search.

http://daserste_live-lh.akamaihd.net/i/daserste_de@91204/master.m3u8 http://zdf_hds_de-f.akamaihd.net/i/de14_v1@147090/master.m3u8

These playlists reveal the raw HTTP stream URLs in different qualities. For example the ARD playlist contains:

#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=184000,RESOLUTION=320x180,CODECS="avc1.66.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_184_av-p.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=184000,RESOLUTION=320x180,CODECS="avc1.66.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_184_av-b.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=320000,RESOLUTION=480x270,CODECS="avc1.66.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_320_av-p.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=320000,RESOLUTION=480x270,CODECS="avc1.66.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_320_av-b.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=608000,RESOLUTION=512x288,CODECS="avc1.77.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_608_av-p.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=608000,RESOLUTION=512x288,CODECS="avc1.77.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_608_av-b.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1216000,RESOLUTION=640x360,CODECS="avc1.77.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_1216_av-p.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1216000,RESOLUTION=640x360,CODECS="avc1.77.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_1216_av-b.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1992000,RESOLUTION=960x540,CODECS="avc1.77.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_1992_av-p.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1992000,RESOLUTION=960x540,CODECS="avc1.77.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_1992_av-b.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2691000,RESOLUTION=960x540,CODECS="avc1.77.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_2692_av-p.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2691000,RESOLUTION=960x540,CODECS="avc1.77.30, mp4a.40.2" http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_2692_av-b.m3u8?sd=10&rebase=on

Getting a server in Germany and install VLC

Fortunatly, renting a server with root access is cheap nowadays. DigitalOcean has VPS servers starting from $5 a month. As they charge by hour, just watching the soccer games will almost cost nothing. The only thing we have to be aware of is to create the server in the Frankfurt datacenter.

After logging into a root terminal, the following command will install VLC:

vlc-nox provides a headless VLC without GUI. Basically it is just an alias to vlc -I dummy.

Using VLC to relay the stream

VLC can both access the stream and send it out simultaneously with a build-in HTTP server. That is basically all we have to tell it to do, it is plain simple.

#!/bin/bash FILE="http://daserste_live-lh.akamaihd.net/i/daserste_int@91203/index_2692_av-b.m3u8?sd=10&rebase=on" cvlc -vvv $FILE --network-caching=15000 --sout "#standard{access=http,mux=ts,dst=:8080/ard}"

With --network-caching=15000 a very conservative buffer of 15 seconds is used. --sout "#standard{access=http,mux=ts,dst=:8080/ard}" does the magic of creating a HTTP server that listens on port 8080 and makes the stream available at URL http://<your-servers-ip>:8080/ard.

Conclusion

By relaying the stream with VLC, geoblocking could be avoided. Compared to a VPN solution I could even get a much more stable stream without sacrificing quality.

On the down side, this technique may not work in cases where the stream is not easily accessible or encrypted. VPN or more serious hacking has to be used to relay such streams.

Originally published at blog.cvguy.de.

--

--