def init_input_order(self, defaults=False): if defaults: input_map = prefs.defaults['input_format_order'] else: input_map = prefs['input_format_order'] all_formats = set() self.opt_input_order.clear() for fmt in all_input_formats().union({'ZIP', 'RAR'}): all_formats.add(fmt.upper()) for format in input_map + list(all_formats.difference(input_map)): item = QListWidgetItem(format, self.opt_input_order) item.setData(Qt.UserRole, (format)) item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable)
def init_input_order(self, defaults=False): if defaults: input_map = prefs.defaults['input_format_order'] else: input_map = prefs['input_format_order'] all_formats = set() self.opt_input_order.clear() for fmt in all_input_formats().union({'ZIP', 'RAR'}): all_formats.add(fmt.upper()) for format in input_map + list(all_formats.difference(input_map)): item = QListWidgetItem(format, self.opt_input_order) item.setData(Qt.UserRole, (format)) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
def specialise_plist(launcher, remove_types, plist): plist['CFBundleDisplayName'] = plist['CFBundleName'] = { 'ebook-viewer':'E-book Viewer', 'ebook-edit':'Edit Book', 'calibre-debug': 'calibre (debug)', }[launcher] plist['CFBundleExecutable'] = launcher if launcher != 'calibre-debug': plist['CFBundleIconFile'] = launcher + '.icns' plist['CFBundleIdentifier'] = 'com.calibre-ebook.' + launcher if not remove_types: input_formats = sorted(all_input_formats()) e = plist['CFBundleDocumentTypes'][0] exts = 'epub azw3'.split() if launcher == 'ebook-edit' else input_formats e['CFBundleTypeExtensions'] = exts
def extensions(basename): if basename == 'calibre.exe': from calibre.ebooks import BOOK_EXTENSIONS # We remove rar and zip as they interfere with 7-zip associations # http://www.mobileread.com/forums/showthread.php?t=256459 return set(BOOK_EXTENSIONS) - {'rar', 'zip'} if basename == 'ebook-viewer.exe': from calibre.customize.ui import all_input_formats return set(all_input_formats()) if basename == 'ebook-edit.exe': from calibre.ebooks.oeb.polish.main import SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE return SUPPORTED | IMPORTABLE
def specialise_plist(launcher, remove_types, plist): plist['CFBundleDisplayName'] = plist['CFBundleName'] = { 'ebook-viewer': 'E-book Viewer', 'ebook-edit': 'Edit Book', 'calibre-debug': 'calibre (debug)', }[launcher] plist['CFBundleExecutable'] = launcher if launcher != 'calibre-debug': plist['CFBundleIconFile'] = launcher + '.icns' plist['CFBundleIdentifier'] = 'com.calibre-ebook.' + launcher if not remove_types: input_formats = sorted(all_input_formats()) e = plist['CFBundleDocumentTypes'][0] exts = 'epub azw3'.split( ) if launcher == 'ebook-edit' else input_formats e['CFBundleTypeExtensions'] = exts
def setup_desktop_integration(self): # {{{ try: self.info('Setting up desktop integration...') env = os.environ.copy() cc = check_call if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env: paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep) paths = [x for x in paths if x] npaths = [x for x in paths if x != sys.frozen_path + '/lib'] env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) cc = partial(check_call, env=env) with TemporaryDirectory() as tdir, CurrentDir(tdir), \ PreserveMIMEDefaults(): render_img('mimetypes/lrf.png', 'calibre-lrf.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True) self.icon_resources.append( ('mimetypes', 'application-lrf', '128')) cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell=True) self.icon_resources.append( ('mimetypes', 'application-lrs', '128')) render_img('mimetypes/mobi.png', 'calibre-mobi.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook', shell=True) self.icon_resources.append( ('mimetypes', 'application-x-mobipocket-ebook', '128')) render_img('mimetypes/tpz.png', 'calibre-tpz.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook', shell=True) self.icon_resources.append( ('mimetypes', 'application-x-topaz-ebook', '128')) render_img('mimetypes/azw2.png', 'calibre-azw2.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application', shell=True) self.icon_resources.append( ('mimetypes', 'application-x-kindle-application', '128')) render_img('mimetypes/azw3.png', 'calibre-azw3.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook', shell=True) self.icon_resources.append( ('mimetypes', 'application-x-mobi8-ebook', '128')) render_img('lt.png', 'calibre-gui.png', width=256, height=256) cc('xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui', shell=True) self.icon_resources.append(('apps', 'calibre-gui', '256')) render_img('viewer.png', 'calibre-viewer.png', width=256, height=256) cc('xdg-icon-resource install --size 256 calibre-viewer.png calibre-viewer', shell=True) self.icon_resources.append(('apps', 'calibre-viewer', '256')) render_img('tweak.png', 'calibre-ebook-edit.png', width=256, height=256) cc('xdg-icon-resource install --size 256 calibre-ebook-edit.png calibre-ebook-edit', shell=True) self.icon_resources.append( ('apps', 'calibre-ebook-edit', '256')) mimetypes = set([]) for x in all_input_formats(): mt = guess_type('dummy.' + x)[0] if mt and 'chemical' not in mt and 'ctc-posml' not in mt: mimetypes.add(mt) def write_mimetypes(f): f.write('MimeType=%s;\n' % ';'.join(mimetypes)) from calibre.ebooks.oeb.polish.main import SUPPORTED f = open('calibre-lrfviewer.desktop', 'wb') f.write(VIEWER) f.close() f = open('calibre-ebook-viewer.desktop', 'wb') f.write(EVIEWER) write_mimetypes(f) f = open('calibre-ebook-edit.desktop', 'wb') f.write(ETWEAK) mt = [guess_type('a.' + x.lower())[0] for x in SUPPORTED] f.write('MimeType=%s;\n' % ';'.join(mt)) f.close() f = open('calibre-gui.desktop', 'wb') f.write(GUI) write_mimetypes(f) f.close() des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop', 'calibre-ebook-viewer.desktop', 'calibre-ebook-edit.desktop') appdata = os.path.join( os.path.dirname(self.opts.staging_sharedir), 'appdata') if not os.path.exists(appdata): try: os.mkdir(appdata) except: self.warning( 'Failed to create %s not installing appdata files' % appdata) if os.path.exists(appdata) and not os.access(appdata, os.W_OK): self.warning( 'Do not have write permissions for %s not installing appdata files' % appdata) else: from calibre.utils.localization import get_all_translators translators = dict(get_all_translators()) APPDATA = get_appdata() for x in des: cmd = [ 'xdg-desktop-menu', 'install', '--noupdate', './' + x ] cc(' '.join(cmd), shell=True) self.menu_resources.append(x) ak = x.partition('.')[0] if ak in APPDATA and os.access(appdata, os.W_OK): self.appdata_resources.append( write_appdata(ak, APPDATA[ak], appdata, translators)) cc(['xdg-desktop-menu', 'forceupdate']) MIME = P('calibre-mimetypes.xml') self.mime_resources.append(MIME) cc(['xdg-mime', 'install', MIME]) except Exception: if self.opts.fatal_errors: raise self.task_failed('Setting up desktop integration failed')
def setup_desktop_integration(self): # {{{ try: self.info('Setting up desktop integration...') env = os.environ.copy() cc = check_call if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env: paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep) paths = [x for x in paths if x] npaths = [x for x in paths if x != sys.frozen_path+'/lib'] env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) cc = partial(check_call, env=env) with TemporaryDirectory() as tdir, CurrentDir(tdir), PreserveMIMEDefaults(): def install_single_icon(iconsrc, basename, size, context, is_last_icon=False): filename = '%s-%s.png' % (basename, size) render_img(iconsrc, filename, width=int(size), height=int(size)) cmd = ['xdg-icon-resource', 'install', '--noupdate', '--context', context, '--size', str(size), filename, basename] if is_last_icon: del cmd[2] cc(cmd) self.icon_resources.append((context, basename, str(size))) def install_icons(iconsrc, basename, context, is_last_icon=False): sizes = (16, 32, 48, 64, 128, 256) for size in sizes: install_single_icon(iconsrc, basename, size, context, is_last_icon and size is sizes[-1]) icons = filter(None, [x.strip() for x in '''\ mimetypes/lrf.png application-lrf mimetypes mimetypes/lrf.png text-lrs mimetypes mimetypes/mobi.png application-x-mobipocket-ebook mimetypes mimetypes/tpz.png application-x-topaz-ebook mimetypes mimetypes/azw2.png application-x-kindle-application mimetypes mimetypes/azw3.png application-x-mobi8-ebook mimetypes lt.png calibre-gui apps viewer.png calibre-viewer apps tweak.png calibre-ebook-edit apps '''.splitlines()]) for line in icons: iconsrc, basename, context = line.split() install_icons(iconsrc, basename, context, is_last_icon=line is icons[-1]) mimetypes = set() for x in all_input_formats(): mt = guess_type('dummy.'+x)[0] if mt and 'chemical' not in mt and 'ctc-posml' not in mt: mimetypes.add(mt) mimetypes.discard('application/octet-stream') def write_mimetypes(f): f.write('MimeType=%s;\n'%';'.join(mimetypes)) from calibre.ebooks.oeb.polish.main import SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE f = open('calibre-lrfviewer.desktop', 'wb') f.write(VIEWER) f.close() f = open('calibre-ebook-viewer.desktop', 'wb') f.write(EVIEWER) write_mimetypes(f) f = open('calibre-ebook-edit.desktop', 'wb') f.write(ETWEAK) mt = {guess_type('a.' + x.lower())[0] for x in (SUPPORTED|IMPORTABLE)} - {None, 'application/octet-stream'} f.write('MimeType=%s;\n'%';'.join(mt)) f.close() f = open('calibre-gui.desktop', 'wb') f.write(GUI) write_mimetypes(f) f.close() des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop', 'calibre-ebook-viewer.desktop', 'calibre-ebook-edit.desktop') appdata = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'metainfo') if not os.path.exists(appdata): try: os.mkdir(appdata) except: self.warning('Failed to create %s not installing appdata files' % appdata) if os.path.exists(appdata) and not os.access(appdata, os.W_OK): self.warning('Do not have write permissions for %s not installing appdata files' % appdata) else: from calibre.utils.localization import get_all_translators translators = dict(get_all_translators()) APPDATA = get_appdata() for x in des: cmd = ['xdg-desktop-menu', 'install', '--noupdate', './'+x] cc(' '.join(cmd), shell=True) self.menu_resources.append(x) ak = x.partition('.')[0] if ak in APPDATA and os.access(appdata, os.W_OK): self.appdata_resources.append(write_appdata(ak, APPDATA[ak], appdata, translators)) cc(['xdg-desktop-menu', 'forceupdate']) MIME = P('calibre-mimetypes.xml') self.mime_resources.append(MIME) cc(['xdg-mime', 'install', MIME]) except Exception: if self.opts.fatal_errors: raise self.task_failed('Setting up desktop integration failed')
def setup_completion(self): # {{{ try: self.info('Setting up bash completion...') from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop from calibre.gui2.viewer.main import option_parser as viewer_op from calibre.ebooks.metadata.sources.cli import option_parser as fem_op from calibre.gui2.main import option_parser as guiop from calibre.utils.smtp import option_parser as smtp_op from calibre.library.server.main import option_parser as serv_op from calibre.ebooks.epub.fix.main import option_parser as fix_op from calibre.ebooks import BOOK_EXTENSIONS input_formats = sorted(all_input_formats()) bc = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'bash-completion') if os.path.exists(bc): f = os.path.join(bc, 'calibre') else: if isnetbsd: f = os.path.join(self.opts.staging_root, 'share/bash_completion.d/calibre') else: f = os.path.join(self.opts.staging_etc, 'bash_completion.d/calibre') if not os.path.exists(os.path.dirname(f)): os.makedirs(os.path.dirname(f)) self.manifest.append(f) complete = 'calibre-complete' if getattr(sys, 'frozen_path', None): complete = os.path.join(getattr(sys, 'frozen_path'), complete) self.info('Installing bash completion to', f) with open(f, 'wb') as f: f.write('# calibre Bash Shell Completion\n') f.write(opts_and_exts('calibre', guiop, BOOK_EXTENSIONS)) f.write(opts_and_exts('lrf2lrs', lrf2lrsop, ['lrf'])) f.write(opts_and_exts('ebook-meta', metaop, list(meta_filetypes()))) f.write(opts_and_exts('lrfviewer', lrfviewerop, ['lrf'])) f.write(opts_and_exts('ebook-viewer', viewer_op, input_formats)) f.write(opts_and_words('fetch-ebook-metadata', fem_op, [])) f.write(opts_and_words('calibre-smtp', smtp_op, [])) f.write(opts_and_words('calibre-server', serv_op, [])) f.write(opts_and_exts('epub-fix', fix_op, ['epub'])) f.write(textwrap.dedent(''' _ebook_device_ls() { local pattern search listing prefix pattern="$1" search="$1" if [[ -n "{$pattern}" ]]; then if [[ "${pattern:(-1)}" == "/" ]]; then pattern="" else pattern="$(basename ${pattern} 2> /dev/null)" search="$(dirname ${search} 2> /dev/null)" fi fi if [[ "x${search}" == "x" || "x${search}" == "x." ]]; then search="/" fi listing="$(ebook-device ls ${search} 2>/dev/null)" prefix="${search}" if [[ "x${prefix:(-1)}" != "x/" ]]; then prefix="${prefix}/" fi echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") } _ebook_device() { local cur prev cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=() case "${prev}" in ls|rm|mkdir|touch|cat ) COMPREPLY=( $(_ebook_device_ls "${cur}") ) return 0 ;; cp ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else _filedir return 0 fi ;; dev ) COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") ) return 0 ;; * ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else if [[ ${prev} == dev:* ]]; then _filedir return 0 else COMPREPLY=( $(compgen -W "dev:" "${cur}") ) return 0 fi return 0 fi ;; esac } complete -o nospace -F _ebook_device ebook-device complete -o nospace -C %s ebook-convert ''')%complete) except TypeError as err: if 'resolve_entities' in str(err): print 'You need python-lxml >= 2.0.5 for calibre' sys.exit(1) raise except: if self.opts.fatal_errors: raise self.task_failed('Setting up completion failed')
def write_completion(bash_comp_dest, zsh): from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop from calibre.gui2.viewer.main import option_parser as viewer_op from calibre.gui2.tweak_book.main import option_parser as tweak_op from calibre.ebooks.metadata.sources.cli import option_parser as fem_op from calibre.gui2.main import option_parser as guiop from calibre.utils.smtp import option_parser as smtp_op from calibre.srv.standalone import create_option_parser as serv_op from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE from calibre.debug import option_parser as debug_op from calibre.ebooks import BOOK_EXTENSIONS from calibre.customize.ui import available_input_formats input_formats = sorted(all_input_formats()) tweak_formats = sorted(x.lower() for x in SUPPORTED | IMPORTABLE) if bash_comp_dest and not os.path.exists(os.path.dirname(bash_comp_dest)): os.makedirs(os.path.dirname(bash_comp_dest)) complete = 'calibre-complete' if getattr(sys, 'frozen_path', None): complete = os.path.join(getattr(sys, 'frozen_path'), complete) with open(bash_comp_dest or os.devnull, 'wb') as f: w = polyglot_write(f) def o_and_e(*args, **kwargs): w(opts_and_exts(*args, **kwargs)) zsh.opts_and_exts(*args, **kwargs) def o_and_w(*args, **kwargs): w(opts_and_words(*args, **kwargs)) zsh.opts_and_words(*args, **kwargs) w('# calibre Bash Shell Completion\n') o_and_e('calibre', guiop, BOOK_EXTENSIONS) o_and_e('lrf2lrs', lrf2lrsop, ['lrf'], file_map={'--output': ['lrs']}) o_and_e('ebook-meta', metaop, list(meta_filetypes()), cover_opts=['--cover', '-c'], opf_opts=['--to-opf', '--from-opf']) o_and_e('ebook-polish', polish_op, [x.lower() for x in SUPPORTED], cover_opts=['--cover', '-c'], opf_opts=['--opf', '-o']) o_and_e('lrfviewer', lrfviewerop, ['lrf']) o_and_e('ebook-viewer', viewer_op, input_formats) o_and_e('ebook-edit', tweak_op, tweak_formats) o_and_w('fetch-ebook-metadata', fem_op, []) o_and_w('calibre-smtp', smtp_op, []) o_and_w('calibre-server', serv_op, []) o_and_e('calibre-debug', debug_op, ['py', 'recipe', 'mobi', 'azw', 'azw3', 'docx'], file_map={ '--tweak-book': ['epub', 'azw3', 'mobi'], '--subset-font': ['ttf', 'otf'], '--exec-file': ['py', 'recipe'], '--add-simple-plugin': ['py'], '--inspect-mobi': ['mobi', 'azw', 'azw3'], '--viewer': sorted(available_input_formats()), }) w( textwrap.dedent(''' _ebook_device_ls() { local pattern search listing prefix pattern="$1" search="$1" if [[ -n "{$pattern}" ]]; then if [[ "${pattern:(-1)}" == "/" ]]; then pattern="" else pattern="$(basename ${pattern} 2> /dev/null)" search="$(dirname ${search} 2> /dev/null)" fi fi if [[ "x${search}" == "x" || "x${search}" == "x." ]]; then search="/" fi listing="$(ebook-device ls ${search} 2>/dev/null)" prefix="${search}" if [[ "x${prefix:(-1)}" != "x/" ]]; then prefix="${prefix}/" fi echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") } _ebook_device() { local cur prev cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=() case "${prev}" in ls|rm|mkdir|touch|cat ) COMPREPLY=( $(_ebook_device_ls "${cur}") ) return 0 ;; cp ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else _filedir return 0 fi ;; dev ) COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") ) return 0 ;; * ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else if [[ ${prev} == dev:* ]]; then _filedir return 0 else COMPREPLY=( $(compgen -W "dev:" "${cur}") ) return 0 fi return 0 fi ;; esac } complete -o nospace -F _ebook_device ebook-device complete -o nospace -C %s ebook-convert ''') % complete) zsh.write()
def setup_completion(self): # {{{ try: self.info('Setting up command-line completion...') from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop from calibre.gui2.viewer.main import option_parser as viewer_op from calibre.gui2.tweak_book.main import option_parser as tweak_op from calibre.ebooks.metadata.sources.cli import option_parser as fem_op from calibre.gui2.main import option_parser as guiop from calibre.utils.smtp import option_parser as smtp_op from calibre.library.server.main import option_parser as serv_op from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE from calibre.debug import option_parser as debug_op from calibre.ebooks import BOOK_EXTENSIONS from calibre.customize.ui import available_input_formats input_formats = sorted(all_input_formats()) tweak_formats = sorted(x.lower() for x in SUPPORTED|IMPORTABLE) zsh = ZshCompleter(self.opts) bc = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'bash-completion') if os.path.exists(bc): f = os.path.join(bc, 'calibre') else: if isnetbsd: f = os.path.join(self.opts.staging_root, 'share/bash_completion.d/calibre') else: f = os.path.join(self.opts.staging_etc, 'bash_completion.d/calibre') if not os.path.exists(os.path.dirname(f)): os.makedirs(os.path.dirname(f)) bash_comp_dest, zsh_comp_dest = f, None if zsh.dest: self.info('Installing zsh completion to:', zsh.dest) self.manifest.append(zsh.dest) zsh_comp_dest = zsh.dest complete = 'calibre-complete' if getattr(sys, 'frozen_path', None): complete = os.path.join(getattr(sys, 'frozen_path'), complete) self.info('Installing bash completion to', f) with open(f, 'wb') as f: def o_and_e(*args, **kwargs): f.write(opts_and_exts(*args, **kwargs)) zsh.opts_and_exts(*args, **kwargs) def o_and_w(*args, **kwargs): f.write(opts_and_words(*args, **kwargs)) zsh.opts_and_words(*args, **kwargs) f.write('# calibre Bash Shell Completion\n') o_and_e('calibre', guiop, BOOK_EXTENSIONS) o_and_e('lrf2lrs', lrf2lrsop, ['lrf'], file_map={'--output':['lrs']}) o_and_e('ebook-meta', metaop, list(meta_filetypes()), cover_opts=['--cover', '-c'], opf_opts=['--to-opf', '--from-opf']) o_and_e('ebook-polish', polish_op, [x.lower() for x in SUPPORTED], cover_opts=['--cover', '-c'], opf_opts=['--opf', '-o']) o_and_e('lrfviewer', lrfviewerop, ['lrf']) o_and_e('ebook-viewer', viewer_op, input_formats) o_and_e('ebook-edit', tweak_op, tweak_formats) o_and_w('fetch-ebook-metadata', fem_op, []) o_and_w('calibre-smtp', smtp_op, []) o_and_w('calibre-server', serv_op, []) o_and_e('calibre-debug', debug_op, ['py', 'recipe', 'mobi', 'azw', 'azw3', 'docx'], file_map={ '--tweak-book':['epub', 'azw3', 'mobi'], '--subset-font':['ttf', 'otf'], '--exec-file':['py', 'recipe'], '--add-simple-plugin':['py'], '--inspect-mobi':['mobi', 'azw', 'azw3'], '--viewer':list(available_input_formats()), }) f.write(textwrap.dedent(''' _ebook_device_ls() { local pattern search listing prefix pattern="$1" search="$1" if [[ -n "{$pattern}" ]]; then if [[ "${pattern:(-1)}" == "/" ]]; then pattern="" else pattern="$(basename ${pattern} 2> /dev/null)" search="$(dirname ${search} 2> /dev/null)" fi fi if [[ "x${search}" == "x" || "x${search}" == "x." ]]; then search="/" fi listing="$(ebook-device ls ${search} 2>/dev/null)" prefix="${search}" if [[ "x${prefix:(-1)}" != "x/" ]]; then prefix="${prefix}/" fi echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") } _ebook_device() { local cur prev cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=() case "${prev}" in ls|rm|mkdir|touch|cat ) COMPREPLY=( $(_ebook_device_ls "${cur}") ) return 0 ;; cp ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else _filedir return 0 fi ;; dev ) COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") ) return 0 ;; * ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else if [[ ${prev} == dev:* ]]; then _filedir return 0 else COMPREPLY=( $(compgen -W "dev:" "${cur}") ) return 0 fi return 0 fi ;; esac } complete -o nospace -F _ebook_device ebook-device complete -o nospace -C %s ebook-convert ''')%complete) zsh.write() self.manifest.extend((bash_comp_dest, zsh_comp_dest)) except TypeError as err: if 'resolve_entities' in str(err): print 'You need python-lxml >= 2.0.5 for calibre' sys.exit(1) raise except EnvironmentError as e: if e.errno == errno.EACCES: self.warning('Failed to setup completion, permission denied') except: if self.opts.fatal_errors: raise self.task_failed('Setting up completion failed')
def setup_desktop_integration(self): # {{{ try: self.info('Setting up desktop integration...') env = os.environ.copy() cc = check_call if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env: paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep) paths = [x for x in paths if x] npaths = [x for x in paths if x != sys.frozen_path+'/lib'] env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) cc = partial(check_call, env=env) with TemporaryDirectory() as tdir, CurrentDir(tdir), \ PreserveMIMEDefaults(): render_img('mimetypes/lrf.png', 'calibre-lrf.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True) self.icon_resources.append(('mimetypes', 'application-lrf', '128')) cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell=True) self.icon_resources.append(('mimetypes', 'application-lrs', '128')) render_img('mimetypes/mobi.png', 'calibre-mobi.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook', shell=True) self.icon_resources.append(('mimetypes', 'application-x-mobipocket-ebook', '128')) render_img('mimetypes/tpz.png', 'calibre-tpz.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook', shell=True) self.icon_resources.append(('mimetypes', 'application-x-topaz-ebook', '128')) render_img('mimetypes/azw2.png', 'calibre-azw2.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application', shell=True) self.icon_resources.append(('mimetypes', 'application-x-kindle-application', '128')) render_img('mimetypes/azw3.png', 'calibre-azw3.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook', shell=True) self.icon_resources.append(('mimetypes', 'application-x-mobi8-ebook', '128')) render_img('lt.png', 'calibre-gui.png', width=256, height=256) cc('xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui', shell=True) self.icon_resources.append(('apps', 'calibre-gui', '128')) render_img('viewer.png', 'calibre-viewer.png') cc('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True) self.icon_resources.append(('apps', 'calibre-viewer', '128')) render_img('tweak.png', 'calibre-ebook-tweak.png') cc('xdg-icon-resource install --size 128 calibre-ebook-tweak.png calibre-ebook-tweak', shell=True) self.icon_resources.append(('apps', 'calibre-ebook-tweak', '128')) mimetypes = set([]) for x in all_input_formats(): mt = guess_type('dummy.'+x)[0] if mt and 'chemical' not in mt and 'ctc-posml' not in mt: mimetypes.add(mt) def write_mimetypes(f): f.write('MimeType=%s;\n'%';'.join(mimetypes)) from calibre.ebooks.oeb.polish.main import SUPPORTED f = open('calibre-lrfviewer.desktop', 'wb') f.write(VIEWER) f.close() f = open('calibre-ebook-viewer.desktop', 'wb') f.write(EVIEWER) write_mimetypes(f) f = open('calibre-ebook-tweak.desktop', 'wb') f.write(ETWEAK) mt = [guess_type('a.' + x.lower())[0] for x in SUPPORTED] f.write('MimeType=%s;\n'%';'.join(mt)) f.close() f = open('calibre-gui.desktop', 'wb') f.write(GUI) write_mimetypes(f) f.close() des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop', 'calibre-ebook-viewer.desktop', 'calibre-ebook-tweak.desktop') for x in des: cmd = ['xdg-desktop-menu', 'install', '--noupdate', './'+x] cc(' '.join(cmd), shell=True) self.menu_resources.append(x) cc(['xdg-desktop-menu', 'forceupdate']) f = open('calibre-mimetypes.xml', 'wb') f.write(MIME) f.close() self.mime_resources.append('calibre-mimetypes.xml') cc('xdg-mime install ./calibre-mimetypes.xml', shell=True) except Exception: if self.opts.fatal_errors: raise self.task_failed('Setting up desktop integration failed')
def setup_desktop_integration(self): # {{{ try: self.info("Setting up desktop integration...") env = os.environ.copy() cc = check_call if getattr(sys, "frozen_path", False) and "LD_LIBRARY_PATH" in env: paths = env.get("LD_LIBRARY_PATH", "").split(os.pathsep) paths = [x for x in paths if x] npaths = [x for x in paths if x != sys.frozen_path + "/lib"] env["LD_LIBRARY_PATH"] = os.pathsep.join(npaths) cc = partial(check_call, env=env) with TemporaryDirectory() as tdir, CurrentDir(tdir), PreserveMIMEDefaults(): render_img("mimetypes/lrf.png", "calibre-lrf.png") cc( "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf", shell=True, ) self.icon_resources.append(("mimetypes", "application-lrf", "128")) cc( "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs", shell=True, ) self.icon_resources.append(("mimetypes", "application-lrs", "128")) render_img("mimetypes/mobi.png", "calibre-mobi.png") cc( "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook", shell=True, ) self.icon_resources.append(("mimetypes", "application-x-mobipocket-ebook", "128")) render_img("mimetypes/tpz.png", "calibre-tpz.png") cc( "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook", shell=True, ) self.icon_resources.append(("mimetypes", "application-x-topaz-ebook", "128")) render_img("mimetypes/azw2.png", "calibre-azw2.png") cc( "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application", shell=True, ) self.icon_resources.append(("mimetypes", "application-x-kindle-application", "128")) render_img("mimetypes/azw3.png", "calibre-azw3.png") cc( "xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook", shell=True, ) self.icon_resources.append(("mimetypes", "application-x-mobi8-ebook", "128")) render_img("lt.png", "calibre-gui.png", width=256, height=256) cc("xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui", shell=True) self.icon_resources.append(("apps", "calibre-gui", "256")) render_img("viewer.png", "calibre-viewer.png", width=256, height=256) cc("xdg-icon-resource install --size 256 calibre-viewer.png calibre-viewer", shell=True) self.icon_resources.append(("apps", "calibre-viewer", "256")) render_img("tweak.png", "calibre-ebook-edit.png", width=256, height=256) cc("xdg-icon-resource install --size 256 calibre-ebook-edit.png calibre-ebook-edit", shell=True) self.icon_resources.append(("apps", "calibre-ebook-edit", "256")) mimetypes = set([]) for x in all_input_formats(): mt = guess_type("dummy." + x)[0] if mt and "chemical" not in mt and "ctc-posml" not in mt: mimetypes.add(mt) def write_mimetypes(f): f.write("MimeType=%s;\n" % ";".join(mimetypes)) from calibre.ebooks.oeb.polish.main import SUPPORTED f = open("calibre-lrfviewer.desktop", "wb") f.write(VIEWER) f.close() f = open("calibre-ebook-viewer.desktop", "wb") f.write(EVIEWER) write_mimetypes(f) f = open("calibre-ebook-edit.desktop", "wb") f.write(ETWEAK) mt = [guess_type("a." + x.lower())[0] for x in SUPPORTED] f.write("MimeType=%s;\n" % ";".join(mt)) f.close() f = open("calibre-gui.desktop", "wb") f.write(GUI) write_mimetypes(f) f.close() des = ( "calibre-gui.desktop", "calibre-lrfviewer.desktop", "calibre-ebook-viewer.desktop", "calibre-ebook-edit.desktop", ) appdata = os.path.join(os.path.dirname(self.opts.staging_sharedir), "appdata") if not os.path.exists(appdata): try: os.mkdir(appdata) except: self.warning("Failed to create %s not installing appdata files" % appdata) if os.path.exists(appdata) and not os.access(appdata, os.W_OK): self.warning("Do not have write permissions for %s not installing appdata files" % appdata) else: from calibre.utils.localization import get_all_translators translators = dict(get_all_translators()) APPDATA = get_appdata() for x in des: cmd = ["xdg-desktop-menu", "install", "--noupdate", "./" + x] cc(" ".join(cmd), shell=True) self.menu_resources.append(x) ak = x.partition(".")[0] if ak in APPDATA and os.access(appdata, os.W_OK): self.appdata_resources.append(write_appdata(ak, APPDATA[ak], appdata, translators)) cc(["xdg-desktop-menu", "forceupdate"]) MIME = P("calibre-mimetypes.xml") self.mime_resources.append(MIME) cc(["xdg-mime", "install", MIME]) except Exception: if self.opts.fatal_errors: raise self.task_failed("Setting up desktop integration failed")
def write_completion(bash_comp_dest, zsh): from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop from calibre.gui2.viewer.main import option_parser as viewer_op from calibre.gui2.tweak_book.main import option_parser as tweak_op from calibre.ebooks.metadata.sources.cli import option_parser as fem_op from calibre.gui2.main import option_parser as guiop from calibre.utils.smtp import option_parser as smtp_op from calibre.library.server.main import option_parser as serv_op from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE from calibre.debug import option_parser as debug_op from calibre.ebooks import BOOK_EXTENSIONS from calibre.customize.ui import available_input_formats input_formats = sorted(all_input_formats()) tweak_formats = sorted(x.lower() for x in SUPPORTED | IMPORTABLE) if bash_comp_dest and not os.path.exists(os.path.dirname(bash_comp_dest)): os.makedirs(os.path.dirname(bash_comp_dest)) complete = "calibre-complete" if getattr(sys, "frozen_path", None): complete = os.path.join(getattr(sys, "frozen_path"), complete) with open(bash_comp_dest or os.devnull, "wb") as f: def o_and_e(*args, **kwargs): f.write(opts_and_exts(*args, **kwargs)) zsh.opts_and_exts(*args, **kwargs) def o_and_w(*args, **kwargs): f.write(opts_and_words(*args, **kwargs)) zsh.opts_and_words(*args, **kwargs) f.write("# calibre Bash Shell Completion\n") o_and_e("calibre", guiop, BOOK_EXTENSIONS) o_and_e("lrf2lrs", lrf2lrsop, ["lrf"], file_map={"--output": ["lrs"]}) o_and_e( "ebook-meta", metaop, list(meta_filetypes()), cover_opts=["--cover", "-c"], opf_opts=["--to-opf", "--from-opf"], ) o_and_e( "ebook-polish", polish_op, [x.lower() for x in SUPPORTED], cover_opts=["--cover", "-c"], opf_opts=["--opf", "-o"], ) o_and_e("lrfviewer", lrfviewerop, ["lrf"]) o_and_e("ebook-viewer", viewer_op, input_formats) o_and_e("ebook-edit", tweak_op, tweak_formats) o_and_w("fetch-ebook-metadata", fem_op, []) o_and_w("calibre-smtp", smtp_op, []) o_and_w("calibre-server", serv_op, []) o_and_e( "calibre-debug", debug_op, ["py", "recipe", "mobi", "azw", "azw3", "docx"], file_map={ "--tweak-book": ["epub", "azw3", "mobi"], "--subset-font": ["ttf", "otf"], "--exec-file": ["py", "recipe"], "--add-simple-plugin": ["py"], "--inspect-mobi": ["mobi", "azw", "azw3"], "--viewer": list(available_input_formats()), }, ) f.write( textwrap.dedent( """ _ebook_device_ls() { local pattern search listing prefix pattern="$1" search="$1" if [[ -n "{$pattern}" ]]; then if [[ "${pattern:(-1)}" == "/" ]]; then pattern="" else pattern="$(basename ${pattern} 2> /dev/null)" search="$(dirname ${search} 2> /dev/null)" fi fi if [[ "x${search}" == "x" || "x${search}" == "x." ]]; then search="/" fi listing="$(ebook-device ls ${search} 2>/dev/null)" prefix="${search}" if [[ "x${prefix:(-1)}" != "x/" ]]; then prefix="${prefix}/" fi echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") } _ebook_device() { local cur prev cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=() case "${prev}" in ls|rm|mkdir|touch|cat ) COMPREPLY=( $(_ebook_device_ls "${cur}") ) return 0 ;; cp ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else _filedir return 0 fi ;; dev ) COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") ) return 0 ;; * ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else if [[ ${prev} == dev:* ]]; then _filedir return 0 else COMPREPLY=( $(compgen -W "dev:" "${cur}") ) return 0 fi return 0 fi ;; esac } complete -o nospace -F _ebook_device ebook-device complete -o nospace -C %s ebook-convert """ ) % complete ) zsh.write()
def setup_desktop_integration(self): # {{{ try: self.info('Setting up desktop integration...') env = os.environ.copy() cc = check_call if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env: paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep) paths = [x for x in paths if x] npaths = [x for x in paths if x != sys.frozen_path + '/lib'] env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) cc = partial(check_call, env=env) with TemporaryDirectory() as tdir, CurrentDir(tdir), \ PreserveMIMEDefaults(): render_img('mimetypes/lrf.png', 'calibre-lrf.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True) self.icon_resources.append( ('mimetypes', 'application-lrf', '128')) cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell=True) self.icon_resources.append( ('mimetypes', 'application-lrs', '128')) render_img('mimetypes/mobi.png', 'calibre-mobi.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook', shell=True) self.icon_resources.append( ('mimetypes', 'application-x-mobipocket-ebook', '128')) render_img('mimetypes/tpz.png', 'calibre-tpz.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook', shell=True) self.icon_resources.append( ('mimetypes', 'application-x-topaz-ebook', '128')) render_img('mimetypes/azw2.png', 'calibre-azw2.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application', shell=True) self.icon_resources.append( ('mimetypes', 'application-x-kindle-application', '128')) render_img('mimetypes/azw3.png', 'calibre-azw3.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook', shell=True) self.icon_resources.append( ('mimetypes', 'application-x-mobi8-ebook', '128')) render_img('lt.png', 'calibre-gui.png', width=256, height=256) cc('xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui', shell=True) self.icon_resources.append(('apps', 'calibre-gui', '128')) render_img('viewer.png', 'calibre-viewer.png') cc('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True) self.icon_resources.append(('apps', 'calibre-viewer', '128')) render_img('tweak.png', 'calibre-ebook-edit.png') cc('xdg-icon-resource install --size 128 calibre-ebook-edit.png calibre-ebook-edit', shell=True) self.icon_resources.append( ('apps', 'calibre-ebook-edit', '128')) mimetypes = set([]) for x in all_input_formats(): mt = guess_type('dummy.' + x)[0] if mt and 'chemical' not in mt and 'ctc-posml' not in mt: mimetypes.add(mt) def write_mimetypes(f): f.write('MimeType=%s;\n' % ';'.join(mimetypes)) from calibre.ebooks.oeb.polish.main import SUPPORTED f = open('calibre-lrfviewer.desktop', 'wb') f.write(VIEWER) f.close() f = open('calibre-ebook-viewer.desktop', 'wb') f.write(EVIEWER) write_mimetypes(f) f = open('calibre-ebook-edit.desktop', 'wb') f.write(ETWEAK) mt = [guess_type('a.' + x.lower())[0] for x in SUPPORTED] f.write('MimeType=%s;\n' % ';'.join(mt)) f.close() f = open('calibre-gui.desktop', 'wb') f.write(GUI) write_mimetypes(f) f.close() des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop', 'calibre-ebook-viewer.desktop', 'calibre-ebook-edit.desktop') for x in des: cmd = [ 'xdg-desktop-menu', 'install', '--noupdate', './' + x ] cc(' '.join(cmd), shell=True) self.menu_resources.append(x) cc(['xdg-desktop-menu', 'forceupdate']) f = open('calibre-mimetypes.xml', 'wb') f.write(MIME) f.close() self.mime_resources.append('calibre-mimetypes.xml') cc('xdg-mime install ./calibre-mimetypes.xml', shell=True) except Exception: if self.opts.fatal_errors: raise self.task_failed('Setting up desktop integration failed')
def setup_completion(self): # {{{ try: self.info('Setting up command-line completion...') from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop from calibre.gui2.viewer.main import option_parser as viewer_op from calibre.gui2.tweak_book.main import option_parser as tweak_op from calibre.ebooks.metadata.sources.cli import option_parser as fem_op from calibre.gui2.main import option_parser as guiop from calibre.utils.smtp import option_parser as smtp_op from calibre.library.server.main import option_parser as serv_op from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED from calibre.debug import option_parser as debug_op from calibre.ebooks import BOOK_EXTENSIONS from calibre.customize.ui import available_input_formats input_formats = sorted(all_input_formats()) tweak_formats = sorted(x.lower() for x in SUPPORTED) zsh = ZshCompleter(self.opts) bc = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'bash-completion') if os.path.exists(bc): f = os.path.join(bc, 'calibre') else: if isnetbsd: f = os.path.join(self.opts.staging_root, 'share/bash_completion.d/calibre') else: f = os.path.join(self.opts.staging_etc, 'bash_completion.d/calibre') if not os.path.exists(os.path.dirname(f)): os.makedirs(os.path.dirname(f)) if zsh.dest: self.info('Installing zsh completion to:', zsh.dest) self.manifest.append(zsh.dest) self.manifest.append(f) complete = 'calibre-complete' if getattr(sys, 'frozen_path', None): complete = os.path.join(getattr(sys, 'frozen_path'), complete) self.info('Installing bash completion to', f) with open(f, 'wb') as f: def o_and_e(*args, **kwargs): f.write(opts_and_exts(*args, **kwargs)) zsh.opts_and_exts(*args, **kwargs) def o_and_w(*args, **kwargs): f.write(opts_and_words(*args, **kwargs)) zsh.opts_and_words(*args, **kwargs) f.write('# calibre Bash Shell Completion\n') o_and_e('calibre', guiop, BOOK_EXTENSIONS) o_and_e('lrf2lrs', lrf2lrsop, ['lrf'], file_map={'--output': ['lrs']}) o_and_e('ebook-meta', metaop, list(meta_filetypes()), cover_opts=['--cover', '-c'], opf_opts=['--to-opf', '--from-opf']) o_and_e('ebook-polish', polish_op, [x.lower() for x in SUPPORTED], cover_opts=['--cover', '-c'], opf_opts=['--opf', '-o']) o_and_e('lrfviewer', lrfviewerop, ['lrf']) o_and_e('ebook-viewer', viewer_op, input_formats) o_and_e('ebook-edit', tweak_op, tweak_formats) o_and_w('fetch-ebook-metadata', fem_op, []) o_and_w('calibre-smtp', smtp_op, []) o_and_w('calibre-server', serv_op, []) o_and_e('calibre-debug', debug_op, ['py', 'recipe', 'mobi', 'azw', 'azw3', 'docx'], file_map={ '--tweak-book': ['epub', 'azw3', 'mobi'], '--subset-font': ['ttf', 'otf'], '--exec-file': ['py', 'recipe'], '--add-simple-plugin': ['py'], '--inspect-mobi': ['mobi', 'azw', 'azw3'], '--viewer': list(available_input_formats()), }) f.write( textwrap.dedent(''' _ebook_device_ls() { local pattern search listing prefix pattern="$1" search="$1" if [[ -n "{$pattern}" ]]; then if [[ "${pattern:(-1)}" == "/" ]]; then pattern="" else pattern="$(basename ${pattern} 2> /dev/null)" search="$(dirname ${search} 2> /dev/null)" fi fi if [[ "x${search}" == "x" || "x${search}" == "x." ]]; then search="/" fi listing="$(ebook-device ls ${search} 2>/dev/null)" prefix="${search}" if [[ "x${prefix:(-1)}" != "x/" ]]; then prefix="${prefix}/" fi echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") } _ebook_device() { local cur prev cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=() case "${prev}" in ls|rm|mkdir|touch|cat ) COMPREPLY=( $(_ebook_device_ls "${cur}") ) return 0 ;; cp ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else _filedir return 0 fi ;; dev ) COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") ) return 0 ;; * ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else if [[ ${prev} == dev:* ]]; then _filedir return 0 else COMPREPLY=( $(compgen -W "dev:" "${cur}") ) return 0 fi return 0 fi ;; esac } complete -o nospace -F _ebook_device ebook-device complete -o nospace -C %s ebook-convert ''') % complete) zsh.write() except TypeError as err: if 'resolve_entities' in str(err): print 'You need python-lxml >= 2.0.5 for calibre' sys.exit(1) raise except: if self.opts.fatal_errors: raise self.task_failed('Setting up completion failed')
def setup_desktop_integration(self): # {{{ try: self.info('Setting up desktop integration...') env = os.environ.copy() cc = check_call if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env: paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep) paths = [x for x in paths if x] npaths = [x for x in paths if x != sys.frozen_path+'/lib'] env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) cc = partial(check_call, env=env) with TemporaryDirectory() as tdir, CurrentDir(tdir), \ PreserveMIMEDefaults(): render_img('mimetypes/lrf.png', 'calibre-lrf.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True) self.icon_resources.append(('mimetypes', 'application-lrf', '128')) cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell=True) self.icon_resources.append(('mimetypes', 'application-lrs', '128')) render_img('mimetypes/mobi.png', 'calibre-mobi.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-mobi.png application-x-mobipocket-ebook', shell=True) self.icon_resources.append(('mimetypes', 'application-x-mobipocket-ebook', '128')) render_img('mimetypes/tpz.png', 'calibre-tpz.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-tpz.png application-x-topaz-ebook', shell=True) self.icon_resources.append(('mimetypes', 'application-x-topaz-ebook', '128')) render_img('mimetypes/azw2.png', 'calibre-azw2.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw2.png application-x-kindle-application', shell=True) self.icon_resources.append(('mimetypes', 'application-x-kindle-application', '128')) render_img('mimetypes/azw3.png', 'calibre-azw3.png') cc('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-azw3.png application-x-mobi8-ebook', shell=True) self.icon_resources.append(('mimetypes', 'application-x-mobi8-ebook', '128')) render_img('lt.png', 'calibre-gui.png', width=256, height=256) cc('xdg-icon-resource install --noupdate --size 256 calibre-gui.png calibre-gui', shell=True) self.icon_resources.append(('apps', 'calibre-gui', '256')) render_img('viewer.png', 'calibre-viewer.png', width=256, height=256) cc('xdg-icon-resource install --size 256 calibre-viewer.png calibre-viewer', shell=True) self.icon_resources.append(('apps', 'calibre-viewer', '256')) render_img('tweak.png', 'calibre-ebook-edit.png', width=256, height=256) cc('xdg-icon-resource install --size 256 calibre-ebook-edit.png calibre-ebook-edit', shell=True) self.icon_resources.append(('apps', 'calibre-ebook-edit', '256')) mimetypes = set([]) for x in all_input_formats(): mt = guess_type('dummy.'+x)[0] if mt and 'chemical' not in mt and 'ctc-posml' not in mt: mimetypes.add(mt) def write_mimetypes(f): f.write('MimeType=%s;\n'%';'.join(mimetypes)) from calibre.ebooks.oeb.polish.main import SUPPORTED f = open('calibre-lrfviewer.desktop', 'wb') f.write(VIEWER) f.close() f = open('calibre-ebook-viewer.desktop', 'wb') f.write(EVIEWER) write_mimetypes(f) f = open('calibre-ebook-edit.desktop', 'wb') f.write(ETWEAK) mt = [guess_type('a.' + x.lower())[0] for x in SUPPORTED] f.write('MimeType=%s;\n'%';'.join(mt)) f.close() f = open('calibre-gui.desktop', 'wb') f.write(GUI) write_mimetypes(f) f.close() des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop', 'calibre-ebook-viewer.desktop', 'calibre-ebook-edit.desktop') appdata = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'appdata') if not os.path.exists(appdata): try: os.mkdir(appdata) except: self.warning('Failed to create %s not installing appdata files' % appdata) if os.path.exists(appdata) and not os.access(appdata, os.W_OK): self.warning('Do not have write permissions for %s not installing appdata files' % appdata) else: from calibre.utils.localization import get_all_translators translators = dict(get_all_translators()) APPDATA = get_appdata() for x in des: cmd = ['xdg-desktop-menu', 'install', '--noupdate', './'+x] cc(' '.join(cmd), shell=True) self.menu_resources.append(x) ak = x.partition('.')[0] if ak in APPDATA and os.access(appdata, os.W_OK): self.appdata_resources.append(write_appdata(ak, APPDATA[ak], appdata, translators)) cc(['xdg-desktop-menu', 'forceupdate']) MIME = P('calibre-mimetypes.xml') self.mime_resources.append(MIME) cc(['xdg-mime', 'install', MIME]) except Exception: if self.opts.fatal_errors: raise self.task_failed('Setting up desktop integration failed')
def write_completion(bash_comp_dest, zsh): from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop from calibre.gui2.viewer.main import option_parser as viewer_op from calibre.gui2.tweak_book.main import option_parser as tweak_op from calibre.ebooks.metadata.sources.cli import option_parser as fem_op from calibre.gui2.main import option_parser as guiop from calibre.utils.smtp import option_parser as smtp_op from calibre.srv.standalone import create_option_parser as serv_op from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE from calibre.debug import option_parser as debug_op from calibre.ebooks import BOOK_EXTENSIONS from calibre.customize.ui import available_input_formats input_formats = sorted(all_input_formats()) tweak_formats = sorted(x.lower() for x in SUPPORTED|IMPORTABLE) if bash_comp_dest and not os.path.exists(os.path.dirname(bash_comp_dest)): os.makedirs(os.path.dirname(bash_comp_dest)) complete = 'calibre-complete' if getattr(sys, 'frozen_path', None): complete = os.path.join(getattr(sys, 'frozen_path'), complete) with open(bash_comp_dest or os.devnull, 'wb') as f: def o_and_e(*args, **kwargs): f.write(opts_and_exts(*args, **kwargs)) zsh.opts_and_exts(*args, **kwargs) def o_and_w(*args, **kwargs): f.write(opts_and_words(*args, **kwargs)) zsh.opts_and_words(*args, **kwargs) f.write('# calibre Bash Shell Completion\n') o_and_e('calibre', guiop, BOOK_EXTENSIONS) o_and_e('lrf2lrs', lrf2lrsop, ['lrf'], file_map={'--output':['lrs']}) o_and_e('ebook-meta', metaop, list(meta_filetypes()), cover_opts=['--cover', '-c'], opf_opts=['--to-opf', '--from-opf']) o_and_e('ebook-polish', polish_op, [x.lower() for x in SUPPORTED], cover_opts=['--cover', '-c'], opf_opts=['--opf', '-o']) o_and_e('lrfviewer', lrfviewerop, ['lrf']) o_and_e('ebook-viewer', viewer_op, input_formats) o_and_e('ebook-edit', tweak_op, tweak_formats) o_and_w('fetch-ebook-metadata', fem_op, []) o_and_w('calibre-smtp', smtp_op, []) o_and_w('calibre-server', serv_op, []) o_and_e('calibre-debug', debug_op, ['py', 'recipe', 'mobi', 'azw', 'azw3', 'docx'], file_map={ '--tweak-book':['epub', 'azw3', 'mobi'], '--subset-font':['ttf', 'otf'], '--exec-file':['py', 'recipe'], '--add-simple-plugin':['py'], '--inspect-mobi':['mobi', 'azw', 'azw3'], '--viewer':sorted(available_input_formats()), }) f.write(textwrap.dedent(''' _ebook_device_ls() { local pattern search listing prefix pattern="$1" search="$1" if [[ -n "{$pattern}" ]]; then if [[ "${pattern:(-1)}" == "/" ]]; then pattern="" else pattern="$(basename ${pattern} 2> /dev/null)" search="$(dirname ${search} 2> /dev/null)" fi fi if [[ "x${search}" == "x" || "x${search}" == "x." ]]; then search="/" fi listing="$(ebook-device ls ${search} 2>/dev/null)" prefix="${search}" if [[ "x${prefix:(-1)}" != "x/" ]]; then prefix="${prefix}/" fi echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") } _ebook_device() { local cur prev cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=() case "${prev}" in ls|rm|mkdir|touch|cat ) COMPREPLY=( $(_ebook_device_ls "${cur}") ) return 0 ;; cp ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else _filedir return 0 fi ;; dev ) COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") ) return 0 ;; * ) if [[ ${cur} == dev:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else if [[ ${prev} == dev:* ]]; then _filedir return 0 else COMPREPLY=( $(compgen -W "dev:" "${cur}") ) return 0 fi return 0 fi ;; esac } complete -o nospace -F _ebook_device ebook-device complete -o nospace -C %s ebook-convert ''')%complete) zsh.write()
def setup_desktop_integration(self): # {{{ try: self.info('Setting up desktop integration...') env = os.environ.copy() cc = check_call if getattr(sys, 'frozen_path', False) and 'LD_LIBRARY_PATH' in env: paths = env.get('LD_LIBRARY_PATH', '').split(os.pathsep) paths = [x for x in paths if x] npaths = [x for x in paths if x != sys.frozen_path + '/lib'] env['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) cc = partial(check_call, env=env) with TemporaryDirectory() as tdir, CurrentDir( tdir), PreserveMIMEDefaults(): def install_single_icon(iconsrc, basename, size, context, is_last_icon=False): filename = '%s-%s.png' % (basename, size) render_img(iconsrc, filename, width=int(size), height=int(size)) cmd = [ 'xdg-icon-resource', 'install', '--noupdate', '--context', context, '--size', str(size), filename, basename ] if is_last_icon: del cmd[2] cc(cmd) self.icon_resources.append((context, basename, str(size))) def install_icons(iconsrc, basename, context, is_last_icon=False): sizes = (16, 32, 48, 64, 128, 256) for size in sizes: install_single_icon(iconsrc, basename, size, context, is_last_icon and size is sizes[-1]) icons = list( filter(None, [ x.strip() for x in '''\ mimetypes/lrf.png application-lrf mimetypes mimetypes/lrf.png text-lrs mimetypes mimetypes/mobi.png application-x-mobipocket-ebook mimetypes mimetypes/tpz.png application-x-topaz-ebook mimetypes mimetypes/azw2.png application-x-kindle-application mimetypes mimetypes/azw3.png application-x-mobi8-ebook mimetypes lt.png calibre-gui apps viewer.png calibre-viewer apps tweak.png calibre-ebook-edit apps '''.splitlines() ])) for line in icons: iconsrc, basename, context = line.split() install_icons(iconsrc, basename, context, is_last_icon=line is icons[-1]) mimetypes = set() for x in all_input_formats(): mt = guess_type('dummy.' + x)[0] if mt and 'chemical' not in mt and 'ctc-posml' not in mt: mimetypes.add(mt) mimetypes.discard('application/octet-stream') def write_mimetypes(f): polyglot_write(f)('MimeType=%s;\n' % ';'.join(mimetypes)) from calibre.ebooks.oeb.polish.main import SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE with open('calibre-lrfviewer.desktop', 'wb') as f: polyglot_write(f)(VIEWER) with open('calibre-ebook-viewer.desktop', 'wb') as f: polyglot_write(f)(EVIEWER) write_mimetypes(f) with open('calibre-ebook-edit.desktop', 'wb') as f: polyglot_write(f)(ETWEAK) mt = { guess_type('a.' + x.lower())[0] for x in (SUPPORTED | IMPORTABLE) } - {None, 'application/octet-stream'} polyglot_write(f)('MimeType=%s;\n' % ';'.join(mt)) with open('calibre-gui.desktop', 'wb') as f: polyglot_write(f)(GUI) write_mimetypes(f) des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop', 'calibre-ebook-viewer.desktop', 'calibre-ebook-edit.desktop') appdata = os.path.join( os.path.dirname(self.opts.staging_sharedir), 'metainfo') if not os.path.exists(appdata): try: os.mkdir(appdata) except: self.warning( 'Failed to create %s not installing appdata files' % appdata) if os.path.exists(appdata) and not os.access(appdata, os.W_OK): self.warning( 'Do not have write permissions for %s not installing appdata files' % appdata) else: from calibre.utils.localization import get_all_translators translators = dict(get_all_translators()) APPDATA = get_appdata() for x in des: cmd = [ 'xdg-desktop-menu', 'install', '--noupdate', './' + x ] cc(' '.join(cmd), shell=True) self.menu_resources.append(x) ak = x.partition('.')[0] if ak in APPDATA and os.access(appdata, os.W_OK): self.appdata_resources.append( write_appdata(ak, APPDATA[ak], appdata, translators)) cc(['xdg-desktop-menu', 'forceupdate']) MIME = P('calibre-mimetypes.xml') self.mime_resources.append(MIME) cc(['xdg-mime', 'install', MIME]) except Exception: if self.opts.fatal_errors: raise self.task_failed('Setting up desktop integration failed')
def setup_completion(self): # {{{ try: self.info('Setting up bash completion...') from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop from calibre.gui2.viewer.main import option_parser as viewer_op from calibre.ebooks.metadata.sources.cli import option_parser as fem_op from calibre.gui2.main import option_parser as guiop from calibre.utils.smtp import option_parser as smtp_op from calibre.library.server.main import option_parser as serv_op from calibre.ebooks.epub.fix.main import option_parser as fix_op from calibre.ebooks import BOOK_EXTENSIONS input_formats = sorted(all_input_formats()) bc = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'bash-completion') if os.path.exists(bc): f = os.path.join(bc, 'calibre') else: if isnetbsd: f = os.path.join(self.opts.staging_root, 'share/bash_completion.d/calibre') else: f = os.path.join(self.opts.staging_etc, 'bash_completion.d/calibre') if not os.path.exists(os.path.dirname(f)): os.makedirs(os.path.dirname(f)) self.manifest.append(f) complete = 'calibre-complete' if getattr(sys, 'frozen_path', None): complete = os.path.join(getattr(sys, 'frozen_path'), complete) self.info('Installing bash completion to', f) with open(f, 'wb') as f: f.write('# calibre Bash Shell Completion\n') f.write(opts_and_exts('calibre', guiop, BOOK_EXTENSIONS)) f.write(opts_and_exts('lrf2lrs', lrf2lrsop, ['lrf'])) f.write(opts_and_exts('ebook-meta', metaop, list(meta_filetypes()))) f.write(opts_and_exts('lrfviewer', lrfviewerop, ['lrf'])) f.write(opts_and_exts('ebook-viewer', viewer_op, input_formats)) f.write(opts_and_words('fetch-ebook-metadata', fem_op, [])) f.write(opts_and_words('calibre-smtp', smtp_op, [])) f.write(opts_and_words('calibre-server', serv_op, [])) f.write(opts_and_exts('epub-fix', fix_op, ['epub'])) f.write(textwrap.dedent(''' _ebook_device_ls() { local pattern search listing prefix pattern="$1" search="$1" if [[ -n "{$pattern}" ]]; then if [[ "${pattern:(-1)}" == "/" ]]; then pattern="" else pattern="$(basename ${pattern} 2> /dev/null)" search="$(dirname ${search} 2> /dev/null)" fi fi if [[ "x${search}" == "x" || "x${search}" == "x." ]]; then search="/" fi listing="$(ebook-device ls ${search} 2>/dev/null)" prefix="${search}" if [[ "x${prefix:(-1)}" != "x/" ]]; then prefix="${prefix}/" fi echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}") } _ebook_device() { local cur prev cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=() case "${prev}" in ls|rm|mkdir|touch|cat ) COMPREPLY=( $(_ebook_device_ls "${cur}") ) return 0 ;; cp ) if [[ ${cur} == prs500:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else _filedir return 0 fi ;; prs500 ) COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") ) return 0 ;; * ) if [[ ${cur} == prs500:* ]]; then COMPREPLY=( $(_ebook_device_ls "${cur:7}") ) return 0 else if [[ ${prev} == prs500:* ]]; then _filedir return 0 else COMPREPLY=( $(compgen -W "prs500:" "${cur}") ) return 0 fi return 0 fi ;; esac } complete -o nospace -F _ebook_device ebook-device complete -o nospace -C %s ebook-convert ''')%complete) except TypeError as err: if 'resolve_entities' in str(err): print 'You need python-lxml >= 2.0.5 for calibre' sys.exit(1) raise except: if self.opts.fatal_errors: raise self.task_failed('Setting up completion failed')