def add_files(self): if current_container() is None: return error_dialog(self.gui, _('No open book'), _( 'You must first open a book to tweak, before trying to create new files' ' in it.'), show=True) files = choose_files(self.gui, 'tweak-book-bulk-import-files', _('Choose files')) if files: folder_map = get_recommended_folders(current_container(), files) files = {x:('/'.join((folder, os.path.basename(x))) if folder else os.path.basename(x)) for x, folder in folder_map.iteritems()} self.commit_dirty_opf() self.add_savepoint(_('Add files')) c = current_container() for path, name in files.iteritems(): i = 0 while c.exists(name): i += 1 name, ext = name.rpartition('.')[0::2] name = '%s_%d.%s' % (name, i, ext) try: with open(path, 'rb') as f: c.add_file(name, f.read()) except: self.rewind_savepoint() raise self.gui.file_list.build(c) if c.opf_name in editors: editors[c.opf_name].replace_data(c.raw_data(c.opf_name)) self.set_modified()
def do_import_file(self, path, hide_button=False): with open(path, 'rb') as f: self.file_data = f.read() name = os.path.basename(path) fmap = get_recommended_folders(current_container(), (name, )) if fmap[name]: name = '/'.join((fmap[name], name)) self.name.setText(name) self.la.setText(_('Choose a name for the imported file')) if hide_button: self.imp_button.setVisible(False)
def do_import_file(self, path, hide_button=False): with open(path, 'rb') as f: self.file_data = f.read() name = os.path.basename(path) fmap = get_recommended_folders(current_container(), (name,)) if fmap[name]: name = '/'.join((fmap[name], name)) self.name.setText(name) self.la.setText(_('Choose a name for the imported file')) if hide_button: self.imp_button.setVisible(False)
def import_file(self): path = choose_files(self, 'tweak-book-new-resource-file', _('Choose file'), select_only_single_file=True) if path: path = path[0] with open(path, 'rb') as f: self.file_data = f.read() name = os.path.basename(path) fmap = get_recommended_folders(current_container(), (name,)) if fmap[name]: name = '/'.join((fmap[name], name)) self.name.setText(name) self.la.setText(_('Choose a name for the imported file'))
def import_file(self): path = choose_files(self, 'tweak-book-new-resource-file', _('Choose file'), select_only_single_file=True) if path: path = path[0] with open(path, 'rb') as f: self.file_data = f.read() name = os.path.basename(path) fmap = get_recommended_folders(current_container(), (name, )) if fmap[name]: name = '/'.join((fmap[name], name)) self.name.setText(name) self.la.setText(_('Choose a name for the imported file'))
def get_name(name): return get_recommended_folders(current_container(), (name, ))[name] + '/' + name
def create_epub_cover(container, cover_path, existing_image, options=None): from calibre.ebooks.conversion.config import load_defaults from calibre.ebooks.oeb.transforms.cover import CoverManager ext = cover_path.rpartition('.')[-1].lower() cname, tname = 'cover.' + ext, 'titlepage.xhtml' recommended_folders = get_recommended_folders(container, (cname, tname)) if existing_image: raster_cover = existing_image manifest_id = {v: k for k, v in container.manifest_id_map.iteritems() }[existing_image] raster_cover_item = container.opf_xpath('//opf:manifest/*[@id="%s"]' % manifest_id)[0] else: folder = recommended_folders[cname] if folder: cname = folder + '/' + cname raster_cover_item = container.generate_item(cname, id_prefix='cover') raster_cover = container.href_to_name(raster_cover_item.get('href'), container.opf_name) with open(cover_path, 'rb') as src, container.open(raster_cover, 'wb') as dest: shutil.copyfileobj(src, dest) if options is None: opts = load_defaults('epub_output') keep_aspect = opts.get('preserve_cover_aspect_ratio', False) no_svg = opts.get('no_svg_cover', False) else: keep_aspect = options.get('keep_aspect', False) no_svg = options.get('no_svg', False) if no_svg: style = 'style="height: 100%%"' templ = CoverManager.NONSVG_TEMPLATE.replace('__style__', style) else: width, height = 600, 800 try: if existing_image: width, height = identify_data( container.raw_data(existing_image, decode=False))[:2] else: width, height = identify(cover_path)[:2] except: container.log.exception("Failed to get width and height of cover") ar = 'xMidYMid meet' if keep_aspect else 'none' templ = CoverManager.SVG_TEMPLATE.replace('__ar__', ar) templ = templ.replace('__viewbox__', '0 0 %d %d' % (width, height)) templ = templ.replace('__width__', str(width)) templ = templ.replace('__height__', str(height)) folder = recommended_folders[tname] if folder: tname = folder + '/' + tname titlepage_item = container.generate_item(tname, id_prefix='titlepage') titlepage = container.href_to_name(titlepage_item.get('href'), container.opf_name) raw = templ % container.name_to_href(raster_cover, titlepage).encode('utf-8') with container.open(titlepage, 'wb') as f: f.write(raw) # We have to make sure the raster cover item has id="cover" for the moron # that wrote the Nook firmware if raster_cover_item.get('id') != 'cover': from calibre.ebooks.oeb.base import uuid_id newid = uuid_id() for item in container.opf_xpath('//*[@id="cover"]'): item.set('id', newid) for item in container.opf_xpath('//*[@idref="cover"]'): item.set('idref', newid) raster_cover_item.set('id', 'cover') spine = container.opf_xpath('//opf:spine')[0] ref = spine.makeelement(OPF('itemref'), idref=titlepage_item.get('id')) container.insert_into_xml(spine, ref, index=0) guide = container.opf_get_or_create('guide') container.insert_into_xml( guide, guide.makeelement(OPF('reference'), type='cover', title=_('Cover'), href=container.name_to_href( titlepage, base=container.opf_name))) metadata = container.opf_get_or_create('metadata') meta = metadata.makeelement(OPF('meta'), name='cover') meta.set('content', raster_cover_item.get('id')) container.insert_into_xml(metadata, meta) return raster_cover, titlepage
def get_name(name): folder = get_recommended_folders(current_container(), (name, ))[name] or '' if folder: folder += '/' return folder + name
def create_epub_cover(container, cover_path, existing_image, options=None): from calibre.ebooks.conversion.config import load_defaults from calibre.ebooks.oeb.transforms.cover import CoverManager try: ext = cover_path.rpartition('.')[-1].lower() except Exception: ext = 'jpeg' cname, tname = 'cover.' + ext, 'titlepage.xhtml' recommended_folders = get_recommended_folders(container, (cname, tname)) if existing_image: raster_cover = existing_image manifest_id = {v:k for k, v in container.manifest_id_map.iteritems()}[existing_image] raster_cover_item = container.opf_xpath('//opf:manifest/*[@id="%s"]' % manifest_id)[0] else: folder = recommended_folders[cname] if folder: cname = folder + '/' + cname raster_cover_item = container.generate_item(cname, id_prefix='cover') raster_cover = container.href_to_name(raster_cover_item.get('href'), container.opf_name) with container.open(raster_cover, 'wb') as dest: if callable(cover_path): cover_path('write_image', dest) else: with lopen(cover_path, 'rb') as src: shutil.copyfileobj(src, dest) if options is None: opts = load_defaults('epub_output') keep_aspect = opts.get('preserve_cover_aspect_ratio', False) no_svg = opts.get('no_svg_cover', False) else: keep_aspect = options.get('keep_aspect', False) no_svg = options.get('no_svg', False) if no_svg: style = 'style="height: 100%%"' templ = CoverManager.NONSVG_TEMPLATE.replace('__style__', style) has_svg = False else: if callable(cover_path): templ = (options or {}).get('template', CoverManager.SVG_TEMPLATE) has_svg = 'xlink:href' in templ else: width, height = 600, 800 has_svg = True try: if existing_image: width, height = identify(container.raw_data(existing_image, decode=False))[1:] else: with lopen(cover_path, 'rb') as csrc: width, height = identify(csrc)[1:] except: container.log.exception("Failed to get width and height of cover") ar = 'xMidYMid meet' if keep_aspect else 'none' templ = CoverManager.SVG_TEMPLATE.replace('__ar__', ar) templ = templ.replace('__viewbox__', '0 0 %d %d'%(width, height)) templ = templ.replace('__width__', str(width)) templ = templ.replace('__height__', str(height)) folder = recommended_folders[tname] if folder: tname = folder + '/' + tname titlepage_item = container.generate_item(tname, id_prefix='titlepage') titlepage = container.href_to_name(titlepage_item.get('href'), container.opf_name) raw = templ%container.name_to_href(raster_cover, titlepage).encode('utf-8') with container.open(titlepage, 'wb') as f: f.write(raw) # We have to make sure the raster cover item has id="cover" for the moron # that wrote the Nook firmware if raster_cover_item.get('id') != 'cover': from calibre.ebooks.oeb.base import uuid_id newid = uuid_id() for item in container.opf_xpath('//*[@id="cover"]'): item.set('id', newid) for item in container.opf_xpath('//*[@idref="cover"]'): item.set('idref', newid) raster_cover_item.set('id', 'cover') spine = container.opf_xpath('//opf:spine')[0] ref = spine.makeelement(OPF('itemref'), idref=titlepage_item.get('id')) container.insert_into_xml(spine, ref, index=0) ver = container.opf_version_parsed if ver.major < 3: guide = container.opf_get_or_create('guide') container.insert_into_xml(guide, guide.makeelement( OPF('reference'), type='cover', title=_('Cover'), href=container.name_to_href(titlepage, base=container.opf_name))) metadata = container.opf_get_or_create('metadata') meta = metadata.makeelement(OPF('meta'), name='cover') meta.set('content', raster_cover_item.get('id')) container.insert_into_xml(metadata, meta) else: container.apply_unique_properties(raster_cover, 'cover-image') container.apply_unique_properties(titlepage, 'calibre:title-page') if has_svg: container.add_properties(titlepage, 'svg') return raster_cover, titlepage
def create_epub_cover(container, cover_path, existing_image, options=None): from calibre.ebooks.conversion.config import load_defaults from calibre.ebooks.oeb.transforms.cover import CoverManager try: ext = cover_path.rpartition(".")[-1].lower() except Exception: ext = "jpeg" cname, tname = "cover." + ext, "titlepage.xhtml" recommended_folders = get_recommended_folders(container, (cname, tname)) if existing_image: raster_cover = existing_image manifest_id = {v: k for k, v in container.manifest_id_map.iteritems()}[existing_image] raster_cover_item = container.opf_xpath('//opf:manifest/*[@id="%s"]' % manifest_id)[0] else: folder = recommended_folders[cname] if folder: cname = folder + "/" + cname raster_cover_item = container.generate_item(cname, id_prefix="cover") raster_cover = container.href_to_name(raster_cover_item.get("href"), container.opf_name) with container.open(raster_cover, "wb") as dest: if callable(cover_path): cover_path("write_image", dest) else: with lopen(cover_path, "rb") as src: shutil.copyfileobj(src, dest) if options is None: opts = load_defaults("epub_output") keep_aspect = opts.get("preserve_cover_aspect_ratio", False) no_svg = opts.get("no_svg_cover", False) else: keep_aspect = options.get("keep_aspect", False) no_svg = options.get("no_svg", False) if no_svg: style = 'style="height: 100%%"' templ = CoverManager.NONSVG_TEMPLATE.replace("__style__", style) else: if callable(cover_path): templ = (options or {}).get("template", CoverManager.SVG_TEMPLATE) else: width, height = 600, 800 try: if existing_image: width, height = identify(container.raw_data(existing_image, decode=False))[1:] else: with lopen(cover_path, "rb") as csrc: width, height = identify(csrc)[1:] except: container.log.exception("Failed to get width and height of cover") ar = "xMidYMid meet" if keep_aspect else "none" templ = CoverManager.SVG_TEMPLATE.replace("__ar__", ar) templ = templ.replace("__viewbox__", "0 0 %d %d" % (width, height)) templ = templ.replace("__width__", str(width)) templ = templ.replace("__height__", str(height)) folder = recommended_folders[tname] if folder: tname = folder + "/" + tname titlepage_item = container.generate_item(tname, id_prefix="titlepage") titlepage = container.href_to_name(titlepage_item.get("href"), container.opf_name) raw = templ % container.name_to_href(raster_cover, titlepage).encode("utf-8") with container.open(titlepage, "wb") as f: f.write(raw) # We have to make sure the raster cover item has id="cover" for the moron # that wrote the Nook firmware if raster_cover_item.get("id") != "cover": from calibre.ebooks.oeb.base import uuid_id newid = uuid_id() for item in container.opf_xpath('//*[@id="cover"]'): item.set("id", newid) for item in container.opf_xpath('//*[@idref="cover"]'): item.set("idref", newid) raster_cover_item.set("id", "cover") spine = container.opf_xpath("//opf:spine")[0] ref = spine.makeelement(OPF("itemref"), idref=titlepage_item.get("id")) container.insert_into_xml(spine, ref, index=0) guide = container.opf_get_or_create("guide") container.insert_into_xml( guide, guide.makeelement( OPF("reference"), type="cover", title=_("Cover"), href=container.name_to_href(titlepage, base=container.opf_name), ), ) metadata = container.opf_get_or_create("metadata") meta = metadata.makeelement(OPF("meta"), name="cover") meta.set("content", raster_cover_item.get("id")) container.insert_into_xml(metadata, meta) return raster_cover, titlepage
def get_name(name): folder = get_recommended_folders(current_container(), (name,))[name] or '' if folder: folder += '/' return folder + name
def get_name(name): return get_recommended_folders(current_container(), (name,))[name] + '/' + name