feat: Samsung TV Installation + Streaming-Fix

- Samsung-Zertifikate (author + distributor) fuer TV-App erstellt
- WGT mit Samsung-Signatur auf TV installiert und getestet
- Streaming movflags korrigiert: default_base_moof statt faststart (pipe)
- frag_duration=1s fuer schnelleren Playback-Start auf Samsung TV
- INSTALL.md komplett ueberarbeitet mit Manjaro/Arch-Anleitung
- .gitignore: Tizen Studio workspace/ Ordner ausgeschlossen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Eduard Wisch 2026-02-28 22:25:45 +01:00
parent 99730f2f8f
commit a1be045a7d
8 changed files with 167 additions and 65 deletions

3
.gitignore vendored
View file

@ -35,5 +35,8 @@ video-konverter/app/cfg/
.DS_Store .DS_Store
Thumbs.db Thumbs.db
# Tizen Studio Workspace
workspace/
# Claude # Claude
.claude/ .claude/

View file

@ -4,7 +4,7 @@ Die VideoKonverter TV-App auf einem Samsung Smart TV (Tizen) installieren.
## Voraussetzungen ## Voraussetzungen
- Samsung Smart TV mit Tizen OS (ab 2017) - Samsung Smart TV mit Tizen OS (ab 2017, getestet: Tizen 9.0)
- PC und TV im gleichen Netzwerk - PC und TV im gleichen Netzwerk
- Samsung Developer Account (kostenlos): https://developer.samsung.com/ - Samsung Developer Account (kostenlos): https://developer.samsung.com/
- Tizen Studio auf dem PC - Tizen Studio auf dem PC
@ -20,105 +20,131 @@ Download: https://developer.tizen.org/development/tizen-studio/download
chmod +x web-ide_Tizen_Studio_*.bin chmod +x web-ide_Tizen_Studio_*.bin
./web-ide_Tizen_Studio_*.bin ./web-ide_Tizen_Studio_*.bin
# Nach Installation: Tools liegen unter ~/tizen-studio/ # Nach Installation: Package Manager CLI nutzen
# Package Manager oeffnen und installieren: ~/tizen-studio/package-manager/package-manager-cli.bin install \
# - Tizen SDK Tools --accept-license cert-add-on TV-SAMSUNG-Public
# - Samsung TV Extensions (Extension SDK Tab)
# - Samsung Certificate Extension (Extension SDK Tab) # WICHTIG auf Manjaro/Arch: Fake-dpkg Wrapper anlegen
# (Tizen PM prueft dpkg Pakete die auf Arch nicht existieren)
mkdir -p /tmp/fake-dpkg
cat > /tmp/fake-dpkg/dpkg << 'EOF'
#!/bin/bash
if [[ "$*" == *"-l"* ]] || [[ "$*" == *"--list"* ]] || [[ "$*" == *"-s"* ]]; then
for pkg in "$@"; do
[[ "$pkg" != -* ]] && echo "ii $pkg 99.0 amd64 Fake"
done
fi
exit 0
EOF
chmod +x /tmp/fake-dpkg/dpkg
# Dann mit PATH="/tmp/fake-dpkg:$PATH" den Package Manager starten
``` ```
### Wichtige Pfade nach Installation ### Wichtige Pfade nach Installation
``` ```
~/tizen-studio/tools/sdb # Smart Development Bridge (wie adb) ~/tizen-studio/tools/sdb # Smart Development Bridge
~/tizen-studio/tools/ide/bin/tizen # CLI-Tool ~/tizen-studio/tools/ide/bin/tizen # CLI-Tool
~/tizen-studio/ide/TizenStudio # IDE starten ~/tizen-studio/tools/certificate-manager/certificate-manager # Certificate Manager GUI
``` ```
## Schritt 2: Samsung Developer Zertifikat erstellen ## Schritt 2: Samsung Developer Zertifikat erstellen
Das Zertifikat signiert die App fuer deinen TV. Ohne Zertifikat verweigert der TV die Installation. Das Zertifikat signiert die App fuer den TV. Samsung TVs akzeptieren NUR Samsung-signierte
Zertifikate (nicht Standard-Tizen!).
1. Tizen Studio IDE starten ### Voraussetzung: Samsung Certificate Extension installieren
2. **Tools > Certificate Manager** oeffnen
3. **"+" klicken** > **Samsung** waehlen (nicht Tizen!) ```bash
4. **TV** als Geraetetyp waehlen # MUSS installiert sein, sonst erscheint "Samsung" nicht als Option!
5. Samsung Developer Account Daten eingeben PATH="/tmp/fake-dpkg:$PATH" ~/tizen-studio/package-manager/package-manager-cli.bin \
6. Zertifikat wird erstellt und gespeichert install --accept-license cert-add-on
```
### Zertifikat erstellen (Certificate Manager GUI)
1. Certificate Manager starten: `~/tizen-studio/tools/certificate-manager/certificate-manager`
2. **"+" klicken** > **Samsung** waehlen (NICHT Tizen!)
3. **TV** als Geraetetyp waehlen
4. Author-Zertifikat: Key Filename + Author Name eingeben
5. Samsung Developer Account einloggen
6. Distributor-Zertifikat: DUID des TVs eintragen (siehe Schritt 3)
7. **Finish** - Zertifikat wird unter `~/SamsungCertificate/<Profilname>/` gespeichert
**WICHTIG:** Zertifikat sichern! Bei App-Updates muss das gleiche Zertifikat verwendet werden. **WICHTIG:** Zertifikat sichern! Bei App-Updates muss das gleiche Zertifikat verwendet werden.
Backup liegt in `tizen-app/certs/`.
## Schritt 3: TV vorbereiten (Developer Mode) ## Schritt 3: TV vorbereiten (Developer Mode)
### Ueber TV-Menue
1. TV einschalten 1. TV einschalten
2. **Apps** oeffnen (Home > Apps) 2. **Apps** oeffnen (Home > Apps)
3. Im Apps-Bereich die Ziffern **12345** eingeben (bei neueren Fernbedienungen evtl. ueber das virtuelle Nummernfeld) 3. Ziffern **12345** eingeben (virtuelles Nummernfeld bei neueren Fernbedienungen)
4. Developer Mode **ON** schalten 4. Developer Mode **ON** schalten
5. **Host PC IP** eingeben (IP des PCs mit Tizen Studio) 5. **Host PC IP** eingeben (IP des PCs mit Tizen Studio)
6. TV neustarten 6. **TV neustarten** (wichtig!)
### Alternative (neuere TVs ab 2024/Tizen 8) ### DUID auslesen (fuer Zertifikat)
Falls der 12345-Trick nicht funktioniert: ```bash
- **Einstellungen > Allgemein > System-Manager** nach Developer Mode suchen # Erst TV verbinden (Schritt 4), dann:
- Oder direkt ueber Tizen Studio Device Manager verbinden (siehe Schritt 4) ~/tizen-studio/tools/sdb shell 0 getduid
# Gibt z.B. zurueck: KLCDNTGIJS4OU
```
## Schritt 4: TV verbinden ## Schritt 4: TV verbinden
1. **TV-IP herausfinden:** TV > Einstellungen > Allgemein > Netzwerk > IP-Adresse
2. In Tizen Studio: **Tools > Device Manager** oeffnen
3. **Remote Device Manager** > TV-IP eingeben > Verbinden
4. TV sollte in der Geraete-Liste erscheinen
5. **Rechtsklick auf TV > "Permit to install applications"**
### Oder per Kommandozeile
```bash ```bash
# Verbinden # Verbinden (Port 26101 muss offen sein)
~/tizen-studio/tools/sdb connect <TV-IP> ~/tizen-studio/tools/sdb connect <TV-IP>
# Pruefen # Pruefen
~/tizen-studio/tools/sdb devices ~/tizen-studio/tools/sdb devices
# Zeigt: <IP>:26101 device <TV-Modell>
``` ```
## Schritt 5: App installieren Falls Verbindung fehlschlaegt:
- Developer Mode aktiviert? PC-IP korrekt eingegeben?
- TV nach Aenderung des Developer Mode neugestartet?
- Port 26101 in Firewall offen?
### Option A: Ueber Tizen Studio IDE (empfohlen) ## Schritt 5: WGT bauen und installieren
1. Device Manager: TV ist verbunden ### WGT mit Samsung-Zertifikat signieren
2. **Rechtsklick auf TV > "Install app"**
3. `VideoKonverter.wgt` auswaehlen
4. Installation laeuft automatisch
### Option B: Per Kommandozeile
```bash ```bash
cd /pfad/zu/tizen-app/ # Sauberes Build-Verzeichnis erstellen (nur App-Dateien!)
~/tizen-studio/tools/ide/bin/tizen install -n VideoKonverter.wgt -t <TV-Name> mkdir -p /tmp/tizen-build
cp tizen-app/config.xml tizen-app/index.html tizen-app/icon.png /tmp/tizen-build/
# WGT mit Samsung Security Profile signieren
cd /tmp/tizen-build
~/tizen-studio/tools/ide/bin/tizen package -t wgt -s <Profilname> -- /tmp/tizen-build/
``` ```
Der TV-Name wird mit `sdb devices` angezeigt. ### Auf TV installieren
### Option C: Docker (ohne Tizen Studio)
Falls Tizen Studio zu aufwaendig ist - das Georift Docker-Image hat alles drin:
```bash ```bash
# Generisches WGT installieren (ohne Tizen Studio auf dem PC) # TV-Name mit sdb devices ermitteln
docker run --rm -v $(pwd):/app georift/install-jellyfin-tizen \ ~/tizen-studio/tools/ide/bin/tizen install -n /tmp/tizen-build/VideoKonverter.wgt -t <TV-Name>
<TV-IP> --wgt /app/VideoKonverter.wgt
``` ```
Siehe: https://github.com/Georift/install-jellyfin-tizen Erfolgreiche Ausgabe:
```
Tizen application is successfully installed.
```
### App deinstallieren (falls noetig)
```bash
~/tizen-studio/tools/sdb shell 0 vd_appuninstall vkTVApp001.VideoKonverter
```
## Schritt 6: App starten ## Schritt 6: App starten
1. App erscheint als **"VideoKonverter"** im Apps-Menue des TVs 1. App erscheint als **"VideoKonverter"** im Apps-Menue des TVs
2. Beim **ersten Start**: Server-IP eingeben (z.B. `192.168.155.12:8080`) 2. Beim **ersten Start**: Server-IP eingeben (z.B. `192.168.155.12:8080`)
3. Die IP wird gespeichert - beim naechsten Start verbindet die App automatisch 3. Die IP wird gespeichert - beim naechsten Start verbindet die App automatisch
4. Login mit TV-App Benutzerdaten (erstellt in der Admin-Oberflaeche) 4. Login mit TV-App Benutzerdaten (erstellt in der Admin-Oberflaeche unter `/admin`)
## Wie funktioniert die App? ## Wie funktioniert die App?
@ -133,25 +159,37 @@ Die App auf dem TV muss NICHT neu installiert werden.
## Fehlerbehebung ## Fehlerbehebung
### "Invalid certificate chain" bei Installation
- **Haeufigster Fehler!** Samsung TVs akzeptieren NUR Samsung-signierte Zertifikate
- Im Certificate Manager: "Samsung" waehlen, NICHT "Tizen"
- Samsung Certificate Extension (`cert-add-on`) muss installiert sein
### TV wird nicht gefunden ### TV wird nicht gefunden
- Sind PC und TV im gleichen Netzwerk/VLAN? - Sind PC und TV im gleichen Netzwerk/VLAN?
- Ist Developer Mode auf dem TV aktiviert? - Ist Developer Mode auf dem TV aktiviert + TV neugestartet?
- Firewall auf dem PC deaktiviert/Port 26101 offen? - Firewall auf dem PC: Port 26101 offen?
### Installation schlaegt fehl ### Video startet langsam / nicht
- Zertifikat korrekt erstellt? (Samsung, nicht Tizen) - Server laeuft? `curl http://<Server-IP>:8080/tv/`
- "Permit to install applications" ausgefuehrt? - AV1-Videos brauchen einen TV mit AV1-Unterstuetzung (ab ~2020)
- Alte Version erst deinstallieren: `sdb shell 0 vd_appuninstall vkTVApp001.VideoKonverter` - Streaming nutzt fragmented MP4 (`frag_keyframe+empty_moov+default_base_moof`)
### App startet nicht / weisser Bildschirm ### App startet nicht / weisser Bildschirm
- Server laeuft? `curl http://<Server-IP>:8080/tv/` - Richtige Server-IP eingegeben?
- Richtige IP eingegeben? - Browser-Cache leeren: App deinstallieren und neu installieren
- Browser-Cache auf TV leeren: App deinstallieren und neu installieren
## Getestete Konfiguration
| Komponente | Version |
|-----------|---------|
| Samsung TV | GQ65Q7FAAUXZG (Tizen 9.0) |
| Tizen Studio | 6.0+ |
| sdb | 4.2.36 |
| tizen CLI | 2.5.25 |
| Host OS | Manjaro Linux (KDE) |
## Links ## Links
- Samsung Developer Portal: https://developer.samsung.com/smarttv/develop - Samsung Developer Portal: https://developer.samsung.com/smarttv/develop
- Tizen Studio Download: https://developer.tizen.org/development/tizen-studio/download - Tizen Studio Download: https://developer.tizen.org/development/tizen-studio/download
- Samsung TV Quick-Start Guide: https://developer.samsung.com/smarttv/develop/getting-started/quick-start-guide.html - Samsung TV Quick-Start Guide: https://developer.samsung.com/smarttv/develop/getting-started/quick-start-guide.html
- Jellyfin Tizen (aehnliches Projekt): https://github.com/jellyfin/jellyfin-tizen
- Samsung-Jellyfin-Installer (GUI): https://github.com/Jellyfin2Samsung/Samsung-Jellyfin-Installer

