Simplified KabelDeutschland streaming proxy

Review

A few days go i wrote about How to reverse engineer the KabelDeutschland API. Attached to this post there was a PHP script hosted on github to get your own streaming proxy running.

After testing and spreading the word with some people i came to the decision that the procedure was far too complicated. The need of a webserver and the large number of configuration options were unnecessary.

That’s why i build a single binary version, written in go.

Limitation

This tool does not remove the restrictions made by KabelDeutschland. You will need an internet and a TV contract with them. It only give you the ability to use their streams besides the iOS app.

Download

Binaries for all major platforms can be found at the shared folder.

Shared Folder at mega.co.nz (mirror at dropbox)

Select the binary suitable for your machine.

Tested environments

  • Macbook Pro Mid 2012, OSX 10.10.2
  • Synology DS215j (arm)
  • RaspberryPi (arm)
  • Windows XP 32bit

Please drop me a line if it works or not on your system.

Installation

Grab the config.json and edit it with your customer-service-center credentials. You can also change the port if you like.

On windows, double-click the executable file. On Linux/Mac you have to use your terminal, navigate to the folder you downloaded the binary and type the following command.

If you got a permission denied error, you have to set the executable bit for the binary

On all systems you will see the same output if everything went fine.

You will see the list of interfaces, the proxy listens to. All of them are ready to use to serve the channel playlist.

On certain Windows systems, it is not possible to display the interface list. The proxy will work nevertheless. Simply paste your known IP-Adress or one of your loopback addresses.

Installation on a Synology Diskstation

By now the easiest way to install the KabelDeutschland proxy is to download the arm-version of the binary and put it to your home-folder on the diskstation. Put the edited config.json next to it. Now you have to log into your nas  using ssh as your user and run the following command.

This creates a new screen, starts the proxy and immediately detaches the screen. That means the process runs in the background.

In order to be able to use the screen command, your box has to be bootsrapped. You can find the instructions to do this here: Bootrap the DS215j. Installation of screen will be done with this command as root.

You can connect to the proxy using the IP-address of your diskstation. http://[diskstation]:8787.

To stop the process, attach to the screen and press control+c. Attaching works using this command.

Predefined package

Synology has its own package manager and I’ll try to build a repository containing the proxy as a installable package. This will provide a way more easier solution. I will keep you updated.

Usage

Copy one of the links form the terminal output and paste it into your desired media player. It should load the playlist automatically. In VLC it looks like on the screenshot. You can now switch between the channels. The playlist contains links pointing to the proxy. This link handles the license generation, KabelDeutschland used to verify the stream.

