Improved epub cover image search, simplified function naming
This commit is contained in:
19
__main__.py
19
__main__.py
@@ -144,7 +144,8 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
self.listView.verticalScrollBar().setSingleStep(7)
|
self.listView.verticalScrollBar().setSingleStep(7)
|
||||||
self.listView.doubleClicked.connect(self.list_doubleclick)
|
self.listView.doubleClicked.connect(self.list_doubleclick)
|
||||||
self.listView.setItemDelegate(LibraryDelegate(self.temp_dir.path()))
|
self.listView.setItemDelegate(LibraryDelegate(self.temp_dir.path()))
|
||||||
self.reload_listview()
|
self.lib_ref.generate_model('build')
|
||||||
|
self.lib_ref.create_proxymodel()
|
||||||
|
|
||||||
# Keyboard shortcuts
|
# Keyboard shortcuts
|
||||||
self.exit_all = QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+Q'), self)
|
self.exit_all = QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+Q'), self)
|
||||||
@@ -208,13 +209,12 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
for i in selected_books:
|
for i in selected_books:
|
||||||
data = i.data(QtCore.Qt.UserRole + 3)
|
data = i.data(QtCore.Qt.UserRole + 3)
|
||||||
selected_hashes.append(data['hash'])
|
selected_hashes.append(data['hash'])
|
||||||
|
|
||||||
database.DatabaseFunctions(
|
database.DatabaseFunctions(
|
||||||
self.database_path).delete_from_database(selected_hashes)
|
self.database_path).delete_from_database(selected_hashes)
|
||||||
self.viewModel = None # TODO
|
|
||||||
# Delete the item from the model instead
|
self.lib_ref.generate_model('build')
|
||||||
# of reconstructing it
|
self.lib_ref.create_proxymodel()
|
||||||
# The same goes for addition
|
|
||||||
self.reload_listview()
|
|
||||||
|
|
||||||
selected_number = len(selected_books)
|
selected_number = len(selected_books)
|
||||||
msg_box = QtWidgets.QMessageBox()
|
msg_box = QtWidgets.QMessageBox()
|
||||||
@@ -227,10 +227,6 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
msg_box.show()
|
msg_box.show()
|
||||||
msg_box.exec_()
|
msg_box.exec_()
|
||||||
|
|
||||||
def reload_listview(self):
|
|
||||||
if not self.viewModel:
|
|
||||||
self.lib_ref.generate_model('build')
|
|
||||||
|
|
||||||
def tab_switch(self):
|
def tab_switch(self):
|
||||||
if self.tabWidget.currentIndex() == 0:
|
if self.tabWidget.currentIndex() == 0:
|
||||||
|
|
||||||
@@ -282,13 +278,12 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
|
|
||||||
# We're also updating the underlying model to have real-time
|
# We're also updating the underlying model to have real-time
|
||||||
# updates on the read status
|
# updates on the read status
|
||||||
# Find index of the model item that corresponds to the tab
|
|
||||||
|
|
||||||
# Set a baseline model index in case the item gets deleted
|
# Set a baseline model index in case the item gets deleted
|
||||||
# E.g It's open in a tab and deleted from the library
|
# E.g It's open in a tab and deleted from the library
|
||||||
model_index = None
|
model_index = None
|
||||||
|
|
||||||
start_index = self.viewModel.index(0, 0)
|
start_index = self.viewModel.index(0, 0)
|
||||||
|
# Find index of the model item that corresponds to the tab
|
||||||
matching_item = self.viewModel.match(
|
matching_item = self.viewModel.match(
|
||||||
start_index,
|
start_index,
|
||||||
QtCore.Qt.UserRole + 6,
|
QtCore.Qt.UserRole + 6,
|
||||||
|
12
database.py
12
database.py
@@ -127,9 +127,15 @@ class DatabaseFunctions:
|
|||||||
# file_hashes is expected as a list that will be iterated upon
|
# file_hashes is expected as a list that will be iterated upon
|
||||||
# This should enable multiple deletion
|
# This should enable multiple deletion
|
||||||
|
|
||||||
for i in file_hashes:
|
first = file_hashes[0]
|
||||||
self.database.execute(
|
sql_command = f"DELETE FROM books WHERE Hash = '{first}'"
|
||||||
f"DELETE FROM books WHERE Hash = '{i}'")
|
|
||||||
|
if len(file_hashes) > 1:
|
||||||
|
for i in file_hashes[1:]:
|
||||||
|
sql_command += f" OR Hash = '{i}'"
|
||||||
|
|
||||||
|
self.database.execute(sql_command)
|
||||||
|
|
||||||
self.database.commit()
|
self.database.commit()
|
||||||
self.close_database()
|
self.close_database()
|
||||||
|
|
||||||
|
@@ -121,8 +121,6 @@ class Library:
|
|||||||
item.setIcon(QtGui.QIcon(img_pixmap))
|
item.setIcon(QtGui.QIcon(img_pixmap))
|
||||||
self.parent_window.viewModel.appendRow(item)
|
self.parent_window.viewModel.appendRow(item)
|
||||||
|
|
||||||
self.create_proxymodel()
|
|
||||||
|
|
||||||
def create_proxymodel(self):
|
def create_proxymodel(self):
|
||||||
self.proxy_model = QtCore.QSortFilterProxyModel()
|
self.proxy_model = QtCore.QSortFilterProxyModel()
|
||||||
self.proxy_model.setSourceModel(self.parent_window.viewModel)
|
self.proxy_model.setSourceModel(self.parent_window.viewModel)
|
||||||
|
@@ -58,38 +58,38 @@ class ParseEPUB:
|
|||||||
cover_item = self.book.get_item_with_id(cover)
|
cover_item = self.book.get_item_with_id(cover)
|
||||||
if cover_item:
|
if cover_item:
|
||||||
return cover_item.get_content()
|
return cover_item.get_content()
|
||||||
|
|
||||||
# In case no cover_item is returned,
|
|
||||||
# we look for a cover in the guide
|
|
||||||
for j in self.book.guide:
|
|
||||||
try:
|
|
||||||
if (j['title'].lower in ['cover', 'cover-image', 'coverimage'] or
|
|
||||||
j['type'] == 'coverimagestandard'):
|
|
||||||
image_path = j['href']
|
|
||||||
break
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# And if all else fails, we find
|
|
||||||
# the first image referenced in the book
|
|
||||||
# Fuck everything
|
|
||||||
if not image_path:
|
|
||||||
for j in self.book.items:
|
|
||||||
if j.media_type == 'application/xhtml+xml':
|
|
||||||
_regex = re.search(r"src=\"(.*)\"\/", j.content.decode('utf-8'))
|
|
||||||
if _regex:
|
|
||||||
image_path = _regex[1]
|
|
||||||
break
|
|
||||||
|
|
||||||
for k in self.book.get_items_of_type(ebooklib.ITEM_IMAGE):
|
|
||||||
if os.path.basename(k.file_name) == os.path.basename(image_path):
|
|
||||||
image_content = k.get_content()
|
|
||||||
break
|
|
||||||
|
|
||||||
return image_content
|
|
||||||
|
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return None
|
pass
|
||||||
|
|
||||||
|
# In case no cover_item is returned, we look for a cover in the guide
|
||||||
|
for i in self.book.guide:
|
||||||
|
try:
|
||||||
|
if (i['title'].lower in ['cover', 'cover-image', 'coverimage'] or
|
||||||
|
i['type'] == 'coverimagestandard'):
|
||||||
|
image_path = i['href']
|
||||||
|
break
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# If that fails, we find the first image referenced in the book
|
||||||
|
if not image_path:
|
||||||
|
for i in self.book.items:
|
||||||
|
if i.media_type == 'application/xhtml+xml':
|
||||||
|
_regex = re.search(r"src=\"(.*)\"\/", i.content.decode('utf-8'))
|
||||||
|
if _regex:
|
||||||
|
image_path = _regex[1]
|
||||||
|
break
|
||||||
|
|
||||||
|
if image_path:
|
||||||
|
for i in self.book.get_items_of_type(ebooklib.ITEM_IMAGE):
|
||||||
|
if os.path.basename(i.file_name) == os.path.basename(image_path):
|
||||||
|
return i.get_content()
|
||||||
|
|
||||||
|
# And if that too fails, we get the first image referenced in the file
|
||||||
|
for i in self.book.items:
|
||||||
|
if i.media_type == 'image/jpeg' or i.media_type == 'image/png':
|
||||||
|
return i.get_content()
|
||||||
|
|
||||||
|
|
||||||
def get_isbn(self):
|
def get_isbn(self):
|
||||||
try:
|
try:
|
||||||
|
12
pie_chart.py
12
pie_chart.py
@@ -59,7 +59,7 @@ class GeneratePie():
|
|||||||
|
|
||||||
lPath = "%s %s %s" % (lLineOne, lArc, lLineTwo)
|
lPath = "%s %s %s" % (lLineOne, lArc, lLineTwo)
|
||||||
lGradient = GRADIENTS[lIndex]
|
lGradient = GRADIENTS[lIndex]
|
||||||
lSvgPath += "<path d='%s' style='stroke:#c579be; fill:url(#%s);'/>" % (
|
lSvgPath += "<path d='%s' style='stroke:#097b8c; fill:url(#%s);'/>" % (
|
||||||
lPath, lGradient)
|
lPath, lGradient)
|
||||||
lIndex += 1
|
lIndex += 1
|
||||||
|
|
||||||
@@ -68,19 +68,19 @@ class GeneratePie():
|
|||||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
<defs>
|
<defs>
|
||||||
<radialGradient id="myRadialGradientGreen" r="65%%" cx="0" cy="0" spreadMethod="pad">
|
<radialGradient id="myRadialGradientGreen" r="65%%" cx="0" cy="0" spreadMethod="pad">
|
||||||
<stop offset="0%%" stop-color="#c579be" stop-opacity="1"/>
|
<stop offset="0%%" stop-color="#11e0ff" stop-opacity="1"/>
|
||||||
<stop offset="100%%" stop-color="#c579be" stop-opacity="1" />
|
<stop offset="100%%" stop-color="#11e0ff" stop-opacity="1" />
|
||||||
</radialGradient>
|
</radialGradient>
|
||||||
</defs>
|
</defs>
|
||||||
<defs>
|
<defs>
|
||||||
<radialGradient id="myRadialGradientOrange" r="65%%" cx="0" cy="0" spreadMethod="pad">
|
<radialGradient id="myRadialGradientOrange" r="65%%" cx="0" cy="0" spreadMethod="pad">
|
||||||
<stop offset="0%%" stop-color="#6c4268" stop-opacity="1"/>
|
<stop offset="0%%" stop-color="#097b8c" stop-opacity="1"/>
|
||||||
<stop offset="100%%" stop-color="#6c4268" stop-opacity="1" />
|
<stop offset="100%%" stop-color="#097b8c" stop-opacity="1" />
|
||||||
</radialGradient>
|
</radialGradient>
|
||||||
</defs>
|
</defs>
|
||||||
|
|
||||||
%s
|
%s
|
||||||
<!-- <circle cx="%d" cy="%d" r="100" style="stroke:#6c4268; fill:none;"/> -->
|
<!-- <circle cx="%d" cy="%d" r="100" style="stroke:#097b8c; fill:none;"/> -->
|
||||||
</svg>
|
</svg>
|
||||||
""" % (lSvgPath, lOffsetX, lOffsetY)
|
""" % (lSvgPath, lOffsetX, lOffsetY)
|
||||||
|
|
||||||
|
BIN
resources/NotFound.png
Normal file
BIN
resources/NotFound.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
@@ -360,7 +360,7 @@ class LibraryDelegate(QtWidgets.QStyledItemDelegate):
|
|||||||
QtWidgets.QStyledItemDelegate.paint(self, painter, option, index)
|
QtWidgets.QStyledItemDelegate.paint(self, painter, option, index)
|
||||||
pie_chart.GeneratePie(progress_percent, self.temp_dir).generate()
|
pie_chart.GeneratePie(progress_percent, self.temp_dir).generate()
|
||||||
svg_path = os.path.join(self.temp_dir, 'lector_progress.svg')
|
svg_path = os.path.join(self.temp_dir, 'lector_progress.svg')
|
||||||
read_icon = QtGui.QIcon(svg_path).pixmap(34)
|
read_icon = QtGui.QIcon(svg_path).pixmap(32)
|
||||||
|
|
||||||
x_draw = option.rect.bottomRight().x() - 30
|
x_draw = option.rect.bottomRight().x() - 30
|
||||||
y_draw = option.rect.bottomRight().y() - 35
|
y_draw = option.rect.bottomRight().y() - 35
|
||||||
|
Reference in New Issue
Block a user