mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix cover fetching for The Atlantic and fix regressions in epub-meta and ebook-viewer
This commit is contained in:
parent
894c1570db
commit
70a90c3b50
1
setup.py
1
setup.py
@ -144,6 +144,7 @@ if __name__ == '__main__':
|
||||
ncx_template = 'ebooks/metadata/ncx.xml',
|
||||
fb2_xsl = 'ebooks/lrf/fb2/fb2.xsl',
|
||||
metadata_sqlite = 'library/metadata_sqlite.sql',
|
||||
jquery = 'gui2/viewer/jquery.js',
|
||||
)
|
||||
|
||||
DEST = os.path.join('src', APPNAME, 'resources.py')
|
||||
|
@ -8,7 +8,6 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||
import sys, os, time
|
||||
from cStringIO import StringIO
|
||||
from contextlib import closing
|
||||
from ctypes import c_long, byref
|
||||
|
||||
from PyQt4.Qt import QUrl, QEventLoop, QSize, QByteArray, QBuffer, \
|
||||
SIGNAL, QPainter, QImage, QObject, QApplication, Qt, QPalette
|
||||
@ -19,7 +18,7 @@ from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup
|
||||
from calibre.ebooks.metadata import get_parser, MetaInformation
|
||||
from calibre.ebooks.metadata.opf2 import OPF
|
||||
from calibre.ptempfile import TemporaryDirectory
|
||||
from calibre import CurrentDir
|
||||
from calibre import CurrentDir, fit_image
|
||||
|
||||
class EPubException(Exception):
|
||||
pass
|
||||
@ -120,11 +119,11 @@ class CoverRenderer(QObject):
|
||||
def render_html(self, ok):
|
||||
self.rendered = True
|
||||
try:
|
||||
from calibre.utils.PythonMagickWand import ImageMagick, NewMagickWand, MagickGetImageBlob, \
|
||||
MagickReadImageBlob, MagickTrimImage, MagickSetFormat
|
||||
if not ok:
|
||||
return
|
||||
self.page.setViewportSize(QSize(1280, 1024))
|
||||
size = self.page.mainFrame().contentsSize()
|
||||
width, height = fit_image(size.width(), size.height(), 1280, 1024)[1:]
|
||||
self.page.setViewportSize(QSize(width, height))
|
||||
image = QImage(self.page.viewportSize(), QImage.Format_ARGB32)
|
||||
image.setDotsPerMeterX(96*(100/2.54))
|
||||
image.setDotsPerMeterY(96*(100/2.54))
|
||||
@ -136,21 +135,7 @@ class CoverRenderer(QObject):
|
||||
buf = QBuffer(ba)
|
||||
buf.open(QBuffer.WriteOnly)
|
||||
image.save(buf, 'JPEG')
|
||||
raw = str(ba.data())
|
||||
with ImageMagick():
|
||||
wand = NewMagickWand()
|
||||
if not MagickReadImageBlob(wand, raw, len(raw)):
|
||||
raise ValueError('Failed to load cover image')
|
||||
if not MagickTrimImage(wand, 10.):
|
||||
raise ValueError('Failed to process cover image')
|
||||
x = c_long(0)
|
||||
if not MagickSetFormat(wand, 'JPEG'):
|
||||
raise Exception()
|
||||
dat = MagickGetImageBlob(wand, byref(x))
|
||||
obuf = StringIO()
|
||||
for i in xrange(x.value):
|
||||
obuf.write(chr(dat[i]))
|
||||
self.image_data = obuf.getvalue()
|
||||
self.image_data = str(ba.data())
|
||||
finally:
|
||||
self.loop.exit(0)
|
||||
|
||||
|
@ -14,6 +14,7 @@ from PyQt4.QtWebKit import QWebPage, QWebView, QWebSettings
|
||||
from calibre.utils.config import Config, StringConfig
|
||||
from calibre.gui2.viewer.config_ui import Ui_Dialog
|
||||
|
||||
|
||||
def load_builtin_fonts():
|
||||
from calibre.ebooks.lrf.fonts.liberation import LiberationMono_BoldItalic
|
||||
QFontDatabase.addApplicationFontFromData(QByteArray(LiberationMono_BoldItalic.font_data))
|
||||
@ -128,6 +129,14 @@ class Document(QWebPage):
|
||||
# Miscellaneous
|
||||
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
|
||||
|
||||
# Load jQuery
|
||||
self.connect(self.mainFrame(), SIGNAL('javaScriptWindowObjectCleared()'),
|
||||
self.load_javascript_libraries)
|
||||
|
||||
def load_javascript_libraries(self):
|
||||
from calibre.resources import jquery
|
||||
self.javascript(jquery)
|
||||
|
||||
def javascript(self, string, typ=None):
|
||||
ans = self.mainFrame().evaluateJavaScript(string)
|
||||
if typ == 'int':
|
||||
@ -259,7 +268,7 @@ class DocumentView(QWebView):
|
||||
self.connect(self.scrollbar, SIGNAL('valueChanged(int)'), self.scroll_horizontally)
|
||||
|
||||
def scroll_horizontally(self, amount):
|
||||
self.document.scroll_to(x=amount)
|
||||
self.document.scroll_to(y=self.document.ypos, x=amount)
|
||||
|
||||
def link_hovered(self, link, text, context):
|
||||
link, text = unicode(link), unicode(text)
|
||||
@ -340,6 +349,7 @@ class DocumentView(QWebView):
|
||||
if scrolled:
|
||||
self.manager.scrolled(self.document.scroll_fraction)
|
||||
|
||||
|
||||
@classmethod
|
||||
def test_line(cls, img, y):
|
||||
start = img.pixel(0, y)
|
||||
|
3549
src/calibre/gui2/viewer/jquery.js
vendored
Normal file
3549
src/calibre/gui2/viewer/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -363,9 +363,15 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
||||
self.view.load_path(path, pos=pos)
|
||||
|
||||
def viewport_resized(self, frac):
|
||||
pos = self.pos.value()
|
||||
self.view.scroll_to(pos, notify=False)
|
||||
#self.set_page_number(frac)
|
||||
new_page = self.pos.value()
|
||||
if self.current_page is not None:
|
||||
try:
|
||||
frac = float(new_page-self.current_page.start_page)/(self.current_page.pages-1)
|
||||
except ZeroDivisionError:
|
||||
frac = 0
|
||||
self.view.scroll_to(frac, notify=False)
|
||||
else:
|
||||
self.set_page_number(frac)
|
||||
|
||||
def close_progress_indicator(self):
|
||||
self.pi.stop()
|
||||
|
@ -79,6 +79,9 @@ class BasicNewsRecipe(object, LoggingInterface):
|
||||
#: If True stylesheets are not downloaded and processed
|
||||
no_stylesheets = False
|
||||
|
||||
#: Convenient flag to strip all javascripts tags from the downloaded HTML
|
||||
remove_javascript = True
|
||||
|
||||
#: If True the GUI will ask the user for a username and password
|
||||
#: to use while downloading
|
||||
#: @type: boolean
|
||||
@ -485,6 +488,9 @@ class BasicNewsRecipe(object, LoggingInterface):
|
||||
if self.no_stylesheets:
|
||||
for link in list(soup.findAll('link', type=re.compile('css'))):
|
||||
link.extract()
|
||||
if self.remove_javascript:
|
||||
for script in list(soup.findAll('script')):
|
||||
script.extract()
|
||||
return self.postprocess_html(soup, first_fetch)
|
||||
|
||||
|
||||
|
@ -5,7 +5,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||
'''
|
||||
theatlantic.com
|
||||
'''
|
||||
|
||||
import re
|
||||
from calibre.web.feeds.news import BasicNewsRecipe
|
||||
|
||||
class TheAtlantic(BasicNewsRecipe):
|
||||
@ -28,7 +28,7 @@ class TheAtlantic(BasicNewsRecipe):
|
||||
if issue:
|
||||
self.timefmt = ' [%s]'%self.tag_to_string(issue).rpartition('|')[-1].strip().replace('/', '-')
|
||||
|
||||
cover = soup.find('img', alt='feature image', src=True)
|
||||
cover = soup.find('img', alt=re.compile('Cover'), src=True)
|
||||
if cover is not None:
|
||||
self.cover_url = 'http://theatlantic.com'+cover['src']
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user