mirror of
https://github.com/imrayya/SRTto3Dsubtitles.git
synced 2026-09-21 10:17:27 +02:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 817b476c5f | |||
| 02176d0d7e | |||
| 1c5d2e3934 | |||
| 9b7b8df874 |
@@ -4,19 +4,19 @@ namespace ConvertSRTto3DASS;
|
|||||||
|
|
||||||
internal static class Cli
|
internal static class Cli
|
||||||
{
|
{
|
||||||
public static void Run(string[] args)
|
public static bool Run(string[] args)
|
||||||
{
|
{
|
||||||
if (args.Length == 0 || args[0] is "--help" or "-h" or "/?")
|
if (args.Length == 0 || args[0] is "--help" or "-h" or "/?")
|
||||||
{
|
{
|
||||||
PrintUsage();
|
PrintUsage();
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var inputPath = args[0];
|
var inputPath = args[0];
|
||||||
if (!File.Exists(inputPath))
|
if (!File.Exists(inputPath))
|
||||||
{
|
{
|
||||||
Console.Error.WriteLine($"Input file not found: {inputPath}");
|
Console.Error.WriteLine($"Input file not found: {inputPath}");
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse options
|
// Parse options
|
||||||
@@ -80,7 +80,7 @@ internal static class Cli
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Console.Error.WriteLine($"Unknown argument: {args[i]}");
|
Console.Error.WriteLine($"Unknown argument: {args[i]}");
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@@ -106,11 +106,13 @@ internal static class Cli
|
|||||||
var result = SrtConverter.Convert(options);
|
var result = SrtConverter.Convert(options);
|
||||||
Console.WriteLine($"Parsed: {result.SubtitleCount} subtitle blocks");
|
Console.WriteLine($"Parsed: {result.SubtitleCount} subtitle blocks");
|
||||||
Console.WriteLine("Conversion complete.");
|
Console.WriteLine("Conversion complete.");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.Error.WriteLine($"ERROR: {ex.Message}");
|
Console.Error.WriteLine($"ERROR: {ex.Message}");
|
||||||
Console.Error.WriteLine(ex.ToString());
|
Console.Error.WriteLine(ex.ToString());
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
string GetNextArg(int index) => index + 1 < args.Length ? args[index + 1] : throw new ArgumentException($"Missing value for {args[index]}");
|
string GetNextArg(int index) => index + 1 < args.Length ? args[index + 1] : throw new ArgumentException($"Missing value for {args[index]}");
|
||||||
|
|||||||
@@ -13,6 +13,9 @@
|
|||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
|
<PublishSingleFile>true</PublishSingleFile>
|
||||||
|
<PublishReadyToRun>false</PublishReadyToRun>
|
||||||
|
<StripSymbols>true</StripSymbols>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -2,5 +2,10 @@ namespace ConvertSRTto3DASS;
|
|||||||
|
|
||||||
internal static class Program
|
internal static class Program
|
||||||
{
|
{
|
||||||
static void Main(string[] args) => Cli.Run(args);
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var hadError = Cli.Run(args);
|
||||||
|
if (hadError)
|
||||||
|
Console.ReadLine();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
<RootNamespace>ConvertSRTto3DASS</RootNamespace>
|
<RootNamespace>ConvertSRTto3DASS</RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ public static class SrtConverter
|
|||||||
|
|
||||||
public static ConversionResult Convert(ConversionOptions options)
|
public static ConversionResult Convert(ConversionOptions options)
|
||||||
{
|
{
|
||||||
|
// Register legacy codepage support (needed for CP1252, etc.)
|
||||||
|
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||||||
|
|
||||||
var srtText = ReadSrt(options.InputPath);
|
var srtText = ReadSrt(options.InputPath);
|
||||||
var subtitles = ParseSrt(srtText);
|
var subtitles = ParseSrt(srtText);
|
||||||
var header = CreateHeader(options);
|
var header = CreateHeader(options);
|
||||||
|
|||||||
Generated
+6
-2
@@ -71,11 +71,13 @@ partial class Form1
|
|||||||
Size = new Size(1040, 80)
|
Size = new Size(1040, 80)
|
||||||
};
|
};
|
||||||
label_InputFile = new Label { Text = "Input SRT:", Font = segoe, Location = new Point(15, 25), AutoSize = true };
|
label_InputFile = new Label { Text = "Input SRT:", Font = segoe, Location = new Point(15, 25), AutoSize = true };
|
||||||
textBox_InputFile = new TextBox { Location = new Point(100, 22), Size = new Size(780, 23), ReadOnly = true };
|
textBox_InputFile = new TextBox { Location = new Point(100, 22), Size = new Size(780, 23) };
|
||||||
button_BrowseInput = new Button { Text = "Browse...", Location = new Point(890, 20), Size = new Size(90, 25), Font = segoe, FlatStyle = FlatStyle.Flat };
|
button_BrowseInput = new Button { Text = "Browse...", Location = new Point(890, 20), Size = new Size(90, 25), Font = segoe, FlatStyle = FlatStyle.Flat };
|
||||||
|
button_BrowseInput.Click += button_BrowseInput_Click;
|
||||||
label_OutputFile = new Label { Text = "Output ASS:", Font = segoe, Location = new Point(15, 55), AutoSize = true };
|
label_OutputFile = new Label { Text = "Output ASS:", Font = segoe, Location = new Point(15, 55), AutoSize = true };
|
||||||
textBox_OutputFile = new TextBox { Location = new Point(100, 52), Size = new Size(780, 23), ReadOnly = true };
|
textBox_OutputFile = new TextBox { Location = new Point(100, 52), Size = new Size(780, 23) };
|
||||||
button_BrowseOutput = new Button { Text = "Browse...", Location = new Point(890, 50), Size = new Size(90, 25), Font = segoe, FlatStyle = FlatStyle.Flat };
|
button_BrowseOutput = new Button { Text = "Browse...", Location = new Point(890, 50), Size = new Size(90, 25), Font = segoe, FlatStyle = FlatStyle.Flat };
|
||||||
|
button_BrowseOutput.Click += button_BrowseOutput_Click;
|
||||||
groupBox_File.Controls.AddRange([label_InputFile, textBox_InputFile, button_BrowseInput, label_OutputFile, textBox_OutputFile, button_BrowseOutput]);
|
groupBox_File.Controls.AddRange([label_InputFile, textBox_InputFile, button_BrowseInput, label_OutputFile, textBox_OutputFile, button_BrowseOutput]);
|
||||||
|
|
||||||
// ---- Mode section ----
|
// ---- Mode section ----
|
||||||
@@ -95,6 +97,7 @@ partial class Form1
|
|||||||
DropDownStyle = ComboBoxStyle.DropDownList
|
DropDownStyle = ComboBoxStyle.DropDownList
|
||||||
};
|
};
|
||||||
comboBox_Mode.Items.AddRange(["SBS (Side-by-Side)", "OU (Over-Under)", "RG (Red-Green)"]);
|
comboBox_Mode.Items.AddRange(["SBS (Side-by-Side)", "OU (Over-Under)", "RG (Red-Green)"]);
|
||||||
|
comboBox_Mode.SelectedIndexChanged += comboBox_Mode_SelectedIndexChanged;
|
||||||
groupBox_Mode.Controls.AddRange([label_Mode, comboBox_Mode]);
|
groupBox_Mode.Controls.AddRange([label_Mode, comboBox_Mode]);
|
||||||
|
|
||||||
// ---- Resolution section ----
|
// ---- Resolution section ----
|
||||||
@@ -165,6 +168,7 @@ partial class Form1
|
|||||||
ForeColor = Color.White,
|
ForeColor = Color.White,
|
||||||
FlatAppearance = { BorderSize = 0 }
|
FlatAppearance = { BorderSize = 0 }
|
||||||
};
|
};
|
||||||
|
button_Convert.Click += button_Convert_Click;
|
||||||
|
|
||||||
// ---- Status ----
|
// ---- Status ----
|
||||||
textBox_Status = new TextBox
|
textBox_Status = new TextBox
|
||||||
|
|||||||
@@ -28,19 +28,27 @@ The application runs in two modes — **GUI** (no arguments) and **CLI** (with a
|
|||||||
4. Adjust settings as needed
|
4. Adjust settings as needed
|
||||||
5. Click **Convert**
|
5. Click **Convert**
|
||||||
|
|
||||||
|
> **Note:** The GUI is experimental. Feedback and bug reports are welcome!
|
||||||
|
|
||||||
### Command Line
|
### Command Line
|
||||||
|
|
||||||
Pass any argument to trigger CLI mode:
|
The CLI runs on **Windows, Linux, and macOS**.
|
||||||
|
|
||||||
```
|
#### Drag and drop:
|
||||||
ConvertSRTto3DASS.exe input.srt [options]
|
1. Drag and drop an `.srt` file onto `ConvertSRTto3DASS`
|
||||||
```
|
- Uses default settings (SBS mode, 1280x720)
|
||||||
|
2. The resulting `.ass` file will be saved in the same directory as the `.srt`
|
||||||
|
|
||||||
Or drag and drop an `.srt` file onto the executable.
|
#### Command line:
|
||||||
|
```
|
||||||
|
|
||||||
Available options:
|
ConvertSRTto3DASS.exe input.srt [options]
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Available options:
|
||||||
|
```
|
||||||
|
|
||||||
```
|
|
||||||
--mode sbs|ou|rg 3D mode (default: sbs)
|
--mode sbs|ou|rg 3D mode (default: sbs)
|
||||||
--resx <number> Output width
|
--resx <number> Output width
|
||||||
--resy <number> Output height
|
--resy <number> Output height
|
||||||
@@ -54,21 +62,20 @@ Available options:
|
|||||||
--verticalmargin <number> General vertical margin
|
--verticalmargin <number> General vertical margin
|
||||||
--output <path> Output file path
|
--output <path> Output file path
|
||||||
--help, -h, /? Show help
|
--help, -h, /? Show help
|
||||||
```
|
|
||||||
|
|
||||||
Examples:
|
```
|
||||||
|
|
||||||
```
|
##### Examples:
|
||||||
ConvertSRTto3DASS.exe movie.srt --mode sbs
|
```
|
||||||
ConvertSRTto3DASS.exe movie.srt --mode ou --resx 1920 --resy 1080
|
|
||||||
ConvertSRTto3DASS.exe movie.srt --mode rg --offsetx 6 --bottomoffset 24
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Note:** The GUI is experimental. Feedback and bug reports are welcome!
|
ConvertSRTto3DASS.exe movie.srt --mode sbs
|
||||||
|
ConvertSRTto3DASS.exe movie.srt --mode ou --resx 1920 --resy 1080
|
||||||
|
ConvertSRTto3DASS.exe movie.srt --mode rg --offsetx 6 --bottomoffset 24
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
## Known Issues
|
## Known Issues
|
||||||
|
|
||||||
- Plex Transcoder has issues with the converted subtitles. VLC works correctly.
|
|
||||||
- Subtitle positional data from `.srt` files is stripped during conversion.
|
- Subtitle positional data from `.srt` files is stripped during conversion.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
@@ -83,14 +90,21 @@ ConvertSRTto3DASS.exe movie.srt --mode rg --offsetx 6 --bottomoffset 24
|
|||||||
# Build all projects
|
# Build all projects
|
||||||
dotnet build
|
dotnet build
|
||||||
|
|
||||||
# Publish CLI (cross-platform)
|
# Publish CLI (self-contained)
|
||||||
dotnet publish ConvertSRTto3DASS.Cli -c Release -r linux-x64 --self-contained false -p:PublishSingleFile=true
|
## Linux x64
|
||||||
dotnet publish ConvertSRTto3DASS.Cli -c Release -r osx-x64 --self-contained false -p:PublishSingleFile=true
|
dotnet publish ConvertSRTto3DASS.Cli -c Release -r linux-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
dotnet publish ConvertSRTto3DASS.Cli -c Release -r win-x64 --self-contained false -p:PublishSingleFile=true
|
## OSX x64
|
||||||
|
dotnet publish ConvertSRTto3DASS.Cli -c Release -r osx-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
|
## OSX arm64
|
||||||
|
dotnet publish ConvertSRTto3DASS.Cli -c Release -r osx-arm64 --self-contained false -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
|
## Windows x64
|
||||||
|
dotnet publish ConvertSRTto3DASS.Cli -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
|
|
||||||
# Publish GUI (Windows only)
|
# Publish GUI (Windows x64 only, self-contained)
|
||||||
dotnet publish ConvertSRTto3DASS.Gui -c Release -r win-x64 --self-contained false -p:PublishSingleFile=true
|
dotnet publish ConvertSRTto3DASS.Gui -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
_Each publish produces a single .exe with no .dll sidecars._
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user