Binary file not shown.

View file

@ -0,0 +1,27 @@
-----BEGIN CERTIFICATE-----
MIIEfTCCAmWgAwIBAgIIV7LKnb5BWxEwDQYJKoZIhvcNAQELBQAwgZIxCzAJBgNV
BAYTAktSMRowGAYDVQQIDBFSZXB1YmxpYyBvZiBLb3JlYTETMBEGA1UEBwwKU3V3
b24gQ2l0eTEmMCQGA1UECgwdU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4x
CzAJBgNVBAsMAlZEMR0wGwYDVQQDDBRTYW1zdW5nIFZEIEF1dGhvciBDQTAeFw0y
NjAyMjgyMTEwMDhaFw0yNzAyMjgyMTEwMDhaME4xCTAHBgNVBAYTADEJMAcGA1UE
CBMAMQkwBwYDVQQHEwAxCTAHBgNVBAoTADEJMAcGA1UECxMAMRUwEwYDVQQDEwxF
ZHVhcmQgV2lzY2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCPuf5J
A+94c9QTqtm8rF6zPOCRjXZGZ+CoZLaJ1NMWLEwyTasEf08qkbiwzlmH3EAlyh4e
EmEBTqb5n6wCaakUtxwBYOb79yFSpoUU254XhjNilRW6F4x0loY+l6SaDpfkRjMx
PSLUZn2wXOXsVIgH39EFK3V1098hS5dBU++eBKhGFabvXo6cwC8a/f7CaE6JFZxe
v+F2zZW4nYWEAl6QTrgBWrGrzZQHbGjID8ZOcx/I2xQP0yD2oNsxMxWppUxCJjZS
k97hRA+XN/j1AVIRokXJDcOfifsNMNp6y0HV029X+57KN/zlGzZBJIXaRqqQS5JW
gHH9Oyn210Cj9iylAgMBAAGjGjAYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgeAMA0G
CSqGSIb3DQEBCwUAA4ICAQBfaijH6HNNoUEBxXgGX6cxhoyVwhRQHIdkjBvmSi3G
Yf9E3agFM2SFo/TiFgQzEssiQiXabHKiYohUlDxjGp88UqilMyVflq54Uzw7EpBM
XxHlxTWIMdnUWXTRBbbxSFnvcde2dcH2hFk5TeiddaXOwcvErl6ewDytkBgL/MVT
zqUoiN7ATMwx1R3D5Kp7sog14UwkiKHLOdven+leURhRkl6rxJ9dD5X1ETisXhF5
QFazYXm/Hm3cAMfzqZVZGAXn0YZg2cP+iwroFGXxXONDaJAYNleUXZvZqhfXIN81
zqeIVL2fotl8pUiLkTihbBjd1bvzK+aAHPHeJHKbBBjGfH6l5d5d5xj9RU7o92bv
CiUe+lwN4IBcox8w1zFPqGv/8MFwcK/hoNh001rsAOoU3PQPag/7cvReqaKHbNNr
b8wUAlieTZktyrs4Ey9bd0eSJer5YfyLuQi1CiiLRcth2h5O9Xj4UEZfFE1DoIiQ
S1d/HQ1+MyFd2RszNqLqORL0PfgT909GSN+g0FIO/4uOvJUikAnhNT1QD62p6DvS
XJtlDE2KeYEzwoAxpX7RDf8AXuvFe9VG2rrmGJjXu+iPv6ez3+TnrXnUovxeoJZw
avbvaMDa93lcnTqzxhzXmJAC9kN+6L0ocN+XZIanxEABXm7+cOLkjRNRjg6n9unB
jQ==
-----END CERTIFICATE-----

BIN
tizen-app/certs/author.p12 Normal file

Binary file not shown.

View file

@ -0,0 +1,28 @@
-----BEGIN CERTIFICATE-----
MIIEyjCCArKgAwIBAgIIHZzx6svX/q0wDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNV
BAYTAktSMRQwEgYDVQQIDAtTb3V0aCBLb3JlYTEOMAwGA1UEBwwFU3V3b24xJjAk
BgNVBAoMHVNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuMQswCQYDVQQLDAJW
RDElMCMGA1UEAwwcVkQgREVWRUxPUEVSIFB1YmxpYyBDQSBDbGFzczAeFw0yNjAy
MjgyMTExMzJaFw0yNzAyMjgyMTExMzJaMHMxETAPBgNVBAMMCFRpemVuU0RLMQkw
BwYDVQQLDAAxCTAHBgNVBAoMADEJMAcGA1UEBwwAMQkwBwYDVQQIDAAxCTAHBgNV
BAYTADEnMCUGCSqGSIb3DQEJARYYZGF0YUBkYXRhLWl0LXNvbHV0aW9uLmRlMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsIsx/nP0lNgrK5726AEUxgeo
Qjc4K/O6QvdGdquoGKUgy+cLVVF4COKNPM/PrcEFI36yXH8fAoSmd0+6QGRi8VB4
ZUhJDiuSEy8GD+VXEPB3sFKl4sR0AtD8K5nEaioegE6ldJmLYtROysgFAsFLWv9I
L00OkMSDR5+mxtbT9wf2XJG8q+GToGJ0/UBEp/AMkfZ6M8DdhUZRFlfsASfRuOfa
aQ2joKqDR7Lq4mZdU1esJfN2HsuCBdT4e104QZOtelMW10f8KarWV8nFIkDIsq+B
3Y1zbinH/gYNwOrzqwnH7KgiBvjRc+KCfuFd5BUaV/6igl7dEluFb1zWoFNKrQID
AQABo0UwQzBBBgNVHREEOjA4hhRVUk46dGl6ZW46cGFja2FnZWlkPYYgVVJOOnRp
emVuOmRldmljZWlkPUtMQ0ROVEdJSlM0T1UwDQYJKoZIhvcNAQELBQADggIBAA8D
l3Unyxt/a0xv6Rq1FPvBdMhj4KtFDm18Rd+b6966Dun6VTEwSzbmywewZqcM2rNt
qB91AHUegVoRg0bCEBLA8mwqIPCvnSf/BuX7xtUpvdFVrF4EzgbryAT3HOfAphZ3
lftMOD+NreXjpp2NGgZ7GeqYzwDZFK1kvhGzIix1lozA+q111+kNuZ87HGVgO1z2
0MPtR9AxwCCNWZV9t/mNNWSuvyrUwkCMy4hwSYzWp0Q09g5MZdgaqvv0GE8cB1hO
85EKEqY64RHZlAUTIKNlm2veGRWMoHIooBa3kdAjB+GK9Krv+delcOvzeb5Ys9Xq
C58ouFD5VPovt0CfLJ8E1MOcwrCjdm0GYw5pyi1i8yVqwjQa6F60DEhQoWtF7XPo
IRRsHcZXNQCzTwVm3Xa71VR3JQL7RM6QRoOiUdaQh2hs5HqwgdsT/gFqThp/bMFZ
fSM5RZ+TqLbdXO9FWK7XsnIz3dlJdBjw/RCRpO94gjTWL+Adb9bzcAFULv8dMjKF
+9eSE81uFyaEuuyRhkBlw7f2RsUbpDeywuoXbCNv0FJO8buWRcPTjSeHLbSfyajN
T0MKY5L/68joIKByjd6e1npM4OLdZ6mq+wL8HIeISCcpJv2yZxjDLN8tVn6mX9ZC
IDvpfiuZx37W72DPJViYIXkcroSK1m9w6wIIoyg8
-----END CERTIFICATE-----

