mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Do not generate smil wrappers for spine items that have no sentences
This commit is contained in:
parent
2ea2460753
commit
80c74e54cc
@ -903,20 +903,21 @@ class Container(ContainerBase): # {{{
|
|||||||
self.parsed_cache.pop(name, None)
|
self.parsed_cache.pop(name, None)
|
||||||
self.dirtied.discard(name)
|
self.dirtied.discard(name)
|
||||||
|
|
||||||
def set_media_overlay_durations(self, duration_map):
|
def set_media_overlay_durations(self, duration_map=None):
|
||||||
self.dirty(self.opf_name)
|
self.dirty(self.opf_name)
|
||||||
for meta in self.opf_xpath('//opf:meta[@property="media:duration"]'):
|
for meta in self.opf_xpath('//opf:meta[@property="media:duration"]'):
|
||||||
self.remove_from_xml(meta)
|
self.remove_from_xml(meta)
|
||||||
metadata = self.opf_xpath('//opf:metadata')[0]
|
metadata = self.opf_xpath('//opf:metadata')[0]
|
||||||
total_duration = 0
|
total_duration = 0
|
||||||
for item_id, duration in duration_map.items():
|
for item_id, duration in (duration_map or {}).items():
|
||||||
meta = metadata.makeelement(OPF('meta'), property="media:duration", refines="#" + item_id)
|
meta = metadata.makeelement(OPF('meta'), property="media:duration", refines="#" + item_id)
|
||||||
meta.text = seconds_to_timestamp(duration)
|
meta.text = seconds_to_timestamp(duration)
|
||||||
self.insert_into_xml(metadata, meta)
|
self.insert_into_xml(metadata, meta)
|
||||||
total_duration += duration
|
total_duration += duration
|
||||||
meta = metadata.makeelement(OPF('meta'), property="media:duration")
|
if duration_map:
|
||||||
meta.text = seconds_to_timestamp(total_duration)
|
meta = metadata.makeelement(OPF('meta'), property="media:duration")
|
||||||
self.insert_into_xml(metadata, meta)
|
meta.text = seconds_to_timestamp(total_duration)
|
||||||
|
self.insert_into_xml(metadata, meta)
|
||||||
|
|
||||||
def dirty(self, name):
|
def dirty(self, name):
|
||||||
''' Mark the parsed object corresponding to name as dirty. See also: :meth:`parsed`. '''
|
''' Mark the parsed object corresponding to name as dirty. See also: :meth:`parsed`. '''
|
||||||
|
@ -116,8 +116,10 @@ def mark_sentences_in_html(root, lang: str = '', voice: str = '') -> list[Senten
|
|||||||
text = ''.join(c.text for c in self.texts)
|
text = ''.join(c.text for c in self.texts)
|
||||||
self.pos = 0
|
self.pos = 0
|
||||||
for start, length in split_into_sentences_for_tts_embed(text, self.lang):
|
for start, length in split_into_sentences_for_tts_embed(text, self.lang):
|
||||||
elem_id = self.wrap_sentence(start, length)
|
stext = text[start:start+length]
|
||||||
ans.append(Sentence(elem_id, text[start:start+length], self.lang, self.voice))
|
if stext.strip():
|
||||||
|
elem_id = self.wrap_sentence(start, length)
|
||||||
|
ans.append(Sentence(elem_id, stext, self.lang, self.voice))
|
||||||
if self.has_tail:
|
if self.has_tail:
|
||||||
p = self.elem.getparent()
|
p = self.elem.getparent()
|
||||||
spans = []
|
spans = []
|
||||||
@ -125,6 +127,8 @@ def mark_sentences_in_html(root, lang: str = '', voice: str = '') -> list[Senten
|
|||||||
for start, length in split_into_sentences_for_tts_embed(self.elem.tail, self.parent_lang):
|
for start, length in split_into_sentences_for_tts_embed(self.elem.tail, self.parent_lang):
|
||||||
end = start + length
|
end = start + length
|
||||||
text = self.elem.tail[start:end]
|
text = self.elem.tail[start:end]
|
||||||
|
if not text.strip():
|
||||||
|
continue
|
||||||
if before is None:
|
if before is None:
|
||||||
before = self.elem.tail[:start]
|
before = self.elem.tail[:start]
|
||||||
span = self.make_wrapper(text, p)
|
span = self.make_wrapper(text, p)
|
||||||
@ -422,7 +426,7 @@ def remove_embedded_tts(container):
|
|||||||
container.set_media_overlay_durations({})
|
container.set_media_overlay_durations({})
|
||||||
media_files = set()
|
media_files = set()
|
||||||
for item in manifest_items:
|
for item in manifest_items:
|
||||||
smil_id = item.get('media-overlay')
|
smil_id = item.attrib.pop('media-overlay', '')
|
||||||
href = item.get('href')
|
href = item.get('href')
|
||||||
if href and smil_id:
|
if href and smil_id:
|
||||||
name = container.href_to_name(href, container.opf_name)
|
name = container.href_to_name(href, container.opf_name)
|
||||||
@ -469,17 +473,23 @@ def embed_tts(container, report_progress=None, callback_to_download_voices=None)
|
|||||||
return False
|
return False
|
||||||
all_voices = set()
|
all_voices = set()
|
||||||
total_num_sentences = 0
|
total_num_sentences = 0
|
||||||
|
files_with_no_sentences = set()
|
||||||
for i, (name, pfd) in enumerate(name_map.items()):
|
for i, (name, pfd) in enumerate(name_map.items()):
|
||||||
pfd.root = container.parsed(name)
|
pfd.root = container.parsed(name)
|
||||||
pfd.sentences = mark_sentences_in_html(pfd.root, lang=language)
|
pfd.sentences = mark_sentences_in_html(pfd.root, lang=language)
|
||||||
total_num_sentences += len(pfd.sentences)
|
if not pfd.sentences:
|
||||||
for s in pfd.sentences:
|
files_with_no_sentences.add(name)
|
||||||
key = s.lang, s.voice
|
else:
|
||||||
pfd.key_map[key].append(s)
|
total_num_sentences += len(pfd.sentences)
|
||||||
all_voices.add(key)
|
for s in pfd.sentences:
|
||||||
container.dirty(name)
|
key = s.lang, s.voice
|
||||||
|
pfd.key_map[key].append(s)
|
||||||
|
all_voices.add(key)
|
||||||
|
container.dirty(name)
|
||||||
if report_progress(stage, name, i+1, len(name_map)):
|
if report_progress(stage, name, i+1, len(name_map)):
|
||||||
return False
|
return False
|
||||||
|
for rname in files_with_no_sentences:
|
||||||
|
name_map.pop(rname)
|
||||||
if callback_to_download_voices is None:
|
if callback_to_download_voices is None:
|
||||||
piper.ensure_voices_downloaded(iter(all_voices))
|
piper.ensure_voices_downloaded(iter(all_voices))
|
||||||
else:
|
else:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user