diff --git a/recipes/dilbert.recipe b/recipes/dilbert.recipe index 56aa4af8c9..ed2771debf 100644 --- a/recipes/dilbert.recipe +++ b/recipes/dilbert.recipe @@ -2,6 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Darko Miletic ' ''' http://www.dilbert.com +DrMerry added cover Image 2011-11-12 ''' from calibre.web.feeds.recipes import BasicNewsRecipe @@ -9,7 +10,7 @@ import re class DilbertBig(BasicNewsRecipe): title = 'Dilbert' - __author__ = 'Darko Miletic and Starson17' + __author__ = 'Darko Miletic and Starson17 contribution of DrMerry' description = 'Dilbert' reverse_article_order = True oldest_article = 15 @@ -20,6 +21,7 @@ class DilbertBig(BasicNewsRecipe): publisher = 'UNITED FEATURE SYNDICATE, INC.' category = 'comic' language = 'en' + cover_url = 'http://dilbert.com/mobile/mobile/dilbert.app.icon.png' conversion_options = { 'comments' : description diff --git a/recipes/geek_poke.recipe b/recipes/geek_poke.recipe index 7f5117b586..7a241db407 100644 --- a/recipes/geek_poke.recipe +++ b/recipes/geek_poke.recipe @@ -1,6 +1,6 @@ from calibre.web.feeds.news import BasicNewsRecipe import re -from calibre.utils.magick import Image +from calibre.utils.magick import Image, create_canvas class AdvancedUserRecipe1307556816(BasicNewsRecipe): title = u'Geek and Poke' @@ -11,7 +11,7 @@ class AdvancedUserRecipe1307556816(BasicNewsRecipe): oldest_article = 31 max_articles_per_feed = 100 language = u'en' - simultaneous_downloads = 5 + simultaneous_downloads = 1 #delay = 1 timefmt = ' [%a, %d %B, %Y]' summary_length = -1 @@ -22,6 +22,7 @@ class AdvancedUserRecipe1307556816(BasicNewsRecipe): remove_javascript = True remove_empty_feeds = True publication_type = 'blog' + masthead_url = None conversion_options = { 'comments' : '' ,'tags' : category @@ -44,28 +45,38 @@ class AdvancedUserRecipe1307556816(BasicNewsRecipe): (r'yimg\.com'), (r'scorecardresearch\.com')] - preprocess_regexps = [(re.compile(r'(

( |\s)*

