diff --git a/src/calibre/devices/cybookg3/t2b.py b/src/calibre/devices/cybookg3/t2b.py index 0baa7a1060..5bf512f22d 100644 --- a/src/calibre/devices/cybookg3/t2b.py +++ b/src/calibre/devices/cybookg3/t2b.py @@ -4,7 +4,8 @@ __copyright__ = '2009, John Schember ' Write a t2b file to disk. ''' -import Image, StringIO +import StringIO +from PIL import Image DEFAULT_T2B_DATA = '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x0f\xff\xff\xff\xf0\xff\x0f\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\xff\xff\xff\xf0\xff\x0f\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\xff\xf0\xff\xff\xff\xf0\xff\xff\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\xff\xff\xff\xff\xff\xf0\xff\xff\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\xff\xff\xfc\x00?\xf0\xff\x0f\xc3\x00?\xf0\xc0\xfe\x00?\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xf0<\x0f\xf0\xff\x0f\xc0,\x0f\xf0\x0e\xf0,\x0f\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\xff\xc3\xf0\xff\x0f\xc0\xff\x0f\xf0\xff\xf0\xff\xc7\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\xff\xc3\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc3\xff\xc3\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x00\x03\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc3\xff\xc3\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xf0\x1f\xc3\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc0\x00\x03\xff\xff\xff\xff\xff\xff\xff\x0b\xff\xff\xf0\xff\xc3\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\xff\xff\xf3\xff\xc3\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\xff\xfc\xf0\xff\x03\xf0\xff\x0f\xc0\xff\x0f\xf0\xff\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x0f\x00\xf08\x03\xf0\xff\x0f\xc0,\x0f\xf0\xff\xf0\x1f\x03\xff\xff\xff\xff\xff\xff\xff\xff\x00\x0f\xfc\x00\xc3\xf0\xff\x0f\xc3\x00?\xf0\xff\xff\x00\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xfe\x94\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xfc\x7f\xfe\x94\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x0f\xff\xfe\xa9@\xff\xff\xff\xff\xff\xff\xfc?\xfe\xa4\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xe9P\xff\xff\xff\xff\xff\xff\xfe/\xfe\xa8\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xf9T\xff\xff\xff\xff\xf0@\x00+\xfa\xa8?\xff\xff\xff\xff\xff\xff\xff\xfc\xbf\xff\xff\xf9T\xff\xff\xff\xff\xcb\xe4}*\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfc\xbf\xff\xff\xe9T\xff\xff\xff\xff\xc7\xe4\xfd\x1a\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfc\xaf\xea\xaa\xa6\xa4\xff@\x00\x0f\xc3\xe8\xfe\x1a\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4\x00\x7f\xfe\x90\x03\xe8\xfe\n\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4?\xff\xff\xa5C\xe8\xfe\x06\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4?\xff\xff\xeaC\xe8\xbe\x06\xaa\xaa\x0f\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4/\xff\xff\xea\x82\xe8j\x06\xaa\xaa\x0f\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4/\xff\xff\xaa\x82\xe8*F\xaa\xaa\x8f\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4+\xff\xfe\xaa\x82\xe8*\x86\xaa\xaa\x8f\xff\xff\x80\xff\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8*\x86\xaa\xaa\x8f\xf0\x00T?\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8*\x81\xaa\xaa\x8c\x03\xff\x95?\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8*\x81\xaa\xaa\x80\xbf\xff\x95?\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8*\x81\xaa\xaa\x9b\xff\xff\x95\x0f\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8\x1a\x81\xaa\xaa\x9a\xff\xfe\x95\x0f\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8\n\x81\xaa\xaa\xa6\xbf\xfeUO\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xa8\n\x91j\xaa\xa5\xaa\xa9ZO\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xa8\n\xa0j\xaa\xa5Z\x95ZO\xff\xff\xff\xfcj\x95UV\xa4*\xfa\xaa\xaa\x82\xa9\n\xa0j\xaa\xa5UUZC\xff\xff\xff\xfcj\x95UV\xa4*\xfa\xaa\xaa\x82\xaa\n\xa0j\xaa\xa4UUZS\xff\xff\xff\xfcZ\x95UV\xa4*\xfa\xaa\xaa\x82\xaa\n\xa0j\xaa\xa4UUZS\xff\xff\xff\xfcZ\x95UU\xa4*\xfa\xaa\xaa\x82\xaa\n\xa0j\xaa\xa8UUVS\xff\xff\xff\xfcZ\x95UU\xa4*\xea\xaa\xaa\x82\xaa\x06\xa0Z\xaa\xa8UUV\x93\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x81\xaa\x02\xa0\x1a\xaa\xa8UUV\x90\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa\x02\xa0\x1a\xaa\xa8\x15UU\x94\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa"\xa0\x1a\xaa\xa8\x15UU\x94\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa2\xa4\x16\xaa\xa8\x15UU\x94\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa2\xa8\x16\xa6\xa9\x15UU\x94\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa2\xa8\x16\xa6\xa9\x05UUT?\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x84\xaa2\xa8\x16\xaa\xaa\x05UUU?\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x88\xaa2\xa8\x06\xaa\xaa\x05UUU?\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa1\xa8\xc5\xaa\xaa\x05UUU?\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa0\xa8E\xa9\xaa\x05UUU/\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa<\xa8\x05\xa9\xaaAUUU\x0f\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa<\xa8\x05\xa9\xaaAUUUO\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa<\xa9\x05\xaa\xaaAUUUO\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x1c\xaa\x01\xaa\xaa\x81UUUO\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x0c\xaa\x01\xaa\xaa\x81UUUO\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x0c\xaa1j\xaa\x80UUUC\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x0cj1jj\x90UUUS\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x0c*1jj\x90UUUS\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaaL*1jj\xa0UUUS\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x8f* j\xaa\xa0\x15UUS\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x8f*@j\xaa\xa0\x15UUP\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x8f*\x8cZ\xaa\xa1\x15UUT\xff\xff\xfcZ\x95UU\xa4j\xaa\xaa\xaa\x8c\xaa\x8f*\x8cZ\x9a\xa0\x15UUT\xff\xff\xfcZ\x95UU\xa4j\xaa\xaa\xaa\x8c\xaa\x8f*\x8cZ\x9a\xa0\x15UUT\xff\xff\xfcZ\x95UU\xa4j\xaa\xaa\xaa\x8c\xaa\x8f\x1a\x8cZ\x9a\xa4\x15UUT?\xff\xfcZ\x95UU\x94j\xaa\xaa\xaa\x8cj\x8f\n\x8cVj\xa4\x05UU\xa4?\xff\xfcVUUU\xa4j\xaa\xaa\xaa\x8cj\x8fJ\x8c\x16\xaa\xa8\xc5UZ\xa5?\xff\xfcUUUV\xa4j\xaa\xaa\xaa\x8cj\x8f\xca\x8f\x16\xaa\xa8\xc5V\xaa\xa5?\xff\xfcUj\xaa\xaa\xa4j\xaa\xaa\xaa\x8cj\x8f\xca\x8f\x1a\xaa\xa8\x05Z\xaaU?\xff\xfcV\xaa\xaa\xaa\xa5j\xaa\xaa\xaa\x8e*\x8f\xca\x83\x1a\xaa\xa4\x01eUU?\xff\xfcZ\xaa\xaa\xaa\xa5j\xaa\xaa\xaa\x8f*\x8f\xca\x83\x1a\xa5U\x01U\x00\x00\x0f\xff\xfcUUUUUZ\xaa\xaa\xaaO%\x8f\xc6\x93\x15\x00\x001@\x0f\xff\xff\xff\xfcP\x00\x00\x00\x15\x00\x00\x00\x00\x0f\x00\x07\xc0\x03\x00\xff\xff0\x1f\xff\xff\xff\xff\xfc\x00\xff\xff\xf8\x00?\xff\xff\xff\x0f?\xc7\xc3\xf7\x0f\xff\xff\xf1\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xf4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index fa8f6845cc..bbda8f95d2 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -146,36 +146,7 @@ class PRS505(Device): self._card_prefix = re.search(card_pat, mount).group(2) + os.sep - def open_windows_nowmi(self): - from calibre import plugins - winutil = plugins['winutil'][0] - volumes = winutil.get_mounted_volumes_for_usb_device(self.VENDOR_ID, self.PRODUCT_ID) - main = None - for device_id in volumes.keys(): - if 'PRS-505/UC&' in device_id: - main = volumes[device_id]+':\\' - if not main: - raise DeviceError(_('Unable to detect the %s disk drive. Try rebooting.')%self.__class__.__name__) - self._main_prefix = main - card = self._card_prefix = None - win32api = __import__('win32api') - for device_id in volumes.keys(): - if 'PRS-505/UC:' in device_id: - card = volumes[device_id]+':\\' - try: - win32api.GetVolumeInformation(card) - self._card_prefix = card - break - except: - continue - - def open_windows(self): - try: - self.open_windows_nowmi() - return - except: - pass drives = [] wmi = __import__('wmi', globals(), locals(), [], -1) c = wmi.WMI() diff --git a/src/calibre/ebooks/epub/__init__.py b/src/calibre/ebooks/epub/__init__.py index d8d4c9a758..442f5260b1 100644 --- a/src/calibre/ebooks/epub/__init__.py +++ b/src/calibre/ebooks/epub/__init__.py @@ -156,7 +156,7 @@ to auto-generate a Table of Contents. help=_('Set the right margin in pts. Default is %default')) layout('base_font_size2', ['--base-font-size'], default=12.0, help=_('The base font size in pts. Default is %defaultpt. Set to 0 to disable rescaling of fonts.')) - layout('remove_paragraph_spacing', ['--remove-paragraph-spacing'], default=True, + layout('remove_paragraph_spacing', ['--remove-paragraph-spacing'], default=False, help=_('Remove spacing between paragraphs. Will not work if the source file forces inter-paragraph spacing.')) layout('preserve_tag_structure', ['--preserve-tag-structure'], default=False, help=_('Preserve the HTML tag structure while splitting large HTML files. This is only neccessary if the HTML files contain CSS that uses sibling selectors. Enabling this greatly slows down processing of large HTML files.')) diff --git a/src/calibre/ebooks/epub/from_feeds.py b/src/calibre/ebooks/epub/from_feeds.py index fd1759712d..6a12353f50 100644 --- a/src/calibre/ebooks/epub/from_feeds.py +++ b/src/calibre/ebooks/epub/from_feeds.py @@ -52,6 +52,7 @@ def convert(opts, recipe_arg, notification=None): print 'Generating epub...' opts.encoding = 'utf-8' + opts.remove_paragraph_spacing = True html2epub(opf, opts, notification=notification) diff --git a/src/calibre/ebooks/epub/from_html.py b/src/calibre/ebooks/epub/from_html.py index 413bea4801..179c0af22b 100644 --- a/src/calibre/ebooks/epub/from_html.py +++ b/src/calibre/ebooks/epub/from_html.py @@ -128,6 +128,8 @@ class HTMLProcessor(Processor, Rationalizer): if hasattr(self.body, 'xpath'): for script in list(self.body.xpath('descendant::script')): script.getparent().remove(script) + + self.fix_markup() def convert_image(self, img): rpath = img.get('src', '') @@ -145,6 +147,17 @@ class HTMLProcessor(Processor, Rationalizer): if val == rpath: self.resource_map[key] = rpath+'_calibre_converted.jpg' img.set('src', rpath+'_calibre_converted.jpg') + + def fix_markup(self): + ''' + Perform various markup transforms to get the output to render correctly + in the quirky ADE. + ''' + # Replace
that are children of with

 

+ if hasattr(self.body, 'xpath'): + for br in self.body.xpath('./br'): + br.tag = 'p' + br.text = u'\u00a0' def save(self): for meta in list(self.root.xpath('//meta')): diff --git a/src/calibre/ebooks/epub/iterator.py b/src/calibre/ebooks/epub/iterator.py index 08c275e81f..5601e9b8de 100644 --- a/src/calibre/ebooks/epub/iterator.py +++ b/src/calibre/ebooks/epub/iterator.py @@ -95,7 +95,7 @@ class EbookIterator(object): for match in re.compile(r'@font-face\s*{([^}]+)}').finditer(css): block = match.group(1) family = re.compile(r'font-family\s*:\s*([^;]+)').search(block) - url = re.compile(r'url\s*\((.+?)\)', re.DOTALL).search(block) + url = re.compile(r'url\s*\([\'"]*(.+?)[\'"]*\)', re.DOTALL).search(block) if url: path = url.group(1).split('/') path = os.path.join(os.path.dirname(item.path), *path) diff --git a/src/calibre/ebooks/html.py b/src/calibre/ebooks/html.py index 634963e775..c853f62171 100644 --- a/src/calibre/ebooks/html.py +++ b/src/calibre/ebooks/html.py @@ -848,7 +848,7 @@ class Processor(Parser): # Workaround for anchor rendering bug in ADE css += '\n\na { color: inherit; text-decoration: inherit; cursor: default; }\na[href] { color: blue; text-decoration: underline; cursor:pointer; }' if self.opts.remove_paragraph_spacing: - css += '\n\np {text-indent: 2em; margin-top:0pt; margin-bottom:0pt; padding:0pt; border:0pt;}' + css += '\n\np {text-indent: 1.5em; margin-top:0pt; margin-bottom:0pt; padding:0pt; border:0pt;}' if self.opts.override_css: css += '\n\n' + self.opts.override_css self.override_css = self.css_parser.parseString(self.preprocess_css(css)) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index 7a74bd9401..afc2fb63ba 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -12,7 +12,7 @@ import copy import re from lxml import etree from calibre.ebooks.oeb.base import namespace, barename -from calibre.ebooks.oeb.base import XHTML, XHTML_NS +from calibre.ebooks.oeb.base import XHTML, XHTML_NS, OEB_DOCS from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.transforms.flatcss import KeyMapper @@ -96,8 +96,11 @@ class MobiMLizer(object): href = oeb.guide['cover'].href del oeb.guide['cover'] item = oeb.manifest.hrefs[href] - oeb.manifest.remove(item) - + if item.spine_position is not None: + oeb.spine.remove(item) + if item.media_type in OEB_DOCS: + self.oeb.manifest.remove(item) + def mobimlize_spine(self): for item in self.oeb.spine: stylizer = Stylizer(item.data, item.href, self.oeb, self.profile) @@ -137,7 +140,7 @@ class MobiMLizer(object): para = bstate.para if tag in SPECIAL_TAGS and not text: para = para if para is not None else bstate.body - elif para is None: + elif para is None or tag in ('td', 'th'): body = bstate.body if bstate.pbreak: etree.SubElement(body, MBP('pagebreak')) @@ -157,7 +160,8 @@ class MobiMLizer(object): elif indent != 0 and abs(indent) < self.profile.fbase: indent = (indent / abs(indent)) * self.profile.fbase if tag in NESTABLE_TAGS: - para = wrapper = etree.SubElement(parent, XHTML(tag)) + para = wrapper = etree.SubElement( + parent, XHTML(tag), attrib=istate.attrib) bstate.nested.append(para) if tag == 'li' and len(istates) > 1: istates[-2].list_num += 1 @@ -337,6 +341,10 @@ class MobiMLizer(object): tag = 'tr' elif display == 'table-cell': tag = 'td' + if tag in TABLE_TAGS: + for attr in ('rowspan', 'colspan'): + if attr in elem.attrib: + istate.attrib[attr] = elem.attrib[attr] text = None if elem.text: if istate.preserve: @@ -374,6 +382,6 @@ class MobiMLizer(object): bstate.vpadding += bstate.vmargin bstate.vmargin = 0 bstate.vpadding += vpadding - if tag in NESTABLE_TAGS and bstate.nested: + if bstate.nested and bstate.nested[-1].tag == elem.tag: bstate.nested.pop() istates.pop() diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index 2ed41ac898..5d2edd3fe0 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -124,6 +124,7 @@ class BookHeader(object): sublangid = (langcode >> 10) & 0xFF self.language = main_language.get(langid, 'ENGLISH') self.sublanguage = sub_language.get(sublangid, 'NEUTRAL') + self.first_image_index = struct.unpack('>L', raw[0x6c:0x6c+4])[0] self.exth_flag, = struct.unpack('>L', raw[0x80:0x84]) self.exth = None @@ -441,17 +442,18 @@ class MobiReader(object): os.makedirs(output_dir) image_index = 0 self.image_names = [] - for i in range(self.num_sections): + for i in range(self.book_header.first_image_index, self.num_sections): if i in processed_records: continue processed_records.append(i) data = self.sections[i][0] buf = cStringIO.StringIO(data) + image_index += 1 try: im = PILImage.open(buf) - except IOError: + except IOError, e: continue - image_index += 1 + path = os.path.join(output_dir, '%05d.jpg'%image_index) self.image_names.append(os.path.basename(path)) im.convert('RGB').save(open(path, 'wb'), format='JPEG') @@ -476,6 +478,7 @@ def get_metadata(stream): else: tdir = tempfile.mkdtemp('_mobi_meta', __appname__+'_') atexit.register(shutil.rmtree, tdir) + #print tdir mr.extract_images([], tdir) mi = mr.create_opf('dummy.html') if mi.cover: @@ -491,7 +494,6 @@ def get_metadata(stream): if os.access(candidate, os.R_OK): cover = candidate break - if os.access(cover, os.R_OK): mi.cover_data = ('JPEG', open(os.path.join(tdir, cover), 'rb').read()) else: diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index 62d444ee95..306f097c90 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -95,6 +95,7 @@ class Serializer(object): def __init__(self, oeb, images): self.oeb = oeb self.images = images + self.logger = oeb.logger self.id_offsets = {} self.href_offsets = defaultdict(list) self.breaks = [] @@ -144,8 +145,8 @@ class Serializer(object): item = hrefs[path] if path else None if item and item.spine_position is None: return False - id = item.id if item else base.id - href = '#'.join((id, frag)) if frag else id + path = item.href if item else base.href + href = '#'.join((path, frag)) if frag else path buffer.write('filepos=') self.href_offsets[href].append(buffer.tell()) buffer.write('0000000000') @@ -170,7 +171,7 @@ class Serializer(object): buffer = self.buffer if not item.linear: self.breaks.append(buffer.tell() - 1) - self.id_offsets[item.id] = buffer.tell() + self.id_offsets[item.href] = buffer.tell() for elem in item.data.find(XHTML('body')): self.serialize_elem(elem, item) buffer.write('') @@ -180,12 +181,11 @@ class Serializer(object): if not isinstance(elem.tag, basestring) \ or namespace(elem.tag) not in nsrmap: return - hrefs = self.oeb.manifest.hrefs tag = prefixname(elem.tag, nsrmap) for attr in ('name', 'id'): if attr in elem.attrib: - id = '#'.join((item.id, elem.attrib[attr])) - self.id_offsets[id] = buffer.tell() + href = '#'.join((item.href, elem.attrib[attr])) + self.id_offsets[href] = buffer.tell() del elem.attrib[attr] if tag == 'a' and not elem.attrib \ and not len(elem) and not elem.text: @@ -203,7 +203,7 @@ class Serializer(object): continue elif attr == 'src': href = item.abshref(val) - if href in hrefs: + if href in self.images: index = self.images[href] buffer.write('recindex="%05d"' % index) continue @@ -233,8 +233,12 @@ class Serializer(object): def fixup_links(self): buffer = self.buffer - for id, hoffs in self.href_offsets.items(): - ioff = self.id_offsets[id] + id_offsets = self.id_offsets + for href, hoffs in self.href_offsets.items(): + if href not in id_offsets: + self.logger.warn('Hyperlink target %r not found' % href) + href, _ = urldefrag(href) + ioff = self.id_offsets[href] for hoff in hoffs: buffer.seek(hoff) buffer.write('%010d' % ioff) @@ -360,7 +364,11 @@ class MobiWriter(object): if image.format not in ('JPEG', 'GIF'): width, height = image.size area = width * height - format = 'GIF' if area <= 40000 else 'JPEG' + if area <= 40000: + format = 'GIF' + else: + image = image.convert('RGBA') + format = 'JPEG' changed = True if dimen is not None: image.thumbnail(dimen, Image.ANTIALIAS) diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index a903136610..85d87cf425 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -500,6 +500,7 @@ class Spine(object): self.items.pop(index) for i in xrange(index, len(self.items)): self.items[i].spine_position = i + item.spine_position = None def __iter__(self): for item in self.items: @@ -796,12 +797,20 @@ class OEBBook(object): def _manifest_from_opf(self, opf): self.manifest = manifest = Manifest(self) for elem in xpath(opf, '/o2:package/o2:manifest/o2:item'): + id = elem.get('id') href = elem.get('href') + media_type = elem.get('media-type') + fallback = elem.get('fallback') + if href in manifest.hrefs: + self.logger.warn(u'Duplicate manifest entry for %r.' % href) + continue if not self.container.exists(href): self.logger.warn(u'Manifest item %r not found.' % href) continue - manifest.add(elem.get('id'), href, elem.get('media-type'), - elem.get('fallback')) + if id in manifest.ids: + self.logger.warn(u'Duplicate manifest id %r.' % id) + id, href = manifest.generate(id, href) + manifest.add(id, href, media_type, fallback) def _spine_from_opf(self, opf): self.spine = spine = Spine(self) diff --git a/src/calibre/ebooks/oeb/transforms/trimmanifest.py b/src/calibre/ebooks/oeb/transforms/trimmanifest.py index bd2c388245..b150a12831 100644 --- a/src/calibre/ebooks/oeb/transforms/trimmanifest.py +++ b/src/calibre/ebooks/oeb/transforms/trimmanifest.py @@ -41,8 +41,9 @@ class ManifestTrimmer(object): while unchecked: new = set() for item in unchecked: - if item.media_type in OEB_DOCS or \ - item.media_type[-4:] in ('/xml', '+xml'): + if (item.media_type in OEB_DOCS or + item.media_type[-4:] in ('/xml', '+xml')) and \ + item.data is not None: hrefs = [sel(item.data) for sel in LINK_SELECTORS] for href in chain(*hrefs): href = item.abshref(href) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 0910f85dac..5753a7c974 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -309,18 +309,7 @@ class Main(MainWindow, Ui_MainWindow): self.library_path = dir db = LibraryDatabase2(self.library_path) self.library_view.set_database(db) - if self.olddb is not None: - pd = QProgressDialog('', '', 0, 100, self) - pd.setWindowModality(Qt.ApplicationModal) - pd.setCancelButton(None) - pd.setWindowTitle(_('Migrating database')) - pd.show() - number_of_books = db.migrate_old(self.olddb, pd) - self.olddb.close() - if number_of_books == 0: - os.remove(self.olddb.dbpath) - self.olddb = None - prefs['library_path'] = self.library_path + prefs['library_path'] = self.library_path self.library_view.sortByColumn(*dynamic.get('sort_column', ('timestamp', Qt.DescendingOrder))) if not self.library_view.restore_column_widths(): self.library_view.resizeColumnsToContents() @@ -1392,39 +1381,14 @@ class Main(MainWindow, Ui_MainWindow): def initialize_database(self): self.library_path = prefs['library_path'] - self.olddb = None if self.library_path is None: # Need to migrate to new database layout - QMessageBox.information(self, 'Database format changed', - '''\ -

calibre's book storage format has changed. Instead of storing book files in a database, the -files are now stored in a folder on your filesystem. You will now be asked to choose the folder -in which you want to store your books files. Any existing books will be automatically migrated. - ''') - self.database_path = prefs['database_path'] - if not os.access(os.path.dirname(self.database_path), os.W_OK): - error_dialog(self, _('Database does not exist'), - _('The directory in which the database should be: %s no longer exists. Please choose a new database location.')%self.database_path).exec_() - self.database_path = choose_dir(self, 'database path dialog', - _('Choose new location for database')) - if not self.database_path: - self.database_path = os.path.expanduser('~').decode(sys.getfilesystemencoding()) - if not os.path.exists(self.database_path): - os.makedirs(self.database_path) - self.database_path = os.path.join(self.database_path, 'library1.db') - prefs['database_path'] = self.database_path - home = os.path.dirname(self.database_path) - if not os.path.exists(home): - home = os.getcwd() dir = unicode(QFileDialog.getExistingDirectory(self, - _('Choose a location for your ebook library.'), home)) + _('Choose a location for your ebook library.'), os.getcwd())) if not dir: - dir = os.path.dirname(self.database_path) + dir = os.path.expanduser('~/Library') self.library_path = os.path.abspath(dir) - try: - self.olddb = LibraryDatabase(self.database_path) - except: - traceback.print_exc() - self.olddb = None + if not os.path.exists(self.library_path): + os.makedirs(self.library_path) def read_settings(self): diff --git a/src/calibre/translations/bg.po b/src/calibre/translations/bg.po index 45a3feb12b..e43eac8cd8 100644 --- a/src/calibre/translations/bg.po +++ b/src/calibre/translations/bg.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.51\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-01-10 01:19+0000\n" +"POT-Creation-Date: 2009-01-19 04:38+0000\n" "PO-Revision-Date: 2008-05-24 06:23+0000\n" "Last-Translator: Kovid Goyal \n" "Language-Team: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2009-01-13 07:12+0000\n" +"X-Launchpad-Export-Date: 2009-01-19 06:40+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -24,13 +24,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:44 #: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_any.py:44 #: /home/kovid/work/calibre/src/calibre/ebooks/html.py:492 -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:965 -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:978 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:977 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:990 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:81 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:86 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:300 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:295 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:95 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:97 @@ -42,6 +42,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:196 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:226 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:229 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:252 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:274 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:45 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:47 @@ -51,31 +52,36 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:449 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:819 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:12 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:36 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:66 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:475 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/to_oeb.py:46 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:53 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:365 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:38 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:346 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:360 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:861 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:709 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:949 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:952 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:696 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:937 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:940 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:116 #: /home/kovid/work/calibre/src/calibre/library/cli.py:257 #: /home/kovid/work/calibre/src/calibre/library/database.py:920 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1404 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1435 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1464 -#: /home/kovid/work/calibre/src/calibre/library/database.py:1592 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:461 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:473 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:808 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:841 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1405 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1434 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1468 +#: /home/kovid/work/calibre/src/calibre/library/database.py:1594 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:465 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:477 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:820 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:853 msgid "Unknown" msgstr "" @@ -196,29 +202,32 @@ msgstr "" msgid "Disable the named plugin" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/cybookg3/driver.py:38 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:413 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:55 +msgid "The reader has no storage card connected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/cybookg3/driver.py:57 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:74 +msgid "There is insufficient free space on the storage card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/cybookg3/driver.py:59 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:76 +msgid "There is insufficient free space in main memory" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:140 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:158 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:196 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:224 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:182 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:223 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:250 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:189 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:228 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:255 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:412 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:51 -msgid "The reader has no storage card connected." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:62 -msgid "There is insufficient free space on the storage card" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:64 -msgid "There is insufficient free space in main memory" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/epub/__init__.py:92 msgid "Options to control the conversion to EPUB" msgstr "" @@ -398,7 +407,7 @@ msgid "" "Extract the contents of the produced EPUB file to the specified directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_any.py:156 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_any.py:157 msgid "" "%%prog [options] filename\n" "\n" @@ -406,11 +415,11 @@ msgid "" "formats are: %s\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:100 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:102 msgid "Could not find an ebook inside the archive" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:162 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:177 msgid "" "%prog [options] file.html|opf\n" "\n" @@ -421,13 +430,14 @@ msgid "" "the element of the OPF file. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:413 -#: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:739 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:428 +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:744 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:571 msgid "Output written to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:435 -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:1063 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/from_html.py:450 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:1075 msgid "You must specify an input HTML file" msgstr "" @@ -450,83 +460,83 @@ msgstr "" msgid "Written processed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:848 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:860 msgid "Options to control the traversal of HTML" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:855 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:867 msgid "The output directory. Default is the current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:857 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:869 msgid "Character encoding for HTML files. Default is to auto detect." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:859 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:871 msgid "" "Create the output in a zip file. If this option is specified, the --output " "should be the name of a file not a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:861 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:873 msgid "Control the following of links in HTML files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:863 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:875 msgid "" "Traverse links in HTML files breadth first. Normally, they are traversed " "depth first" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:865 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:877 msgid "" "Maximum levels of recursion when following links in HTML files. Must be non-" "negative. 0 implies that no links in the root HTML file are followed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:867 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:879 msgid "Set metadata of the generated ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:869 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:881 msgid "Set the title. Default is to autodetect." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:871 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:883 msgid "The author(s) of the ebook, as a comma separated list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:873 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:885 msgid "The subject(s) of this book, as a comma separated list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:875 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:887 msgid "Set the publisher of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:877 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:889 msgid "A summary of this book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:879 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:891 msgid "Load metadata from the specified OPF file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:881 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:893 msgid "Options useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:883 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:895 msgid "" "Be more verbose while processing. Can be specified multiple times to " "increase verbosity." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:885 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:897 msgid "Output HTML is \"pretty printed\" for easier parsing by humans" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:891 +#: /home/kovid/work/calibre/src/calibre/ebooks/html.py:903 msgid "" "%prog [options] file.html|opf\n" "\n" @@ -538,7 +548,7 @@ msgid "" "is used.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:44 +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47 msgid "Creating LIT file from EPUB..." msgstr "" @@ -547,7 +557,7 @@ msgid "%prog [options] LITFILE" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:852 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:475 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:507 msgid "Output directory. Defaults to current directory." msgstr "" @@ -556,20 +566,23 @@ msgid "Legibly format extracted markup. May modify meaningful whitespace." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:858 -#: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:724 +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:717 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:530 msgid "Useful for debugging." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lit/reader.py:869 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:499 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:531 msgid "OEB ebook created in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:718 +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:711 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:524 msgid "%prog [options] OPFFILE" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:721 +#: /home/kovid/work/calibre/src/calibre/ebooks/lit/writer.py:714 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:527 msgid "Output file. Default is derived from input filename." msgstr "" @@ -866,120 +879,120 @@ msgstr "" msgid "No file to convert specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:229 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:224 msgid "Rendered %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:232 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:227 msgid "Failed %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:284 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:279 msgid "" "Failed to process comic: %s\n" "\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:291 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:286 msgid "" "Options to control the conversion of comics (CBR, CBZ) files into ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:297 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:292 msgid "Title for generated ebook. Default is to use the filename." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:299 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:294 msgid "" "Set the author in the metadata of the generated ebook. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:302 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:297 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:22 msgid "" "Path to output file. By default a file is created in the current directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:299 msgid "Number of colors for grayscale image conversion. Default: %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:301 msgid "" "Disable normalize (improve contrast) color range for pictures. Default: False" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:308 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:303 msgid "Maintain picture aspect ratio. Default is to fill the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:310 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:305 msgid "Disable sharpening." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:312 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:307 msgid "Don't split landscape images into two portrait images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:314 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:309 msgid "" "Keep aspect ratio and scale image using screen height as image width for " "viewing in landscape mode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:316 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:311 msgid "" "Used for right-to-left publications like manga. Causes landscape pages to be " "split into portrait pages from right to left." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:318 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:313 msgid "" "Enable Despeckle. Reduces speckle noise. May greatly increase processing " "time." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:320 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:315 msgid "" "Don't sort the files found in the comic alphabetically by name. Instead use " "the order they were added to the comic." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:322 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:317 msgid "" "Choose a profile for the device you are generating this file for. The " "default is the SONY PRS-500 with a screen size of 584x754 pixels. This is " "suitable for any reader with the same screen size. Choices are %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:324 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:319 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/pdftrim.py:20 msgid "" "Be verbose, useful for debugging. Can be specified multiple times for " "greater verbosity." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:326 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:321 msgid "Don't show progress bar." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:329 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:324 msgid "Apply no processing to the image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:334 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:329 msgid "" "%prog [options] comic.cb[z|r]\n" "\n" "Convert a comic in a CBZ or CBR file to an ebook. \n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:394 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:389 msgid "Output written to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:459 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/comic/convert_from.py:453 msgid "Rendering comic pages..." msgstr "" @@ -1020,95 +1033,95 @@ msgstr "" msgid "Fetching of recipe failed: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:313 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:317 msgid "\tBook Designer file detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:315 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:319 msgid "\tParsing HTML..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:338 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:342 msgid "\tBaen file detected. Re-parsing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:358 msgid "Written preprocessed HTML to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:372 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:376 msgid "Processing %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:386 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:390 msgid "\tConverting to BBeB..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:532 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:545 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:536 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:549 msgid "Could not parse file: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:537 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:541 msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:557 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:561 msgid "Failed to parse link %s %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:601 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:605 msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:953 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:957 msgid "Unable to process image %s. Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:991 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:995 msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1006 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1010 msgid "" "Could not process image: %s\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1759 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1763 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1761 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1765 msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1783 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1787 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1813 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1817 msgid "" "You have to save the website %s as an html file first and then run html2lrf " "on it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1856 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1860 msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1859 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1863 msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1984 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1988 msgid "Failed to process opf file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1990 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1994 msgid "" "Usage: %prog [options] mybook.html\n" "\n" @@ -1324,16 +1337,16 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:343 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:931 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:958 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:274 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:348 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:959 msgid "Author(s)" msgstr "" @@ -1352,26 +1365,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:394 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:304 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:309 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:58 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:280 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:871 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:935 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:898 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:962 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:50 msgid "Tags" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:281 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:314 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:50 msgid "Series" msgstr "" @@ -1486,14 +1499,62 @@ msgstr "" msgid "Usage: rb-meta file.rb" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:473 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/from_any.py:52 +msgid "Creating Mobipocket file from EPUB..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:505 msgid "%prog [options] myebook.mobi" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:497 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:529 msgid "Raw MOBI HTML saved in" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:501 +msgid "Mobipocket" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:502 +msgid "Mobipocket-specific options." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:505 +msgid "" +"Compress file text using PalmDOC compression. Results in smaller files, but " +"takes a long time to run." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:509 +msgid "Modify images to meet Palm device size limitations." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:511 +msgid "" +"Device renderer profiles. Affects conversion of default font sizes and " +"rasterization resolution. Valid profiles are: %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:511 +msgid "Profiles" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:516 +msgid "Source renderer profile. Default is 'Browser'." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:519 +msgid "Destination renderer profile. Default is 'CybookG3'." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:543 +msgid "Unknown source profile %r" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/writer.py:547 +msgid "Unknown destination profile %r" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/odt/to_oeb.py:57 msgid "The output directory. Defaults to the current directory." msgstr "" @@ -1635,27 +1696,27 @@ msgstr "" msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:146 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:161 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:176 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:186 msgid "View book on device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:300 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:866 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:893 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:56 msgid "Path" msgstr "" @@ -1664,14 +1725,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:88 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:299 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:304 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:57 -#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:50 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/warning_ui.py:52 msgid "Dialog" msgstr "" @@ -1681,6 +1743,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:50 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/warning_ui.py:53 msgid "TextLabel" msgstr "" @@ -1834,7 +1898,7 @@ msgid "Access log:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:344 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:381 msgid "Failed to start content server" msgstr "" @@ -2254,7 +2318,7 @@ msgid " is not a valid picture" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub.py:227 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1039 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1048 msgid "Cannot convert" msgstr "" @@ -2583,7 +2647,7 @@ msgid "" "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:32 msgid "Details of job" msgstr "" @@ -2987,53 +3051,57 @@ msgstr "" msgid "Password needed" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:42 +msgid "Aborting..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:39 msgid "You" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:218 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:241 msgid "%d recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:270 msgid "Must set account information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:270 msgid "This recipe requires a username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:283 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:303 msgid "Last downloaded: %s days ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:299 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:305 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:326 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:136 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:335 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:336 -#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:42 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:752 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:756 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1063 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/tags.py:50 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:764 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:768 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1075 msgid "News" msgstr "" @@ -3516,12 +3584,12 @@ msgid "Job has already run" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library.py:105 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:960 msgid "Size (MB)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:934 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:961 msgid "Date" msgstr "" @@ -3529,35 +3597,35 @@ msgstr "" msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:292 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:297 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:308 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:314 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:701 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:728 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:729 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:865 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:892 msgid "Format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:897 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:968 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:995 msgid "Search (For Advanced Search click the button to the left)" msgstr "" @@ -3633,156 +3701,152 @@ msgstr "" msgid "Configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:90 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:102 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:103 msgid "&Donate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:104 msgid "&Quit" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:106 msgid "&Restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 msgid "" "

