diff --git a/src/calibre/ebooks/oeb/reader.py b/src/calibre/ebooks/oeb/reader.py index 0caa9533bd..26a15c057f 100644 --- a/src/calibre/ebooks/oeb/reader.py +++ b/src/calibre/ebooks/oeb/reader.py @@ -192,6 +192,7 @@ class OEBReader(object): if not scheme and href not in known: new.add(href) unchecked.clear() + warned = set([]) for href in new: known.add(href) is_invalid = False @@ -202,9 +203,13 @@ class OEBReader(object): if is_invalid: continue if not self.oeb.container.exists(href): - self.logger.warn('Referenced file %r not found' % href) + if href not in warned: + self.logger.warn('Referenced file %r not found' % href) + warned.add(href) continue - self.logger.warn('Referenced file %r not in manifest' % href) + if href not in warned: + self.logger.warn('Referenced file %r not in manifest' % href) + warned.add(href) id, _ = manifest.generate(id='added') guessed = guess_type(href)[0] media_type = guessed or BINARY_MIME diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index e27ccba82f..79ecbc082b 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -15,6 +15,7 @@ from PyQt4.QtCore import QAbstractTableModel, QVariant, Qt, QString, \ from calibre import strftime from calibre.ptempfile import PersistentTemporaryFile +from calibre.utils.pyparsing import ParseException from calibre.library.database2 import FIELD_MAP from calibre.gui2 import NONE, TableView, qstring_to_unicode, config, \ error_dialog @@ -240,7 +241,11 @@ class BooksModel(QAbstractTableModel): self.count_changed() def search(self, text, refinement, reset=True): - self.db.search(text) + try: + self.db.search(text) + except ParseException: + self.emit(SIGNAL('parse_exception()')) + return self.last_search = text if reset: self.clear_caches() @@ -856,7 +861,12 @@ class DeviceBooksModel(BooksModel): if not text or not text.strip(): self.map = list(range(len(self.db))) else: - matches = self.search_engine.parse(text) + try: + matches = self.search_engine.parse(text) + except ParseException: + self.emit(SIGNAL('parse_exception()')) + return + self.map = [] for i in range(len(self.db)): if i in matches: diff --git a/src/calibre/library/server.py b/src/calibre/library/server.py index 071d4c285a..eab159bc95 100644 --- a/src/calibre/library/server.py +++ b/src/calibre/library/server.py @@ -221,9 +221,20 @@ class LibraryServer(object): def get_format(self, id, format): format = format.upper() - fmt = self.db.format(id, format, index_is_id=True, as_file=True, mode='rb') + fmt = self.db.format(id, format, index_is_id=True, as_file=True, + mode='r+b') if fmt is None: raise cherrypy.HTTPError(404, 'book: %d does not have format: %s'%(id, format)) + if format == 'EPUB': + from tempfile import TemporaryFile + from calibre.ebooks.metadata.meta import set_metadata + raw = fmt.read() + fmt = TemporaryFile() + fmt.write(raw) + fmt.seek(0) + set_metadata(fmt, self.db.get_metadata(id, index_is_id=True), + 'epub') + fmt.seek(0) mt = guess_type('dummy.'+format.lower())[0] if mt is None: mt = 'application/octet-stream' diff --git a/src/calibre/web/feeds/recipes/recipe_wsj.py b/src/calibre/web/feeds/recipes/recipe_wsj.py index a2d72abd99..67211d75dc 100644 --- a/src/calibre/web/feeds/recipes/recipe_wsj.py +++ b/src/calibre/web/feeds/recipes/recipe_wsj.py @@ -7,94 +7,108 @@ from calibre.web.feeds.news import BasicNewsRecipe # http://online.wsj.com/page/us_in_todays_paper.html -class WallStreetJournal(BasicNewsRecipe): - - title = 'The Wall Street Journal' - __author__ = 'Kovid Goyal' +class WallStreetJournal(BasicNewsRecipe): + + title = 'The Wall Street Journal' + __author__ = 'Kovid Goyal and Sujata Raman' description = 'News and current affairs.' needs_subscription = True language = _('English') max_articles_per_feed = 10 - timefmt = ' [%a, %b %d, %Y]' + timefmt = ' [%a, %b %d, %Y]' no_stylesheets = True + + extra_css = '''h1{color:#093D72 ; font-size:large ; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; } + h2{color:gray; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small; font-style:italic;} + .subhead{color:gray; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small; font-style:italic;} + .insettipUnit {color:#666666; font-family:Arial,Sans-serif;font-size:xx-small } + .targetCaption{ font-size:x-small; color:#333333; font-family:Arial,Helvetica,sans-serif} + .article{font-family :Arial,Helvetica,sans-serif; font-size:x-small} + .tagline {color:#333333; font-size:xx-small} + .dateStamp {color:#666666; font-family:Arial,Helvetica,sans-serif} + h3{color:blue ;font-family:Arial,Helvetica,sans-serif; font-size:xx-small} + .byline{color:blue;font-family:Arial,Helvetica,sans-serif; font-size:xx-small} + h6{color:#333333; font-family:Georgia,"Century Schoolbook","Times New Roman",Times,serif; font-size:small;font-style:italic; } + .paperLocation{color:#666666; font-size:xx-small}''' + remove_tags_before = dict(name='h1') remove_tags = [ - dict(id=["articleTabs_tab_article", "articleTabs_tab_comments", "articleTabs_tab_interactive"]), - {'class':['more_in', "insetContent", 'articleTools_bottom', 'aTools', "tooltip", "adSummary", "nav-inline"]}, + dict(id=["articleTabs_tab_article", "articleTabs_tab_comments", "articleTabs_tab_interactive","articleTabs_tab_video","articleTabs_tab_map","articleTabs_tab_slideshow"]), + {'class':['footer_columns','network','insetCol3wide','interactive','video','slideshow','map','insettip','more_in', "insetContent", 'articleTools_bottom', 'aTools', "tooltip", "adSummary", "nav-inline"]}, dict(rel='shortcut icon'), ] remove_tags_after = [dict(id="article_story_body"), {'class':"article story"},] - - def get_browser(self): - br = BasicNewsRecipe.get_browser() - if self.username is not None and self.password is not None: - br.open('http://commerce.wsj.com/auth/login') - br.select_form(nr=0) - br['user'] = self.username - br['password'] = self.password - br.submit() + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('http://commerce.wsj.com/auth/login') + br.select_form(nr=0) + br['user'] = self.username + br['password'] = self.password + br.submit() return br - + def postprocess_html(self, soup, first): for tag in soup.findAll(name=['table', 'tr', 'td']): tag.name = 'div' return soup - + def get_article_url(self, article): try: return article.feedburner_origlink.split('?')[0] except AttributeError: return article.link.split('?')[0] - - def cleanup(self): - self.browser.open('http://online.wsj.com/logout?url=http://online.wsj.com') - - feeds = [ - #('Most Emailed - Day', 'http://online.wsj.com/xml/rss/3_7030.xml'), - #('Most Emailed - Week', 'http://online.wsj.com/xml/rss/3_7253.xml'), - #('Most Emailed - Month', 'http://online.wsj.com/xml/rss/3_7254.xml'), - (' Most Viewed - Day', 'http://online.wsj.com/xml/rss/3_7198.xml'), - (' Most Viewed - Week', 'http://online.wsj.com/xml/rss/3_7251.xml'), - # ('Most Viewed - Month', 'http://online.wsj.com/xml/rss/3_7252.xml'), - ('Today\'s Newspaper - Page One', 'http://online.wsj.com/xml/rss/3_7205.xml'), - ('Today\'s Newspaper - Marketplace', 'http://online.wsj.com/xml/rss/3_7206.xml'), - ('Today\'s Newspaper - Money & Investing', 'http://online.wsj.com/xml/rss/3_7207.xml'), - ('Today\'s Newspaper - Personal Journal', 'http://online.wsj.com/xml/rss/3_7208.xml'), - ('Today\'s Newspaper - Weekend Journal', 'http://online.wsj.com/xml/rss/3_7209.xml'), - ('Opinion', 'http://online.wsj.com/xml/rss/3_7041.xml'), - ('News - U.S.: What\'s News', 'http://online.wsj.com/xml/rss/3_7011.xml'), - ('News - U.S. Business', 'http://online.wsj.com/xml/rss/3_7014.xml'), - ('News - Europe: What\'s News', 'http://online.wsj.com/xml/rss/3_7012.xml'), - ('News - Asia: What\'s News', 'http://online.wsj.com/xml/rss/3_7013.xml'), - ('News - World News', 'http://online.wsj.com/xml/rss/3_7085.xml'), - ('News - Economy', 'http://online.wsj.com/xml/rss/3_7086.xml'), - ('News - Earnings', 'http://online.wsj.com/xml/rss/3_7088.xml'), - ('News - Health', 'http://online.wsj.com/xml/rss/3_7089.xml'), - ('News - Law', 'http://online.wsj.com/xml/rss/3_7091.xml'), - ('News - Media & Marketing', 'http://online.wsj.com/xml/rss/3_7020.xml'), - ('Technology - What\'s News', 'http://online.wsj.com/xml/rss/3_7015.xml'), - ('Technology - Gadgets', 'http://online.wsj.com/xml/rss/3_7094.xml'), - ('Technology - Telecommunications', 'http://online.wsj.com/xml/rss/3_7095.xml'), - ('Technology - E-commerce/Media', 'http://online.wsj.com/xml/rss/3_7096.xml'), - ('Technology - Asia', 'http://online.wsj.com/xml/rss/3_7097.xml'), - ('Technology - Europe', 'http://online.wsj.com/xml/rss/3_7098.xml'), - ('Markets - News', 'http://online.wsj.com/xml/rss/3_7031.xml'), - ('Markets - Europe News', 'http://online.wsj.com/xml/rss/3_7101.xml'), - ('Markets - Asia News', 'http://online.wsj.com/xml/rss/3_7102.xml'), - ('Markets - Deals & Deal Makers', 'http://online.wsj.com/xml/rss/3_7099.xml'), - ('Markets - Hedge Funds', 'http://online.wsj.com/xml/rss/3_7199.xml'), - ('Personal Journal', 'http://online.wsj.com/xml/rss/3_7200.xml'), - ('Personal Journal - Money', 'http://online.wsj.com/xml/rss/3_7104.xml'), - ('Personal Journal - Health', 'http://online.wsj.com/xml/rss/3_7089.xml'), - ('Personal Journal - Autos', 'http://online.wsj.com/xml/rss/3_7092.xml'), - ('Personal Journal - Homes', 'http://online.wsj.com/xml/rss/3_7105.xml'), - ('Personal Journal - Travel', 'http://online.wsj.com/xml/rss/3_7106.xml'), - ('Personal Journal - Careers', 'http://online.wsj.com/xml/rss/3_7107.xml'), - ('Weekend & Leisure', 'http://online.wsj.com/xml/rss/3_7201.xml'), - ('Weekend & Leisure - Weekend Journal', 'http://online.wsj.com/xml/rss/3_7202.xml'), - ('Weekend & Leisure - Arts & Entertainment', 'http://online.wsj.com/xml/rss/3_7177.xml'), - ('Weekend & Leisure - Books', 'http://online.wsj.com/xml/rss/3_7203.xml'), - ('Weekend & Leisure - Sports', 'http://online.wsj.com/xml/rss/3_7204.xml'), + + def cleanup(self): + self.browser.open('http://online.wsj.com/logout?url=http://online.wsj.com') + + feeds = [ + #('Most Emailed - Day', 'http://online.wsj.com/xml/rss/3_7030.xml'), + #('Most Emailed - Week', 'http://online.wsj.com/xml/rss/3_7253.xml'), + #('Most Emailed - Month', 'http://online.wsj.com/xml/rss/3_7254.xml'), + (' Most Viewed - Day', 'http://online.wsj.com/xml/rss/3_7198.xml'), + (' Most Viewed - Week', 'http://online.wsj.com/xml/rss/3_7251.xml'), + # ('Most Viewed - Month', 'http://online.wsj.com/xml/rss/3_7252.xml'), + ('Today\'s Newspaper - Page One', 'http://online.wsj.com/xml/rss/3_7205.xml'), + ('Today\'s Newspaper - Marketplace', 'http://online.wsj.com/xml/rss/3_7206.xml'), + ('Today\'s Newspaper - Money & Investing', 'http://online.wsj.com/xml/rss/3_7207.xml'), + ('Today\'s Newspaper - Personal Journal', 'http://online.wsj.com/xml/rss/3_7208.xml'), + ('Today\'s Newspaper - Weekend Journal', 'http://online.wsj.com/xml/rss/3_7209.xml'), + ('Opinion', 'http://online.wsj.com/xml/rss/3_7041.xml'), + ('News - U.S.: What\'s News', 'http://online.wsj.com/xml/rss/3_7011.xml'), + ('News - U.S. Business', 'http://online.wsj.com/xml/rss/3_7014.xml'), + ('News - Europe: What\'s News', 'http://online.wsj.com/xml/rss/3_7012.xml'), + ('News - Asia: What\'s News', 'http://online.wsj.com/xml/rss/3_7013.xml'), + ('News - World News', 'http://online.wsj.com/xml/rss/3_7085.xml'), + ('News - Economy', 'http://online.wsj.com/xml/rss/3_7086.xml'), + ('News - Earnings', 'http://online.wsj.com/xml/rss/3_7088.xml'), + ('News - Health', 'http://online.wsj.com/xml/rss/3_7089.xml'), + ('News - Law', 'http://online.wsj.com/xml/rss/3_7091.xml'), + ('News - Media & Marketing', 'http://online.wsj.com/xml/rss/3_7020.xml'), + ('Technology - What\'s News', 'http://online.wsj.com/xml/rss/3_7015.xml'), + ('Technology - Gadgets', 'http://online.wsj.com/xml/rss/3_7094.xml'), + ('Technology - Telecommunications', 'http://online.wsj.com/xml/rss/3_7095.xml'), + ('Technology - E-commerce/Media', 'http://online.wsj.com/xml/rss/3_7096.xml'), + ('Technology - Asia', 'http://online.wsj.com/xml/rss/3_7097.xml'), + ('Technology - Europe', 'http://online.wsj.com/xml/rss/3_7098.xml'), + ('Markets - News', 'http://online.wsj.com/xml/rss/3_7031.xml'), + ('Markets - Europe News', 'http://online.wsj.com/xml/rss/3_7101.xml'), + ('Markets - Asia News', 'http://online.wsj.com/xml/rss/3_7102.xml'), + ('Markets - Deals & Deal Makers', 'http://online.wsj.com/xml/rss/3_7099.xml'), + ('Markets - Hedge Funds', 'http://online.wsj.com/xml/rss/3_7199.xml'), + ('Personal Journal', 'http://online.wsj.com/xml/rss/3_7200.xml'), + ('Personal Journal - Money', 'http://online.wsj.com/xml/rss/3_7104.xml'), + ('Personal Journal - Health', 'http://online.wsj.com/xml/rss/3_7089.xml'), + ('Personal Journal - Autos', 'http://online.wsj.com/xml/rss/3_7092.xml'), + ('Personal Journal - Homes', 'http://online.wsj.com/xml/rss/3_7105.xml'), + ('Personal Journal - Travel', 'http://online.wsj.com/xml/rss/3_7106.xml'), + ('Personal Journal - Careers', 'http://online.wsj.com/xml/rss/3_7107.xml'), + ('Weekend & Leisure', 'http://online.wsj.com/xml/rss/3_7201.xml'), + ('Weekend & Leisure - Weekend Journal', 'http://online.wsj.com/xml/rss/3_7202.xml'), + ('Weekend & Leisure - Arts & Entertainment', 'http://online.wsj.com/xml/rss/3_7177.xml'), + ('Weekend & Leisure - Books', 'http://online.wsj.com/xml/rss/3_7203.xml'), + ('Weekend & Leisure - Sports', 'http://online.wsj.com/xml/rss/3_7204.xml'), ]