diff --git a/.travis.yml b/.travis.yml index 11a98b41..eff62b5d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,10 +21,10 @@ before_install: install: - if [ "$TRAVIS_OS_NAME" == "linux" ] ; then pip install -r requirements.txt ; fi -- if [ "$TRAVIS_OS_NAME" == "linux" ] ; then pip install certifi https://github.com/pyinstaller/pyinstaller/archive/develop.zip ; fi +- if [ "$TRAVIS_OS_NAME" == "linux" ] ; then pip install certifi PyInstaller ; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] ; then gem install fpm ; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] ; then pip3 install -r requirements.txt ; fi -- if [ "$TRAVIS_OS_NAME" == "osx" ] ; then pip3 install certifi https://github.com/pyinstaller/pyinstaller/archive/develop.zip ; fi +- if [ "$TRAVIS_OS_NAME" == "osx" ] ; then pip3 install certifi PyInstaller ; fi - if [ "$TRAVIS_OS_NAME" == "osx" ] ; then npm install -g appdmg ; fi script: python3 setup.py build_binary diff --git a/CHANGELOG.md b/CHANGELOG.md index c68a09f5..997e0430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ # CHANGELOG +#### 5.4.2: +* Added Kindle Oasis 2 profile +* Allowed metadata editor to edit directories +* Fixed image stretching when HQ Panel View option was enabled +* Fixed possible problem with directory sort order + #### 5.4.1: * Minor bug fixes and tweaks * Implemented new binary build pipeline diff --git a/README.md b/README.md index ce4977a0..fe49da19 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Options: MAIN: -p PROFILE, --profile=PROFILE Device profile (Available options: K1, K2, K34, K578, - KDX, KPW, KV, KoMT, KoG, KoGHD, KoA, KoAHD, KoAH2O, + KDX, KPW, KV, KO, KoMT, KoG, KoGHD, KoA, KoAHD, KoAH2O, KoAO) [Default=KV] -m, --manga-style Manga style (right-to-left reading and splitting) -q, --hq Try to increase the quality of magnification @@ -162,9 +162,10 @@ The app relies and includes the following scripts: - Icon is by **Nikolay Verin** ([http://ncrow.deviantart.com/](http://ncrow.deviantart.com/)) and released under [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/) License. ## SAMPLE FILES CREATED BY KCC +* [Kindle Oasis 2](http://kcc.iosphe.re/Samples/Ubunchu!-KO.mobi) * [Kindle Paperwhite 3 / Voyage / Oasis](http://kcc.iosphe.re/Samples/Ubunchu!-KV.mobi) * [Kindle Paperwhite 1 / 2](http://kcc.iosphe.re/Samples/Ubunchu!-KPW.mobi) -* [Kindle](http://kcc.iosphe.re/Samples/Ubunchu!-K45.mobi) +* [Kindle](http://kcc.iosphe.re/Samples/Ubunchu!-K578.mobi) * [Kobo Aura](http://kcc.iosphe.re/Samples/Ubunchu-KoA.kepub.epub) * [Kobo Aura HD](http://kcc.iosphe.re/Samples/Ubunchu-KoAHD.kepub.epub) * [Kobo Aura H2O](http://kcc.iosphe.re/Samples/Ubunchu-KoAH2O.kepub.epub) diff --git a/appveyor.yml b/appveyor.yml index 2a477212..1fb13e10 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,7 +5,7 @@ install: - set PATH="%PYTHON%\\Scripts";"C:\\Program Files (x86)\\Inno Setup 5";%PATH% - "%PYTHON%\\python.exe -m pip install --upgrade pip setuptools wheel" - "%PYTHON%\\python.exe -m pip install -r requirements.txt" - - "%PYTHON%\\python.exe -m pip install certifi https://github.com/pyinstaller/pyinstaller/archive/develop.zip" + - "%PYTHON%\\python.exe -m pip install certifi PyInstaller" - nuget install secure-file -ExcludeVersion - nuget install verpatch -ExcludeVersion - secure-file\tools\secure-file -decrypt other\windows\Cert.pfx.enc -secret %ENCRYPTION% diff --git a/gui/KCC.ui b/gui/KCC.ui index 1c49bc29..09a7b929 100644 --- a/gui/KCC.ui +++ b/gui/KCC.ui @@ -320,6 +320,9 @@ Editor + + <html><head/><body><p style='white-space:pre'>Shift+Click to edit directory.</p></body></html> + :/Other/icons/editor.png:/Other/icons/editor.png @@ -454,7 +457,7 @@ - <html><head/><body><p style='white-space:pre'>Shift+Click to select the output directory.</p></body></html> + <html><head/><body><p style='white-space:pre'>Shift+Click to select the output directory.</p></body></html> Convert diff --git a/kcc.iss b/kcc.iss index c51f8c8a..52254260 100644 --- a/kcc.iss +++ b/kcc.iss @@ -1,5 +1,5 @@ #define MyAppName "Kindle Comic Converter" -#define MyAppVersion "5.4.1" +#define MyAppVersion "5.4.2" #define MyAppPublisher "Ciro Mattia Gonano, Paweł Jastrzębski" #define MyAppURL "http://kcc.iosphe.re/" #define MyAppExeName "KCC.exe" @@ -49,7 +49,6 @@ Source: "LICENSE.txt"; DestDir: "{app}"; Flags: ignoreversion solidbreak Source: "other\windows\Additional-LICENSE.txt"; DestDir: "{app}"; Flags: ignoreversion Source: "other\windows\UnRAR.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "other\windows\7za.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "other\windows\vc_redist.x64.exe"; DestDir: "{tmp}"; Flags: ignoreversion deleteafterinstall [Icons] Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" @@ -57,7 +56,6 @@ Name: "{group}\Readme"; Filename: "https://github.com/ciromattia/kcc#kcc" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] -Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/install /passive /norestart"; StatusMsg: "Installing Microsoft Visual C++ 2015 Redistributable Package..." Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall [Messages] diff --git a/kindlecomicconverter/KCC_gui.py b/kindlecomicconverter/KCC_gui.py index c2749ff0..a98585a1 100644 --- a/kindlecomicconverter/KCC_gui.py +++ b/kindlecomicconverter/KCC_gui.py @@ -500,28 +500,38 @@ def selectFile(self): GUI.jobList.scrollToBottom() def selectFileMetaEditor(self): - if self.UnRAR: - if self.sevenza: - fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, - 'Comic (*.cbz *.cbr *.cb7)') - else: - fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, - 'Comic (*.cbz *.cbr)') + sname = '' + if QtWidgets.QApplication.keyboardModifiers() == QtCore.Qt.ShiftModifier: + dname = QtWidgets.QFileDialog.getExistingDirectory(MW, 'Select directory', self.lastPath) + if dname != '': + sname = os.path.join(dname, 'ComicInfo.xml') + if sys.platform.startswith('win'): + sname = sname.replace('/', '\\') + self.lastPath = os.path.abspath(sname) else: - if self.sevenza: - fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, - 'Comic (*.cbz *.cb7)') - else: - fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, - 'Comic (*.cbz)') - if fname[0] != '': - if sys.platform.startswith('win'): - fname = fname[0].replace('/', '\\') + if self.UnRAR: + if self.sevenza: + fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, + 'Comic (*.cbz *.cbr *.cb7)') + else: + fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, + 'Comic (*.cbz *.cbr)') else: - fname = fname[0] - self.lastPath = os.path.abspath(os.path.join(fname, os.pardir)) + if self.sevenza: + fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, + 'Comic (*.cbz *.cb7)') + else: + fname = QtWidgets.QFileDialog.getOpenFileName(MW, 'Select file', self.lastPath, + 'Comic (*.cbz)') + if fname[0] != '': + if sys.platform.startswith('win'): + sname = fname[0].replace('/', '\\') + else: + sname = fname[0] + self.lastPath = os.path.abspath(os.path.join(sname, os.pardir)) + if sname != '': try: - self.editor.loadData(fname) + self.editor.loadData(sname) except Exception as err: _, _, traceback = sys.exc_info() GUI.sentry.captureException() @@ -618,9 +628,9 @@ def togglewebtoonBox(self, value): def togglequalityBox(self, value): profile = GUI.profiles[str(GUI.deviceBox.currentText())] if value == 2: - if profile['Label'] in ['KV']: + if profile['Label'] in ['KV', 'KO']: self.addMessage('This option is intended for older Kindle models.', 'warning') - self.addMessage('It will not increase quality on a device with 300 ppi screen.', 'warning') + self.addMessage('On this device, quality improvement will be negligible.', 'warning') GUI.upscaleBox.setEnabled(False) GUI.upscaleBox.setChecked(True) else: @@ -918,6 +928,8 @@ def __init__(self, KCCAplication, KCCWindow): MW.resize(500, 500) self.profiles = { + "Kindle Oasis 2": {'PVOptions': True, 'ForceExpert': False, 'DefaultFormat': 0, + 'DefaultUpscale': True, 'Label': 'KO'}, "Kindle Oasis": {'PVOptions': True, 'ForceExpert': False, 'DefaultFormat': 0, 'DefaultUpscale': True, 'Label': 'KV'}, "Kindle Voyage": {'PVOptions': True, 'ForceExpert': False, 'DefaultFormat': 0, @@ -956,6 +968,7 @@ def __init__(self, KCCAplication, KCCWindow): 'DefaultUpscale': False, 'Label': 'K34'}, } profilesGUI = [ + "Kindle Oasis 2", "Kindle Oasis", "Kindle Voyage", "Kindle PW 3", @@ -1106,7 +1119,10 @@ def loadData(self, file): for field in (self.writerLine, self.pencillerLine, self.inkerLine, self.coloristLine): field.setText(', '.join(self.parser.data[field.objectName().capitalize()[:-4] + 's'])) if self.seriesLine.text() == '': - self.seriesLine.setText(file.split('\\')[-1].split('/')[-1].split('.')[0]) + if file.endswith('.xml'): + self.seriesLine.setText(file.split('\\')[-2]) + else: + self.seriesLine.setText(file.split('\\')[-1].split('/')[-1].split('.')[0]) def saveData(self): for field in (self.volumeLine, self.numberLine, self.muidLine): diff --git a/kindlecomicconverter/KCC_ui.py b/kindlecomicconverter/KCC_ui.py index ef8fcbfc..b70f3efc 100644 --- a/kindlecomicconverter/KCC_ui.py +++ b/kindlecomicconverter/KCC_ui.py @@ -258,6 +258,7 @@ def retranslateUi(self, mainWindow): self.colorBox.setText(_translate("mainWindow", "Color mode")) self.gammaLabel.setText(_translate("mainWindow", "Gamma: Auto")) self.editorButton.setText(_translate("mainWindow", "Editor")) + self.editorButton.setToolTip(_translate("mainWindow", "

Shift+Click to edit directory.

")) self.wikiButton.setText(_translate("mainWindow", "Wiki")) self.directoryButton.setToolTip(_translate("mainWindow", "

Add directory containing JPG, PNG or GIF files to queue.
CBR, CBZ and CB7 files inside will not be processed!

")) self.directoryButton.setText(_translate("mainWindow", "Add directory")) diff --git a/kindlecomicconverter/__init__.py b/kindlecomicconverter/__init__.py index 45fe8a65..dad32ea0 100644 --- a/kindlecomicconverter/__init__.py +++ b/kindlecomicconverter/__init__.py @@ -1,4 +1,4 @@ -__version__ = '5.4.1' +__version__ = '5.4.2' __license__ = 'ISC' __copyright__ = '2012-2017, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' diff --git a/kindlecomicconverter/comic2ebook.py b/kindlecomicconverter/comic2ebook.py index 4d5f574f..e27d5e64 100755 --- a/kindlecomicconverter/comic2ebook.py +++ b/kindlecomicconverter/comic2ebook.py @@ -104,7 +104,7 @@ def buildHTML(path, imgfile, imgfilepath): htmlfile = os.path.join(htmlpath, filename[0] + '.xhtml') imgsize = Image.open(os.path.join(head, "Images", postfix, imgfile)).size if options.hq: - imgsizeframe = deviceres + imgsizeframe = (int(imgsize[0] // 1.5), int(imgsize[1] // 1.5)) else: imgsizeframe = imgsize f = open(htmlfile, "w", encoding='UTF-8') @@ -118,7 +118,7 @@ def buildHTML(path, imgfile, imgfilepath): "content=\"width=" + str(imgsize[0]) + ", height=" + str(imgsize[1]) + "\"/>\n" "\n", "\n", - "
\n", + "
\n", "\n
\n"]) if options.iskindle and options.panelview: @@ -699,7 +699,7 @@ def sanitizeTree(filetree): for root, dirs, files in os.walk(filetree, False): for name in files: splitname = os.path.splitext(name) - slugified = slugify(splitname[0]) + slugified = slugify(splitname[0], False) while os.path.exists(os.path.join(root, slugified + splitname[1])) and splitname[0].upper()\ != slugified.upper(): slugified += "A" @@ -709,7 +709,7 @@ def sanitizeTree(filetree): os.replace(key, newKey) for name in dirs: tmpName = name - slugified = slugify(name) + slugified = slugify(name, True) while os.path.exists(os.path.join(root, slugified)) and name.upper() != slugified.upper(): slugified += "A" chapterNames[slugified] = tmpName @@ -856,8 +856,11 @@ def createNewTome(): return tomePath, tomePathRoot -def slugify(value): - value = slugifyExt(value) +def slugify(value, isDir): + if isDir: + value = slugifyExt(value, regex_pattern=r'[^-a-z0-9_\.]+') + else: + value = slugifyExt(value) value = sub(r'0*([0-9]{4,})', r'\1', sub(r'([0-9]+)', r'0000\1', value, count=2)) return value @@ -887,8 +890,8 @@ def makeParser(): otherOptions = OptionGroup(psr, "OTHER") mainOptions.add_option("-p", "--profile", action="store", dest="profile", default="KV", - help="Device profile (Available options: K1, K2, K34, K578, KDX, KPW, KV, KoMT, KoG, KoGHD," - " KoA, KoAHD, KoAH2O, KoAO) [Default=KV]") + help="Device profile (Available options: K1, K2, K34, K578, KDX, KPW, KV, KO, KoMT, KoG," + " KoGHD, KoA, KoAHD, KoAH2O, KoAO) [Default=KV]") mainOptions.add_option("-m", "--manga-style", action="store_true", dest="righttoleft", default=False, help="Manga style (right-to-left reading and splitting)") mainOptions.add_option("-q", "--hq", action="store_true", dest="hq", default=False, @@ -951,13 +954,13 @@ def checkOptions(): options.iskindle = False options.bordersColor = None if options.format == 'Auto': - if options.profile in ['K1', 'K2', 'K34', 'K578', 'KPW', 'KV']: + if options.profile in ['K1', 'K2', 'K34', 'K578', 'KPW', 'KV', 'KO']: options.format = 'MOBI' elif options.profile in ['OTHER', 'KoMT', 'KoG', 'KoGHD', 'KoA', 'KoAHD', 'KoAH2O', 'KoAO']: options.format = 'EPUB' elif options.profile in ['KDX']: options.format = 'CBZ' - if options.profile in ['K1', 'K2', 'K34', 'K578', 'KPW', 'KV']: + if options.profile in ['K1', 'K2', 'K34', 'K578', 'KPW', 'KV', 'KO']: options.iskindle = True if options.white_borders: options.bordersColor = 'white' diff --git a/kindlecomicconverter/image.py b/kindlecomicconverter/image.py index c95817e3..e7f29a43 100755 --- a/kindlecomicconverter/image.py +++ b/kindlecomicconverter/image.py @@ -85,6 +85,7 @@ def __init__(self): 'KDX': ("Kindle DX/DXG", (824, 1000), Palette16, 1.8), 'KPW': ("Kindle Paperwhite 1/2", (758, 1024), Palette16, 1.8), 'KV': ("Kindle Paperwhite 3/Voyage/Oasis", (1072, 1448), Palette16, 1.8), + 'KO': ("Kindle Oasis 2", (1264, 1680), Palette16, 1.8), 'KoMT': ("Kobo Mini/Touch", (600, 800), Palette16, 1.8), 'KoG': ("Kobo Glo", (768, 1024), Palette16, 1.8), 'KoGHD': ("Kobo Glo HD", (1072, 1448), Palette16, 1.8), diff --git a/kindlecomicconverter/metadata.py b/kindlecomicconverter/metadata.py index f2cf4887..714dcd18 100644 --- a/kindlecomicconverter/metadata.py +++ b/kindlecomicconverter/metadata.py @@ -43,10 +43,10 @@ def __init__(self, source): 'Bookmarks': []} self.rawdata = None self.compressor = None - if self.source.endswith('.xml'): + if self.source.endswith('.xml') and os.path.exists(self.source): self.rawdata = parse(self.source) self.parseXML() - else: + elif not self.source.endswith('.xml'): if is_zipfile(self.source): self.compressor = 'zip' with ZipFile(self.source) as zip_file: diff --git a/other/osx/Info.plist b/other/osx/Info.plist index d8fad38d..158bd621 100644 --- a/other/osx/Info.plist +++ b/other/osx/Info.plist @@ -30,7 +30,7 @@ CFBundleExecutable MacOS/Kindle Comic Converter CFBundleGetInfoString - KindleComicConverter 5.4.1, written 2012-2017 by Ciro Mattia Gonano and Pawel Jastrzebski + KindleComicConverter 5.4.2, written 2012-2017 by Ciro Mattia Gonano and Pawel Jastrzebski CFBundleIconFile comic2ebook.icns CFBundleIdentifier @@ -42,11 +42,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 5.4.1 + 5.4.2 CFBundleSignature ???? CFBundleVersion - 5.4.1 + 5.4.2 LSEnvironment PATH diff --git a/other/windows/vc_redist.x64.exe b/other/windows/vc_redist.x64.exe deleted file mode 100644 index 048fda2f..00000000 Binary files a/other/windows/vc_redist.x64.exe and /dev/null differ diff --git a/setup.py b/setup.py index 89c41a00..c50dcaa0 100755 --- a/setup.py +++ b/setup.py @@ -71,6 +71,7 @@ def run(self): '--category "graphics" -d "unrar | unrar-free" -d "p7zip-full" -d "libc6" usr') exit(0) + setuptools.setup( cmdclass={ 'build_binary': BuildBinaryCommand,