Program.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // See https://aka.ms/new-console-template for more information
  2. using System.Buffers;
  3. using System.Diagnostics;
  4. using System.IO.Compression;
  5. Console.WriteLine("Hello, World!");
  6. var getFrom = args[0];
  7. var saveTo = args[1];
  8. var isRunning = true;
  9. Console.CancelKeyPress += delegate
  10. {
  11. Console.WriteLine("Control-C");
  12. isRunning = false;
  13. };
  14. var client = new HttpClient();
  15. //shared allocation
  16. var bufDownload = new byte[1024 * 1024 * 1024];
  17. var bufBrCompressed = new byte[1024 * 1024 * 1024];
  18. while (isRunning)
  19. {
  20. Console.WriteLine("Fetching task...");
  21. try
  22. {
  23. var r = await client.GetAsync(getFrom, HttpCompletionOption.ResponseHeadersRead);
  24. if (r.IsSuccessStatusCode)
  25. {
  26. r.Headers.TryGetValues("x-compress-task-name", out var values);
  27. var taskName = values?.FirstOrDefault();
  28. r.Headers.TryGetValues("x-compress-task-id", out values);
  29. var taskId = values?.FirstOrDefault();
  30. if (taskName == null || taskId == null || !(r.Content.Headers.ContentLength > 0))
  31. {
  32. Console.WriteLine("No task for worker.");
  33. }
  34. else
  35. {
  36. Console.WriteLine("Got task");
  37. Console.WriteLine($" Name: {taskName}");
  38. Console.WriteLine($" Id: {taskId}");
  39. Console.WriteLine($" Length: {r.Content.Headers.ContentLength:N0}");
  40. var outDir = Path.Combine(saveTo, taskName);
  41. if (Directory.Exists(outDir) == false) Directory.CreateDirectory(outDir);
  42. var outFile = Path.Combine(outDir, $"{taskId}.br");
  43. if (File.Exists(outFile))
  44. {
  45. if (new FileInfo(outFile).Length == 0) File.Delete(outFile);
  46. else
  47. {
  48. Console.WriteLine(" Exist, Skip");
  49. r.Dispose();
  50. continue;
  51. }
  52. }
  53. Console.WriteLine(" Downloading...");
  54. var msDownload = new MemoryStream(bufDownload);
  55. var downloadStream = await r.Content.ReadAsStreamAsync();
  56. await downloadStream.CopyToAsync(msDownload);
  57. var nbDownload = (int)msDownload.Position;
  58. try
  59. {
  60. Console.WriteLine(" Creating outout file...");
  61. await using var fs = File.Create(outFile);
  62. using var br = new BrotliEncoder(11, 24);
  63. Console.WriteLine(" Compressing...");
  64. var sw = Stopwatch.StartNew();
  65. var operationStatus = br.Compress(new ReadOnlySpan<byte>(bufDownload, 0, nbDownload), bufBrCompressed, out _, out var bytesWritten, true);
  66. sw.Stop();
  67. if (operationStatus == OperationStatus.Done)
  68. {
  69. fs.Write(bufBrCompressed, 0, bytesWritten);
  70. fs.Close();
  71. Console.WriteLine($"Done task in {sw.Elapsed.TotalSeconds:N2}s");
  72. }
  73. else
  74. {
  75. Console.WriteLine($"Fail:{operationStatus}");
  76. }
  77. }
  78. catch (Exception e)
  79. {
  80. Console.WriteLine($"Fail with err:{e.Message}");
  81. }
  82. }
  83. }
  84. else
  85. {
  86. Console.WriteLine("Failure to request:" + r.StatusCode);
  87. }
  88. }
  89. catch (Exception e)
  90. {
  91. Console.WriteLine($"Err:{e.Message}");
  92. }
  93. Console.WriteLine("Force GC...");
  94. GC.Collect(GC.MaxGeneration, GCCollectionMode.Aggressive, true, true);
  95. Console.WriteLine("Delay 1 sec for next request");
  96. await Task.Delay(1000);
  97. }