private string BuildSplittedArchive(ArchiveTemplate template, int fileIndex, ref int sourcePageIndex) { // Create the subBuffer string subBufferPath = Path.Combine(template.PathToBuffer, $"{template.ComicName}_{(fileIndex + 1).ToString().PadLeft(template.IndexSize, '0')}"); _logger.Log($"Create the subFolder {subBufferPath}"); int pagesAdded = 0; List <FileInfo> pagesToAdd = new List <FileInfo>(); for (int currentPageIndex = sourcePageIndex; (pagesAdded < template.PagesPerFile) && (currentPageIndex < template.Pages.Count); ++currentPageIndex) { if (template.Pages[currentPageIndex].Extension != ".xml") { pagesToAdd.Add(template.Pages[currentPageIndex]); ++pagesAdded; } sourcePageIndex = currentPageIndex + 1; } if (fileIndex == template.NumberOfSplittedFiles - 1) { for (int i = sourcePageIndex; i < template.Pages.Count; ++i) { if (template.Pages[i].Extension != ".xml") { pagesToAdd.Add(template.Pages[i]); } } } bool ok = MovePicturesToSubBuffer(subBufferPath, pagesToAdd, template.ComicName, fileIndex == 0, template.ImageCompression); if (!ok) { SystemTools.CleanDirectory(subBufferPath, _logger); return(""); } if (!string.IsNullOrWhiteSpace(template.CoverPath)) { if (fileIndex != 0) { CopyCoverToSubBuffer(template.CoverPath, subBufferPath, fileIndex + 1, (int)template.NumberOfSplittedFiles); } } if (Settings.Instance.IncludeMetadata) { CopyMetaDataToSubBuffer(template.MetadataFiles, subBufferPath); } return(subBufferPath); }
public void Merge(string outputFile, IList <string> files, long imageQuality) { _eventAggregator.GetEvent <BusinessEvent>().Publish(true); _logger.Log($"Check input validity vs settings"); FileInfo fi = new FileInfo(outputFile); string fileName = fi.Name; string settingsExtension = $".{Settings.Instance.OutputFormat.ToString().ToLower()}"; if (string.IsNullOrEmpty(fi.Extension)) { _logger.Log($"Add Extension to filename {settingsExtension}"); outputFile += settingsExtension; } else { if (fi.Extension != settingsExtension) { _logger.Log($"Incorrect extension found in filename {fi.Extension} replaced with {settingsExtension}"); outputFile = outputFile.Substring(0, outputFile.Length - fi.Extension.Length) + settingsExtension; } } _logger.Log($"Start merging input archives in {outputFile}"); string nameTemplate = fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length); string bufferPath = Settings.Instance.GetBufferDirectory(files[0], nameTemplate); string outputBuffer = Path.Combine(bufferPath, "outputBuffer"); Directory.CreateDirectory(outputBuffer); List <FileInfo> metadataFiles = new List <FileInfo>(); List <FileInfo> pages = new List <FileInfo>(); int bufferPadSize = files.Count.ToString().Length; for (int i = 0; i < files.Count; ++i) { CompressionHelper ch1 = new CompressionHelper(_logger); string decompressionBuffer = Path.Combine(bufferPath, $"archive_{i.ToString().PadLeft(bufferPadSize, '0')}"); _logger.Log($"Uncompress {files[i]} in {decompressionBuffer}"); ch1.DecompressToDirectory(files[i], decompressionBuffer); _logger.Log($"Extraction done."); ParseArchiveFiles(decompressionBuffer, ref metadataFiles, ref pages); } if (Settings.Instance.IncludeMetadata) { if (metadataFiles.Count > 0) { string destFile = Path.Combine(outputBuffer, metadataFiles[0].Name); _logger.Log($"copy metadata {metadataFiles[0].FullName} in {destFile}"); File.Copy(metadataFiles[0].FullName, destFile, true); } } int pagePadSize = pages.Count.ToString().Length; int pageAdded = 1; JpgConverter jpgConverter = new JpgConverter(_logger, imageQuality); for (int i = 0; i < pages.Count; ++i) { if (pages[i].Extension != ".xml") { string destFile = Path.Combine(outputBuffer, $"{nameTemplate}_{pageAdded.ToString().PadLeft(pagePadSize, '0')}{pages[i].Extension}".Replace(' ', '_')); if (imageQuality == 100) { // rename the files in the directories File.Move(pages[i].FullName, destFile); } else { jpgConverter.SaveJpeg(pages[i].FullName, destFile); File.Delete(pages[i].FullName); } ++pageAdded; } } CompressionHelper ch2 = new CompressionHelper(_logger); _logger.Log($"Start compression of {outputBuffer} into {outputFile} ..."); ch2.CompressDirectoryContent(outputBuffer, outputFile); _logger.Log($"Compression done."); _logger.Log($"Clean Buffer {bufferPath}"); SystemTools.CleanDirectory(bufferPath, _logger); _logger.Log("Done."); _eventAggregator.GetEvent <BusinessEvent>().Publish(false); }
private void DoSave() { bool canUpdate = false; FileInfo fi = new FileInfo(_fileToEdit); switch (fi.Extension) { case ".cbz": case ".cb7": case ".cbt": canUpdate = true; break; default: canUpdate = false; break; } string nameTemplate = fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length); string bufferPath = Settings.Instance.GetBufferDirectory(_fileToEdit, nameTemplate); if (string.IsNullOrEmpty(_metadataFile)) { _metadataFile = Path.Combine(bufferPath, "ComicInfo.xml"); } _logger.Log($"Save metadata as ComicRack xml in {_metadataFile}"); XmlDocument xmlDoc = new XmlDocument(); string baseXml = "<?xml version=\"1.0\"?><ComicInfo xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"></ComicInfo> "; xmlDoc.LoadXml(baseXml); XmlElement rootElem = xmlDoc.DocumentElement; foreach (ComicMetadata data in MetadataCollection) { XmlElement dataElem = xmlDoc.CreateElement(data.Key); dataElem.InnerText = data.Value; rootElem.AppendChild(dataElem); } using (XmlWriter writer = XmlWriter.Create(_metadataFile)) { xmlDoc.WriteTo(writer); } CompressionHelper ch = new CompressionHelper(_logger); if (canUpdate) { ch.UpdateFile(FileToEdit, _metadataFile); } else { _logger.Log("Archive format does not support update with 7zip. Decompression and recompression is required"); ch.DecompressToDirectory(FileToEdit, bufferPath); XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.Indent = true; using (XmlWriter writer = XmlWriter.Create(_metadataFile, xmlWriterSettings)) { xmlDoc.WriteTo(writer); } string settingsExtension = $".{Settings.Instance.OutputFormat.ToString().ToLower()}"; string outputFile = FileToEdit; if (fi.Extension != settingsExtension) { _logger.Log($"Incorrect extension found in filename {fi.Extension} replaced with {settingsExtension}"); outputFile = outputFile.Substring(0, outputFile.Length - fi.Extension.Length) + settingsExtension; } ch.CompressDirectoryContent(bufferPath, outputFile); _logger.Log($"Recompression done."); _logger.Log($"Clean Buffer {bufferPath}"); SystemTools.CleanDirectory(bufferPath, _logger); _logger.Log("Done."); } }
public void Split(string filePath, ArchiveTemplate archiveTemplate) { _eventAggregator.GetEvent <BusinessEvent>().Publish(true); if (archiveTemplate.NumberOfSplittedFiles < 2) { _logger.Log($"Cannot split archive in {archiveTemplate.NumberOfSplittedFiles} files"); _eventAggregator.GetEvent <BusinessEvent>().Publish(false); return; } //Extract file in buffer string pathToBuffer = ExtractArchive(filePath, archiveTemplate); //Count files in directory except metadata ParseArchiveFiles(pathToBuffer, out List <FileInfo> metadataFiles, out List <FileInfo> pages); int totalPagesCount = pages.Count - metadataFiles.Count; _logger.Log($"Total number of pages is {totalPagesCount}"); // Check that the resulting split files number is consistent with the number of pages if (archiveTemplate.NumberOfSplittedFiles > totalPagesCount) { _logger.Log($"Not enough pages to split into {archiveTemplate.NumberOfSplittedFiles} files."); SystemTools.CleanDirectory(pathToBuffer, _logger); _eventAggregator.GetEvent <BusinessEvent>().Publish(false); return; } //Create one folder per resulting file and copy pictures in it int pagesPerFile = Math.DivRem(totalPagesCount, (int)archiveTemplate.NumberOfSplittedFiles, out int extraPages); _logger.Log($"Pages per resulting file : {pagesPerFile}"); int indexSize = Math.Max(archiveTemplate.NumberOfSplittedFiles.ToString().Length, 2); string coverPath = ""; if (Settings.Instance.IncludeCover) { coverPath = SaveCoverInBuffer(pathToBuffer, archiveTemplate.ComicName, indexSize, pages); } int sourcePageIndex = 0; for (int fileIndex = 0; fileIndex < archiveTemplate.NumberOfSplittedFiles; ++fileIndex) { archiveTemplate.PathToBuffer = pathToBuffer; archiveTemplate.IndexSize = indexSize; archiveTemplate.PagesPerFile = pagesPerFile; archiveTemplate.Pages = pages; archiveTemplate.MetadataFiles = metadataFiles; archiveTemplate.CoverPath = coverPath; string splittedContentPath = BuildSplittedArchive(archiveTemplate, fileIndex, ref sourcePageIndex); if (string.IsNullOrWhiteSpace(splittedContentPath)) { _logger.Log("ERROR: Failure to split the file"); break; } _logger.Log($"Compress {splittedContentPath}"); CompressArchiveContent(splittedContentPath, archiveTemplate); _logger.Log($"Clean Buffer {splittedContentPath}"); SystemTools.CleanDirectory(splittedContentPath, _logger); } _logger.Log($"Clean Buffer {pathToBuffer}"); SystemTools.CleanDirectory(pathToBuffer, _logger); // compress the resulting file // clean the temp directories _logger.Log("Done."); _eventAggregator.GetEvent <BusinessEvent>().Publish(false); }
public void Split(string filePath, ArchiveTemplate archiveTemplate) { _eventAggregator.GetEvent <BusinessEvent>().Publish(true); if (archiveTemplate.MaxPagesPerSplittedFile < 2) { _logger.Log($"Cannot split archive with {archiveTemplate.MaxPagesPerSplittedFile} page per file"); _eventAggregator.GetEvent <BusinessEvent>().Publish(false); return; } //Extract file in buffer archiveTemplate.PathToBuffer = ExtractArchive(filePath, archiveTemplate); //Count files in directory except metadata ParseArchiveFiles(archiveTemplate.PathToBuffer, out List <FileInfo> metadataFiles, out List <FileInfo> pages); archiveTemplate.Pages = pages; archiveTemplate.MetadataFiles = metadataFiles; int totalPagesCount = archiveTemplate.Pages.Count - archiveTemplate.MetadataFiles.Count; _logger.Log($"Total number of pages is {totalPagesCount}"); int numberOfSplittedFiles = ComputeNumberOfSplittedFiles(totalPagesCount, archiveTemplate); _logger.Log($"Creating {numberOfSplittedFiles} splitted files"); archiveTemplate.IndexSize = Math.Max(archiveTemplate.NumberOfSplittedFiles.ToString().Length, 2); archiveTemplate.CoverPath = ""; if (Settings.Instance.IncludeCover) { archiveTemplate.CoverPath = SaveCoverInBuffer(archiveTemplate.PathToBuffer, archiveTemplate.ComicName, archiveTemplate.IndexSize, archiveTemplate.Pages); } int pagesAdded = 0; int fileIndex = 0; string subBufferPath = ""; List <FileInfo> pagesToAdd = new List <FileInfo>(); for (int i = 0; i < totalPagesCount; ++i) { if (pagesAdded == 0) { pagesToAdd = new List <FileInfo>(); subBufferPath = GetSubBufferPath(archiveTemplate, fileIndex); Directory.CreateDirectory(subBufferPath); if (Settings.Instance.IncludeMetadata) { CopyMetaDataToSubBuffer(archiveTemplate.MetadataFiles, subBufferPath); } if (fileIndex != 0) { if (Settings.Instance.IncludeCover) { CopyCoverToSubBuffer(archiveTemplate.CoverPath, subBufferPath, fileIndex + 1, (int)archiveTemplate.NumberOfSplittedFiles); ++pagesAdded; } } } while (pagesAdded < archiveTemplate.MaxPagesPerSplittedFile && i < totalPagesCount) { if (archiveTemplate.Pages[i].Extension != ".xml") { pagesToAdd.Add(archiveTemplate.Pages[i]); ++pagesAdded; } ++i; } bool ok = MovePicturesToSubBuffer(subBufferPath, pagesToAdd, archiveTemplate.ComicName, fileIndex == 0, archiveTemplate.ImageCompression); if (!ok) { SystemTools.CleanDirectory(subBufferPath, _logger); break; } _logger.Log($"Compress {subBufferPath}"); CompressArchiveContent(subBufferPath, archiveTemplate); _logger.Log($"Clean Buffer {subBufferPath}"); SystemTools.CleanDirectory(subBufferPath, _logger); pagesAdded = 0; ++fileIndex; } _logger.Log($"Clean Buffer {archiveTemplate.PathToBuffer}"); SystemTools.CleanDirectory(archiveTemplate.PathToBuffer, _logger); _logger.Log("Done."); _eventAggregator.GetEvent <BusinessEvent>().Publish(false); }