GwR revisions wip

This commit is contained in:
GRiker 2010-06-22 16:15:10 -06:00
parent 40718a915a
commit 60cb1c2fbe
3 changed files with 97 additions and 15 deletions

View File

@ -71,10 +71,3 @@ gui_pubdate_display_format = 'MMM yyyy'
# order until the title is edited. Double-clicking on a title and hitting return # order until the title is edited. Double-clicking on a title and hitting return
# without changing anything is sufficient to change the sort. # without changing anything is sufficient to change the sort.
title_series_sorting = 'library_order' title_series_sorting = 'library_order'
# Apple iTunes/iDevice
# Control whether Series name is used as Genre in iTunes/iBooks
# If set to 'True', a Book's Series name (if one exists) will be used as the Genre
# If set to 'False', the book's first tag beginning with an alpha character will
# be used as the Genre
ITUNES_use_series_as_category = False

View File

@ -10,12 +10,13 @@ from calibre.constants import __appname__, __version__, DEBUG
from calibre import fit_image from calibre import fit_image
from calibre.constants import isosx, iswindows from calibre.constants import isosx, iswindows
from calibre.devices.errors import UserFeedback from calibre.devices.errors import UserFeedback
from calibre.devices.usbms.deviceconfig import DeviceConfig
from calibre.devices.interface import DevicePlugin from calibre.devices.interface import DevicePlugin
from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.BeautifulSoup import BeautifulSoup
from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata import MetaInformation
from calibre.ebooks.metadata.epub import set_metadata from calibre.ebooks.metadata.epub import set_metadata
from calibre.library.server.utils import strftime from calibre.library.server.utils import strftime
from calibre.utils.config import Config, config_dir, tweaks from calibre.utils.config import Config, ConfigProxy, config_dir
from calibre.utils.date import isoformat, now, parse_date from calibre.utils.date import isoformat, now, parse_date
from calibre.utils.logging import Log from calibre.utils.logging import Log
from calibre.utils.zipfile import ZipFile from calibre.utils.zipfile import ZipFile
@ -34,7 +35,7 @@ if iswindows:
import pythoncom, win32com.client import pythoncom, win32com.client
class ITUNES(DevicePlugin): class ITUNES(DeviceConfig, DevicePlugin):
''' '''
Calling sequences: Calling sequences:
Initialization: Initialization:
@ -85,6 +86,15 @@ class ITUNES(DevicePlugin):
FORMATS = ['epub','pdf'] FORMATS = ['epub','pdf']
# Configuration
HELP_MESSAGE = _('Configure Device')
EXTRA_CUSTOMIZATION_MESSAGE = None
EXTRA_CUSTOMIZATION_DEFAULT = None
MUST_READ_METADATA = False
SAVE_TEMPLATE = '{title}'
SUPPORTS_SUB_DIRS = False
SUPPORTS_USE_AUTHOR_SORT = False
# Product IDs: # Product IDs:
# 0x1292:iPhone 3G # 0x1292:iPhone 3G
# 0x129a:iPad # 0x129a:iPad
@ -163,7 +173,7 @@ class ITUNES(DevicePlugin):
sources = None sources = None
update_msg = None update_msg = None
update_needed = False update_needed = False
use_series_as_category = tweaks['ITUNES_use_series_as_category'] use_series_as_category = False
# Public methods # Public methods
def add_books_to_metadata(self, locations, metadata, booklists): def add_books_to_metadata(self, locations, metadata, booklists):
@ -512,6 +522,29 @@ class ITUNES(DevicePlugin):
''' '''
return (None,None) return (None,None)
def config_widget(self):
'''
Return a QWidget with settings for the device interface
'''
if DEBUG:
self.log.info("ITUNES.config_widget()")
from calibre.gui2.device_drivers.configwidget import ConfigWidget
cw = ConfigWidget(self.settings(), self.FORMATS, self.SUPPORTS_SUB_DIRS,
self.MUST_READ_METADATA, self.SUPPORTS_USE_AUTHOR_SORT,
self.EXTRA_CUSTOMIZATION_MESSAGE)
# Turn off the Save template
cw.opt_save_template.setVisible(False)
cw.label.setVisible(False)
# Repurpose the checkbox
cw.opt_read_metadata.setText("Use Series as Genre in iTunes/iBooks")
return cw
def customization_help(self,gui=False):
if DEBUG:
self.log.info("ITUNES.customization_help()")
return _('Configure Device')
def delete_books(self, paths, end_session=True): def delete_books(self, paths, end_session=True):
''' '''
Delete books at paths on device. Delete books at paths on device.
@ -741,16 +774,45 @@ class ITUNES(DevicePlugin):
''' '''
self.report_progress = report_progress self.report_progress = report_progress
def save_settings(self, settings_widget):
'''
Should save settings to disk. Takes the widget created in config_widget
and saves all settings to disk.
'''
if DEBUG:
self.log.info("ITUNES.save_settings()")
proxy = self._configProxy()
proxy['format_map'] = settings_widget.format_map()
if self.SUPPORTS_SUB_DIRS:
proxy['use_subdirs'] = settings_widget.use_subdirs()
if not self.MUST_READ_METADATA:
proxy['read_metadata'] = settings_widget.read_metadata()
if self.SUPPORTS_USE_AUTHOR_SORT:
proxy['use_author_sort'] = settings_widget.use_author_sort()
if self.EXTRA_CUSTOMIZATION_MESSAGE:
ec = unicode(settings_widget.opt_extra_customization.text()).strip()
if not ec:
ec = None
proxy['extra_customization'] = ec
st = unicode(settings_widget.opt_save_template.text())
proxy['save_template'] = st
# Snag the read_metadata check box contents on the way by
self.use_series_as_category = settings_widget.read_metadata()
def settings(self): def settings(self):
''' '''
Should return an opts object. The opts object should have one attribute Should return an opts object. The opts object should have one attribute
`format_map` which is an ordered list of formats for the device. `format_map` which is an ordered list of formats for the device.
''' '''
klass = self if isinstance(self, type) else self.__class__ if DEBUG:
c = Config('device_drivers_%s' % klass.__name__, _('settings for device drivers')) self.log.info("ITUNES.settings()")
c.add_opt('format_map', default=self.FORMATS, opts = self._config().parse()
help=_('Ordered list of formats the device will accept'))
return c.parse() # Repurpose the read_metadata check box
self.use_series_as_category = opts.read_metadata
return opts
def sync_booklists(self, booklists, end_session=True): def sync_booklists(self, booklists, end_session=True):
''' '''
@ -1067,6 +1129,27 @@ class ITUNES(DevicePlugin):
return db_added, lb_added return db_added, lb_added
def _config(self):
klass = self if isinstance(self, type) else self.__class__
c = Config('device_drivers_%s' % klass.__name__, _('settings for device drivers'))
c.add_opt('format_map', default=self.FORMATS,
help=_('Ordered list of formats the device will accept'))
c.add_opt('use_subdirs', default=True,
help=_('Place files in sub directories if the device supports them'))
c.add_opt('read_metadata', default=True,
help=_('Use Series as Genre in iTunes/iBooks'))
c.add_opt('use_author_sort', default=False,
help=_('Use author sort instead of author'))
c.add_opt('save_template', default=self._default_save_template(),
help=_('Template to control how books are titled in iTunes/iBooks'))
c.add_opt('extra_customization',
default=self.EXTRA_CUSTOMIZATION_DEFAULT,
help=_('Extra customization'))
return c
def _configProxy(self):
return ConfigProxy(self._config())
def _cover_to_thumb(self, path, metadata, db_added, lb_added, format): def _cover_to_thumb(self, path, metadata, db_added, lb_added, format):
''' '''
assumes pythoncom wrapper for db_added assumes pythoncom wrapper for db_added
@ -1217,6 +1300,11 @@ class ITUNES(DevicePlugin):
return this_book return this_book
def _default_save_template(self):
from calibre.library.save_to_disk import config
return self.SAVE_TEMPLATE if self.SAVE_TEMPLATE else \
config().parse().send_template
def _delete_iTunesMetadata_plist(self,fpath): def _delete_iTunesMetadata_plist(self,fpath):
''' '''
Delete the plist file from the file to force recache Delete the plist file from the file to force recache

View File

@ -429,6 +429,7 @@ class Bookmark():
entries, = unpack('>I', data[9:13]) entries, = unpack('>I', data[9:13])
current_entry = 0 current_entry = 0
e_base = 0x0d e_base = 0x0d
self.pdf_page_offset = 0
while current_entry < entries: while current_entry < entries:
''' '''
location, = unpack('>I', data[e_base+2:e_base+6]) location, = unpack('>I', data[e_base+2:e_base+6])