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,