Advertisement
scottgalPastes

Subtitle File Translator

Feb 23rd, 2023 (edited)
1,627
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.45 KB | None | 0 0
  1. /*
  2. To run libretranslate: docker run -ti --rm -p 5000:5000 libretranslate/libretranslate:v1.3.8
  3. */
  4. using System.Collections.Concurrent;
  5. using System.Diagnostics;
  6. using System.Net.Http.Json;
  7. using System.Text;
  8. using System.Text.Json;
  9. using ElementTranslator;
  10. using FastDeepCloner;
  11. using SubtitlesParser.Classes;
  12.  
  13. Console.OutputEncoding = Encoding.UTF8;
  14. //This is just a retry handler, you can find it online or just remive he new HttpRetry.... part)
  15. var httpClient = new HttpClient (new HttpRetryMessageHandler(new HttpClientHandler())) { BaseAddress = new Uri("http://localhost:5000"), Timeout = TimeSpan.FromSeconds(30) };
  16. const string sourceFile = @"F:\Its.Always.Sunny.in.Philadelphia.S12E01.1080p.WEB-DL.AAC2.0.H264-RARBG.srt";
  17.  
  18. Dictionary<int, string[]> dict = new();
  19.  
  20. var parser = new SubtitlesParser.Classes.Parsers.SrtParser();
  21. await using var fileStream = File.OpenRead(sourceFile);
  22.     var items = parser.ParseStream(fileStream, Encoding.UTF8);
  23.    
  24.  
  25. var langs = await httpClient.GetFromJsonAsync<Languages[]>("/languages");
  26.  
  27.  
  28. var langList = langs.ToList();
  29. Console.WriteLine("Languages: " + langList.Count);
  30. var paralelOptions2 = new ParallelOptions { MaxDegreeOfParallelism =Environment.ProcessorCount };
  31.  
  32. await Parallel.ForEachAsync(langList, paralelOptions2, async (line, t) =>
  33.     {
  34.         var outItems = new ConcurrentBag<SubtitleItem?>();
  35.        await Parallel.ForEachAsync(items, new ParallelOptions { MaxDegreeOfParallelism = 3 }, async (item, t) =>
  36.         {
  37.             var newItem = item.Clone();
  38.             for (var index = 0; index < item.PlaintextLines.Count; index++)
  39.             {
  40.                 var plainLine = item.PlaintextLines[index];
  41.                 var translated = await TranslateAsync(httpClient, plainLine, "en", line.code);
  42.                 newItem.PlaintextLines[index] = translated;
  43.                 newItem.Lines[index] = translated;
  44.                 Console.WriteLine(item.StartTime + " :: " + line.name + " :: " + plainLine + " :: " + translated);
  45.             }
  46.  
  47.             outItems.Add(newItem);
  48.         });
  49.        
  50.         Console.WriteLine("Starting on language" + langList.IndexOf(line));
  51.         var path = Path.GetDirectoryName(sourceFile);
  52.  
  53.         var filePath = Path.Combine(path, Path.GetFileNameWithoutExtension(sourceFile) + "." + line.code + ".srt");
  54.  
  55.         if (File.Exists(filePath)) return; ;
  56.  
  57.        
  58.         Console.WriteLine("Writing file at " + filePath + " for language" + langList.IndexOf(line));
  59.         var writer = new SubtitlesParser.Classes.Writers.SrtWriter();
  60.         var outList = outItems.OrderBy(x => x.StartTime).ToList();
  61.         using (var fileStream = File.OpenWrite(filePath)) {
  62.             writer.WriteStream(fileStream, outList);
  63.         }
  64.        
  65.     }
  66. );
  67.  
  68.  
  69.  
  70. Console.WriteLine("FINISHED");
  71. Console.ReadLine();
  72.  
  73.  
  74. async Task<string> TranslateAsync(HttpClient client, string test, string sourceLanguage, string targetLanguage)
  75. {
  76.     var urlEncodedContent = new FormUrlEncodedContent(new Dictionary<string, string>
  77.     {
  78.         {
  79.             "q",
  80.             test
  81.         },using System.Collections.Concurrent;
  82. using System.Diagnostics;
  83. using System.Net.Http.Json;
  84. using System.Text;
  85. using System.Text.Json;
  86. using ElementTranslator;
  87. using FastDeepCloner;
  88. using SubtitlesParser.Classes;
  89.  
  90. Console.OutputEncoding = Encoding.UTF8;
  91. var httpClient = new HttpClient (new HttpRetryMessageHandler(new HttpClientHandler())) { BaseAddress = new Uri("http://localhost:5000"), Timeout = TimeSpan.FromSeconds(30) };
  92. const string sourceFile = @"F:\Its.Always.Sunny.in.Philadelphia.S12E01.1080p.WEB-DL.AAC2.0.H264-RARBG.srt";
  93.  
  94. Dictionary<int, string[]> dict = new();
  95.  
  96. var parser = new SubtitlesParser.Classes.Parsers.SrtParser();
  97. await using var fileStream = File.OpenRead(sourceFile);
  98.     var items = parser.ParseStream(fileStream, Encoding.UTF8);
  99.    
  100.  
  101. var langs = await httpClient.GetFromJsonAsync<Languages[]>("/languages");
  102.  
  103.  
  104. var langList = langs.ToList();
  105. Console.WriteLine("Languages: " + langList.Count);
  106. var paralelOptions2 = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount / 4 };
  107.  
  108. await Parallel.ForEachAsync(langList, paralelOptions2, async (line, t) =>
  109.     {
  110.         var path = Path.GetDirectoryName(sourceFile);
  111.  
  112.         var filePath = Path.Combine(path, Path.GetFileNameWithoutExtension(sourceFile) + "." + line.code + ".srt");
  113.  
  114.         if (File.Exists(filePath)) return; ;
  115.         var outItems = new ConcurrentBag<SubtitleItem?>();
  116.        await Parallel.ForEachAsync(items, new ParallelOptions { MaxDegreeOfParallelism = 4}, async (item, t) =>
  117.         {
  118.             var newItem = item.Clone();
  119.             for (var index = 0; index < item.PlaintextLines.Count; index++)
  120.             {
  121.                 var plainLine = item.PlaintextLines[index];
  122.                 var translated = await TranslateAsync(httpClient, plainLine, "en", line.code);
  123.                 newItem.PlaintextLines[index] = translated;
  124.                 newItem.Lines[index] = translated;
  125.                 Console.WriteLine(item.StartTime + " :: " + line.name + " :: " + plainLine + " :: " + translated);
  126.             }
  127.  
  128.             outItems.Add(newItem);
  129.         });
  130.        
  131.         Console.WriteLine("Starting on language" + langList.IndexOf(line));
  132.    
  133.  
  134.        
  135.         Console.WriteLine("Writing file at " + filePath + " for language" + langList.IndexOf(line));
  136.         var writer = new SubtitlesParser.Classes.Writers.SrtWriter();
  137.         var outList = outItems.OrderBy(x => x.StartTime).ToList();
  138.         using (var fileStream = File.OpenWrite(filePath)) {
  139.             writer.WriteStream(fileStream, outList);
  140.         }
  141.        
  142.     }
  143. );
  144.  
  145.  
  146.  
  147. Console.WriteLine("FINISHED");
  148. Console.ReadLine();
  149.  
  150.  
  151. async Task<string> TranslateAsync(HttpClient client, string test, string sourceLanguage, string targetLanguage)
  152. {
  153.     var urlEncodedContent = new FormUrlEncodedContent(new Dictionary<string, string>
  154.     {
  155.         {
  156.             "q",
  157.             test
  158.         },
  159.         {
  160.             "source",
  161.             sourceLanguage
  162.         },
  163.         {
  164.             "target",
  165.             targetLanguage
  166.         }
  167.     });
  168.  
  169.     var content = (HttpContent)urlEncodedContent;
  170.     var res =
  171.         await httpClient.PostAsync("/translate", content);
  172.     var stringResp = await res.Content.ReadAsStringAsync();
  173.     var rest = new { translatedText = "" };
  174.     var ret = JsonSerializer.Deserialize<dynamic>(stringResp);
  175.     return ret.GetProperty("translatedText").GetString();
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement