diff --git a/.gitignore b/.gitignore index ae3a8a2..68b179e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,31 @@ dist *.mngl *.cbz *.bat +.idea/ + +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk \ No newline at end of file diff --git a/mangle/book.py b/mangle/book.py index fe8edfa..e4d545a 100644 --- a/mangle/book.py +++ b/mangle/book.py @@ -45,7 +45,7 @@ def natural_key(string_): class Book(object): - DefaultDevice = 'Kindle Paperwhite' + DefaultDevice = 'Kindle Paperwhite 3/Voyage/Oasis' DefaultOutputFormat = 'CBZ only' DefaultOverwrite = True DefaultImageFlags = ImageFlags.Orient | ImageFlags.Resize | ImageFlags.Quantize diff --git a/mangle/convert.py b/mangle/convert.py index 6366daa..8c9c92e 100644 --- a/mangle/convert.py +++ b/mangle/convert.py @@ -36,6 +36,7 @@ class DialogConvert(QtGui.QProgressDialog): self.setWindowTitle('Exporting book...') self.setMaximum(len(self.book.images)) self.setValue(0) + self.increment = 0 self.archive = None if 'CBZ' in self.book.outputFormat: @@ -79,7 +80,8 @@ class DialogConvert(QtGui.QProgressDialog): def onTimer(self): index = self.value() - target = os.path.join(self.bookPath, '%05d.png' % index) + pages_split = self.increment + target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split)) source = unicode(self.book.images[index]) if index == 0: @@ -121,30 +123,34 @@ class DialogConvert(QtGui.QProgressDialog): archive = self.archive pdf = self.pdf - # Maybe the user ask for a split, but the picture is not a large one, so skip - # it but only for this picture - if (flags & ImageFlags.Split) or (flags & ImageFlags.SplitInverse): + # Check if page wide enough to split + if (flags & ImageFlags.SplitRightLeft) or (flags & ImageFlags.SplitLeftRight): if not image.isSplitable(source): # remove split flags - splitFlags= [ImageFlags.Split, ImageFlags.SplitInverse, ImageFlags.SplitRight, ImageFlags.SplitLeft] + splitFlags = [ImageFlags.SplitRightLeft, ImageFlags.SplitLeftRight, ImageFlags.SplitRight, + ImageFlags.SplitLeft] for f in splitFlags: flags &= ~f # For right page (if requested in options and need for this image) - if (flags & ImageFlags.Split): - # New path based on modified index - target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 0)) - self.convertAndSave(source, target, device, flags ^ ImageFlags.Split | ImageFlags.SplitRight, archive, pdf) - # Change target once again for left page - target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 1)) + if flags & ImageFlags.SplitRightLeft: + self.convertAndSave(source, target, device, + flags ^ ImageFlags.SplitRightLeft | ImageFlags.SplitRight, + archive, pdf) + + # Change target for left page + target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split + 1)) + self.increment += 1 # For right page (if requested), but in inverted mode - if (flags & ImageFlags.SplitInverse): - # New path based on modified index - target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 0)) - self.convertAndSave(source, target, device, flags ^ ImageFlags.SplitInverse | ImageFlags.SplitLeft, archive, pdf) - # Change target once again for left page - target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 1)) + if flags & ImageFlags.SplitLeftRight: + self.convertAndSave(source, target, device, + flags ^ ImageFlags.SplitLeftRight | ImageFlags.SplitLeft, + archive, pdf) + + # Change target for left page + target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split + 1)) + self.increment += 1 # Convert page self.convertAndSave(source, target, device, flags, archive, pdf) diff --git a/mangle/image.py b/mangle/image.py index dcd6563..b9ba9e5 100644 --- a/mangle/image.py +++ b/mangle/image.py @@ -20,16 +20,16 @@ from PIL import Image, ImageDraw, ImageStat, ImageChops class ImageFlags: - Orient = 1 << 0 - Resize = 1 << 1 - Frame = 1 << 2 - Quantize = 1 << 3 - Stretch = 1 << 4 - Split = 1 << 5 # split right then left - SplitRight = 1 << 6 # split only the right page - SplitLeft = 1 << 7 # split only the left page - SplitInverse = 1 << 8 # split left then right page - AutoCrop = 1 << 9 # split left then right page + Orient = 1 << 0 + Resize = 1 << 1 + Frame = 1 << 2 + Quantize = 1 << 3 + Stretch = 1 << 4 + SplitRightLeft = 1 << 5 # split right then left + SplitRight = 1 << 6 # split only the right page + SplitLeft = 1 << 7 # split only the left page + SplitLeftRight = 1 << 8 # split left then right page + AutoCrop = 1 << 9 class KindleData: @@ -78,16 +78,17 @@ class KindleData: Profiles = { 'Kindle 1': ((600, 800), Palette4), - 'Kindle 2': ((600, 800), Palette15a), - 'Kindle 3': ((600, 800), Palette15a), - 'Kindle 4': ((600, 800), Palette15b), - 'Kindle 5': ((600, 800), Palette15b), - 'Kindle DX': ((824, 1200), Palette15a), - 'Kindle DXG': ((824, 1200), Palette15a), - 'Kindle Touch': ((600, 800), Palette15a), - 'Kindle Paperwhite': ((758, 1024), Palette15b), # resolution given in manual, see http://kindle.s3.amazonaws.com/Kindle_Paperwhite_Users_Guide.pdf - 'Kindle Paperwhite 3': ((1072, 1448), Palette15b), - 'KoBo Aura H2o': ((1080, 1430), Palette15a), # resolution from http://www.fnac.com/Liseuse-Numerique-Kobo-by-Fnac-Kobo-Aura-H2O-Noir/a7745120/w-4 + 'Kindle 2/3/Touch': ((600, 800), Palette15a), + 'Kindle 4 & 5': ((600, 800), Palette15b), + 'Kindle DX/DXG': ((824, 1200), Palette15a), + 'Kindle Paperwhite 1 & 2': ((758, 1024), Palette15b), + 'Kindle Paperwhite 3/Voyage/Oasis': ((1072, 1448), Palette15b), + 'Kobo Mini/Touch': ((600, 800), Palette15b), + 'Kobo Glo': ((768, 1024), Palette15b), + 'Kobo Glo HD': ((1072, 1448), Palette15b), + 'Kobo Aura': ((758, 1024), Palette15b), + 'Kobo Aura HD': ((1080, 1440), Palette15b), + 'Kobo Aura H2O': ((1080, 1430), Palette15a), } @@ -102,12 +103,14 @@ def protect_bad_image(func): return func(*args, **kwargs) except IOError: # Exception from PIL about bad image return args[0] + return func_wrapper @protect_bad_image def splitLeft(image): widthImg, heightImg = image.size + return image.crop((0, 0, widthImg / 2, heightImg)) @@ -188,6 +191,7 @@ def autoCropImage(image): except TypeError: # bad image, specific to chops return image image = image.crop((x0, y0, xend, yend)) + return image @@ -253,29 +257,22 @@ def convertImage(source, target, device, flags): # Load image from source path image = loadImage(source) - - # Format according to palette image = formatImage(image) - # Apply flag transforms - # Second pass of first split + # Apply flag transforms if flags & ImageFlags.SplitRight: image = splitRight(image) - # First pass of first split option - if (flags & ImageFlags.Split): + if flags & ImageFlags.SplitRightLeft: image = splitLeft(image) - # First pass of second splitting option if flags & ImageFlags.SplitLeft: image = splitLeft(image) - # second pass of second splitting option - if (flags & ImageFlags.SplitInverse): + if flags & ImageFlags.SplitLeftRight: image = splitRight(image) # Auto crop the image, but before manage size and co, clean the source so if flags & ImageFlags.AutoCrop: image = autoCropImage(image) - if flags & ImageFlags.Orient: image = orientImage(image, size) if flags & ImageFlags.Resize: @@ -284,10 +281,7 @@ def convertImage(source, target, device, flags): image = stretchImage(image, size) if flags & ImageFlags.Frame: image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size) - - - if flags & ImageFlags.Quantize: image = quantizeImage(image, palette) - saveImage(image, target) \ No newline at end of file + saveImage(image, target) diff --git a/mangle/options.py b/mangle/options.py index 08a29dd..c2437bc 100644 --- a/mangle/options.py +++ b/mangle/options.py @@ -69,9 +69,9 @@ class DialogOptions(QtGui.QDialog): if self.checkboxFrame.isChecked(): imageFlags |= ImageFlags.Frame if self.checkboxSplit.isChecked(): - imageFlags |= ImageFlags.Split + imageFlags |= ImageFlags.SplitRightLeft if self.checkboxSplitInverse.isChecked(): - imageFlags |= ImageFlags.SplitInverse + imageFlags |= ImageFlags.SplitLeftRight if self.checkboxAutoCrop.isChecked(): imageFlags |= ImageFlags.AutoCrop diff --git a/mangle/ui/options.ui b/mangle/ui/options.ui index 3619bbb..dded245 100644 --- a/mangle/ui/options.ui +++ b/mangle/ui/options.ui @@ -63,52 +63,57 @@ - Kindle 2 + Kindle 2/3/Touch - Kindle 3 + Kindle 4 & 5 - Kindle 4 + Kindle DX/DXG - Kindle 5 + Kindle Paperwhite 1 & 2 - Kindle DX + Kindle Paperwhite 3/Voyage/Oasis - Kindle DXG + Kobo Mini/Touch - Kindle Touch + Kobo Glo - Kindle Paperwhite + Kobo Glo HD - Kindle Paperwhite 3 + Kobo Aura - KoBo Aura H2o + Kobo Aura HD + + + + + Kobo Aura H2O