AMS

Min Samsung Q60C: native launcher, medier og privatliv

Fra web-launcher til native Quiet Home: apps, mediarækker, fjernbetjening, privacy og automatisk root ved opstart. Med kildekode, kommandoer og gendannelse.

Jeg ville have en hurtig startskærm med de apps og medier, jeg faktisk bruger. Denne guide erstatter min tidligere beskrivelse af en web-launcher med trampolin. Her er den native løsning, hvad der blev ændret på TV’et, hvordan forbindelsen virker, og hvordan jeg kan gendanne det hele.

Kildekode og den fulde manuelle procedure: AnthonMS/samsung-tv-launcher. Brug manualen som kommandoreference og læs kompatibilitetsafsnittet først.

Hvad jeg har nu

Jeg har erstattet Samsungs startskærm med en native launcher bygget videre på quiet-tizen. Den åbner direkte på Home og ved opstart. Den gamle web-launcher og dens trampolin-app er ikke længere nødvendige i den daglige opsætning.

Nederst ligger en dock med apps og HDMI-indgange. Ovenover ligger YouTube-anbefalinger, Fortsæt med at se/Næste afsnit og livekanaler fra min Jellyfin-server. Moonfin står for min medieafspilning. Rækker, apps, rækkefølge, tema og ur kan tilpasses.

Netflix-, TV Plus-, Disney+- og Prime Video-knapperne virker som mine egne genveje, også inde i andre apps. Kanalvippen skifter mellem Moonfin-kanaler med wraparound, og midtertryk åbner programguiden.

Detaljer og kommandoer i repoet

Det gælder min model og firmware

Mit TV er en Q60C fra 2023, model TQ65Q60CAUXXC, med firmware T-NKLCDEUC-0090-2220.4, Tizen 9 og .NET 6.0.9 på ARMv7. Det oprindelige quiet-tizen-projekt beskrev en anden model. Derfor kontrollerede jeg mine egne pakker, API’er, rettigheder og databasefelter først.

Det her er en dokumenteret installation på ét konkret TV. En anden Samsung med Tizen 9 er ikke automatisk kompatibel. Læs softwareversionen under Settings, Support, About This TV. På min model kunne jeg også kontrollere versionen i /etc/prd_info.ini. Et root-probe alene siger ikke, at resten passer.

Repoet har både den nye Q60C-guide og tydeligt markeret upstream-materiale. Brug ikke U8000F-profilen på en Q60C. Stop og undersøg forskellene, hvis modellen, firmwaren, pakkerne eller runtime ikke matcher.

Detaljer og kommandoer i repoet

Hent koden og gør computeren klar

Jeg bruger Tizen Studios Samsung SDB, Python 3.12, .NET SDK 8, Node.js til test, Git og OpenSSL. Git for Windows leverer OpenSSL i eksemplerne. Alle kommandoer herunder køres fra repoets rod på computeren, medmindre jeg udtrykkeligt skriver TV-script.

Erstat YOUR_TV_IP og YOUR_PC_IP med adresserne på dit eget netværk. Hjælperen vælger kun den adresse, du giver den. Den scanner ikke efter andre TV. Funktionen tv gør blot de lange kommandoer kortere.

Jeg gemmer personlige konfigurationer, legitimationsoplysninger, backupfiler og udtrukne Samsung-filer i .local. De er gitignored. Offentlige eksempler indeholder ikke mine tokens, certifikater eller databaser.

git clone https://github.com/AnthonMS/samsung-tv-launcher.git
cd samsung-tv-launcher
$env:SDB = "$env:USERPROFILE\tizen-studio\tools\sdb.exe"
$env:PATH = "C:\Program Files\Git\usr\bin;$env:PATH"
$env:TV_IP = 'YOUR_TV_IP'
$env:PC_IP = 'YOUR_PC_IP'
function tv { py -3.12 tools/device.py --tv $env:TV_IP --pc $env:PC_IP @args }
py -3.12 quiet-tizen/tools/build.py payloads

Detaljer og kommandoer i repoet

Developer Mode og første root-kontrol

Åbn Apps på TV’et, tast 1 2 3 4 5, slå Developer Mode til og indtast computerens LAN-adresse som Host PC IP. Lav derefter en rigtig genstart. Et almindeligt sluk/tænd med fjernbetjeningen kan blot være standby.

På dette tidspunkt skal adressen være computerens, ikke 127.0.0.1. Localhost kommer først senere, hvis du vælger automatisk root ved opstart.

Probe bruger den eksisterende archive-root-metode og kontrollerer UID 0, runtime, oprydning og de beskyttede filer. Den ændrer ikke Home alene. Root skal kunne gennemføres, før pakkerne kan ændres. Hvis den fejler, er løsningen ikke at slukke sikkerhedssystemerne eller tvinge en anden models profil.

