GR changes supporting ondevice

This commit is contained in:
GRiker 2010-09-06 12:04:46 -07:00
parent 99b494fb7b
commit 2501e40e43
4 changed files with 357 additions and 337 deletions

View File

@ -33,7 +33,7 @@ class GenerateCatalogAction(InterfaceAction):
show=True) show=True)
# Calling gui2.tools:generate_catalog() # Calling gui2.tools:generate_catalog()
ret = generate_catalog(self.gui, dbspec, ids, self.gui.device_manager.device) ret = generate_catalog(self.gui, dbspec, ids, self.gui.device_manager)
if ret is None: if ret is None:
return return

View File

@ -238,7 +238,7 @@ def fetch_scheduled_recipe(arg):
return 'gui_convert', args, _('Fetch news from ')+arg['title'], fmt.upper(), [pt] return 'gui_convert', args, _('Fetch news from ')+arg['title'], fmt.upper(), [pt]
def generate_catalog(parent, dbspec, ids, device): def generate_catalog(parent, dbspec, ids, device_manager):
from calibre.gui2.dialogs.catalog import Catalog from calibre.gui2.dialogs.catalog import Catalog
# Build the Catalog dialog in gui2.dialogs.catalog # Build the Catalog dialog in gui2.dialogs.catalog
@ -252,9 +252,18 @@ def generate_catalog(parent, dbspec, ids, device):
# Profile the connected device # Profile the connected device
# Parallel initialization in calibre.library.cli:command_catalog() # Parallel initialization in calibre.library.cli:command_catalog()
connected_device = { 'storage':None,'serial':None,'save_template':None,'name':None} connected_device = {
'is_device_connected': device_manager.is_device_connected,
'kind': device_manager.connected_device_kind,
'name': None,
'save_template': None,
'serial': None,
'storage': None
}
if device: if device_manager.is_device_connected:
device = device_manager.device
connected_device['name'] = device.gui_name
try: try:
storage = [] storage = []
if device._main_prefix: if device._main_prefix:
@ -263,11 +272,10 @@ def generate_catalog(parent, dbspec, ids, device):
storage.append(os.path.join(device._card_a_prefix, device.EBOOK_DIR_CARD_A)) storage.append(os.path.join(device._card_a_prefix, device.EBOOK_DIR_CARD_A))
if device._card_b_prefix: if device._card_b_prefix:
storage.append(os.path.join(device._card_b_prefix, device.EBOOK_DIR_CARD_B)) storage.append(os.path.join(device._card_b_prefix, device.EBOOK_DIR_CARD_B))
connected_device = { 'storage': storage, connected_device['storage'] = storage
'serial': device.detected_device.serial if \ connected_device['serial'] = device.detected_device.serial if \
hasattr(device.detected_device,'serial') else None, hasattr(device.detected_device,'serial') else None
'save_template': device.save_template(), connected_device['save_template'] = device.save_template()
'name': device.gui_name}
except: except:
pass pass

View File

@ -67,6 +67,8 @@ class CSV_XML(CatalogPlugin):
if opts.verbose: if opts.verbose:
opts_dict = vars(opts) opts_dict = vars(opts)
log("%s(): Generating %s" % (self.name,self.fmt)) log("%s(): Generating %s" % (self.name,self.fmt))
if opts.connected_device['is_device_connected']:
log(" connected_device: %s" % opts.connected_device['name'])
if opts_dict['search_text']: if opts_dict['search_text']:
log(" --search='%s'" % opts_dict['search_text']) log(" --search='%s'" % opts_dict['search_text'])
@ -81,7 +83,6 @@ class CSV_XML(CatalogPlugin):
else: else:
log(" Fields: %s" % opts_dict['fields']) log(" Fields: %s" % opts_dict['fields'])
# If a list of ids are provided, don't use search_text # If a list of ids are provided, don't use search_text
if opts.ids: if opts.ids:
opts.search_text = None opts.search_text = None
@ -888,302 +889,302 @@ class EPUB_MOBI(CatalogPlugin):
self.__totalSteps += 2 self.__totalSteps += 2
# Accessors # Accessors
''' if True:
@dynamic_property '''
def xxxx(self): @dynamic_property
def fget(self): def xxxx(self):
return self.__ def fget(self):
def fset(self, val): return self.__
self.__ = val def fset(self, val):
return property(fget=fget, fset=fset) self.__ = val
''' return property(fget=fget, fset=fset)
'''
@dynamic_property
def authorClip(self):
def fget(self):
return self.__authorClip
def fset(self, val):
self.__authorClip = val
return property(fget=fget, fset=fset)
@dynamic_property
def authors(self):
def fget(self):
return self.__authors
def fset(self, val):
self.__authors = val
return property(fget=fget, fset=fset)
@dynamic_property
def basename(self):
def fget(self):
return self.__basename
def fset(self, val):
self.__basename = val
return property(fget=fget, fset=fset)
@dynamic_property
def bookmarked_books(self):
def fget(self):
return self.__bookmarked_books
def fset(self, val):
self.__bookmarked_books = val
return property(fget=fget, fset=fset)
@dynamic_property
def booksByAuthor(self):
def fget(self):
return self.__booksByAuthor
def fset(self, val):
self.__booksByAuthor = val
return property(fget=fget, fset=fset)
@dynamic_property
def booksByDateRead(self):
def fget(self):
return self.__booksByDateRead
def fset(self, val):
self.__booksByDateRead = val
return property(fget=fget, fset=fset)
@dynamic_property
def booksByTitle(self):
def fget(self):
return self.__booksByTitle
def fset(self, val):
self.__booksByTitle = val
return property(fget=fget, fset=fset)
@dynamic_property
def booksByTitle_noSeriesPrefix(self):
def fget(self):
return self.__booksByTitle_noSeriesPrefix
def fset(self, val):
self.__booksByTitle_noSeriesPrefix = val
return property(fget=fget, fset=fset)
@dynamic_property
def catalogPath(self):
def fget(self):
return self.__catalogPath
def fset(self, val):
self.__catalogPath = val
return property(fget=fget, fset=fset)
@dynamic_property
def contentDir(self):
def fget(self):
return self.__contentDir
def fset(self, val):
self.__contentDir = val
return property(fget=fget, fset=fset)
@dynamic_property
def currentStep(self):
def fget(self):
return self.__currentStep
def fset(self, val):
self.__currentStep = val
return property(fget=fget, fset=fset)
@dynamic_property
def creator(self):
def fget(self):
return self.__creator
def fset(self, val):
self.__creator = val
return property(fget=fget, fset=fset)
@dynamic_property
def db(self):
def fget(self):
return self.__db
return property(fget=fget)
@dynamic_property
def descriptionClip(self):
def fget(self):
return self.__descriptionClip
def fset(self, val):
self.__descriptionClip = val
return property(fget=fget, fset=fset)
@dynamic_property
def error(self):
def fget(self):
return self.__error
return property(fget=fget)
@dynamic_property
def generateForKindle(self):
def fget(self):
return self.__generateForKindle
def fset(self, val):
self.__generateForKindle = val
return property(fget=fget, fset=fset)
@dynamic_property
def generateRecentlyRead(self):
def fget(self):
return self.__generateRecentlyRead
def fset(self, val):
self.__generateRecentlyRead = val
return property(fget=fget, fset=fset)
@dynamic_property
def genres(self):
def fget(self):
return self.__genres
def fset(self, val):
self.__genres = val
return property(fget=fget, fset=fset)
@dynamic_property
def genre_tags_dict(self):
def fget(self):
return self.__genre_tags_dict
def fset(self, val):
self.__genre_tags_dict = val
return property(fget=fget, fset=fset)
@dynamic_property
def htmlFileList(self):
def fget(self):
return self.__htmlFileList
def fset(self, val):
self.__htmlFileList = val
return property(fget=fget, fset=fset)
@dynamic_property
def libraryPath(self):
def fget(self):
return self.__libraryPath
def fset(self, val):
self.__libraryPath = val
return property(fget=fget, fset=fset)
@dynamic_property
def markerTags(self):
def fget(self):
return self.__markerTags
def fset(self, val):
self.__markerTags = val
return property(fget=fget, fset=fset)
@dynamic_property
def ncxSoup(self):
def fget(self):
return self.__ncxSoup
def fset(self, val):
self.__ncxSoup = val
return property(fget=fget, fset=fset)
@dynamic_property
def opts(self):
def fget(self):
return self.__opts
return property(fget=fget)
@dynamic_property
def playOrder(self):
def fget(self):
return self.__playOrder
def fset(self,val):
self.__playOrder = val
return property(fget=fget, fset=fset)
@dynamic_property
def plugin(self):
def fget(self):
return self.__plugin
return property(fget=fget)
@dynamic_property
def progressInt(self):
def fget(self):
return self.__progressInt
def fset(self, val):
self.__progressInt = val
return property(fget=fget, fset=fset)
@dynamic_property
def progressString(self):
def fget(self):
return self.__progressString
def fset(self, val):
self.__progressString = val
return property(fget=fget, fset=fset)
@dynamic_property
def reporter(self):
def fget(self):
return self.__reporter
def fset(self, val):
self.__reporter = val
return property(fget=fget, fset=fset)
@dynamic_property
def stylesheet(self):
def fget(self):
return self.__stylesheet
def fset(self, val):
self.__stylesheet = val
return property(fget=fget, fset=fset)
@dynamic_property
def thumbs(self):
def fget(self):
return self.__thumbs
def fset(self, val):
self.__thumbs = val
return property(fget=fget, fset=fset)
def thumbWidth(self):
def fget(self):
return self.__thumbWidth
def fset(self, val):
self.__thumbWidth = val
return property(fget=fget, fset=fset)
def thumbHeight(self):
def fget(self):
return self.__thumbHeight
def fset(self, val):
self.__thumbHeight = val
return property(fget=fget, fset=fset)
@dynamic_property
def title(self):
def fget(self):
return self.__title
def fset(self, val):
self.__title = val
return property(fget=fget, fset=fset)
@dynamic_property
def totalSteps(self):
def fget(self):
return self.__totalSteps
return property(fget=fget)
@dynamic_property
def useSeriesPrefixInTitlesSection(self):
def fget(self):
return self.__useSeriesPrefixInTitlesSection
def fset(self, val):
self.__useSeriesPrefixInTitlesSection = val
return property(fget=fget, fset=fset)
@dynamic_property
def verbose(self):
def fget(self):
return self.__verbose
def fset(self, val):
self.__verbose = val
return property(fget=fget, fset=fset)
@dynamic_property @dynamic_property
def authorClip(self): def NOT_READ_SYMBOL(self):
def fget(self): def fget(self):
return self.__authorClip return '<span style="color:white">&#x2713;</span>' if self.generateForKindle else \
def fset(self, val): '<span style="color:white">%s</span>' % self.opts.read_tag
self.__authorClip = val return property(fget=fget)
return property(fget=fget, fset=fset) @dynamic_property
@dynamic_property def READING_SYMBOL(self):
def authors(self): def fget(self):
def fget(self): return '<span style="color:black">&#x25b7;</span>' if self.generateForKindle else \
return self.__authors '<span style="color:white">%s</span>' % self.opts.read_tag
def fset(self, val): return property(fget=fget)
self.__authors = val @dynamic_property
return property(fget=fget, fset=fset) def READ_SYMBOL(self):
@dynamic_property def fget(self):
def basename(self): return '<span style="color:black">&#x2713;</span>' if self.generateForKindle else \
def fget(self): '<span style="color:black">%s</span>' % self.opts.read_tag
return self.__basename return property(fget=fget)
def fset(self, val): @dynamic_property
self.__basename = val def FULL_RATING_SYMBOL(self):
return property(fget=fget, fset=fset) def fget(self):
@dynamic_property return "&#9733;" if self.generateForKindle else "*"
def bookmarked_books(self): return property(fget=fget)
def fget(self): @dynamic_property
return self.__bookmarked_books def EMPTY_RATING_SYMBOL(self):
def fset(self, val): def fget(self):
self.__bookmarked_books = val return "&#9734;" if self.generateForKindle else ' '
return property(fget=fget, fset=fset) return property(fget=fget)
@dynamic_property @dynamic_property
def booksByAuthor(self): def READ_PROGRESS_SYMBOL(self):
def fget(self): def fget(self):
return self.__booksByAuthor return "&#9642;" if self.generateForKindle else '+'
def fset(self, val): return property(fget=fget)
self.__booksByAuthor = val @dynamic_property
return property(fget=fget, fset=fset) def UNREAD_PROGRESS_SYMBOL(self):
@dynamic_property def fget(self):
def booksByDateRead(self): return "&#9643;" if self.generateForKindle else '-'
def fget(self): return property(fget=fget)
return self.__booksByDateRead
def fset(self, val):
self.__booksByDateRead = val
return property(fget=fget, fset=fset)
@dynamic_property
def booksByTitle(self):
def fget(self):
return self.__booksByTitle
def fset(self, val):
self.__booksByTitle = val
return property(fget=fget, fset=fset)
@dynamic_property
def booksByTitle_noSeriesPrefix(self):
def fget(self):
return self.__booksByTitle_noSeriesPrefix
def fset(self, val):
self.__booksByTitle_noSeriesPrefix = val
return property(fget=fget, fset=fset)
@dynamic_property
def catalogPath(self):
def fget(self):
return self.__catalogPath
def fset(self, val):
self.__catalogPath = val
return property(fget=fget, fset=fset)
@dynamic_property
def contentDir(self):
def fget(self):
return self.__contentDir
def fset(self, val):
self.__contentDir = val
return property(fget=fget, fset=fset)
@dynamic_property
def currentStep(self):
def fget(self):
return self.__currentStep
def fset(self, val):
self.__currentStep = val
return property(fget=fget, fset=fset)
@dynamic_property
def creator(self):
def fget(self):
return self.__creator
def fset(self, val):
self.__creator = val
return property(fget=fget, fset=fset)
@dynamic_property
def db(self):
def fget(self):
return self.__db
return property(fget=fget)
@dynamic_property
def descriptionClip(self):
def fget(self):
return self.__descriptionClip
def fset(self, val):
self.__descriptionClip = val
return property(fget=fget, fset=fset)
@dynamic_property
def error(self):
def fget(self):
return self.__error
return property(fget=fget)
@dynamic_property
def generateForKindle(self):
def fget(self):
return self.__generateForKindle
def fset(self, val):
self.__generateForKindle = val
return property(fget=fget, fset=fset)
@dynamic_property
def generateRecentlyRead(self):
def fget(self):
return self.__generateRecentlyRead
def fset(self, val):
self.__generateRecentlyRead = val
return property(fget=fget, fset=fset)
@dynamic_property
def genres(self):
def fget(self):
return self.__genres
def fset(self, val):
self.__genres = val
return property(fget=fget, fset=fset)
@dynamic_property
def genre_tags_dict(self):
def fget(self):
return self.__genre_tags_dict
def fset(self, val):
self.__genre_tags_dict = val
return property(fget=fget, fset=fset)
@dynamic_property
def htmlFileList(self):
def fget(self):
return self.__htmlFileList
def fset(self, val):
self.__htmlFileList = val
return property(fget=fget, fset=fset)
@dynamic_property
def libraryPath(self):
def fget(self):
return self.__libraryPath
def fset(self, val):
self.__libraryPath = val
return property(fget=fget, fset=fset)
@dynamic_property
def markerTags(self):
def fget(self):
return self.__markerTags
def fset(self, val):
self.__markerTags = val
return property(fget=fget, fset=fset)
@dynamic_property
def ncxSoup(self):
def fget(self):
return self.__ncxSoup
def fset(self, val):
self.__ncxSoup = val
return property(fget=fget, fset=fset)
@dynamic_property
def opts(self):
def fget(self):
return self.__opts
return property(fget=fget)
@dynamic_property
def playOrder(self):
def fget(self):
return self.__playOrder
def fset(self,val):
self.__playOrder = val
return property(fget=fget, fset=fset)
@dynamic_property
def plugin(self):
def fget(self):
return self.__plugin
return property(fget=fget)
@dynamic_property
def progressInt(self):
def fget(self):
return self.__progressInt
def fset(self, val):
self.__progressInt = val
return property(fget=fget, fset=fset)
@dynamic_property
def progressString(self):
def fget(self):
return self.__progressString
def fset(self, val):
self.__progressString = val
return property(fget=fget, fset=fset)
@dynamic_property
def reporter(self):
def fget(self):
return self.__reporter
def fset(self, val):
self.__reporter = val
return property(fget=fget, fset=fset)
@dynamic_property
def stylesheet(self):
def fget(self):
return self.__stylesheet
def fset(self, val):
self.__stylesheet = val
return property(fget=fget, fset=fset)
@dynamic_property
def thumbs(self):
def fget(self):
return self.__thumbs
def fset(self, val):
self.__thumbs = val
return property(fget=fget, fset=fset)
def thumbWidth(self):
def fget(self):
return self.__thumbWidth
def fset(self, val):
self.__thumbWidth = val
return property(fget=fget, fset=fset)
def thumbHeight(self):
def fget(self):
return self.__thumbHeight
def fset(self, val):
self.__thumbHeight = val
return property(fget=fget, fset=fset)
@dynamic_property
def title(self):
def fget(self):
return self.__title
def fset(self, val):
self.__title = val
return property(fget=fget, fset=fset)
@dynamic_property
def totalSteps(self):
def fget(self):
return self.__totalSteps
return property(fget=fget)
@dynamic_property
def useSeriesPrefixInTitlesSection(self):
def fget(self):
return self.__useSeriesPrefixInTitlesSection
def fset(self, val):
self.__useSeriesPrefixInTitlesSection = val
return property(fget=fget, fset=fset)
@dynamic_property
def verbose(self):
def fget(self):
return self.__verbose
def fset(self, val):
self.__verbose = val
return property(fget=fget, fset=fset)
@dynamic_property
def NOT_READ_SYMBOL(self):
def fget(self):
return '<span style="color:white">&#x2713;</span>' if self.generateForKindle else \
'<span style="color:white">%s</span>' % self.opts.read_tag
return property(fget=fget)
@dynamic_property
def READING_SYMBOL(self):
def fget(self):
return '<span style="color:black">&#x25b7;</span>' if self.generateForKindle else \
'<span style="color:white">%s</span>' % self.opts.read_tag
return property(fget=fget)
@dynamic_property
def READ_SYMBOL(self):
def fget(self):
return '<span style="color:black">&#x2713;</span>' if self.generateForKindle else \
'<span style="color:black">%s</span>' % self.opts.read_tag
return property(fget=fget)
@dynamic_property
def FULL_RATING_SYMBOL(self):
def fget(self):
return "&#9733;" if self.generateForKindle else "*"
return property(fget=fget)
@dynamic_property
def EMPTY_RATING_SYMBOL(self):
def fget(self):
return "&#9734;" if self.generateForKindle else ' '
return property(fget=fget)
@dynamic_property
def READ_PROGRESS_SYMBOL(self):
def fget(self):
return "&#9642;" if self.generateForKindle else '+'
return property(fget=fget)
@dynamic_property
def UNREAD_PROGRESS_SYMBOL(self):
def fget(self):
return "&#9643;" if self.generateForKindle else '-'
return property(fget=fget)
# Methods # Methods
def buildSources(self): def buildSources(self):
@ -1206,7 +1207,6 @@ class EPUB_MOBI(CatalogPlugin):
self.generateOPF() self.generateOPF()
self.generateNCXHeader() self.generateNCXHeader()
self.generateNCXDescriptions("Descriptions")
self.generateNCXByAuthor("Authors") self.generateNCXByAuthor("Authors")
if self.opts.generate_titles: if self.opts.generate_titles:
self.generateNCXByTitle("Titles") self.generateNCXByTitle("Titles")
@ -1215,6 +1215,7 @@ class EPUB_MOBI(CatalogPlugin):
if self.generateRecentlyRead: if self.generateRecentlyRead:
self.generateNCXByDateRead("Recently Read") self.generateNCXByDateRead("Recently Read")
self.generateNCXByGenre("Genres") self.generateNCXByGenre("Genres")
self.generateNCXDescriptions("Descriptions")
self.writeNCX() self.writeNCX()
return True return True
@ -1570,8 +1571,8 @@ class EPUB_MOBI(CatalogPlugin):
if title['series']: if title['series']:
# title<br />series series_index # title<br />series series_index
brTag = Tag(soup,'br') brTag = Tag(soup,'br')
title_tokens = title['title'].split(': ') title_tokens = list(title['title'].partition(':'))
emTag.insert(0, escape(NavigableString(title_tokens[1]))) emTag.insert(0, escape(NavigableString(title_tokens[2].strip())))
emTag.insert(1, brTag) emTag.insert(1, brTag)
smallTag = Tag(soup,'small') smallTag = Tag(soup,'small')
smallTag.insert(0, escape(NavigableString(title_tokens[0]))) smallTag.insert(0, escape(NavigableString(title_tokens[0])))
@ -1747,8 +1748,8 @@ class EPUB_MOBI(CatalogPlugin):
nspt = deepcopy(self.booksByTitle) nspt = deepcopy(self.booksByTitle)
for book in nspt: for book in nspt:
if book['series']: if book['series']:
tokens = book['title'].split(': ') tokens = book['title'].partition(':')
book['title'] = '%s (%s)' % (tokens[1], tokens[0]) book['title'] = '%s (%s)' % (tokens[2].strip(), tokens[0])
book['title_sort'] = self.generateSortTitle(book['title']) book['title_sort'] = self.generateSortTitle(book['title'])
nspt = sorted(nspt, nspt = sorted(nspt,
key=lambda x:(x['title_sort'].upper(), x['title_sort'].upper())) key=lambda x:(x['title_sort'].upper(), x['title_sort'].upper()))
@ -1929,7 +1930,7 @@ class EPUB_MOBI(CatalogPlugin):
current_series = book['series'] current_series = book['series']
pSeriesTag = Tag(soup,'p') pSeriesTag = Tag(soup,'p')
pSeriesTag['class'] = "series" pSeriesTag['class'] = "series"
pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + book['series'])) pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + '%s Series' % book['series']))
divTag.insert(dtc,pSeriesTag) divTag.insert(dtc,pSeriesTag)
dtc += 1 dtc += 1
if current_series and not book['series']: if current_series and not book['series']:
@ -2046,7 +2047,7 @@ class EPUB_MOBI(CatalogPlugin):
current_series = new_entry['series'] current_series = new_entry['series']
pSeriesTag = Tag(soup,'p') pSeriesTag = Tag(soup,'p')
pSeriesTag['class'] = "series" pSeriesTag['class'] = "series"
pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + new_entry['series'])) pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + '%s Series' % new_entry['series']))
divTag.insert(dtc,pSeriesTag) divTag.insert(dtc,pSeriesTag)
dtc += 1 dtc += 1
if current_series and not new_entry['series']: if current_series and not new_entry['series']:
@ -2186,8 +2187,8 @@ class EPUB_MOBI(CatalogPlugin):
nspt = deepcopy(self.booksByTitle) nspt = deepcopy(self.booksByTitle)
for book in nspt: for book in nspt:
if book['series']: if book['series']:
tokens = book['title'].split(': ') tokens = book['title'].partition(':')
book['title'] = '%s (%s)' % (tokens[1], tokens[0]) book['title'] = '%s (%s)' % (tokens[2].strip(), tokens[0])
book['title_sort'] = self.generateSortTitle(book['title']) book['title_sort'] = self.generateSortTitle(book['title'])
self.booksByDateRange = sorted(nspt, key=lambda x:(x['timestamp'], x['timestamp']),reverse=True) self.booksByDateRange = sorted(nspt, key=lambda x:(x['timestamp'], x['timestamp']),reverse=True)
@ -2683,22 +2684,7 @@ class EPUB_MOBI(CatalogPlugin):
# HTML files - add books to manifest and spine # HTML files - add books to manifest and spine
sort_descriptions_by = self.booksByAuthor if self.opts.sort_descriptions_by_author \ sort_descriptions_by = self.booksByAuthor if self.opts.sort_descriptions_by_author \
else self.booksByTitle else self.booksByTitle
for book in sort_descriptions_by: # Add html_files to manifest and spine
# manifest
itemTag = Tag(soup, "item")
itemTag['href'] = "content/book_%d.html" % int(book['id'])
itemTag['id'] = "book%d" % int(book['id'])
itemTag['media-type'] = "application/xhtml+xml"
manifest.insert(mtc, itemTag)
mtc += 1
# spine
itemrefTag = Tag(soup, "itemref")
itemrefTag['idref'] = "book%d" % int(book['id'])
spine.insert(stc, itemrefTag)
stc += 1
# Add other html_files to manifest and spine
for file in self.htmlFileList: for file in self.htmlFileList:
itemTag = Tag(soup, "item") itemTag = Tag(soup, "item")
@ -2734,6 +2720,21 @@ class EPUB_MOBI(CatalogPlugin):
spine.insert(stc, itemrefTag) spine.insert(stc, itemrefTag)
stc += 1 stc += 1
for book in sort_descriptions_by:
# manifest
itemTag = Tag(soup, "item")
itemTag['href'] = "content/book_%d.html" % int(book['id'])
itemTag['id'] = "book%d" % int(book['id'])
itemTag['media-type'] = "application/xhtml+xml"
manifest.insert(mtc, itemTag)
mtc += 1
# spine
itemrefTag = Tag(soup, "itemref")
itemrefTag['idref'] = "book%d" % int(book['id'])
spine.insert(stc, itemrefTag)
stc += 1
# Guide # Guide
referenceTag = Tag(soup, "reference") referenceTag = Tag(soup, "reference")
referenceTag['type'] = 'masthead' referenceTag['type'] = 'masthead'
@ -2821,15 +2822,15 @@ class EPUB_MOBI(CatalogPlugin):
navLabelTag = Tag(ncx_soup, "navLabel") navLabelTag = Tag(ncx_soup, "navLabel")
textTag = Tag(ncx_soup, "text") textTag = Tag(ncx_soup, "text")
if book['series']: if book['series']:
tokens = book['title'].split(': ') tokens = list(book['title'].partition(':'))
if self.generateForKindle: if self.generateForKindle:
# Don't include Author for Kindle # Don't include Author for Kindle
textTag.insert(0, NavigableString(self.formatNCXText('%s (%s)' % \ textTag.insert(0, NavigableString(self.formatNCXText('%s (%s)' % \
(tokens[1], tokens[0]), dest='title'))) (tokens[2].strip(), tokens[0]), dest='title')))
else: else:
# Include Author for non-Kindle # Include Author for non-Kindle
textTag.insert(0, NavigableString(self.formatNCXText('%s &middot; %s (%s)' % \ textTag.insert(0, NavigableString(self.formatNCXText('%s &middot; %s (%s)' % \
(tokens[1], book['author'], tokens[0]), dest='title'))) (tokens[2].strip(), book['author'], tokens[0]), dest='title')))
else: else:
if self.generateForKindle: if self.generateForKindle:
# Don't include Author for Kindle # Don't include Author for Kindle
@ -3752,7 +3753,7 @@ class EPUB_MOBI(CatalogPlugin):
current_series = book['series'] current_series = book['series']
pSeriesTag = Tag(soup,'p') pSeriesTag = Tag(soup,'p')
pSeriesTag['class'] = "series" pSeriesTag['class'] = "series"
pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + book['series'])) pSeriesTag.insert(0,NavigableString(self.NOT_READ_SYMBOL + '%s Series' % book['series']))
divTag.insert(dtc,pSeriesTag) divTag.insert(dtc,pSeriesTag)
dtc += 1 dtc += 1
@ -3897,7 +3898,7 @@ class EPUB_MOBI(CatalogPlugin):
</head> </head>
<body> <body>
<p class="title"></p> <p class="title"></p>
<div class="hr"><blockquote><hr/></blockquote></div> <!--div class="hr"><blockquote><hr/></blockquote></div-->
<div class="authors"></div> <div class="authors"></div>
</body> </body>
</html> </html>
@ -4231,6 +4232,7 @@ class EPUB_MOBI(CatalogPlugin):
op = opts.output_profile op = opts.output_profile
if op is None: if op is None:
op = 'default' op = 'default'
if opts.connected_device['name'] and 'kindle' in opts.connected_device['name'].lower(): if opts.connected_device['name'] and 'kindle' in opts.connected_device['name'].lower():
opts.connected_kindle = True opts.connected_kindle = True
if opts.connected_device['serial'] and opts.connected_device['serial'][:4] in ['B004','B005']: if opts.connected_device['serial'] and opts.connected_device['serial'][:4] in ['B004','B005']:
@ -4256,7 +4258,8 @@ class EPUB_MOBI(CatalogPlugin):
opts.exclude_genre = '\[^.\]' opts.exclude_genre = '\[^.\]'
build_log.append(" converting empty exclude_genre to '\[^.\]'") build_log.append(" converting empty exclude_genre to '\[^.\]'")
if opts.connected_device['name']: if opts.connected_device['is_device_connected'] and \
opts.connected_device['kind'] == 'device':
if opts.connected_device['serial']: if opts.connected_device['serial']:
build_log.append(u" connected_device: '%s' #%s%s " % \ build_log.append(u" connected_device: '%s' #%s%s " % \
(opts.connected_device['name'], (opts.connected_device['name'],
@ -4270,6 +4273,8 @@ class EPUB_MOBI(CatalogPlugin):
for storage in opts.connected_device['storage']: for storage in opts.connected_device['storage']:
if storage: if storage:
build_log.append(u" mount point: %s" % storage) build_log.append(u" mount point: %s" % storage)
else:
build_log.append(u" connected_device: '%s'" % opts.connected_device['name'])
opts_dict = vars(opts) opts_dict = vars(opts)
if opts_dict['ids']: if opts_dict['ids']:

View File

@ -672,7 +672,14 @@ def command_catalog(args, dbpath):
# No support for connected device in CLI environment # No support for connected device in CLI environment
# Parallel initialization in calibre.gui2.tools:generate_catalog() # Parallel initialization in calibre.gui2.tools:generate_catalog()
opts.connected_device = { 'storage':None,'serial':None,'save_template':None,'name':None} opts.connected_device = {
'is_device_connected': False,
'kind': device_manager.connected_device_kind,
'name': None,
'save_template': None,
'serial': None,
'storage': None,
}
with plugin: with plugin:
plugin.run(args[1], opts, get_db(dbpath, opts)) plugin.run(args[1], opts, get_db(dbpath, opts))