Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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.");
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }