diff --git a/ComicCompress.csproj b/ComicCompress.csproj index 799ddb3..8d860f2 100644 --- a/ComicCompress.csproj +++ b/ComicCompress.csproj @@ -9,6 +9,7 @@ + @@ -21,6 +22,8 @@ + + diff --git a/ComicCompress.csproj.user b/ComicCompress.csproj.user index a835e16..318fa22 100644 --- a/ComicCompress.csproj.user +++ b/ComicCompress.csproj.user @@ -4,7 +4,7 @@ ProjectDebugger - ComicCompress + PROD ProjectDebugger diff --git a/Program.cs b/Program.cs index 3b6c364..19d26a9 100644 --- a/Program.cs +++ b/Program.cs @@ -17,6 +17,8 @@ using iText.Kernel.Pdf; using Imazen.WebP; +using Xabe.FFmpeg; + using SharpCompress.Archives; using SharpCompress.Archives.Zip; using SharpCompress.Common; @@ -29,11 +31,24 @@ using javax.xml.transform; using System.Collections.Concurrent; using iText.Barcodes.Dmcode; using ZstdSharp; +using Xabe.FFmpeg.Downloader; +using System.Reflection; +using Microsoft.VisualBasic; +using BinaryKits.Zpl.Viewer; namespace ComicCompressor { public class Program { + + // string progVersion = "Version 2.0.0 - (04/07/2024)"; + + // Added copy of non image files with same name + //string progVersion = "Version 2.0.1 - (12/08/2024)"; + + // Added support for ZEBRA PRN files, generate image and base64 for prn and image. + string progVersion = "Version 2.0.2 - (27/08/2024)"; + public static int Main(string[] args) => CommandLineApplication.Execute(args); #region INPUT_FLAGS @@ -69,6 +84,8 @@ namespace ComicCompressor [Option("-j|--image", Description = "process images only")] public bool DoImage { get; } = false; + [Option("-n|--prn", Description = "process images only")] + public bool DoPrn { get; } = false; [Option("-a|--copyall", Description = "copy all unprocessed files")] public bool DoCopyAll { get; } = false; @@ -124,6 +141,17 @@ namespace ComicCompressor Logger.Debug = true; Logger.LoggingLevel = LogLevel.Verbose; + Logger.Log(progVersion, LogLevel.Verbose, true); + + var progress = new Progress( p => Logger.Log(p.ToString(), LogLevel.Verbose, true) ); + FFmpeg.SetExecutablesPath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)); + FFmpegDownloader.GetLatestVersion(FFmpegVersion.Official,progress); + + + //FFmpeg.SetExecutablesPath (Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FFmpeg")); + Logger.Log(FFmpeg.ExecutablesPath, LogLevel.Verbose, true); + + IList files = new FileParser().ListAllFiles(Input, Recursive); Process(files); @@ -135,7 +163,7 @@ namespace ComicCompressor } - private void Process(IList files) + private async void Process(IList files) { Compressor compressor = new Compressor(Logger); compressor.Quality = Quality; @@ -156,7 +184,7 @@ namespace ComicCompressor foreach (var file in files) { Logger.Log($"{n,3}/{files.Count,3} - ", LogLevel.Verbose, false); - CompressTask(compressor, file, filename_len); + await CompressTask(compressor, file, filename_len); n++; } @@ -205,14 +233,22 @@ namespace ComicCompressor } - private void CompressTask(Compressor compressor, string filename, int max_name_len = -1, Boolean isPar = false, ParallelLoopState state = null, long index = 0, long total = 0) + private async Task CompressTask(Compressor compressor, string filename, int max_name_len = -1, Boolean isPar = false, ParallelLoopState state = null, long index = 0, long total = 0) { var relativePath = Path.GetRelativePath(Input, filename); var outputPath = Path.Join(OutputFolder, Path.ChangeExtension(relativePath, "cbz")); var outputPath_webp = Path.Join(OutputFolder, Path.ChangeExtension(relativePath, "webp")); + var outputPath_webm = Path.Join(OutputFolder, Path.ChangeExtension(relativePath, "webm")); var outputPath_same = Path.Join(OutputFolder, relativePath); int digits = 1+(int)Math.Floor(Math.Log((Double)total) / Math.Log(10.0)); + + bool isImage = filename.ToLower().EndsWith("jpg") || + filename.ToLower().EndsWith("jpeg") || + filename.ToLower().EndsWith("tif") || + filename.ToLower().EndsWith("bmp") || + filename.ToLower().EndsWith("png"); + string print_line_header = ""; switch (digits) { @@ -250,10 +286,10 @@ namespace ComicCompressor Logger.Log(outputPath, LogLevel.Verbose, true, Color.Yellow); return; } - if (DoImage && Skip && File.Exists(outputPath_webp)) + if (DoImage && Skip && isImage && File.Exists(outputPath_webp)) { long lengthin = new System.IO.FileInfo(filename).Length; - long lengthout = new System.IO.FileInfo(outputPath).Length; + long lengthout = new System.IO.FileInfo(outputPath_webp).Length; Program.file_stat fs = null; Program.File_statistics.TryGetValue(filename, out fs); if (fs != null) @@ -286,8 +322,66 @@ namespace ComicCompressor return; } - //if (DoPdf) - // return; + // COMPRESS video to webm + if(filename.ToLower().EndsWith("mp4")) + { + Logger.Log(outputPath_webm, LogLevel.Verbose, true, Color.LightBlue); + + IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(filename); + IStream videoStream = mediaInfo.VideoStreams.FirstOrDefault() + ?.SetCodec(VideoCodec.vp8); + IStream audioStream = mediaInfo.AudioStreams.FirstOrDefault(); + + var conversion = FFmpeg.Conversions.New() + .AddStream(audioStream, videoStream) + .SetOutput(outputPath_webm); + conversion.UseHardwareAcceleration(HardwareAccelerator.cuvid,VideoCodec.h264,VideoCodec.hevc); + + // var snippet = await FFmpeg.Conversions.FromSnippet.ToWebM(filename, outputPath_webm); + conversion.OnProgress += (sender, args) => + { + var percent = (int)(Math.Round(args.Duration.TotalSeconds / args.TotalLength.TotalSeconds, 2) * 100); + Logger.Log($"[{args.Duration} / {args.TotalLength}] {percent}%", LogLevel.Verbose, true, Color.LightBlue); + }; + conversion.OnDataReceived += (sender, args) => + { + Logger.Log($"{args.Data}{Environment.NewLine}", LogLevel.Verbose, true, Color.LightBlue); + }; + IConversionResult result = await conversion.Start(); + return; + } + + if(DoImage && DoPrn && filename.ToLower().EndsWith("prn")) + { + try + { + string[] lines = System.IO.File.ReadAllLines(filename); + lines = lines.Skip(2).ToArray(); + string template_prn = string.Join("\r\n",lines); + template_prn = template_prn.Replace(">;", ""); + // BinaryKits + IPrinterStorage printerStorage = new PrinterStorage(); + var drawer = new ZplElementDrawer(printerStorage); + + var analyzer = new ZplAnalyzer(printerStorage); + var analyzeInfo = analyzer.Analyze(template_prn); + + foreach (var labelInfo in analyzeInfo.LabelInfos) + { + byte[] img = drawer.Draw(labelInfo.ZplElements); + outputPath = Path.Join(OutputFolder, Path.ChangeExtension(relativePath, ".prn.png")); + File.WriteAllBytes(outputPath, img); + //imageData is bytes of png image + string base64String = Convert.ToBase64String(img); + + File.WriteAllText(outputPath + ".base64", base64String); + } + } + catch (Exception ex) + { + Logger.LogError(ex); + } + } if (DoImage && filename.ToLower().EndsWith("jpg") || @@ -668,6 +762,29 @@ namespace ComicCompressor outStream.Flush(); outStream.Close(); + + if (DoPrn) + { + using (MemoryStream m = new MemoryStream()) + { + encoder.Encode(mBitmap, m, 70); + byte[] imageBytes = m.ToArray(); + string base64String = Convert.ToBase64String(imageBytes); + + File.WriteAllText(outputFolder + ".base64", base64String); + + byte[] imageBytes_o = Convert.FromBase64String(base64String); + using (MemoryStream ms = new MemoryStream(imageBytes_o)) + { + // Create image from memory stream + using (FileStream file = new FileStream(outputFolder + ".base64.webp", FileMode.Create, System.IO.FileAccess.Write)) + { + + ms.WriteTo(file); + } + } + } + } //encoder.Encode(mBitmap, 70, out result, out length); //UnmanagedMemoryStream ustream = new UnmanagedMemoryStream((byte*)result, length); //ustream.CopyTo(outStream); diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json index 2272243..5dfeccb 100644 --- a/Properties/launchSettings.json +++ b/Properties/launchSettings.json @@ -19,6 +19,10 @@ "ComicCompress": { "commandName": "Project", "commandLineArgs": "-i _IMG_ -o _IMG_WEBP_ -r -s -d -a" + }, + "PROD": { + "commandName": "Project", + "commandLineArgs": "-i \"K:\\_RPG_\\__THE_AMBER_ROOM_UPDATE\\__ASSETS__\\_IMG_\" -o \"K:\\_RPG_\\__THE_AMBER_ROOM_UPDATE\\__ASSETS__\\_IMG_WEBP_\" -r -s -j -a" } } } \ No newline at end of file