diff --git a/README.md b/README.md index 696c5534..5b88121c 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,10 @@ The app relies and includes the following scripts: * [Kobo Aura H2O](http://kcc.iosphe.re/Samples/Ubunchu-KoAH2O.kepub.epub) ## CHANGELOG +####4.6.3: +* Implemented remote bug reporting +* Minor bug fixes and GUI tweaks + ####4.6.2: * Fixed critical MOBI header bug * Fixed metadata encoding error @@ -423,6 +427,14 @@ The app relies and includes the following scripts: ####1.0 * Initial version +## PRIVACY +**KCC** is initiating internet connections in three cases: +* During startup - Version check +* When MCD metadata are used - Cover download +* When error occurs - Automatic reporting + +Error report include **KCC** version, OS version and content of error message. + ## KNOWN ISSUES Please check [wiki page](https://github.com/ciromattia/kcc/wiki/Known-issues). diff --git a/gui/KCC-OSX.ui b/gui/KCC-OSX.ui index 19768eea..70009699 100644 --- a/gui/KCC-OSX.ui +++ b/gui/KCC-OSX.ui @@ -462,6 +462,12 @@ QAbstractItemView::NoSelection + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + diff --git a/gui/KCC.ui b/gui/KCC.ui index 4cd08dcd..67153f9d 100644 --- a/gui/KCC.ui +++ b/gui/KCC.ui @@ -397,6 +397,12 @@ QAbstractItemView::NoSelection + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + diff --git a/gui/MetaEditor-OSX.ui b/gui/MetaEditor-OSX.ui index 681e1c09..a81cacb5 100644 --- a/gui/MetaEditor-OSX.ui +++ b/gui/MetaEditor-OSX.ui @@ -126,6 +126,9 @@ + + QFormLayout::ExpandingFieldsGrow + diff --git a/kcc.iss b/kcc.iss index 5deb3435..d4e88fe1 100644 --- a/kcc.iss +++ b/kcc.iss @@ -1,5 +1,5 @@ #define MyAppName "Kindle Comic Converter" -#define MyAppVersion "4.6.2" +#define MyAppVersion "4.6.3" #define MyAppPublisher "Ciro Mattia Gonano, Paweł Jastrzębski" #define MyAppURL "http://kcc.iosphe.re/" #define MyAppExeName "KCC.exe" diff --git a/kcc/KCC_MetaEditor_ui_osx.py b/kcc/KCC_MetaEditor_ui_osx.py index 3bcf74d1..8561c558 100644 --- a/kcc/KCC_MetaEditor_ui_osx.py +++ b/kcc/KCC_MetaEditor_ui_osx.py @@ -76,6 +76,7 @@ def setupUi(self, MetaEditorDialog): self.formLayoutWidget.setObjectName("formLayoutWidget") self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget) self.formLayout.setContentsMargins(0, 0, 0, 0) + self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.ExpandingFieldsGrow) self.formLayout.setObjectName("formLayout") self.label = QtWidgets.QLabel(self.formLayoutWidget) self.label.setObjectName("label") diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index a020cf2b..e5948e90 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -20,20 +20,22 @@ import os import sys from urllib.parse import unquote -from urllib.request import urlopen, urlretrieve +from urllib.request import urlopen, urlretrieve, Request from socket import gethostbyname_ex, gethostname from traceback import format_tb -from time import sleep +from time import sleep, time +from datetime import datetime from shutil import move from http.server import BaseHTTPRequestHandler, HTTPServer from socketserver import ThreadingMixIn from subprocess import STDOUT, PIPE from PyQt5 import QtGui, QtCore, QtWidgets, QtNetwork -from xml.dom.minidom import parse +from xml.dom.minidom import parse, Document from psutil import Popen, Process from copy import copy from distutils.version import StrictVersion from xml.sax.saxutils import escape +from platform import platform from .shared import md5Checksum, HTMLStripper from . import __version__ from . import comic2ebook @@ -245,22 +247,22 @@ def __del__(self): def run(self): try: - XML = urlopen('http://kcc.iosphe.re/Version.php') - XML = parse(XML) + XML = parse(urlopen(Request('https://kcc.iosphe.re/Version/', + headers={'User-Agent': 'KindleComicConverter/' + __version__}))) except Exception: return - latestVersion = XML.childNodes[0].getElementsByTagName('latest')[0].childNodes[0].toxml() + latestVersion = XML.childNodes[0].getElementsByTagName('LatestVersion')[0].childNodes[0].toxml() if StrictVersion(latestVersion) > StrictVersion(__version__): if sys.platform.startswith('win'): self.newVersion = latestVersion - self.md5 = XML.childNodes[0].getElementsByTagName('WindowsMD5')[0].childNodes[0].toxml() + self.md5 = XML.childNodes[0].getElementsByTagName('MD5')[0].childNodes[0].toxml() MW.showDialog.emit('New version released! ' 'See changelog.

Installed version: ' + __version__ + '
Current version: ' + latestVersion + '

Would you like to start automatic update?', 'question') self.getNewVersion() else: - MW.addMessage.emit('' + MW.addMessage.emit('' 'New version is available! ' '(' 'Changelog)', 'warning', False) @@ -275,7 +277,7 @@ def getNewVersion(self): try: MW.modeConvert.emit(-1) MW.progressBarTick.emit('Downloading update') - path = urlretrieve('http://kcc.iosphe.re/Windows/KindleComicConverter_win_' + path = urlretrieve('https://kcc.iosphe.re/Windows/KindleComicConverter_win_' + self.newVersion + '.exe', reporthook=self.getNewVersionTick) if self.md5 != md5Checksum(path[0]): raise Exception @@ -350,7 +352,7 @@ def clean(self): def sanitizeTrace(self, traceback): return ''.join(format_tb(traceback))\ - .replace('C:\\Users\\AcidWeb\\Documents\\Projekty\\KCC\\', '')\ + .replace('C:\\Users\\pawel\\Documents\\Projekty\\KCC\\', '')\ .replace('C:\\Python34\\', '')\ .replace('C:\\Python34_64\\', '') @@ -928,6 +930,31 @@ def addMessage(self, message, icon, replace=False): def showDialog(self, message, kind): if kind == 'error': QtWidgets.QMessageBox.critical(MW, 'KCC - Error', message, QtWidgets.QMessageBox.Ok) + try: + doc = Document() + root = doc.createElement('KCCErrorReport') + doc.appendChild(root) + main = doc.createElement('Timestamp') + root.appendChild(main) + text = doc.createTextNode(datetime.fromtimestamp(time()).strftime('%Y-%m-%d %H:%M:%S')) + main.appendChild(text) + main = doc.createElement('OS') + root.appendChild(main) + text = doc.createTextNode(platform()) + main.appendChild(text) + main = doc.createElement('Version') + root.appendChild(main) + text = doc.createTextNode(__version__) + main.appendChild(text) + main = doc.createElement('Error') + root.appendChild(main) + text = doc.createTextNode(message) + main.appendChild(text) + urlopen(Request(url='https://kcc.iosphe.re/ErrorHandle/', data=doc.toxml(encoding='utf-8'), + headers={'Content-Type': 'application/xml', + 'User-Agent': 'KindleComicConverter/' + __version__})) + except: + pass elif kind == 'question': GUI.versionCheck.setAnswer(QtWidgets.QMessageBox.question(MW, 'KCC - Question', message, QtWidgets.QMessageBox.Yes, @@ -1205,7 +1232,7 @@ def __init__(self, KCCAplication, KCCWindow): "Kindle DX/DXG", ] - statusBarLabel = QtWidgets.QLabel('HOMEPAGE - HOMEPAGE - DO' 'NATE - WIKI - FORUM') @@ -1307,6 +1334,12 @@ def __init__(self, KCCAplication, KCCWindow): self.versionCheck.start() self.contentServer.start() self.tray.show() + + # Linux hack as PyQt 5.5 not hit mainstream distributions yet + if sys.platform.startswith('linux') and StrictVersion(QtCore.qVersion()) > StrictVersion('5.4.9'): + self.JobList.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + MW.setWindowTitle("Kindle Comic Converter " + __version__) MW.show() MW.raise_() diff --git a/kcc/KCC_ui.py b/kcc/KCC_ui.py index 35d5ca8d..a80e9bf6 100644 --- a/kcc/KCC_ui.py +++ b/kcc/KCC_ui.py @@ -141,6 +141,8 @@ def setupUi(self, KCC): self.JobList.setStyleSheet("QListWidget#JobList {background:#ffffff;background-image:url(:/Other/icons/list_background.png);background-position:center center;background-repeat:no-repeat;}QScrollBar:vertical{border:1px solid #999;background:#FFF;width:5px;margin:0}QScrollBar::handle:vertical{background:DarkGray;min-height:0}QScrollBar::add-line:vertical{height:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:vertical{height:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}QScrollBar:horizontal{border:1px solid #999;background:#FFF;height:5px;margin:0}QScrollBar::handle:horizontal{background:DarkGray;min-width:0}QScrollBar::add-line:horizontal{width:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{width:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}") self.JobList.setProperty("showDropIndicator", False) self.JobList.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.JobList.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) self.JobList.setObjectName("JobList") self.BasicModeButton = QtWidgets.QPushButton(self.Form) self.BasicModeButton.setGeometry(QtCore.QRect(10, 10, 141, 32)) diff --git a/kcc/KCC_ui_osx.py b/kcc/KCC_ui_osx.py index 6184b042..55f1a19d 100644 --- a/kcc/KCC_ui_osx.py +++ b/kcc/KCC_ui_osx.py @@ -188,6 +188,8 @@ def setupUi(self, KCC): self.JobList.setStyleSheet("QListWidget#JobList {background:#ffffff;background-image:url(:/Other/icons/list_background.png);background-position:center center;background-repeat:no-repeat;}QScrollBar:vertical{border:1px solid #999;background:#FFF;width:5px;margin:0}QScrollBar::handle:vertical{background:DarkGray;min-height:0}QScrollBar::add-line:vertical{height:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:vertical{height:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}QScrollBar:horizontal{border:1px solid #999;background:#FFF;height:5px;margin:0}QScrollBar::handle:horizontal{background:DarkGray;min-width:0}QScrollBar::add-line:horizontal{width:0;background:DarkGray;subcontrol-position:bottom;subcontrol-origin:margin}QScrollBar::sub-line:horizontal{width:0;background:DarkGray;subcontrol-position:top;subcontrol-origin:margin}") self.JobList.setProperty("showDropIndicator", False) self.JobList.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.JobList.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.JobList.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) self.JobList.setObjectName("JobList") self.BasicModeButton = QtWidgets.QPushButton(self.Form) self.BasicModeButton.setGeometry(QtCore.QRect(5, 10, 156, 41)) diff --git a/kcc/__init__.py b/kcc/__init__.py index 10c7f427..559ed657 100644 --- a/kcc/__init__.py +++ b/kcc/__init__.py @@ -1,4 +1,4 @@ -__version__ = '4.6.2' +__version__ = '4.6.3' __license__ = 'ISC' __copyright__ = '2012-2015, Ciro Mattia Gonano , Pawel Jastrzebski ' __docformat__ = 'restructuredtext en' diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 06a1c617..ce4cfa67 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -986,7 +986,7 @@ def detectCorruption(tmpPath, orgPath): imageSmaller += 1 except Exception as err: rmtree(os.path.join(tmpPath, '..', '..'), True) - if 'decoder' in err and 'not available' in err: + if 'decoder' in str(err) and 'not available' in str(err): raise RuntimeError('Pillow was compiled without JPG and/or PNG decoder.') else: raise RuntimeError('Image file %s is corrupted.' % pathOrg) diff --git a/other/libqcocoa.dylib b/other/libqcocoa.dylib index 4d025a7c..0f6e015d 100644 Binary files a/other/libqcocoa.dylib and b/other/libqcocoa.dylib differ diff --git a/setup.py b/setup.py index 64774e5c..95b712c2 100755 --- a/setup.py +++ b/setup.py @@ -95,7 +95,7 @@ zipfile=None, data_files=additional_files) else: - if argv[1] == 'make_pyz': + if len(argv) > 1 and argv[1] == 'make_pyz': from os import system script = ''' cp kcc.py __main__.py