'A string representation of this object, suitable for printing to
console'

def __unicode__(self):

    from calibre.utils.date import isoformat
    from calibre.ebooks.metadata import authors_to_string
    ans = []
    def fmt(x, y):
        ans.append((u'%-20s:    %s' % (unicode(x), unicode(y))))
    fmt('Title', self.title)
    if self.title_sort:
        fmt('Title    sort', self.title_sort)
    if self.authors:
        fmt('Author(s)', (authors_to_string(self.authors) + ((('    [' + self.author_sort) + ']') if (self.author_sort and (self.author_sort != _('Unknown'))) else '')))
    if self.publisher:
        fmt('Publisher', self.publisher)
    if getattr(self, 'book_producer', False):
        fmt('Book    Producer', self.book_producer)
    if self.tags:
        fmt('Tags', u',    '.join([unicode(t) for t in self.tags]))
    if self.series:
        fmt('Series', (self.series + ('    #%s' % self.format_series_index())))
    if (not self.is_null('languages')):
        fmt('Languages', ',    '.join(self.languages))
    if (self.rating is not None):
        fmt('Rating', ((u'%.2g' % (float(self.rating) / 2.0)) if self.rating else u''))
    if (self.timestamp is not None):
        fmt('Timestamp', isoformat(self.timestamp))
    if (self.pubdate is not None):
        fmt('Published', isoformat(self.pubdate))
    if (self.rights is not None):
        fmt('Rights', unicode(self.rights))
    if self.identifiers:
        fmt('Identifiers', u',    '.join([('%s:%s' % (k, v)) for (k, v) in self.identifiers.iteritems()]))
    if self.comments:
        fmt('Comments', self.comments)
    for key in self.custom_field_keys():
        val = self.get(key, None)
        if val:
            (name, val) = self.format_field(key)
            fmt(name, unicode(val))
    return u'\n'.join(ans)