For help visit %s.kovidgoyal.net
" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 msgid "%s: %s by Kovid Goyal %%(version)s
%%(device)s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:168 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:170 -msgid "Send to main memory" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/main.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:171 -msgid "Send to storage card" +msgid "Send to main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 +msgid "Send to storage card" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/main.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:172 msgid "and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:174 msgid "Send to storage card by default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:187 msgid "Edit metadata individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:189 msgid "Edit metadata in bulk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:192 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:193 msgid "" "Add books from directories, including sub-directories (One book per " "directory, assumes every ebook file is the same book in a different format)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:194 msgid "" "Add books from directories, including sub directories (Multiple books per " "directory, assumes every ebook file is a different book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:342 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:210 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:210 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1243 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1253 msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:214 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:348 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:215 msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:232 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:233 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:235 msgid "Set defaults for conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:236 msgid "Set defaults for conversion of comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:257 msgid "Similar books..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 msgid "Bad database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:304 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1398 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:305 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1386 msgid "Choose a location for your ebook library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:315 -msgid "Migrating database" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:420 msgid "Browse by covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:509 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:510 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:532 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:543 msgid "Device database corrupted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:544 msgid "" "\n" "

The database of books on the reader is corrupted. Try the " @@ -3798,320 +3862,308 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:601 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:689 -msgid "Stop" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:593 msgid "Adding books recursively..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:598 msgid "Added " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:598 msgid "Searching..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:620 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:712 msgid "" "

Books with the same title as the following already exist in the database. " "Add them anyway?