Search Google books for missing covers
Small fixes
This commit is contained in:
@@ -718,11 +718,16 @@ class PliantWidgetsCommonFunctions:
|
|||||||
def change_chapter(self, direction, was_button_pressed=None):
|
def change_chapter(self, direction, was_button_pressed=None):
|
||||||
current_tab = self.pw.parent
|
current_tab = self.pw.parent
|
||||||
current_position = current_tab.metadata['position']['current_chapter']
|
current_position = current_tab.metadata['position']['current_chapter']
|
||||||
|
final_position = len(current_tab.metadata['content'])
|
||||||
|
|
||||||
# Prevent scrolling below page 1
|
# Prevent scrolling below page 1
|
||||||
if current_position == 1 and direction == -1:
|
if current_position == 1 and direction == -1:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Prevent scrolling beyond last page
|
||||||
|
if (current_position == final_position) and direction == 1:
|
||||||
|
return
|
||||||
|
|
||||||
# Special cases for double page view
|
# Special cases for double page view
|
||||||
# Page limits are taken care of by the set_content method
|
# Page limits are taken care of by the set_content method
|
||||||
def get_modifier():
|
def get_modifier():
|
||||||
|
@@ -27,7 +27,6 @@ try:
|
|||||||
multimedia_available = True
|
multimedia_available = True
|
||||||
except ImportError:
|
except ImportError:
|
||||||
error_string = 'QtMultimedia not found. Sounds will not play.'
|
error_string = 'QtMultimedia not found. Sounds will not play.'
|
||||||
print(error_string)
|
|
||||||
logger.error(error_string)
|
logger.error(error_string)
|
||||||
multimedia_available = False
|
multimedia_available = False
|
||||||
|
|
||||||
|
@@ -34,12 +34,14 @@
|
|||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import json
|
||||||
import time
|
import time
|
||||||
import pickle
|
import pickle
|
||||||
import logging
|
import logging
|
||||||
import hashlib
|
import hashlib
|
||||||
import threading
|
import threading
|
||||||
import importlib
|
import importlib
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
# The multiprocessing module does not work correctly on Windows
|
# The multiprocessing module does not work correctly on Windows
|
||||||
if sys.platform.startswith('win'):
|
if sys.platform.startswith('win'):
|
||||||
@@ -94,7 +96,7 @@ else:
|
|||||||
|
|
||||||
available_parsers = [i for i in sorter]
|
available_parsers = [i for i in sorter]
|
||||||
progressbar = None # This is populated by __main__
|
progressbar = None # This is populated by __main__
|
||||||
progress_emitter = None # This is to be made into a global variable
|
_progress_emitter = None # This is to be made into a global variable
|
||||||
|
|
||||||
|
|
||||||
class UpdateProgress(QtCore.QObject):
|
class UpdateProgress(QtCore.QObject):
|
||||||
@@ -244,7 +246,7 @@ class BookSorter:
|
|||||||
if cover_image_raw:
|
if cover_image_raw:
|
||||||
cover_image = resize_image(cover_image_raw)
|
cover_image = resize_image(cover_image_raw)
|
||||||
else:
|
else:
|
||||||
cover_image = None
|
cover_image = fetch_cover(title, author)
|
||||||
|
|
||||||
this_book[file_md5]['cover_image'] = cover_image
|
this_book[file_md5]['cover_image'] = cover_image
|
||||||
this_book[file_md5]['addition_mode'] = self.addition_mode
|
this_book[file_md5]['addition_mode'] = self.addition_mode
|
||||||
@@ -293,8 +295,9 @@ class BookSorter:
|
|||||||
total_number = len(self.file_list)
|
total_number = len(self.file_list)
|
||||||
completed_number = len(self.threading_completed)
|
completed_number = len(self.threading_completed)
|
||||||
|
|
||||||
if progress_emitter: # Skip update in reading mode
|
# Just for the record, this slows down book searching by about 20%
|
||||||
progress_emitter.update_progress(
|
if _progress_emitter: # Skip update in reading mode
|
||||||
|
_progress_emitter.update_progress(
|
||||||
completed_number * 100 // total_number)
|
completed_number * 100 // total_number)
|
||||||
|
|
||||||
if total_number == completed_number:
|
if total_number == completed_number:
|
||||||
@@ -338,9 +341,9 @@ class BookSorter:
|
|||||||
def progress_object_generator():
|
def progress_object_generator():
|
||||||
# This has to be kept separate from the BookSorter class because
|
# This has to be kept separate from the BookSorter class because
|
||||||
# the QtObject inheritance disallows pickling
|
# the QtObject inheritance disallows pickling
|
||||||
global progress_emitter
|
global _progress_emitter
|
||||||
progress_emitter = UpdateProgress()
|
_progress_emitter = UpdateProgress()
|
||||||
progress_emitter.connect_to_progressbar()
|
_progress_emitter.connect_to_progressbar()
|
||||||
|
|
||||||
|
|
||||||
def resize_image(cover_image_raw):
|
def resize_image(cover_image_raw):
|
||||||
@@ -363,3 +366,45 @@ def resize_image(cover_image_raw):
|
|||||||
cover_image_final = io.BytesIO(byte_array)
|
cover_image_final = io.BytesIO(byte_array)
|
||||||
cover_image_final.seek(0)
|
cover_image_final.seek(0)
|
||||||
return cover_image_final.getvalue()
|
return cover_image_final.getvalue()
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_cover(title, author):
|
||||||
|
# TODO
|
||||||
|
# Start using the author parameter
|
||||||
|
# Generate a cover image in case the Google API finds nothing
|
||||||
|
# Why is that stupid UnicodeEncodeError happening?
|
||||||
|
|
||||||
|
api_url = 'https://www.googleapis.com/books/v1/volumes?q='
|
||||||
|
key = '&key=' + 'AIzaSyDOferpeSS424Dshs4YWY1s-nIBA9884hE'
|
||||||
|
title = title.replace(' ', '+')
|
||||||
|
req = api_url + title + key
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = urllib.request.urlopen(req)
|
||||||
|
if response.getcode() == 200:
|
||||||
|
response_text = response.read().decode('utf-8')
|
||||||
|
response_json = json.loads(response_text)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
except (urllib.error.HTTPError, urllib.error.URLError):
|
||||||
|
return None
|
||||||
|
|
||||||
|
except UnicodeEncodeError:
|
||||||
|
logger.error('UnicodeEncodeError fetching cover for ' + title)
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Get cover link from json
|
||||||
|
cover_link = response_json['items'][0]['volumeInfo']['imageLinks']['thumbnail']
|
||||||
|
# Get a slightly larger version
|
||||||
|
cover_link = cover_link.replace('zoom=1', 'zoom=2')
|
||||||
|
cover_request = urllib.request.urlopen(cover_link)
|
||||||
|
response = cover_request.read() # Bytes object
|
||||||
|
cover_image = resize_image(response)
|
||||||
|
logger.info('Cover found for ' + title)
|
||||||
|
|
||||||
|
return cover_image
|
||||||
|
|
||||||
|
except:
|
||||||
|
logger.error(f'Couldn\'t find cover for ' + title)
|
||||||
|
@@ -431,6 +431,7 @@ class Tab(QtWidgets.QWidget):
|
|||||||
|
|
||||||
# Update the metadata dictionary to save position
|
# Update the metadata dictionary to save position
|
||||||
self.metadata['position']['current_chapter'] = required_position
|
self.metadata['position']['current_chapter'] = required_position
|
||||||
|
self.metadata['position']['is_read'] = False
|
||||||
if record_position:
|
if record_position:
|
||||||
self.contentView.record_position()
|
self.contentView.record_position()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user