Konwerter napisów SSA na JSON
Albo wklej tekst napisów
Co zmienia ta konwersja
1 rzecz zostaje pominięta albo wymaga decyzji
- Treści specyficzne dla formatu
treść, którą format źródłowy trzyma poza blokami (bloki niebędące napisami, tekst nagłówka, ustawienia pojedynczych bloków, zakomentowane zdarzenia) — format docelowy nie ma dla niej miejsca
Ta lista pochodzi z macierzy możliwości tych dwóch formatów, a nie z konkretnego wczytanego pliku. Konkretny plik może stracić więcej, jeśli używa cech, które format dopuszcza, ale macierz ich nie modeluje.
Ta strona zamienia SSA w JSON. SSA trzyma styl w tabeli [V4 Styles] i w kodach nadpisań; JSON zapisuje te same dane jako obiekt z version, title, styles i cues.
Tabela stylów przechodzi w całości, razem z kolumnami TertiaryColour i AlphaLevel, a wyróżnienia w tekście – kursywa, pogrubienie, podkreślenie – zostają jako znaczniki w tablicy tags. Przepada to, czego JSON nie opisuje: reszta [Script Info], zdarzenia inne niż Dialogue: oraz zawartość [Fonts] i [Graphics].
Pliki można podać hurtowo: kolejka idzie po kolei, można ją przerwać, a wynik wraca jako jeden ZIP. Konwersja odbywa się w przeglądarce.
Przykłady
Typowy plik SSA po konwersji do JSON
Wejście
[Script Info]
Title: Example SSA
ScriptType: v4.00
Collisions: Normal
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: Marked=0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello there.
Dialogue: Marked=0,0:00:05.00,0:00:08.00,Default,,0,0,0,,{\i1}Italic{\i0} line.
Dialogue: Marked=0,0:00:09.00,0:00:12.00,Default,,0,0,0,,Two\Nlines
Wynik
{
"version": 1,
"title": "Example SSA",
"styles": {
"Default": {
"name": "Default",
"Name": "Default",
"Fontname": "Arial",
"Fontsize": "20",
"PrimaryColour": "&H00FFFFFF",
"SecondaryColour": "&H000000FF",
"TertiaryColour": "&H00000000",
"BackColour": "&H00000000",
"Bold": "0",
"Italic": "0",
"BorderStyle": "1",
"Outline": "2",
"Shadow": "2",
"Alignment": "2",
"MarginL": "10",
"MarginR": "10",
"MarginV": "10",
"AlphaLevel": "0",
"Encoding": "1",
"fontFamily": "Arial",
"fontSize": 20,
"primaryColor": "#ffffff",
"bold": false,
"italic": false
}
},
"cues": [
{
"start": 1000,
"end": 4000,
"lines": [
"Hello there."
],
"style": "Default"
},
{
"start": 5000,
"end": 8000,
"lines": [
{
"text": "Italic line.",
"tags": [
{
"kind": "italic",
"start": 0,
"end": 6
}
]
}
],
"style": "Default"
},
{
"start": 9000,
"end": 12000,
"lines": [
"Two",
"lines"
],
"style": "Default"
}
]
}
W tym wyniku odrzucono: resztę [Script Info], zdarzenia inne niż Dialogue: i treści specyficzne dla formatu. Tabela stylów, tekst i czasy są w wyniku.
Ta sama konwersja na trudnym pliku
Wejście
[Script Info]
Title: Dirty SSA
ScriptType: v4.00
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Comment: Marked=0,0:00:00.00,0:00:01.00,Default,,0,0,0,,not a subtitle
Dialogue: Marked=0,0:00:01.00,0:00:04.00,Default,,0,0,0,,{\b1}Bold{\b0} and {\u1}underlined{\u0}.
Dialogue: Marked=0,0:00:05.00,0:00:08.00,Default,,0,0,0,,A soft\nbreak and a {\p1}mystery{\p0} code.Wynik
{
"version": 1,
"title": "Dirty SSA",
"styles": {
"Default": {
"name": "Default",
"Name": "Default",
"Fontname": "Arial",
"Fontsize": "20",
"PrimaryColour": "&H00FFFFFF",
"SecondaryColour": "&H000000FF",
"TertiaryColour": "&H00000000",
"BackColour": "&H00000000",
"Bold": "0",
"Italic": "0",
"BorderStyle": "1",
"Outline": "2",
"Shadow": "2",
"Alignment": "2",
"MarginL": "10",
"MarginR": "10",
"MarginV": "10",
"AlphaLevel": "0",
"Encoding": "1",
"fontFamily": "Arial",
"fontSize": 20,
"primaryColor": "#ffffff",
"bold": false,
"italic": false
}
},
"cues": [
{
"start": 1000,
"end": 4000,
"lines": [
{
"text": "Bold and underlined.",
"tags": [
{
"kind": "bold",
"start": 0,
"end": 4
},
{
"kind": "underline",
"start": 9,
"end": 19
}
]
}
],
"style": "Default"
},
{
"start": 5000,
"end": 8000,
"lines": [
"A soft",
"break and a {\\p1}mystery{\\p0} code."
],
"style": "Default"
}
]
}
Tak wyglądają prawdziwe pliki – mieszane końce wierszy, zbłąkane spacje, puste pola. Porównaj z czystym przykładem powyżej, żeby zobaczyć, co parser wybacza.
Częste pytania
Co z [Script Info], liniami Comment: i osadzonymi fontami, gdy SSA trafia do JSON?
Tytuł przechodzi, a tabela [V4 Styles] również – z każdą kolumną, także TertiaryColour i AlphaLevel, plus odczytany krój, rozmiar, kolor i flagi. JSON nie ma miejsca na resztę [Script Info], na zdarzenia inne niż Dialogue: ani na zawartość [Fonts] i [Graphics]; te rzeczy przepadają.
Jak wygląda wynik, gdy SSA zamienia się w JSON?
Jak obiekt JSON z kluczami version, title, styles i cues; każdy blok SSA staje się obiektem z polami start, end, lines i style, bez pola id.
Czy czasy z SSA są dokładne w pliku JSON?
Tak, co do milisekundy: 0:00:04.13 odpowiada 4130 w JSON, bez zaokrągleń.
Jak w JSON wygląda blok SSA z dwiema liniami?
Jako dwa wpisy w tablicy lines jednego bloku – para zostaje zachowana.
Czy kolejność bloków SSA jest zachowana w JSON?
Tak, po posortowaniu rosnąco po czasie początku; wynik ma porządek osi czasu.
Czy da się zamienić JSON z powrotem na SSA?
Tak, ale JSON do SSA odrzuca precyzję i część pól formatowych, bo JSON nie zna sekcji [Script Info].
Czy wynik JSON zachowuje kodowanie pliku SSA?
Nie – plik JSON powstały z SSA jest w UTF-8 bez BOM, z uniksowymi końcami wierszy; nic nie zależy od kodowania źródła.