diff --git a/mangle.pyw b/mangle.pyw index ad5e380..9bc73ae 100755 --- a/mangle.pyw +++ b/mangle.pyw @@ -17,7 +17,9 @@ import sys + from PyQt4 import QtGui + from mangle.book import MainWindowBook diff --git a/mangle/about.py b/mangle/about.py index c2af64b..1cb0b77 100644 --- a/mangle/about.py +++ b/mangle/about.py @@ -14,10 +14,10 @@ # along with this program. If not, see . -import os.path -import util from PyQt4 import QtGui, uic +import util + class DialogAbout(QtGui.QDialog): def __init__(self, parent): diff --git a/mangle/book.py b/mangle/book.py index 505d852..38a8ba1 100644 --- a/mangle/book.py +++ b/mangle/book.py @@ -14,19 +14,20 @@ # along with this program. If not, see . -import os -import os.path from os.path import basename -import util +import os.path import tempfile -from PyQt4 import QtGui, QtCore, QtXml, uic from zipfile import ZipFile -from image import ImageFlags -from about import DialogAbout -from options import DialogOptions -from convert import DialogConvert + +from PyQt4 import QtGui, QtCore, QtXml, uic from natsort import natsorted +from about import DialogAbout +from convert import DialogConvert +from image import ImageFlags +from options import DialogOptions +import util + class Book(object): DefaultDevice = 'Kindle Paperwhite' @@ -250,7 +251,7 @@ class MainWindowBook(QtGui.QMainWindow): QtGui.QMessageBox.warning(self, 'Mangle', 'This book has no images to export') return - if not self.book.titleSet: # if self.book.title is None: + if not self.book.titleSet: # if self.book.title is None: dialog = DialogOptions(self, self.book) if dialog.exec_() == QtGui.QDialog.Rejected: return @@ -378,7 +379,7 @@ class MainWindowBook(QtGui.QMainWindow): filenames = [] for directory in directories: - for root, subdirs, subfiles in os.walk(unicode(directory)): + for root, _, subfiles in os.walk(unicode(directory)): for filename in subfiles: path = os.path.join(root, filename) if self.isImageFile(path): @@ -402,17 +403,16 @@ class MainWindowBook(QtGui.QMainWindow): for f in cbzFile.namelist(): if f.endswith('/'): try: - os.makedirs(path+f) + os.makedirs(path + f) except: - pass #the dir exists so we are going to extract the images only. + pass # the dir exists so we are going to extract the images only. else: cbzFile.extract(f, path) - #Add the directories - if os.path.isdir(unicode(path)): + if os.path.isdir(unicode(path)): # Add the directories directories.append(path) - #Add the files - self.addImageDirs(directories) - + + self.addImageDirs(directories) # Add the files + def isImageFile(self, filename): imageExts = ['.jpeg', '.jpg', '.gif', '.png'] diff --git a/mangle/convert.py b/mangle/convert.py index 173a4ce..ca09613 100644 --- a/mangle/convert.py +++ b/mangle/convert.py @@ -14,10 +14,13 @@ # along with this program. If not, see . -import os, shutil +import os +import shutil + from PyQt4 import QtGui, QtCore -import image + import cbz +import image import pdfimage @@ -39,8 +42,8 @@ class DialogConvert(QtGui.QProgressDialog): self.pdf = None if "PDF" in self.book.outputFormat: - self.pdf = pdfimage.PDFImage(self.bookPath, str(self.book.title), str(self.book.device)) - + self.pdf = pdfimage.PDFImage(self.bookPath, str(self.book.title), str(self.book.device)) + def showEvent(self, event): @@ -56,9 +59,9 @@ class DialogConvert(QtGui.QProgressDialog): # Close the archive if we created a CBZ file if self.archive is not None: self.archive.close() - #Close and generate the PDF File + # Close and generate the PDF File if self.pdf is not None: - self.pdf.close() + self.pdf.close() # Remove image directory if the user didn't wish for images if 'Image' not in self.book.outputFormat: @@ -108,7 +111,7 @@ class DialogConvert(QtGui.QProgressDialog): if self.archive is not None: self.archive.addFile(target) if self.pdf is not None: - self.pdf.addImage(target) + self.pdf.addImage(target) except RuntimeError, error: result = QtGui.QMessageBox.critical( self, diff --git a/mangle/image.py b/mangle/image.py index a5a3c68..50447f1 100644 --- a/mangle/image.py +++ b/mangle/image.py @@ -14,6 +14,8 @@ # along with this program. If not, see . +import os + from PIL import Image, ImageDraw @@ -23,6 +25,8 @@ class ImageFlags: Frame = 1 << 2 Quantize = 1 << 3 Stretch = 1 << 4 + Split = 1 << 5 + SplitRight = 1 << 6 class KindleData: @@ -79,6 +83,18 @@ class KindleData: 'Kindle DXG': ((824, 1200), Palette15a), 'Kindle Paperwhite': ((758, 1024), Palette15b) } + + +def splitLeft(image): + widthImg, heightImg = image.size + + return image.crop((0, 0, widthImg / 2, heightImg)) + + +def splitRight(image): + widthImg, heightImg = image.size + + return image.crop((widthImg / 2, 0, widthImg, heightImg)) def quantizeImage(image, palette): @@ -93,8 +109,8 @@ def quantizeImage(image, palette): def stretchImage(image, size): - widthDev, heightDev = size - return image.resize((widthDev, heightDev), Image.ANTIALIAS) + widthDev, heightDev = size + return image.resize((widthDev, heightDev), Image.ANTIALIAS) def resizeImage(image, size): widthDev, heightDev = size @@ -175,15 +191,24 @@ def convertImage(source, target, device, flags): raise RuntimeError('Cannot read image file %s' % source) image = formatImage(image) if flags & ImageFlags.Orient: - image = orientImage(image, size) + image = orientImage(image, size) + if flags & ImageFlags.SplitRight: + image = splitRight(image) + elif flags & ImageFlags.Split: + image = splitLeft(image) + # Recurse for right page + fileName, fileExtension = os.path.splitext(target) + newTarget = fileName + "r" + fileExtension + print(newTarget) + convertImage(source, newTarget, device, flags | ImageFlags.SplitRight) if flags & ImageFlags.Resize: - image = resizeImage(image, size) + image = resizeImage(image, size) if flags & ImageFlags.Stretch: - image = stretchImage(image, size) + image = stretchImage(image, size) if flags & ImageFlags.Frame: - image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size) + image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size) if flags & ImageFlags.Quantize: - image = quantizeImage(image, palette) + image = quantizeImage(image, palette) try: image.save(target) diff --git a/mangle/options.py b/mangle/options.py index cf4b021..eb79f7f 100644 --- a/mangle/options.py +++ b/mangle/options.py @@ -14,10 +14,10 @@ # along with this program. If not, see . -import os.path -import util -from PyQt4 import QtGui, QtCore, uic +from PyQt4 import QtGui, uic + from image import ImageFlags +import util class DialogOptions(QtGui.QDialog): @@ -59,11 +59,13 @@ class DialogOptions(QtGui.QDialog): if self.checkboxResize.isChecked(): imageFlags |= ImageFlags.Resize if self.checkboxStretch.isChecked(): - imageFlags |= ImageFlags.Stretch + imageFlags |= ImageFlags.Stretch if self.checkboxQuantize.isChecked(): imageFlags |= ImageFlags.Quantize if self.checkboxFrame.isChecked(): - imageFlags |= ImageFlags.Frame + imageFlags |= ImageFlags.Frame + if self.checkboxSplit.isChecked(): + imageFlags |= ImageFlags.Split modified = ( self.book.title != title or diff --git a/mangle/pdfimage.py b/mangle/pdfimage.py index c7be86d..908be05 100644 --- a/mangle/pdfimage.py +++ b/mangle/pdfimage.py @@ -17,9 +17,10 @@ import os.path from reportlab.pdfgen import canvas -from reportlab.lib.pagesizes import letter + from image import KindleData + class PDFImage(object): def __init__(self, path, title, device): outputDirectory = os.path.dirname(path) @@ -28,7 +29,7 @@ class PDFImage(object): self.currentDevice = device self.bookTitle = title self.pageSize = KindleData.Profiles[self.currentDevice][0] - #pagesize could be letter or A4 for standarization but we need to control some image sizes + # pagesize could be letter or A4 for standarization but we need to control some image sizes self.canvas = canvas.Canvas(outputPath, pagesize=self.pageSize) self.canvas.setAuthor("Mangle") self.canvas.setTitle(self.bookTitle) diff --git a/mangle/ui/options.ui b/mangle/ui/options.ui index b6015d5..bd0b71d 100644 --- a/mangle/ui/options.ui +++ b/mangle/ui/options.ui @@ -158,6 +158,13 @@ Draw frame around images + + + + + Split left and right pages + + diff --git a/mangle/util.py b/mangle/util.py index e23c7f4..3609578 100644 --- a/mangle/util.py +++ b/mangle/util.py @@ -15,7 +15,6 @@ import os.path -import re import sys diff --git a/setup.py b/setup.py index b2e9463..7d42ed4 100644 --- a/setup.py +++ b/setup.py @@ -16,16 +16,15 @@ # along with this program. If not, see . -import sys from distutils.core import setup -import py2exe +import sys sys.argv.append('py2exe') setup( - name = 'Mangle', - windows = [{'script': 'mangle.pyw'}], - data_files = [('', ['LICENSE']), + name='Mangle', + windows=[{'script': 'mangle.pyw'}], + data_files=[('', ['LICENSE']), ('mangle/ui', ['mangle/ui/book.ui', 'mangle/ui/about.ui', 'mangle/ui/options.ui']), @@ -39,11 +38,11 @@ setup( 'mangle/img/save_file.png', 'mangle/img/shift_down.png', 'mangle/img/shift_up.png'])], - options = {'py2exe': { + options={'py2exe': { 'bundle_files': 1, 'includes': ['sip'], 'packages': ['reportlab.pdfbase'], 'dll_excludes': ['w9xpopen.exe'] }}, - zipfile = None + zipfile=None )