Binary file not shown.

View file

@ -1359,16 +1359,22 @@ def setup_library_routes(app: web.Application, config: Config,
seek_sec = float(request.query.get("t", "0")) seek_sec = float(request.query.get("t", "0"))
# ffmpeg-Kommando: Video copy, Audio -> AAC Stereo, MP4-Container # ffmpeg-Kommando: Video copy, Audio -> AAC Stereo, MP4-Container
# frag_keyframe: Fragment bei jedem Keyframe
# empty_moov: Leerer moov-Atom am Anfang (noetig fuer pipe)
# default_base_moof: Bessere Browser-Kompatibilitaet (Samsung TV etc.)
# frag_duration: Kleine Fragmente fuer schnellen Playback-Start
cmd = [ cmd = [
"ffmpeg", "-hide_banner", "-loglevel", "error", "ffmpeg", "-hide_banner", "-loglevel", "error",
] ]
if seek_sec > 0: if seek_sec > 0:
# -ss VOR -i fuer schnelles Seeking (Input-Seeking)
cmd += ["-ss", str(seek_sec)] cmd += ["-ss", str(seek_sec)]
cmd += [ cmd += [
"-i", file_path, "-i", file_path,
"-c:v", "copy", "-c:v", "copy",
"-c:a", "aac", "-ac", "2", "-b:a", "192k", "-c:a", "aac", "-ac", "2", "-b:a", "192k",
"-movflags", "frag_keyframe+empty_moov+faststart", "-movflags", "frag_keyframe+empty_moov+default_base_moof",
"-frag_duration", "1000000",
"-f", "mp4", "-f", "mp4",
"pipe:1", "pipe:1",
] ]