& $env:SDB connect "$($env:TV_IP):26101"
tv probe

Detaljer og kommandoer i repoet

Registrer originalerne før noget ændres

Jeg gemmer appoversigt, manifester, ejere, filrettigheder, SMACK-labels, kørende services og de oprindelige Home-værdier. Der er tre Home-oplysninger: main-operationens app, db/appfw/home_appid og db/appfw/startup_appid.

SQLite-backups laves med .backup, ikke ved at kopiere en aktiv database med cp. Originale assemblies, ressourcer og eventuelle native-image-caches gemmes både på TV’et og computeren. Jeg skriver den konkrete inverse operation, før jeg installerer noget.

Manualen indeholder hele TV-scriptet og kommandoerne til at hente backupen. Root-kommandoer køres sekventielt gennem tv exec. Vent altid på, at oprydningen er færdig, før du genstarter eller sætter TV’et i standby.

# Save the reviewed TV script from docs/MANUAL.md first.
tv exec .local/snapshot.sh
tv pull /home/owner/share/tmp/sdk_tools/native-01-backup.tar.gz .local/backups/native-01.tar.gz

Detaljer og kommandoer i repoet

Byg den native launcher

Launcheren er nu .NET/NUI frem for en webside. Jeg bruger Bixby Promotion-pakkens eksisterende plads til mit eget IL-program. Det er en ændring i en systempakke på skrivbar lagring, ikke en ny firmware eller et nyt styresystem.

Der skal bygges mod matchende Tizen-assemblies fra din egen tilladte SDK/TV-installation. Repoet distribuerer ikke Samsungs binære filer. Henteværktøjet bruger små base64-blokke og kontrollerer størrelse og SHA256; sdb pull var ikke tilgængelig på denne model.

Kopiér katalog- og klienteksempler til private lokale filer. Brug app-id’erne fra netop dit TV. YouTube kræver en kompatibel klientkonfiguration, du må bruge. Hemmelighederne skal ikke ligge i Git, selv om den færdige private installationspakke har brug for dem.

$refs = 'Tizen.dll','Tizen.NUI.dll','Tizen.System.dll','Tizen.Applications.Common.dll','Tizen.Applications.Service.dll'
foreach ($name in $refs) {
  tv pull "/usr/share/dotnet.tizen/framework/$name" "quiet-tizen/.local/tv-framework/$name"
}
py -3.12 quiet-tizen/tools/build.py launcher

Detaljer og kommandoer i repoet

Prøv den før Home ændres

Jeg installerer først uden at ændre standard-Home. Kun den berørte app stoppes. Den nye assembly kopieres med den observerede ejer, filtilstand og SMACK-label, og de nye ressourcer lægges i quiet-home-mappen. Installationsscriptet og metadata er beskrevet fuldt i manualen.

På TV’et kontrollerer jeg billede, tekst, pile, OK, Back, appstart, lyd og adgang til Samsungs native indstillinger. HDMI skal testes med en faktisk tilsluttet enhed. En statusfil eller en vellykket API-retur er ikke nok til at bevise, at skærmen virker.

Først efter at den synlige prøve er god, peger main-operationen, Home og startup på com.samsung.tv.bixby-promotion. Derefter tester jeg Home inde fra en anden app, fuld genstart og standby/vækning hver for sig.

# After backup, trial installation and physical verification:
tv exec .local/assign-home.sh

Detaljer og kommandoer i repoet

Tilpas dock, navigation og udseende

Hold OK på en dock-flise for at redigere, eller vælg Customize app row i Settings. Fliserne vipper. OK tager fat i en flise, venstre/højre flytter den, og op skifter synlighed. Skjulte fliser er dæmpede under redigering. Back afslutter.

HDMI-indgangene er fliser med tal og gradienter. De er ikke låst til en Nintendo- eller PlayStation-tegning. Hvis TV’et leverer et enhedsnavn, kan det vises efter HDMI-navnet. Lang tekst ruller. Det er visningslogik, ikke automatisk garanti for, at enhver enhed kan identificeres.

De tre cirkler øverst bruges til Home, Apps og Settings. Back følger intern historik i stedet for at hoppe tilbage til en HDMI-kilde. Tema, 12/24-timers ur, dato og datoformat vælges i Settings. Rækkerne forbliver i en sammenhængende liste; fokus ruller kun nok til at vise den valgte række.

Detaljer og kommandoer i repoet

YouTube-kode og Jellyfin Quick Connect

YouTube-rækken parres på TV’et ved at vælge YouTube account under Settings, YouTube & media. Jeg åbner den viste adresse på telefonen, indtaster koden og godkender kontoen. Afspilningsapp vælges særskilt, så jeg kan bruge YouTube eller TizenTube.

