This commit is contained in:
Bas Magré 2024-02-08 21:56:15 +01:00
parent 78f0326847
commit 22d1cc99da
7 changed files with 187 additions and 13 deletions

9
docker-compose.yaml Normal file
View file

@ -0,0 +1,9 @@
version: "3"
services:
client:
image: nginx
ports:
- 8000:80
volumes:
- ../website:/usr/share/nginx/html

View file

@ -1,23 +1,24 @@
#!/usr/bin/env sh
genHtml() {
echo "html for $1 with title $3 in template in dir $2"
pandoc $1.md -o $1.html --template ${2}website-template/template.html --include-in-header ${2}website-template/header.html --include-before-body ${2}website-template/navbar.html --include-after-body ${2}website-template/footer.html --standalone --mathjax --toc --toc-depth 2 --metadata title="$3"
echo "html for $1 with title $2"
pandoc $1.md -o $1.html --template website-template/template.html --include-in-header website-template/header.html --include-before-body website-template/navbar.html --include-after-body website-template/footer.html --standalone --mathjax --toc --toc-depth 2 --metadata title="$2"
sed -i -e 's/md">/html">/g' $1.html
}
genHtml index "" "Home"
genHtml index "Home"
cd starfiveVisionFive2
genHtml kodi/npo "Kodi - NPO Uitzendinggemist"
genHtml kodi/rtlxl "Kodi - RTLxl"
genHtml kodi/kanalenlijst-hans "Kodi - Kanalenlijst Hans"
genHtml FedoraATIRadeon5450 '../' "StarFive VisionFive 2 Fedora ATI Radeon 5450"
genHtml UbuntuATIRadeonR9_290 '../' "StarFive VisionFive 2 Ubuntu 22.04 ATI Radeon R9 290"
genHtml UbuntuATIRadeonR9_290_2023_11_20 '../' "StarFive VisionFive 2 23.10 Ubuntu ATI Radeon R9 290"
genHtml starfiveVisionFive2/FedoraATIRadeon5450 "StarFive VisionFive 2 Fedora ATI Radeon 5450"
genHtml starfiveVisionFive2/UbuntuATIRadeonR9_290 "StarFive VisionFive 2 Ubuntu 22.04 ATI Radeon R9 290"
genHtml starfiveVisionFive2/UbuntuATIRadeonR9_290_2023_11_20 "StarFive VisionFive 2 23.10 Ubuntu ATI Radeon R9 290"
# TODO fix link .md to .html
cd ..
rsync -a --prune-empty-dirs --include '*/' --include '*.html' --include '*.png' --include '*.jpeg' --exclude '*' ./ ../website
rm *.html
rm kodi/*.html
rm starfiveVisionFive2/*.html

BIN
kodi/images/hack-npo.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

16
kodi/kanalenlijst-hans.md Normal file
View file

@ -0,0 +1,16 @@
---
date: 2018-nu
author: Bas Magré
---
# Kanalenlijst Hans
In de satelliet-wereld is het een algemeen begrip, de kanalenlijst gemaakt door Hans van de satellietclub De Transponder. Tijdens mijn bezoek in het clubgebouw werd duidelijk dat ik al meerdere addons gemaakt had voor Kodi. Een paar clubleden vroegen zich af of ik dit ook met de Kanalenlijst van Hans kon doen. Natuurlijk, dus zo gezegd, zo gedaan. [plugin.video.hanssettings](https://github.com/Opvolger/plugin.video.hanssettings)
## Satellietclub De Transponder
De satellietclub "De Transponder" is een groep mensen welke (elke) 4de zaterdag van de maand samen komen in het clubgebouw/buurtcentrum "Op Dreef" in Apeldoorn. Hier flashen ze de laatste firmware van hun sateliet ontvanger, repareren ze sateliet ontvanger en hebben ze het over de techniek. Voor meer info zie hun [website](https://www.detransponder.nl/).
Ze hebben zelfs eens een Kodi demo gegeven [youtube](https://www.youtube.com/watch?v=3E-Mkkro2xI&t=740s).
## Geen officele addon
Ik heb geprobeerd er een officiele addon van te maken en hem aan te bieden bij Kodi-addons, maar helaas kon de addon niet aan hun regels voldoen. De streams kunnen namelijk door een 3de partij veranderd worden (Hans). Mogelijk zouden er ook stream neergezet kunnen worden welke betaald zijn. Dus het is een privé project gebleven.

112
kodi/npo.md Normal file
View file

@ -0,0 +1,112 @@
---
date: 2013-nu
author: Bas Magré
---
# Uitzendinggemist (NPO)
Een stukje uitleg over het hoe en waarom van de addon [plugin.video.uzg](https://github.com/Opvolger/plugin.video.uzg) voor Kodi. Deze blijf ik aanvullen als er (grote) dingen veranderen.
## Waarom
Omdat ik had besloten de “kabel” eruit “te gooien”, omdat ik geen zin meer had in betaald reclame te kijken en alles was van het zelfde op t.v. Netflix kwam toen net in Nederland en ik dacht: “Ik doe het gewoon, ik gooi de kabel er uit”. Ik had een “Smart” TV welke RTL-XL en NPO uitzendingen terug kon kijken (zonder reclame) en film van Netflix. Prima. Google Chromecast + Kodi op een Raspberry Pi. Alles opgelost dacht ik.
Helaas 2 maanden nadat ik mijn kabel opzeg, veranderd de “API” van RTL-XL en weer 4 maanden later die van NPO. Kortom, ik kon dit niet meer kijken op mijn “Smart” TV.
## Oplossing
Kodi gebruikte ik al jaren voor mijn series en films te kijken (legaal! ik heb de DVDs/Blu-Rays in de kast staan). Na het opzeggen van de kabel had ik ook tvheadend met een dvb-t USB ontvanger geconfigureerd met Kodi. Zodat ik in het hele huis Nederland 1/2/3 en TV Gelderland kon kijken. Ik kan vanuit mijn werk uit aardig programmeren, dus het lag nu voor de hand om een add-on te maken in Kodi voor NPO en RTL-XL. Beide add-ons aangemeld bij Kodi en ze zijn jaren lang een “Officiële” addon geweest, deze was dus te downloaden uit de repository van Kodi zelf.
## Uitwerking
Hoe start je nu zo iets? Het was vroeger wat meer zoek werk, maar je kan het allemaal vinden op de wiki pagina van Kodi, nu hebben ze erg goede uitlegt hoe je moet beginnen. Nu dus de taal python nog even leren (lees google elke actie welke je wil doen) en achterhalen hoe je videos ophaalt bij NPO. Dat laatste ging vroeger erg makkelijk, dat deed je als volgend:
Zet een “Zed Attack Proxy” op je pc
Stel het juiste IP-Adres in (van je locale netwerk) “ZAP > Tools > Options > Local Proxies”
Op een Android telefoon (emulator of echte), zet je de NPO App er op.
Zorg ervoor dat je telefoon via de proxy loop (Ga naar “advanced options” van je Wifi connection) of je emulator opstart met “-http-proxy http://xx.xxx.xx.xx:8080”
Klaar! Als je verkeer loopt nu via je pc, je ziet alle aanvragen van de app. Alles ging over http, hier kon je zien hoe de “API” werkte en deze “op de zelfde manier” toepassen in python. Je moest alleen even aansluiten om de “API” van Kodi en klaar. Dit klinkt natuurlijk makkelijker dan het is, maar daar komt het in het kort wel op neer. Dit alles is gemaakt november 2013 t/m januari 2014. De code aangeboden aan Kodi met een pull request en na wat kleine aanpassingen geaccepteerd!
## Tegenslag / Stoppen publieke addon
Maar helaas kwam daar na 5 jaar in eind november 2018 een einde aan. De NPO had namelijk de voorwaarden aangepast. Zover ik het nu kan lezen mag er geen publieke plugins/addons meer gemaakt worden. Gelukkig mag dit nog wel steeds voor eigen gebruik, er staat nergens dat dit niet mag! De app was ook “verbeterd”, je kan niet meer al het verkeer aftappen. Nu liep al het verkeer netjes via https, maar op Android Telefoons van versie 5 en lager, kan zelf “root” certificaten toevoegen. Dus we gingen naar “ZAP > Tools > Options > Dynamic SSL Certificates” en exporteerde het certificaat. We zette deze op de Android telefoon en al het verkeer was weer leesbaar.
Wat je hier doet, is al je verkeer via je proxy laten lopen, op je pc ook “decoderen” en opnieuw “coderen” mijn jouw certificaat. Je kan namelijk niet het certificaat van NPO gebruiken, je hebt immers de “private-key/geheime sleutel” niet. Je doet letterlijk een man-in-the-middle attack.
De Api was totaal veranderd, tevens de voorwaarden. Volgens de nieuwe voorwaarden mocht wat ik deed helaas niet meer. Netjes een verzoek gedaan bij Kodi om mijn addon “broken” te melden.
Natuurlijk kon ik privé gewoon doorgaan met mijn addon.
## DRM
Alsof de tegenslag van november 2018 nog niet genoeg was, maart 2019 ging NPO over op DRM. Alles werkte nog, behalve de video-stream uitvragen. Dit moest ik dus weer uitzoeken. De app was nog beter beveiligt, ze doen nu aan “Certificate Pinning”, kortom je kan er niet tussen in gaan zitten met je eigen zap-ssl-certificaat. Dit was niet zo fijn. Uiteindelijk de Andoid App van de NPO moeten decompilen. Gelukkig kan dit online (hoef je de tools niet te instaleren). Helaas hadden ze gebruik gemaakt van “code obfuscation (niet leesbaar maken van code)”, maar dat weerhield mij niet. Het koste mij alleen wat meer tijd. Ik kwam er achter hoe de videos nu werden opgevraagd, met deze informatie kon ik mijn addon weer aanpassen.
Code uit de Android App
```java
public NedforceCatalog(OkHttpClient okHttpClient, NpoPlayerConfig npoPlayerConfig) {
this._httpClient = okHttpClient;
this._config = npoPlayerConfig;
switch (this._config.getEnvironment()) {
case 1:
okHttpClient = "https://api.npobeta.nl";
break;
case 2:
okHttpClient = "https://start-api.npo.nl";
break;
default:
okHttpClient = "https://npo-api.staging.egeniq.com";
break;
}
this._baseUrl = HttpUrl.parse(okHttpClient);
}
en
public void getStreamForAsset(final String str, String str2, String str3, boolean z, boolean z2, int i, final CatalogCallback<NpoStream> catalogCallback) {
HttpUrl build = this._baseUrl.newBuilder().addPathSegment("media").addPathSegment(str).addPathSegment("stream").build();
JSONObject jSONObject = new JSONObject();
JSONObject jSONObject2 = new JSONObject();
try {
jSONObject.put(Scopes.PROFILE, str2);
str2 = true;
if (z) {
jSONObject2.put("startOver", true);
}
jSONObject.put("options", jSONObject2);
if (!TextUtils.isEmpty(str3)) {
jSONObject.put("ageRestriction", str3);
}
if (z2) {
if (this._config == null || this._config.getPlayerOptions() == null || TextUtils.isEmpty(this._config.getPlayerOptions().getEncryptionType()) != null) {
GlobalLogger.m6738a().m6749b(TAG, "skipCatalog = true requires to provide a DRM type!");
} else {
jSONObject.put("skipCatalog", true);
jSONObject.put("useEncryption", this._config.getPlayerOptions().getEncryptionType());
}
}
jSONObject.put("hasSubscription", i != 0);
str3 = "hasPremiumSubscription";
if (2 != i) {
str2 = null;
}
jSONObject.put(str3, str2);
jSONObject.put("platform", 2 == i ? Plan.PREMIUM : "npo");
this._httpClient.newCall(new Builder().url(build).post(RequestBody.create(HttpClient.f5884b, jSONObject.toString())).build()).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
```
Gelukkig was Kodi 18 net uit en daar kon je streams met DRM bekijken! Dus een paar avonden uitzoeken hoe je dat moest aanroepen en we konden weer videos opstarten.
## Security BUG (2019-2023)
Toen ik bezig was met uitzoeken hoe de “APIs” nu werkte. Ja APIs want de lijst met programmas en afleveringen staat helemaal los van de uitvraag van de video-streams. Hierin zit dus ook een beveiligingsprobleem. de uitvraag voor de video-stream heeft geen kennis van de “API” van de NPO. Ook niet of je nu wel of geen “Premium” account hebt. (Lees NPO-plus). Kortom, je kan dus ZONDER dat je NPO-Plus account hebt WEL een NPO-Plus video opvragen. Vrij makkelijk zelfs, je past even een switch aan van “false” naar “true” in je bericht en klaar. Natuurlijk heb ik dit eerst netjes gemeld bij de NPO helemaal niks meer gehoord. Een direct gericht via Twitter, geen response en publiek bericht via twitter, geen reactie. Een bericht via Facebook, een hele korte reactie van “We zullen het doorgeven…” Toen kwam ik deze pagina tegen bij de NPO [link](https://over.npo.nl/organisatie/privacy-en-security/responsible-disclosure). Hier wilde ik wel in komen te staan!, een mail naar de NPO dan maar in maart, april en in mei…, allemaal niks meer van gehoord.
Dus hier het beveiliging lek, ik vraag hier een video-stream op van “De Luizenmoeder”. Welke ik netjes terug krijg. Ook al mijn andere uitvragen komen nu met een 720p-stream terug i.p.v. een SD-stream.
![hack NPO](images/hack-npo.jpeg)
Voor de netheid de “bug” niet doorgevoerd in mijn addon, maar dat is met 2 regels aanpassen wel te doen :)
Update: uiteindelijk november 2019 is de bug herkend en zijn er excuses gemaakt dat er zo traag gereageert was! alleen is de bug nooit opgelost. 1 december 2023 heeft de NPO een totaal andere API genomen, hierdoor werkt de "hack" niet meer.
## Update december 2023
Ze hebben in december 2023 de hele api vervangen, ik heb de hele addon opnieuw mogen schrijven. Helaas geen "gratis" NPO-plus meer, maar nog steeds uitzending gemist op Kodi.

25
kodi/rtlxl.md Normal file
View file

@ -0,0 +1,25 @@
---
date: 2013-2024
author: Bas Magré
---
# Uitzendinggemist (NPO)
Een stukje uitleg over het hoe en waarom van de addon [plugin.video.rtlxl](https://github.com/Opvolger/plugin.video.rtlxl) voor Kodi.
Helaas werkt deze niet meer omdat begin 2024 er geen nieuwe video's meer geplaatst worden, ze zijn nu overgestapt naar videoland.
## Waarom
Zie [Uitzendinggemist (NPO)](npo.md)
## Oplossing
Zie [Uitzendinggemist (NPO)](npo.md)
## Uitwerking
Zie [Uitzendinggemist (NPO)](npo.md)
## Tegenslag / Stoppen publieke addon
Ergens +/- december 2016 kreeg ik tegengas van RTL(xl) en heb ik helaas mijn code offline moeten halen. Deze werkte met een kleine aanpassing wel weer (ze hielden letterlijk aanvragen vanuit de addon tegen), maar de boodschap was duidelijk. Stop met de addon of we gaan stappen ondernemen. De repo stond toen nog op bitbucket (hg), het deze nog overgezet naar github, maar is altijd een prive-repo geweest. Maar hij is sinds 2024-02-08 weer op publiek gezet. Het maakt allemaal niet meer uit. RTLxl bestaan niet meer.

View file

@ -1,5 +1,5 @@
<nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="#">Navbar</a>
<!--<a class="navbar-brand" href="#">Navbar</a>-->
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
@ -12,10 +12,21 @@
<a class="nav-link" href="#">Link</a>
</li> -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<a class="nav-link dropdown-toggle" href="#" id="navbarKODI" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Kodi Addons
</a>
<div class="dropdown-menu" aria-labelledby="navbarKODI">
<a class="dropdown-item" href="/kodi/npo.html">NPO Uitzending gemist</a>
<a class="dropdown-item" href="/kodi/kanalenlijst-hans.html">De Transponder - Kanalenlijk (Hans)</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/kodi/rtlxl.html">RTLxl (Inactive)</a>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarSFVF2" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Starfive VisionFive 2
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<div class="dropdown-menu" aria-labelledby="navbarSFVF2">
<a class="dropdown-item" href="/starfiveVisionFive2/UbuntuATIRadeonR9_290.html">Ubuntu 22.04 with ATI Radeon R9 290</a>
<a class="dropdown-item" href="/starfiveVisionFive2/FedoraATIRadeon5450.html">Fedora with ATI Radeon5450</a>
<a class="dropdown-item" href="/starfiveVisionFive2/UbuntuATIRadeonR9_290_2023_11_20.html">Ubuntu 23.10 with ATI Radeon R9 290</a>