mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Remove --output-format from calibredb list as it is superseded by calibredb catalog
This commit is contained in:
parent
c96e77fe4c
commit
82d3945702
@ -9,99 +9,18 @@ Command line interface to the calibre database.
|
|||||||
|
|
||||||
import sys, os, cStringIO
|
import sys, os, cStringIO
|
||||||
from textwrap import TextWrapper
|
from textwrap import TextWrapper
|
||||||
from urllib import quote
|
|
||||||
|
|
||||||
from calibre import terminal_controller, preferred_encoding, prints
|
from calibre import terminal_controller, preferred_encoding, prints
|
||||||
from calibre.utils.config import OptionParser, prefs
|
from calibre.utils.config import OptionParser, prefs
|
||||||
from calibre.ebooks.metadata.meta import get_metadata
|
from calibre.ebooks.metadata.meta import get_metadata
|
||||||
from calibre.library.database2 import LibraryDatabase2
|
from calibre.library.database2 import LibraryDatabase2
|
||||||
from calibre.ebooks.metadata.opf2 import OPFCreator, OPF
|
from calibre.ebooks.metadata.opf2 import OPFCreator, OPF
|
||||||
from calibre.utils.genshi.template import MarkupTemplate
|
|
||||||
from calibre.utils.date import isoformat
|
from calibre.utils.date import isoformat
|
||||||
|
|
||||||
FIELDS = set(['title', 'authors', 'author_sort', 'publisher', 'rating',
|
FIELDS = set(['title', 'authors', 'author_sort', 'publisher', 'rating',
|
||||||
'timestamp', 'size', 'tags', 'comments', 'series', 'series_index',
|
'timestamp', 'size', 'tags', 'comments', 'series', 'series_index',
|
||||||
'formats', 'isbn', 'uuid', 'pubdate', 'cover'])
|
'formats', 'isbn', 'uuid', 'pubdate', 'cover'])
|
||||||
|
|
||||||
XML_TEMPLATE = '''\
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<calibredb xmlns:py="http://genshi.edgewall.org/">
|
|
||||||
<py:for each="record in data">
|
|
||||||
<record>
|
|
||||||
<id>${record['id']}</id>
|
|
||||||
<uuid>${record['uuid']}</uuid>
|
|
||||||
<title>${record['title']}</title>
|
|
||||||
<authors sort="${record['author_sort']}">
|
|
||||||
<py:for each="author in record['authors']">
|
|
||||||
<author>$author</author>
|
|
||||||
</py:for>
|
|
||||||
</authors>
|
|
||||||
<publisher>${record['publisher']}</publisher>
|
|
||||||
<rating>${record['rating']}</rating>
|
|
||||||
<date>${record['timestamp'].isoformat()}</date>
|
|
||||||
<pubdate>${record['pubdate'].isoformat()}</pubdate>
|
|
||||||
<size>${record['size']}</size>
|
|
||||||
<tags py:if="record['tags']">
|
|
||||||
<py:for each="tag in record['tags']">
|
|
||||||
<tag>$tag</tag>
|
|
||||||
</py:for>
|
|
||||||
</tags>
|
|
||||||
<comments>${record['comments']}</comments>
|
|
||||||
<series py:if="record['series']" index="${record['series_index']}">${record['series']}</series>
|
|
||||||
<isbn>${record['isbn']}</isbn>
|
|
||||||
<cover py:if="record['cover']">${record['cover'].replace(os.sep, '/')}</cover>
|
|
||||||
<formats py:if="record['formats']">
|
|
||||||
<py:for each="path in record['formats']">
|
|
||||||
<format>${path.replace(os.sep, '/')}</format>
|
|
||||||
</py:for>
|
|
||||||
</formats>
|
|
||||||
</record>
|
|
||||||
</py:for>
|
|
||||||
</calibredb>
|
|
||||||
'''
|
|
||||||
|
|
||||||
STANZA_TEMPLATE='''\
|
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:py="http://genshi.edgewall.org/">
|
|
||||||
<title>calibre Library</title>
|
|
||||||
<author>
|
|
||||||
<name>calibre</name>
|
|
||||||
<uri>http://calibre-ebook.com</uri>
|
|
||||||
</author>
|
|
||||||
<id>$id</id>
|
|
||||||
<updated>${updated.isoformat()}</updated>
|
|
||||||
<subtitle>
|
|
||||||
${subtitle}
|
|
||||||
</subtitle>
|
|
||||||
<py:for each="record in data">
|
|
||||||
<entry>
|
|
||||||
<title>${record['title']}</title>
|
|
||||||
<id>urn:calibre:${record['uuid']}</id>
|
|
||||||
<author><name>${record['author_sort']}</name></author>
|
|
||||||
<updated>${record['timestamp'].isoformat()}</updated>
|
|
||||||
<link type="application/epub+zip" href="${quote(record['fmt_epub'].replace(sep, '/'))}"/>
|
|
||||||
<link py:if="record['cover']" rel="x-stanza-cover-image" type="image/png" href="${quote(record['cover'].replace(sep, '/'))}"/>
|
|
||||||
<link py:if="record['cover']" rel="x-stanza-cover-image-thumbnail" type="image/png" href="${quote(record['cover'].replace(sep, '/'))}"/>
|
|
||||||
<content type="xhtml">
|
|
||||||
<div xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<py:for each="f in ('authors', 'publisher', 'rating', 'tags', 'series', 'isbn')">
|
|
||||||
<py:if test="record[f]">
|
|
||||||
${f.capitalize()}:${unicode(', '.join(record[f]) if f=='tags' else record[f])}
|
|
||||||
<py:if test="f =='series'"># ${str(record['series_index'])}</py:if>
|
|
||||||
<br/>
|
|
||||||
</py:if>
|
|
||||||
</py:for>
|
|
||||||
<py:if test="record['comments']">
|
|
||||||
<br/>
|
|
||||||
${record['comments']}
|
|
||||||
</py:if>
|
|
||||||
</div>
|
|
||||||
</content>
|
|
||||||
</entry>
|
|
||||||
</py:for>
|
|
||||||
</feed>
|
|
||||||
'''
|
|
||||||
|
|
||||||
def send_message(msg=''):
|
def send_message(msg=''):
|
||||||
prints('Notifying calibre of the change')
|
prints('Notifying calibre of the change')
|
||||||
from calibre.utils.ipc import RC
|
from calibre.utils.ipc import RC
|
||||||
@ -130,18 +49,17 @@ def get_db(dbpath, options):
|
|||||||
return LibraryDatabase2(dbpath)
|
return LibraryDatabase2(dbpath)
|
||||||
|
|
||||||
def do_list(db, fields, afields, sort_by, ascending, search_text, line_width, separator,
|
def do_list(db, fields, afields, sort_by, ascending, search_text, line_width, separator,
|
||||||
prefix, output_format, subtitle='Books in the calibre database'):
|
prefix, subtitle='Books in the calibre database'):
|
||||||
if sort_by:
|
if sort_by:
|
||||||
db.sort(sort_by, ascending)
|
db.sort(sort_by, ascending)
|
||||||
if search_text:
|
if search_text:
|
||||||
db.search(search_text)
|
db.search(search_text)
|
||||||
authors_to_string = output_format in ['stanza', 'text']
|
data = db.get_data_as_dict(prefix, authors_as_string=True)
|
||||||
data = db.get_data_as_dict(prefix, authors_as_string=authors_to_string)
|
|
||||||
fields = ['id'] + fields
|
fields = ['id'] + fields
|
||||||
title_fields = fields
|
title_fields = fields
|
||||||
fields = [db.custom_column_label_map[x[1:]]['num'] if x[0]=='*'
|
fields = [db.custom_column_label_map[x[1:]]['num'] if x[0]=='*'
|
||||||
else x for x in fields]
|
else x for x in fields]
|
||||||
if output_format == 'text':
|
|
||||||
for f in data:
|
for f in data:
|
||||||
fmts = [x for x in f['formats'] if x is not None]
|
fmts = [x for x in f['formats'] if x is not None]
|
||||||
f['formats'] = u'[%s]'%u','.join(fmts)
|
f['formats'] = u'[%s]'%u','.join(fmts)
|
||||||
@ -192,19 +110,6 @@ def do_list(db, fields, afields, sort_by, ascending, search_text, line_width, se
|
|||||||
o.write(filler+separator)
|
o.write(filler+separator)
|
||||||
print >>o
|
print >>o
|
||||||
return o.getvalue()
|
return o.getvalue()
|
||||||
elif output_format == 'xml':
|
|
||||||
template = MarkupTemplate(XML_TEMPLATE)
|
|
||||||
return template.generate(data=data, os=os).render('xml')
|
|
||||||
elif output_format == 'stanza':
|
|
||||||
data = [i for i in data if i.has_key('fmt_epub')]
|
|
||||||
for x in data:
|
|
||||||
if isinstance(x['fmt_epub'], unicode):
|
|
||||||
x['fmt_epub'] = x['fmt_epub'].encode('utf-8')
|
|
||||||
if isinstance(x['cover'], unicode):
|
|
||||||
x['cover'] = x['cover'].encode('utf-8')
|
|
||||||
template = MarkupTemplate(STANZA_TEMPLATE)
|
|
||||||
return template.generate(id="urn:calibre:main", data=data, subtitle=subtitle,
|
|
||||||
sep=os.sep, quote=quote, updated=db.last_modified()).render('xml')
|
|
||||||
|
|
||||||
def list_option_parser(db=None):
|
def list_option_parser(db=None):
|
||||||
fields = set(FIELDS)
|
fields = set(FIELDS)
|
||||||
@ -236,9 +141,6 @@ List the books available in the calibre database.
|
|||||||
help=_('The maximum width of a single line in the output. Defaults to detecting screen size.'))
|
help=_('The maximum width of a single line in the output. Defaults to detecting screen size.'))
|
||||||
parser.add_option('--separator', default=' ', help=_('The string used to separate fields. Default is a space.'))
|
parser.add_option('--separator', default=' ', help=_('The string used to separate fields. Default is a space.'))
|
||||||
parser.add_option('--prefix', default=None, help=_('The prefix for all file paths. Default is the absolute path to the library folder.'))
|
parser.add_option('--prefix', default=None, help=_('The prefix for all file paths. Default is the absolute path to the library folder.'))
|
||||||
of = ['text', 'xml', 'stanza']
|
|
||||||
parser.add_option('--output-format', choices=of, default='text',
|
|
||||||
help=_('The format in which to output the data. Available choices: %s. Defaults is text.')%of)
|
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
|
||||||
@ -272,7 +174,7 @@ def command_list(args, dbpath):
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
print do_list(db, fields, afields, opts.sort_by, opts.ascending, opts.search, opts.line_width, opts.separator,
|
print do_list(db, fields, afields, opts.sort_by, opts.ascending, opts.search, opts.line_width, opts.separator,
|
||||||
opts.prefix, opts.output_format)
|
opts.prefix)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user