165 thoughts on “Simplified KabelDeutschland streaming proxy

  1. Tom says:

    Wow, was für ne tolle Idee! Schade nur das meine Synology (DS212+) nicht unterstützt wird:

    runtime: this CPU has no floating point hardware, so it cannot run
    this GOARM=6 binary. Recompile using GOARM=5.

    • Hi Tom,

      Danke für den Hinweis 😉
      ich hab die binaries nun für arm v5, v6 und v7 kompiliert.
      Du findest sie im shared folder.

      Gib bescheid ob es bei dir nun läuft.

      Beste Grüße,
      André

      • Tom says:

        Wow, das war schnell 😉 Läuft aber leider nicht, scheint wohl doch etwas komplizierter zu sein:

        ds> ./kd_proxy_arm_v5
        Illegal instruction (core dumped)

        • Tom says:

          Allerdings scheint auch die Web/PHP Variant bei mir problematisch zu sein:

          Die Playlist wir erstellt, kann aber dann nicht abgespielt werden. VLC geht nur nach und nach die gesamte Wiedergabeliste durch…


          Can't get licensed link for Id: 3xxxx0 Link: http://cdn1.iptv.kabel-deutschland.de/live-spts/media/xxx/transmux/hls.m3u8

          • Tom says:

            ok, in all den Blogs und Texten ist mir der völlig entgangen:

            ou need to have two contracts with KD. One for cable-tv and one for internet over cable. The second one is necessary because the streams are only available inside of their own network.

            Somit ist klar warum es nicht funktionieren kann. Kein Internet via Kabel bei mir :-/

          • Schade, aber ich werde mir das Problem dennoch ansehen.
            Du bist nicht der einzige mit dem “illegal instruction” error.
            Vielleicht kannst du wenn ich eine neue Version habe dennoch kurz testen?

        • Auch wenn du es leider nicht nutzen kannst, ich habe das Problem mit der illegal instruction lösen können. Mein cross-compiler-script hat bei arm etwas durcheinander gebracht. Nun gehen die verschiedenen Versionen.

          Beste Grüße,
          André

      • Dennis says:

        Hi eine Frage läuft super auf PC nur fehlt RTL und rtl2 weißt du wieso?

        Kann man das Script auch auf ein Firestick installieren?

        Ist wohl eine Arm 9 Version

        Würde mich freuen von dir zu hören

        • Hey Dennis,

          das die RTL-Gruppe nicht vorhanden ist, liegt leider nicht an meinem Tool. RTL verbietet KabelDeutschland das streaming aller Sender der Gruppe. Auch in der App von KabelDeutschland fehlen die Kanäle.

          Zu deiner zweiten Frage.
          Generell wäre es möglich den Proxy auch auf dem Firetv laufen zu lassen. Von Go gibt es einen Compiler für iOS und Android (https://godoc.org/golang.org/x/mobile/app) aber es wir schwierig ohne GUI den Proxy zu starten.

          Ich werde es mir auf jeden Fall mal ansehen.

          Beste Grüße,
          André

    • Dennis says:

      Hi eine Frage läuft super auf PC nur fehlt RTL und rtl2 weißt du wieso?

      Kann man das Script auch auf ein Firestick installieren?

      Ist wohl eine Arm 9 Version

      Würde mich freuen von dir zu hören

    • You don’t need any special requirements.
      Thanks for your error trace, i will have a look and see how i can fix the problem.

      best regards,
      André

    • hi,

      I managed to find the problem.
      My cross-compilation-script did some mess-up handling all of the arm version.
      I rebuild them, now it should work (tested it on my raspbian running PI B+).
      Download the arm_v6 build again please.

      Best regards,
      André

  2. Sehr tolle Sache!

    Das 64-Bit-Linux-Binary funktioniert bei mir auf dem Client einwandfrei, Stream schauen ging mit VLC sofort, super!

    Auf meinem Homeserver (32 Bit Debian auf einem alten AMD Duron) lies sich das 32-Bit-Binary leider nicht starten: SIGILL: illegal instruction. Gibt es noch andere Compiler-Flags, damit das auf so alten Prozessoren noch läuft? Dummerweise ist Go ja recht modern :/

    Aber eigentlich wollte ich sowieso die PHP-Variante auf dem Homeserver haben, Infrastruktur ist eh schon da und das ist auch nicht so fett wie dieser Go-Klotz. Allerdings – es funktioniert leider nicht. Erzeugen der Playlist klappt, will ich aber dann einen der konkreten Links in der Playlist aufrufen, kommt nichts zurück, womit VLC etwas anfangen könnte. Rufe ich einen dieser Links mit curl auf, bekomme ich “Can’t get licensed link for Id … ” usw. In den Logfiles (log_level=debug) steht einiges, aber da weist nichts konkret auf einen Fehler hin.

    Ich vermute, es liegt nicht an den Credentials, die haben schließlich mit der 64-Bit-Binary funktioniert, kopiert habe ich sie auch richtig, mehrfach kontrolliert. Funktioniert das Aufbauen der Playlist theoretisch mit falschen Credentials? Wie kann ich die PHP-Version noch debuggen?

    • Hallo Heiko,

      Das abholen der Playlist ist auch ohne Credentials möglich.
      Zum generieren des lizensierten Links wird jedoch eine spezifische Gruppen-Id benötigt, welche KD über den Sign-In zur verfügung stellt.

      Mit dir und Carsten (stadt-bremerhaven.de) habe ich leider schon zwei Personen gefunden wo meine Abfrage dieser ID nicht das gewünschte Ergebnis bringt. Mit meinem eigenen Account kann ich den Fehler leider nicht reproduzieren und Carsten wollte, verständlicherweise, nicht seine Credentials zum Debuggen überlassen. Hättest du eventuell Interesse?

      Im Go-Binary ist eine Liste valider Gruppen-IDs fest integriert, daher funktioniert die Erzeugung des Links bei dir damit auch.

      Ich würde gern das PHP-Script um diesen Fehler bereinigen, komme aber mit meinen aktuellen Möglichkeiten nicht weiter.

      Den illegal instruction sigkill werde ich am Wochenende versuchen zu beheben. Ich schätze ich haben bei der cross-compilation einen Fehler gemacht.

      Beste Grüße,
      André

      • Heiko says:

        Nicht falsch verstehen, aber die Credentials sind einen Hauch zu zentral, das ist ja quasi der Masterkey zum KD-Zugang inklusive Mails, Vertragsänderungen etc.. Theoretisch könnten die auch Checks drin haben, ob die gleichen Credentials von verschiedenen Stellen aus genutzt werden und dann den Zugang sperren (Sie wurden gehackt!), das ist mir ein bisschen zu heikel.

        Ich führe gern Testcode aus und erstatte Bericht inklusive Logfiles, sofern das was nützt. Wobei man da bei den Logfiles auch nicht so recht sicher sein kann, in welchem Wert das Passwort wie kodiert drinsteht (UDID? ApiPass?).

        Ich habe auch nochmal die Logfiles angeschaut, beim Holen der LicensedLinks kommen mainUrl und altUrl leer zurück. Ich habe sogar nochmal mit curl den API-Aufruf nachgebaut, wie im Artikel “How to reverse-engineer …” gezeigt (hoffentlich korrekt), das gleiche Ergebnis. Schwer zu beurteilen, an welcher Stelle zum ersten Mal was schief läuft und was dann Folgefehler sind, so ohne richtige Fehlermeldung von der API.

        • Das kann ich voll und ganz verstehen.
          Das Problem ist die SiteGuid. Bisher kenne ich nur 2 Gruppen, welche es erlauben lizensierte Links zu erzeugen.
          Stimmt die Gruppe nicht, kommen leere Urls.

          Um dich ein wenig zu beruhigen. Das Api-Pass ist fest in die KD-App integriert und für jeden User gleich, UDID ist spezifisch pro User und wird in der App generiert, ähnlich der früheren UUID von Apple. Auch die ist aktuell fest verdrahtet, da ich diese bisher nicht zurückrechnen konnte.

          Hast du dich durch mein Tutorial zum reverse-engineering gearbeitet und alle calls in Burp zur Verfügung. Dann könnten wir diese durchsprechen, vielleicht lässt sich damit rausfinden, warum deine SiteGuid nicht valide ist, aber es in der iOS App (wie bei Carsten) dennoch möglich ist Streams zu sehen.

          • Phillip says:

            Ich hatte auch das Problem, dass die URLs leer zurück kamen. Nachdem ich meine UDID eingetragen habe, hat es funktioniert (einfach über den Proxy schnell gesucht). Die Frage ist, ob Kabel Deutschland nur eine gewisse Menge Accounts pro UDID zulässt, denn eig. ist die UDID pro Gerät unterschiedlich. Ich teste das mal mit ein paar iPods und einer frischen neu installierten App, was beim ersten Request mit der UDID über die API passiert. App löschen und neu installieren geht nicht, da sich die UDID nicht ändert.

          • Da hast du recht, es ist nicht die beste Lösung eine fixe UDID zu verwenden. Ich suche immer noch nach dem Algorithmus, welchen KabelDeutschland verwendet um seine UDID zu berechnen. Leider ist es keiner der Standardisierten und bekannten Wege.
            Bin dabei aber auf dem selben Stand wie du, die UDID scheint Hardwaregebunden zu sein, da sie sich auf einem Gerät nicht ändert.
            Von daher hoffe ich noch, dass sie sich an MAC-Adresse oder ähnlichen festen Informationen orientiert und man die Berechnung so zurückführen kann.
            Aber bisher noch erfolglos.

    • Sebi says:

      Hallo Andre,
      vielen Dank für dein Tool. Ich habe das gleiche Problem wie Heiko, dass sich das 32-Bit-Linux-Binary wegen des Fehlers “SIGILL: illegal instruction” auf meinem Home-Server mit Ubuntu 14.04 32 Bit nicht starten lässt. Das 64-Bit-Binary hingegen läuft bei mir unter Ubuntu 15.04 64 Bit fehlerfrei.
      Wäre echt super, wenn du das hinbekommst. Vielen Dank im Voraus!

      • Hi Sebi,

        ich habe es eben mit meiner Cross-Compile VM (ubuntu 14.04 32bit) getestet und es läuft problemlos.

        andre@ubuntu-compile ~ [10:24:52]
        > $ ./kd_proxy_32
        == Checking credentials
        done
        == Listening ...
        http://192.168.178.66:8787
        ^C%
        andre@ubuntu-compile ~ [10:25:04]
        > $ uname -a
        Linux ubuntu-compile 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:12 UTC 2014 i686 i686 i686 GNU/Linux

        Wie hast du das Binary auf den Server transferiert und wann hast du es geladen?

        Beste Grüße,
        André

  3. Sebastian says:

    Habe gerade auch einmal ein bisschen mit dem Proxy gespielt. Über meinen MAC und VLC klappt es super.

    Nun habe ich es versucht über Kodi zum laufen zu bekommen – leider ohne Erfolg. Ich nutze das PVR Plugin “PVR IPTV Simple Client”. Die Programmliste bekomme ich geladen. Nur wenn ich dann einen Kanal auswähle bekomme ich beim Proxy die Meldung “path requested: link/386632/aHR0cDovL2NkbjEuaXB0di5rYWJlbC1kZXV0c2NobGFuZC5kZS9saXZlLXNwdHMvbWVkaWEvcHJvNy90cmFuc211eC9obHMubTN1OA==:== Get licensed link” angezeigt und nichts passiert.

    In der Kodi-Log steht dazu “Open – Error, could not open file pvr://channels/tv/Alle Kanäle/3.pvr”.

    Ich muss zugeben ich bin noch relativ neu bzgl. PVR Clients/Plugins am Kodi. Mache ich ggfs. etwas falsch bzw. geht das überhaupt wie ich es mir vorstelle?

    • Hi Sebastian,

      das Problem mit Kodi kann ich reproduzieren. Der scheint den Link der Playlist nicht richtig aufzurufen.
      Du hast alles richtig gemacht, ich schau mir das noch mal an, warum es nicht geht.

      Generell gibt es gerade ein Problem bei. Ich bekomme gar keine Streams mehr. Gegenstelle antwortet nicht.
      Bei mir gibt es aber auch aktuell eine Großraum-Störung.

      Beste Grüße,
      André

    • Das Problem liegt leider an Kodi, der kommt mit den Playlists von KD nicht klar.
      Nachdem ich den Channel auf eine Playlist von KD auflöse kann Kodi mit dieser nicht mehr arbeiten.

      Die Playlist:
      #EXTM3U
      #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=564000
      CCURstream564000.m3u8
      #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1064000
      CCURstream1064000.m3u8
      #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1664000
      CCURstream1664000.m3u8

      Leider kann ich bisher keine Lösung dafür finden.

      • Sebastian says:

        Sehr schade. Das wäre ein nettes Setup. Meine Synology DS213j im Zusammenspiel mit Kodi.

        Trotzdem vielen Dank für die schnelle Rückmeldung. Ich werde die Seite immer mal wieder besuchen für den Fall das es was neues gibt.

  4. Marcus says:

    Hallo André,

    bin über Carsten auf dein Projekt gestoßen.
    Dein Programm funktioniert bei mir unter Windows 7 64 Bit problemlos, echt toll! Gute Arbeit. Nun besitze ich ein Synology DS 213+ mit FREESCALE QorIQ P1022 Prozessor. Habe versucht deine PHP Version zu betreiben, scheitere aber mit folgendem Fehler:

    Can’t get licensed link for Id: xxxxxx Link: http://cdn1.iptv.kabel-deutschland.de/live-spts/media/arte/transmux/hls.m3u8

    Bin wohl nicht der einzige laut den