diff --git a/Changelog.yaml b/Changelog.yaml
index 65b96b7bc6..bc89af7c51 100644
--- a/Changelog.yaml
+++ b/Changelog.yaml
@@ -4,6 +4,52 @@
# for important features/bug fixes.
# Also, each release can have new and improved recipes.
+- version: 0.7.22
+ date: 2010-10-03
+
+ new features:
+ - title: "Drag and drop books from your calibre library"
+ type: major
+ description: >
+ "You can now drag and drop books from your calibre library. You can drag them to the desktop or to a file explorer, to copy them to your computer. You can drag them to the
+ device icon in calibre to send them to the device. You can also drag and drop books from the device view in calibre to the calibre library icon or the operating
+ system to copy them from the device."
+
+ - title: "There were many minor bug fixes for various bugs caused by the major changes in 0.7.21. So if you have updated to 0.7.21, it is highly recommended you update to 0.7.22"
+
+ - title: "Driver for the VelocityMicro ebook reader device"
+
+ - title: "Add a tweak to control how articles in titles are processed during sorting"
+
+ - title: "Add a new format type 'device_db' to plugboards to control the metadata displayed in book lists on SONY devices."
+
+ bug fixes:
+ - title: "Fix ISBN not being read from filenames in 0.7.21"
+ tickets: [7054]
+
+ - title: "Fix instant Search for text not found causes unhandled exception when conversion jobs are running"
+ tickets: [7043]
+
+ - title: "Fix removing a publisher causes an error in 0.7.21"
+ tickets: [7046]
+
+ - title: "MOBI Output: Fix some images being distorted in 0.7.21"
+ tickets: [7049]
+
+ - title: "Fix regression that broke bulk conversion of books without covers in 0.7.21"
+
+ - title: "Fix regression that broke add and set_metadata commands in calibredb in 0.7.21"
+
+ - title: "Workaround for Qt bug in file open dialogs in linux that causes multiple file selection to ignore files with two or more spaces in the file name"
+
+ - title: "Conversion pipeline: Fix regression in 0.7.21 that broke conversion of LIT/EPUB documents that specified no title in their OPF files"
+
+ - title: "Fix regression that broke iPad driver in 0.7.21"
+
+ improved recipes:
+ - Washington Post
+
+
- version: 0.7.21
date: 2010-10-01
diff --git a/resources/recipes/revista_muy.recipe b/resources/recipes/revista_muy.recipe
index ae3d47466c..e452a6f053 100644
--- a/resources/recipes/revista_muy.recipe
+++ b/resources/recipes/revista_muy.recipe
@@ -1,3 +1,4 @@
+from calibre.web.feeds.news import re
from calibre.web.feeds.recipes import BasicNewsRecipe
from BeautifulSoup import Tag
@@ -10,26 +11,31 @@ class RevistaMuyInteresante(BasicNewsRecipe):
language = 'es'
no_stylesheets = True
- remove_attributes = ['style', 'font']
+ remove_javascript = True
+
+ extra_css = ' .txt_articulo{ font-family: sans-serif; font-size: medium; text-align: justify } .contentheading{font-family: serif; font-size: large; font-weight: bold; color: #000000; text-align: center}'
- #then we add our own style(s) like this:
- extra_css = '''
- .contentheading{font-weight: bold}
- p {font-size: 4px;font-family: Times New Roman;}
- '''
def preprocess_html(self, soup):
+ for item in soup.findAll(style=True):
+ del item['style']
+
for img_tag in soup.findAll('img'):
- parent_tag = img_tag.parent
- if parent_tag.name == 'td':
- if not parent_tag.get('class') == 'txt_articulo': break
- imagen = img_tag
- new_tag = Tag(soup,'p')
- img_tag.replaceWith(new_tag)
- div = soup.find(attrs={'class':'article_category'})
- div.insert(0,imagen)
+ imagen = img_tag
+ new_tag = Tag(soup,'p')
+ img_tag.replaceWith(new_tag)
+ div = soup.find(attrs={'class':'article_category'})
+ div.insert(0,imagen)
+ break
return soup
+
+ preprocess_regexps = [
+ (re.compile(r'
.*?
', re.DOTALL|re.IGNORECASE), lambda match: '
' + match.group().replace('
','').strip().replace('
','').strip() + ''),
+
+ ]
+
+
keep_only_tags = [dict(name='div', attrs={'class':['article']}),dict(name='td', attrs={'class':['txt_articulo']})]
remove_tags = [
@@ -37,6 +43,7 @@ class RevistaMuyInteresante(BasicNewsRecipe):
,dict(name='div', attrs={'id':['comment']})
,dict(name='td', attrs={'class':['buttonheading']})
,dict(name='div', attrs={'class':['tags_articles']})
+ ,dict(name='table', attrs={'class':['pagenav']})
]
remove_tags_after = dict(name='div', attrs={'class':'tags_articles'})
@@ -71,8 +78,33 @@ class RevistaMuyInteresante(BasicNewsRecipe):
for title, url in [
('Historia',
'http://www.muyinteresante.es/historia-articulos'),
+ ('Ciencia',
+ 'http://www.muyinteresante.es/ciencia-articulos'),
+ ('Naturaleza',
+ 'http://www.muyinteresante.es/naturaleza-articulos'),
+ ('Tecnología',
+ 'http://www.muyinteresante.es/tecnologia-articulos'),
+ ('Salud',
+ 'http://www.muyinteresante.es/salud-articulos'),
+ ('Más Muy',
+ 'http://www.muyinteresante.es/muy'),
+ ('Innova - Automoción',
+ 'http://www.muyinteresante.es/articulos-innovacion-autos'),
+ ('Innova - Salud',
+ 'http://www.muyinteresante.es/articulos-innovacion-salud'),
+ ('Innova - Medio Ambiente',
+ 'http://www.muyinteresante.es/articulos-innovacion-medio-ambiente'),
+ ('Innova - Alimentación',
+ 'http://www.muyinteresante.es/articulos-innovacion-alimentacion'),
+ ('Innova - Sociedad',
+ 'http://www.muyinteresante.es/articulos-innovacion-sociedad'),
+ ('Innova - Tecnología',
+ 'http://www.muyinteresante.es/articulos-innovacion-tecnologia'),
+ ('Innova - Ocio',
+ 'http://www.muyinteresante.es/articulos-innovacion-ocio'),
]:
articles = self.nz_parse_section(url)
if articles:
feeds.append((title, articles))
return feeds
+
diff --git a/src/calibre/constants.py b/src/calibre/constants.py
index fdde7ecdd1..df9cbd8844 100644
--- a/src/calibre/constants.py
+++ b/src/calibre/constants.py
@@ -2,7 +2,7 @@ __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'
__appname__ = 'calibre'
-__version__ = '0.7.21'
+__version__ = '0.7.22'
__author__ = "Kovid Goyal "
import re
diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py
index d4d4ee5d4e..0a10b79bd3 100644
--- a/src/calibre/customize/builtins.py
+++ b/src/calibre/customize/builtins.py
@@ -460,7 +460,8 @@ from calibre.devices.hanvon.driver import N516, EB511, ALEX, AZBOOKA, THEBOOK
from calibre.devices.edge.driver import EDGE
from calibre.devices.teclast.driver import TECLAST_K3, NEWSMY, IPAPYRUS, SOVOS
from calibre.devices.sne.driver import SNE
-from calibre.devices.misc import PALMPRE, AVANT, SWEEX, PDNOVEL, KOGAN, GEMEI
+from calibre.devices.misc import PALMPRE, AVANT, SWEEX, PDNOVEL, KOGAN, \
+ GEMEI, VELOCITYMICRO
from calibre.devices.folder_device.driver import FOLDER_DEVICE_FOR_CONFIG
from calibre.devices.kobo.driver import KOBO
@@ -572,6 +573,7 @@ plugins += [
PDNOVEL,
SPECTRA,
GEMEI,
+ VELOCITYMICRO,
ITUNES,
]
plugins += [x for x in list(locals().values()) if isinstance(x, type) and \
diff --git a/src/calibre/devices/irexdr/driver.py b/src/calibre/devices/irexdr/driver.py
index bd2a91740b..32e98f9353 100644
--- a/src/calibre/devices/irexdr/driver.py
+++ b/src/calibre/devices/irexdr/driver.py
@@ -20,7 +20,7 @@ class IREXDR1000(USBMS):
# Ordered list of supported formats
# Be sure these have an entry in calibre.devices.mime
- FORMATS = ['epub', 'mobi', 'prc', 'html', 'pdf', 'txt']
+ FORMATS = ['epub', 'mobi', 'prc', 'html', 'pdf', 'djvu', 'txt']
VENDOR_ID = [0x1e6b]
PRODUCT_ID = [0x001]
diff --git a/src/calibre/devices/misc.py b/src/calibre/devices/misc.py
index bb75ceabd1..f98b6f7103 100644
--- a/src/calibre/devices/misc.py
+++ b/src/calibre/devices/misc.py
@@ -108,6 +108,24 @@ class PDNOVEL(USBMS):
with open('%s.jpg' % os.path.join(path, filename), 'wb') as coverfile:
coverfile.write(coverdata[2])
+class VELOCITYMICRO(USBMS):
+ name = 'VelocityMicro device interface'
+ gui_name = 'VelocityMicro'
+ description = _('Communicate with the VelocityMicro')
+ author = 'Kovid Goyal'
+ supported_platforms = ['windows', 'linux', 'osx']
+ FORMATS = ['epub', 'pdb', 'txt', 'html', 'pdf']
+
+ VENDOR_ID = [0x18d1]
+ PRODUCT_ID = [0xb015]
+ BCD = [0x224]
+
+ VENDOR_NAME = 'ANDROID'
+ WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '__UMS_COMPOSITE'
+
+ EBOOK_DIR_MAIN = 'eBooks'
+ SUPPORTS_SUB_DIRS = False
+
class GEMEI(USBMS):
name = 'Gemei Device Interface'
gui_name = 'GM2000'
diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py
index ca8c09245c..f0aa58e711 100644
--- a/src/calibre/devices/prs505/driver.py
+++ b/src/calibre/devices/prs505/driver.py
@@ -14,7 +14,6 @@ from calibre.devices.prs505 import CACHE_XML
from calibre.devices.prs505.sony_cache import XMLCache
from calibre import __appname__
from calibre.devices.usbms.books import CollectionsBookList
-from calibre.utils.config import tweaks
class PRS505(USBMS):
@@ -171,4 +170,4 @@ class PRS505(USBMS):
def set_plugboard(self, pb):
debug_print('PRS505: use plugboard', pb)
- self.plugboard = pb
\ No newline at end of file
+ self.plugboard = pb
diff --git a/src/calibre/ebooks/chm/reader.py b/src/calibre/ebooks/chm/reader.py
index 831c16bf6a..6b2ef2d211 100644
--- a/src/calibre/ebooks/chm/reader.py
+++ b/src/calibre/ebooks/chm/reader.py
@@ -151,7 +151,8 @@ class CHMReader(CHMFile):
continue
raise
self._extracted = True
- files = os.listdir(output_dir)
+ files = [x for x in os.listdir(output_dir) if
+ os.path.isfile(os.path.join(output_dir, x))]
if self.hhc_path not in files:
for f in files:
if f.lower() == self.hhc_path.lower():
diff --git a/src/calibre/ebooks/oeb/transforms/cover.py b/src/calibre/ebooks/oeb/transforms/cover.py
index 532c9bbc03..6d4c65c2fb 100644
--- a/src/calibre/ebooks/oeb/transforms/cover.py
+++ b/src/calibre/ebooks/oeb/transforms/cover.py
@@ -31,12 +31,14 @@ class CoverManager(object):
-
+