|]*>Tweet|]*>|)', re.DOTALL|re.IGNORECASE),lambda match: ''), + preprocess_regexps = [(re.compile(r'(

( |\s)*

|]*>Tweet|]*>|||]*>[^<]*[^<]*)', re.DOTALL|re.IGNORECASE),lambda match: ''), (re.compile(r'( |\s\s)+\s*', re.DOTALL|re.IGNORECASE),lambda match: ' '), - (re.compile(r']*>([^<]*)[^>]*(]*>)', re.DOTALL|re.IGNORECASE), lambda match: match.group(2) + '
' + match.group(1) + '
'), (re.compile(r'(]*>)]>((?!', re.DOTALL|re.IGNORECASE),lambda match: match.group(1) + match.group(2) + ''), - (re.compile(r'(]*alt="([^"]*)"[^>]*>)', re.DOTALL|re.IGNORECASE),lambda match: match.group(1) + '
' + match.group(2) + ''), + (re.compile(r'(]*alt="([^"]*)"[^>]*>)', re.DOTALL|re.IGNORECASE),lambda match: '
' + match.group(2) + '
' + match.group(1) + '
'), (re.compile(r'()+', re.DOTALL|re.IGNORECASE),lambda match: '
'), - (re.compile(r'', re.DOTALL), lambda m: '') ] - extra_css = 'body, h3, p, #MERRYdate, h1, div, span{margin:0px; padding:0px} h3.entry-header{font-size: 0.8em} div.entry-body{font-size: 0.7em} #MERRYdate {font-size: 0.5em}' + extra_css = 'body, h3, p, div, span{margin:0px; padding:0px} h3.entry-header{font-size: 0.8em} div.entry-body{font-size: 0.7em}' def postprocess_html(self, soup, first): for tag in soup.findAll(lambda tag: tag.name.lower()=='img' and tag.has_key('src')): iurl = tag['src'] img = Image() img.open(iurl) - width, height = img.size - #print 'img is: ', iurl, 'width is: ', width, 'height is: ', height + #width, height = img.size + #print '***img is: ', iurl, '\n****width is: ', width, 'height is: ', height img.trim(0) - img.save(iurl) + #width, height = img.size + #print '***TRIMMED img width is: ', width, 'height is: ', height + left=0 + top=0 + border_color='#ffffff' width, height = img.size - #print 'img is: ', iurl, 'width is: ', width, 'height is: ', height + #print '***retrieved img width is: ', width, 'height is: ', height + height_correction = 1.17 + canvas = create_canvas(width, height*height_correction,border_color) + canvas.compose(img, left, top) + #img = canvas + #img.save(iurl) + canvas.save(iurl) + #width, height = canvas.size + #print '***NEW img width is: ', width, 'height is: ', height return soup feeds = ['http://feeds.feedburner.com/GeekAndPoke?format=xml'] diff --git a/recipes/gosc_niedzielny.recipe b/recipes/gosc_niedzielny.recipe index 12942f0f8a..1538e7fc2c 100644 --- a/recipes/gosc_niedzielny.recipe +++ b/recipes/gosc_niedzielny.recipe @@ -19,6 +19,7 @@ class GN(BasicNewsRecipe): language = 'pl' remove_javascript = True temp_files = [] + simultaneous_downloads = 1 articles_are_obfuscated = True @@ -94,16 +95,16 @@ class GN(BasicNewsRecipe): def find_articles(self, main_block): for a in main_block.findAll('div', attrs={'class':'prev_doc2'}): - art = a.find('a') - yield { + art = a.find('a') + yield { 'title' : self.tag_to_string(art), 'url' : 'http://www.gosc.pl' + art['href'].replace('/doc/','/doc_pr/'), 'date' : '', 'description' : '' } for a in main_block.findAll('div', attrs={'class':'sr-document'}): - art = a.find('a') - yield { + art = a.find('a') + yield { 'title' : self.tag_to_string(art), 'url' : 'http://www.gosc.pl' + art['href'].replace('/doc/','/doc_pr/'), 'date' : '', diff --git a/resources/images/devices/boox.jpg b/resources/images/devices/boox.jpg new file mode 100644 index 0000000000..93e5c70fa1 Binary files /dev/null and b/resources/images/devices/boox.jpg differ diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index eb867b80d3..f6b70794d4 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -62,7 +62,8 @@ class ANDROID(USBMS): 0x4e11 : [0x0100, 0x226, 0x227], 0x4e12 : [0x0100, 0x226, 0x227], 0x4e21 : [0x0100, 0x226, 0x227], - 0xb058 : [0x0222, 0x226, 0x227] + 0xb058 : [0x0222, 0x226, 0x227], + 0x0ff9 : [0x0226], }, # Samsung diff --git a/src/calibre/devices/hanlin/driver.py b/src/calibre/devices/hanlin/driver.py index 2234e2112c..b4c4f2872b 100644 --- a/src/calibre/devices/hanlin/driver.py +++ b/src/calibre/devices/hanlin/driver.py @@ -116,6 +116,7 @@ class BOOX(HANLINV3): supported_platforms = ['windows', 'osx', 'linux'] METADATA_CACHE = '.metadata.calibre' DRIVEINFO = '.driveinfo.calibre' + icon = I('devices/boox.jpg') # Ordered list of supported formats FORMATS = ['epub', 'fb2', 'djvu', 'pdf', 'html', 'txt', 'rtf', 'mobi', @@ -123,7 +124,7 @@ class BOOX(HANLINV3): VENDOR_ID = [0x0525] PRODUCT_ID = [0xa4a5] - BCD = [0x322] + BCD = [0x322, 0x323] MAIN_MEMORY_VOLUME_LABEL = 'BOOX Internal Memory' STORAGE_CARD_VOLUME_LABEL = 'BOOX Storage Card' diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py index ad21632a50..bed5a0b77c 100644 --- a/src/calibre/devices/interface.py +++ b/src/calibre/devices/interface.py @@ -464,6 +464,13 @@ class DevicePlugin(Plugin): ''' pass + def prepare_addable_books(self, paths): + ''' + Given a list of paths, returns another list of paths. These paths + point to addable versions of the books. + ''' + return paths + class BookList(list): ''' A list of books. Each Book object must have the fields @@ -518,9 +525,3 @@ class BookList(list): ''' raise NotImplementedError() - def prepare_addable_books(self, paths): - ''' - Given a list of paths, returns another list of paths. These paths - point to addable versions of the books. - ''' - return paths diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 04637ffa89..e4b40616ba 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -325,6 +325,10 @@ class MobiReader(object): self.processed_html = self.processed_html.replace('<', self.processed_html) + # Remove tags of the form as they can cause issues further + # along the pipeline + self.processed_html = re.sub(r']*>', '', + self.processed_html) for pat in ENCODING_PATS: self.processed_html = pat.sub('', self.processed_html) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 65752eb183..b79813aee8 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -368,6 +368,7 @@ def command_remove(args, dbpath): def do_add_format(db, id, fmt, path): db.add_format_with_hooks(id, fmt.upper(), path, index_is_id=True) + send_message() def add_format_option_parser(): return get_parser(_(