For Jellyfin indtaster jeg serveradressen, vælger Jellyfin account og godkender koden under serverens Profile, Quick Connect. Moonfin/Jellyfin-afspilleren skal også være logget ind. At parre launcheren logger ikke automatisk en anden app ind.

Fortsæt/Næste afsnit og livekanaler kan slås til eller fra. Afspilning kan skiftes mellem Moonfin og Jellyfin. Livekanaler viser kanalnavn og aktuelt program uden en unødvendig varighedsbjælke. At skjule (Geo-blocked) eller opløsning i navnet fjerner ikke en regionsbegrænsning.

Jeg tester mindst to forskellige videoer med en tur til Home imellem. Det fangede en varmstart-fejl, som én vellykket første afspilning ikke viste. En kanal, der også fejler i Moonfins egen guide, skal undersøges på serveren eller kilden.

Detaljer og kommandoer i repoet

Genvejsknapper fra alle apps

Netflix åbner som standard Moonfin, TV Plus åbner Moonfins EPG, Disney+ åbner YouTube og Prime Video åbner Twitch. De fire knapper kan ændres til installerede apps under Remote & controllers. Kanal op/ned følger Moonfins sorterede kanalliste og fortsætter fra den anden ende, når listen slutter.

Det sker med navngivne, eksklusive Wayland-grabs i launcheren. På min firmware krævede det en præcis Cynara-regel for launcherens label, bruger og keygrab-rettighed. Jeg gemte den oprindelige tilstand og en inverse, før reglen blev tilføjet. Jeg gav ikke alle apps generelle systemrettigheder.

EPG og kanalhop bruger en lille versionslåst Moonfin-patch. Koldstart sender en destination via app-control; varmstart bruger en Tizen message port. Fælles request-id undgår dobbelt afspilning. Ukendte Moonfin-bundles afvises af patcheren. Appopdateringer kræver ny kontrol.

tv pull /opt/usr/apps/MoonfinApp/res/wgt/main.js .local/moonfin/original-main.js
tv pull /opt/usr/apps/MoonfinApp/res/wgt/index.html .local/moonfin/original-index.html
py -3.12 quiet-tizen/tools/moonfin_guide_bridge.py .local/moonfin/original-main.js .local/moonfin/original-index.html .local/moonfin/patched

Detaljer og kommandoer i repoet

Hvad der blev slået fra

Jeg slog kendte reklame-, analyse-, ACR-, kontekst- og stemmekomponenter fra samt valgfrie SmartThings-, Health- og Gaming Hub-hjælpere. Det er i alt 47 gennemgåede appregistreringer. Valgfrie funktioner er ikke automatisk malware; jeg bruger dem bare ikke i denne opsætning.

Viewing Information Services, Interest-Based Ads og valgfri Remote Management var allerede fravalgt. Jeg kontrollerede de faktiske consent-rækker og beholdt fravalget. Stemmeaktivering, wakeupless og speech recognition blev sat fra med deres korrekte typer. Kontologin og nødvendige sessionscookies blev bevaret.

Ni verificerede markerfiler dækker ti services. Fire andre services ligger på den skrivebeskyttede systempartition og kræver runtime masks. Jeg ændrede ikke bootloader, firmware, Samsungs globale passwd/key-filer eller generelle sikkerhedssystemer.

ACR over HDMI er dokumenteret i forskning, men det beviser ikke en bestemt billedfrekvens eller konkrete datasalg på mit TV. Jeg kan kontrollere kendte processer, indstillinger og netværksgrænser; jeg kan ikke udstede et nul-telemetri-certifikat for lukket firmware. Softwarekontrol beviser heller ikke, at en mikrofon er elektrisk afbrudt.

# Review one group from YOUR fresh snapshot before applying it.
py -3.12 quiet-tizen/tools/plan_cleanup.py --snapshot .local/privacy/.pkgmgr_parser.db --profile quiet-tizen/profiles/tq65q60cau-2220.4.json --groups ads_analytics --output quiet-tizen/.local/plans/ads
tv exec quiet-tizen/.local/plans/ads/apply.sh
tv exec recipes/mask-runtime.sh

Detaljer og kommandoer i repoet

Så blokeringerne overlever genstart

Runtime masks i /run forsvinder ved en fuld genstart. Derfor installerede jeg en separat, headless opstartshjælper i den ubrugte Gaming Hub Service-plads. Den får root via TV’ets egen localhost-SDB, genanvender de fire masks og afslutter. Launcheren er en anden app og skal ikke vente på et root-vindue.

Jeg testede først kæden med en midlertidig PC-relay, mens computerens normale developer-adresse stadig virkede. Hjælperen viste UID 0-bevis og de faktiske maskerede, inaktive services. Først derefter aktiverede jeg on-boot i manifest og registrering og fjernede test-endpointet.

