From 135db7a1f8c5895671fc22b1572d0846fdc5367b Mon Sep 17 00:00:00 2001 From: Antoine Aflalo <197810+Belphemur@users.noreply.github.com> Date: Mon, 26 Aug 2024 23:15:14 -0400 Subject: [PATCH] feat: avoid converting already converted chapters --- cbz/cbz_creator.go | 12 ++++++++++++ cbz/cbz_loader.go | 21 +++++++++++++++++++-- cmd/convert_cbz_command.go | 6 ++++++ go.mod | 1 + go.sum | 5 +++++ packer/chapter.go | 12 ++++++++++++ 6 files changed, 55 insertions(+), 2 deletions(-) diff --git a/cbz/cbz_creator.go b/cbz/cbz_creator.go index 1faca18..5cb6aa9 100644 --- a/cbz/cbz_creator.go +++ b/cbz/cbz_creator.go @@ -57,5 +57,17 @@ func WriteChapterToCBZ(chapter *packer.Chapter, outputFilePath string) error { } } + if chapter.IsConverted { + convertedWriter, err := zipWriter.Create("Converted.txt") + if err != nil { + return fmt.Errorf("failed to create Converted.txt in .cbz: %w", err) + } + + _, err = convertedWriter.Write([]byte(fmt.Sprintf("%s\nThis chapter has been converted by CBZOptimizer.", chapter.ConvertedTime))) + if err != nil { + return fmt.Errorf("failed to write Converted.txt contents: %w", err) + } + } + return nil } diff --git a/cbz/cbz_loader.go b/cbz/cbz_loader.go index f08e445..080a9a5 100644 --- a/cbz/cbz_loader.go +++ b/cbz/cbz_loader.go @@ -3,10 +3,11 @@ package cbz import ( "CBZOptimizer/packer" "archive/zip" + "bufio" "bytes" "fmt" + "github.com/araddon/dateparse" "io" - "io/ioutil" "path/filepath" "strings" ) @@ -36,12 +37,28 @@ func LoadChapter(filePath string) (*packer.Chapter, error) { if ext == ".xml" && strings.ToLower(filepath.Base(f.Name)) == "comicinfo.xml" { // Read the ComicInfo.xml file content - xmlContent, err := ioutil.ReadAll(rc) + xmlContent, err := io.ReadAll(rc) if err != nil { rc.Close() return nil, fmt.Errorf("failed to read ComicInfo.xml content: %w", err) } chapter.ComicInfoXml = string(xmlContent) + } else if ext == ".txt" && strings.ToLower(filepath.Base(f.Name)) == "converted.txt" { + textContent, err := io.ReadAll(rc) + if err != nil { + rc.Close() + return nil, fmt.Errorf("failed to read Converted.xml content: %w", err) + } + scanner := bufio.NewScanner(bytes.NewReader(textContent)) + if scanner.Scan() { + convertedTime := scanner.Text() + chapter.ConvertedTime, err = dateparse.ParseAny(convertedTime) + if err != nil { + rc.Close() + return nil, fmt.Errorf("failed to parse converted time: %w", err) + } + chapter.IsConverted = true + } } else { // Read the file contents for page buf := new(bytes.Buffer) diff --git a/cmd/convert_cbz_command.go b/cmd/convert_cbz_command.go index ae93bf5..6f09841 100644 --- a/cmd/convert_cbz_command.go +++ b/cmd/convert_cbz_command.go @@ -71,6 +71,11 @@ func ConvertCbzCommand(cmd *cobra.Command, args []string) error { continue } + if chapter.IsConverted { + fmt.Printf("Chapter already converted: %s\n", path) + continue + } + // Convert the chapter convertedChapter, err := chapterConverter.ConvertChapter(chapter, quality, func(msg string) { fmt.Println(msg) @@ -79,6 +84,7 @@ func ConvertCbzCommand(cmd *cobra.Command, args []string) error { fmt.Printf("Failed to convert chapter: %v\n", err) continue } + convertedChapter.SetConverted() // Write the converted chapter back to a CBZ file outputPath := path diff --git a/go.mod b/go.mod index 92c7f7a..e7733c0 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module CBZOptimizer go 1.23 require ( + github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de github.com/nickalie/go-binwrapper v0.0.0-20190114141239-525121d43c84 github.com/nickalie/go-webpbin v0.0.0-20220110095747-f10016bf2dc1 github.com/oliamb/cutter v0.2.2 diff --git a/go.sum b/go.sum index 06a5497..3df5ea3 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -21,6 +23,7 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mholt/archiver v3.1.1+incompatible h1:1dCVxuqs0dJseYEhi5pl7MYPH9zDa1wBi7mF09cbNkU= github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= github.com/nickalie/go-binwrapper v0.0.0-20190114141239-525121d43c84 h1:/6MoQlTdk1eAi0J9O89ypO8umkp+H7mpnSF2ggSL62Q= @@ -38,11 +41,13 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= diff --git a/packer/chapter.go b/packer/chapter.go index df3bbb2..c7c1c41 100644 --- a/packer/chapter.go +++ b/packer/chapter.go @@ -1,5 +1,7 @@ package packer +import "time" + type Chapter struct { // FilePath is the path to the chapter's directory. FilePath string @@ -7,4 +9,14 @@ type Chapter struct { Pages []*Page // ComicInfo is a string containing information about the chapter. ComicInfoXml string + // IsConverted is a boolean that indicates whether the chapter has been converted. + IsConverted bool + // ConvertedTime is a pointer to a time.Time object that indicates when the chapter was converted. Nil mean not converted. + ConvertedTime time.Time +} + +// SetConverted sets the IsConverted field to true and sets the ConvertedTime field to the current time. +func (chapter *Chapter) SetConverted() { + chapter.IsConverted = true + chapter.ConvertedTime = time.Now() }