SCM-Dateiformat für Samsung-Programmlisten

Ich habe auf der Arbeit viel mit Samsung-Flatscreens zu tun. Da ist die Funktion ''Senderliste übertragen'' schon echt praktisch. So muss ich nicht bei jedem neuen Gerät, oder wenn der Kunde mal wieder alle Sender gelöscht hat, einen Suchlauf starten und dann tausende Programme sortieren. Allerdings ist das Erstellen von neuen Listen bzw. das Einpflegen von neuen Sendern eine quälerei.
Mit dem inzwischen veröffentlichten Senderlisteneditor ''chlpced'' geht's am PC etwas schneller als mit der Fernbedienung, ist aber immer noch ein ziemlicher Aufwand. Nach einem kompletten Suchlauf muss man ja wieder komplett von vorne anfangen. Im Kabel dann auch noch mit einer alphabetischen Reihenfolge...

Aus diesem Grund habe ich mich mal rangesetzt und versucht das SCM-Dateiformat zu entschlüsseln. Ein erster Einblick mit einem Hex-Editor brachte schonmal was: Die Datei fängt mit ''PK'' an, scheint also eine Zip-Datei zu sein. Schnell entpackt mit 7zip - und siehe da, es stimmt!
Heraus kommen einige weitere Dateien, je nach Modell und vorhandenen Senderlisten (Sat, Kabel, Antenne etc.) unterschiedlich viele. Die Merkmale, die für mich von Belang sind und die ich bisher entziffern konnte, habe ich nachfolgend zusammengefasst.

Die .scm-Datei
--------------

Die eigentliche SCM-Datei ist eine einfache ZIP-Datei mit der Endung .scm.
Sie enthaelt je nach Fernsehermodell leicht unterschiedliche Dateien.
Interessant sind u.A. die folgenden:

map-SateD               : Enthaelt die digitale Satellitenprogrammliste
map-CableD              : Enthaelt die digitale Kabelprogrammliste
ServiceProviders        : Enthaelt die Liste der Programmanbieter
TransponderDataBase.dat : Enthaelt die Transponderliste

Die unterschiedlichen Modellserien arbeiten mit unterschiedlichen Dateiformaten:

 1001  = Serie C
 1101  = Serie D
 1201  = Serie E, F, H



Die Datei "map-SateD"
---------------------

Die Datei enthaelt feste Datensaetze mit einer Laenge von:
 1001  = 144 Bytes
 1101  = 172 Bytes
 1201  = 168 Bytes
Die Anzahl scheint in 1000er-Bloecken festzuliegen, wobei die letzten, nicht
belegten Saetze nur 0x00 enthalten.
Die Bytereihenfolge von Zahlenwerten ist LITTLE ENDIAN, soll heissen dass der
Wert '0x1A2B' als '0x2B1A' gespeichert wird.
Nachfolgend eine Aufschluesselung der mir bisher bekannten Bytepositionen.

BYTE		INHALT
----		------
001-002		Programmplatznummer
003-004		VPID
005-006		PCR
007		0x00=SD, 0x01=HD

014		0x00=frei, 0x01=gesperrt ("locked")
015		0x01=SD, 0x02=Radio, 0x19=HD

017-018		SID
019		Transpondernummer, siehe Datei "TransponderDataBase.dat"

025-026		TSID

037-136		Programmname im UNICODE-Format (100 Bytes = 50 Zeichen)
137		0x00=FTA, 0x01=PayTV

139		Service Provider, siehe Datei "ServiceProviders"

-1		Favoritenplatz. 0x01=1, 0x02=2, 0x04=3, 0x08=4 (0x0C=3+4)
-0		Checksumme

Negative Werte fuer BYTE zaehlen vom Ende des jeweiligen Datensatzes.



Die Datei "map-CableD"
----------------------

Die Datei enthaelt feste Datensaetze mit einer Laenge von:
 1001  = 292 Bytes
 1101  = 320 Bytes
 1201  = 320 Bytes
Die Anzahl scheint in 1000er-Bloecken festzuliegen, wobei die letzten, nicht
belegten Saetze nur 0x00 enthalten.
Die Bytereihenfolge von Zahlenwerten ist LITTLE ENDIAN, soll heissen dass der
Wert '0x1A 0x2B' als '0x2B 0x1A' gespeichert wird.
Nachfolgend eine Aufschluesselung der mir bisher bekannten Bytepositionen.

BYTE		INHALT
----		------
001-002		Programmplatznummer
003-004		VPID
005-006		PCR
007-008		SID

013		Modulation. 0x01=64QAM, 0x02=256QAM

015		0x01=TV, 0x02=Radio

025		0x00=FTA, 0x01=PayTV

029-030		Symbolrate in kS/s

041		Provider

043		Frequenz.
		001=114MHz in 8MHz-Schritten bis 098=890MHz
		099=110MHz in 8MHz-Schritten bis 193=862MHz
		194=113MHz	195=121MHz	196=143MHz
		197=256MHz	198=346MHz

049-050		TSID

065-264		Programmname (100 Zeichen UNICODE = 200 Bytes)
265-282		Kurzname (9 Zeichen UNICODE = 18 Bytes)

-0		Checksumme

Negative Werte fuer BYTE zaehlen vom Ende des jeweiligen Datensatzes.




Die Datei "ServiceProviders"
----------------------------

Die Datei enthaelt feste Datensaetze mit einer Laenge von 108 Bytes.

BYTE		INHALT
----		------

001		0x01=Kabel, 0x03=Satellit, 0x08=Satellit HD

003		Providernummer

005		?

007		Laenge des Providernamens
009-108		Providername im UNICODE-Format (Laenge beachten, Rest ist
                mit undefinierten Zeichen aufgefuellt!)



Die Datei "TransponderDataBase.dat"
-----------------------------------

Die Datei enthaelt feste Datensaetze mit einer Laenge von 45 Bytes, wobei
die ersten vier Bytes separat sind. Dieselben vier Bytes finden sich auch
am Anfang von "SatDataBase.dat" und "UserTransponderDataBase.dat".

Werte in Klammern sind relativ zum Dateianfang, die anderen zum Anfang
des jeweiligen Datensatzes.

BYTE		INHALT
----		------

 001
(005)		Scheinbar immer das Zeichen "U"
 002
(006)		Transpondernummer

 006
(010)		Vermutlich Satellitennummer (siehe "SatDataBase.dat")

 010-013
(014-017)	Frequenz in kHz
 014-017
(018-021)	Symbolrate in kS/s
 018
(022)		0x00=H, 0x01=V



Die Datei "SatDataBase.dat"
---------------------------

Die Datei enthaelt feste Datensaetze mit einer Laenge von 145 Bytes, wobei
die ersten vier Bytes separat sind. Dieselben vier Bytes finden sich auch
am Anfang von "TransponderDataBase.dat" und "UserTransponderDataBase.dat".

Werte in Klammern sind relativ zum Dateianfang, die anderen zum Anfang
des jeweiligen Datensatzes.

BYTE		INHALT
----		------

 001
(005)		Scheinbar immer das Zeichen "U"
 002
(006)		Satellitennummer

 009-136
(013-140)	Satellitenname (64 Zeichen UNICODE = 128 Bytes)

 138
(142)		0x00=Westen, 0x01=Osten




Die Datei "map-ChKey"
---------------------------

Enthaelt vier Bytes, die moeglicherweise die einzelnen Versionen kennzeichnen.
Beim Versuch, eine aktuelle 1201er Liste in eine 1101er zu konvertieren, musste
diese Datei der jeweiligen Version entsprechen, damit die Liste vom Fernseher
korrekt gelesen wurde.

 1001  = Serie C		0x2F 46 0F 00
 1101  = Serie D		0xCC CC 10 00
 1201  = Serie E, F, H		0x6D 53 12 00



Die Datei "CloneInfo"
---------------------------

Enthaelt die Laenderinformation und die Bezeichnung des Geraetes.

BYTE		INHALT
----		------

001-003		Laendercode in LITTLE ENDIAN, 0x00-Terminiert
		"UED " = "DEU" fuer Deutschland
		"RGB " = "GBR" fuer England

005		Geraetebezeichnung, eventuell mit 0x00 aufgefuellt auf 64 Bytes

Damit kann man sich schon mal einen Editor basteln. Meinen habe ich zwar schon seit 2011 im Einsatz, das Ding ist aber immer noch ziemlich im Alpha-Stadium. Deshalb gibt's jetzt auch keinen Source zu sehen :P.