Pakken bygges privat. En lokal signeringsnøgle og en tilfældig bridge-token skal blive i .local. Builderen installerer intet på TV’et alene. Arkivets SHA256 bruges ved installationen, og originalerne samt restore-script skal hentes, før du fortsætter.

tv pull /opt/usr/apps/com.samsung.tv.ghservice/tizen-manifest.xml .local/boot/original-manifest.xml
py -3.12 tools/prepare_boot.py --manifest .local/boot/original-manifest.xml --test-host $env:PC_IP
tv push .local/boot/boot-package.tar.gz /home/owner/share/tmp/sdk_tools/boot-package.tar.gz
tv exec recipes/install-boot-test.sh boot-01 EXPECTED_ARCHIVE_SHA256
# Follow the headless test, backup transfer and enable steps in docs/PRIVACY.md.

Detaljer og kommandoer i repoet

Den vigtige ændring i Developer Mode

Efter en vellykket prøve og afsluttet root-oprydning ændres Host PC IP i Developer Mode til 127.0.0.1, og TV’et genstartes helt. Hjælperen kan nu roote lokalt ved hver opstart uden en tændt computer. PC-adgangen går gennem en tokenbeskyttet bridge på port 26103.

PC’ens og TV’ets netværksadresser er ikke blevet ændret. Det er Developer Modes tilladte vært, der er ændret. En normal direkte SDB-forbindelse fra PC’en virker derfor ikke som før. Brug proxyen og hold tokenen privat. Bridge-trafikken er ikke krypteret og hører til på det betroede lokale netværk.

Jeg kontrollerede et nyt kernel boot-id, matchende root-bevis, alle fire masks, de 47 flags, otte knap-grabs og kontoerne. Derefter slukkede jeg med fjernbetjeningen, ventede 30 sekunder og vækkede igen. Quiet Home og blokeringerne var der stadig. Der er stadig en kort opstartsperiode før de fire masks anvendes; fravalg og appblokeringer gælder også i den periode.

# Only AFTER the successful trial, enablement, UI address change and restart:
function tv { py -3.12 tools/device.py --tv $env:TV_IP --pc $env:PC_IP --bridge-token-file .local/boot/bridge.token @args }
tv probe

Detaljer og kommandoer i repoet

Fejlene er også dokumenteret

Jeg gemmer ikke kun den pæne slutversion. Repoets journal forklarer, hvorfor trampolinen blev droppet, hvorfor varm app-control ikke var nok, hvorfor kanalhop gik fra serverkommandoer til Moonfins egne callbacks, og hvorfor en gammel .NET-preloader kunne køre den tidligere DLL efter en filudskiftning.

En særlig vigtig fejl var security-manager-policy-reload --help. Det er et script, der ikke behandler argumentet som almindelig hjælp, og det genindlæste base policies. Der fandtes ikke en snapshot fra lige før, så jeg kan ikke påstå præcis før/efter-lighed. De faktiske privacy-fravalg blev bagefter kontrolleret. Den kommando skal ikke bruges til at spørge om tilladelser.

Der ligger et indeks over alle bevarede operator-scripts og deres registrerede resultater i repoet. De rå, personlige scripts, fejloutput, databaser og signeringsfiler er bevaret lokalt, men offentliggøres ikke. Den offentlige manual viser den gennemgåede slutprocedure med pladsholdere.

Detaljer og kommandoer i repoet

Sådan kommer jeg tilbage igen

Hvis bridge eller boot-root ikke virker efter en inkompatibel firmwareopdatering, åbner jeg Developer Mode på TV’et, sætter Host PC IP tilbage til PC’ens rigtige adresse og genstarter. Så kan jeg igen undersøge TV’et via den almindelige forbindelse.

Boot-persistens, privacy-flags, remote-regel, Moonfin-patch og Home-routing har hver sin inverse. Jeg gendanner kun de felter og filer, den konkrete fase ændrede. Jeg erstatter aldrig en aktiv pakkedatabase med en gammel fuld kopi og rydder ikke kontodata som standardreparation.

Fremover tilføjer jeg én funktion ad gangen, bygger lokalt og tester på TV’et, før den næste kommer til. Det var sådan, jeg kunne opdage, hvis en ændring gjorde launcheren langsommere. Hele kildekoden, manualen, licenserne, testene og journalen ligger i GitHub-repoet.

Detaljer og kommandoer i repoet

Læs også den uafhængige undersøgelse af ACR over HDMI: Watching TV with the Second-Party.

Skal du have en hjemmeside?

Jeg bygger hjemmesider til små firmaer, og jeg passer på dem bagefter. Skriv til mig, så finder vi ud af det.

Skriv til mig
← Alle indlæg