From 12266a4397d9e344b7f95a19edc4a8df7cd5f9f0 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Fri, 4 Mar 2011 09:50:19 +0100 Subject: [PATCH] vendor packagers rewrite --- librarian/cover.py | 15 ++- librarian/packagers.py | 144 +++++++++++++++++++++++++++ librarian/res/cover-gandalf.png | Bin 0 -> 13175 bytes librarian/res/wl-logo.png | Bin 33773 -> 34275 bytes scripts/book2partner | 167 ++------------------------------ 5 files changed, 166 insertions(+), 160 deletions(-) create mode 100644 librarian/packagers.py create mode 100644 librarian/res/cover-gandalf.png diff --git a/librarian/cover.py b/librarian/cover.py index 27f7a70..9070344 100644 --- a/librarian/cover.py +++ b/librarian/cover.py @@ -124,8 +124,8 @@ class VirtualoCover(Cover): height = 730 author_top = 73 title_top = 73 - logo_bottom = 0 - logo_width = 300 + logo_bottom = 25 + logo_width = 250 class PrestigioCover(Cover): @@ -173,3 +173,14 @@ class BookotekaCover(Cover): title_font = ImageFont.truetype(get_resource('fonts/JunicodeWL-Regular.ttf'), 140) format = 'PNG' + + +class GandalfCover(Cover): + width = 600 + height = 730 + background_img = get_resource('res/cover-gandalf.png') + author_font = ImageFont.truetype(get_resource('fonts/JunicodeWL-Regular.ttf'), 30) + title_font = ImageFont.truetype(get_resource('fonts/JunicodeWL-Regular.ttf'), 40) + logo_bottom = 25 + logo_width = 250 + format = 'PNG' diff --git a/librarian/packagers.py b/librarian/packagers.py new file mode 100644 index 0000000..285a15f --- /dev/null +++ b/librarian/packagers.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Librarian, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +import os +from copy import deepcopy +from lxml import etree +from librarian import epub, pdf, DirDocProvider, ParseError, cover +from librarian.dcparser import BookInfo + + +class Packager(object): + cover = None + flags = None + + @classmethod + def prepare_file(cls, main_input, output_dir, verbose=False): + path, fname = os.path.realpath(main_input).rsplit('/', 1) + provider = DirDocProvider(path) + slug, ext = os.path.splitext(fname) + + if output_dir != '': + try: + os.makedirs(output_dir) + except: + pass + outfile = os.path.join(output_dir, slug + '.' + cls.ext) + cls.converter.transform(provider, file_path=main_input, output_file=outfile, + cover=cls.cover, flags=cls.flags) + + + @classmethod + def prepare(cls, input_filenames, output_dir='', verbose=False): + try: + for main_input in input_filenames: + if verbose: + print main_input + cls.prepare_file(main_input, output_dir, verbose) + except ParseError, e: + print '%(file)s:%(name)s:%(message)s' % { + 'file': main_input, + 'name': e.__class__.__name__, + 'message': e.message + } + + +class EpubPackager(Packager): + converter = epub + ext = 'epub' + +class PdfPackager(Packager): + converter = pdf + ext = 'pdf' + + +class GandalfEpubPackager(EpubPackager): + cover = cover.GandalfCover + +class BookotekaEpubPackager(EpubPackager): + cover = cover.BookotekaCover + +class PrestigioEpubPackager(EpubPackager): + cover = cover.PrestigioCover + flags = ('less-advertising',) + +class PrestigioPdfPackager(PdfPackager): + cover = cover.PrestigioCover + flags = ('less-advertising',) + + +class VirtualoEpubPackager(Packager): + @staticmethod + def utf_trunc(text, limit): + """ truncates text to at most `limit' bytes in utf-8 """ + if text is None: + return text + orig_text = text + if len(text.encode('utf-8')) > limit: + newlimit = limit - 3 + while len(text.encode('utf-8')) > newlimit: + text = text[:(newlimit - len(text.encode('utf-8'))) / 4] + text += '...' + return text + + @classmethod + def prepare(cls, input_filenames, output_dir='', verbose=False): + xml = etree.fromstring(""" + """) + product = etree.fromstring(""" + + + + + + + Jan + Kowalski + + + 0.0 + PL + """) + + try: + for main_input in input_filenames: + if verbose: + print main_input + path, fname = os.path.realpath(main_input).rsplit('/', 1) + provider = DirDocProvider(path) + slug, ext = os.path.splitext(fname) + + outfile_dir = os.path.join(output_dir, slug) + os.makedirs(os.path.join(output_dir, slug)) + + info = BookInfo.from_file(main_input) + + product_elem = deepcopy(product) + product_elem[0].text = cls.utf_trunc(slug, 100) + product_elem[1].text = cls.utf_trunc(info.title, 255) + product_elem[2].text = cls.utf_trunc(info.description, 255) + product_elem[3].text = cls.utf_trunc(info.source_name, 3000) + product_elem[4][0][0].text = cls.utf_trunc(u' '.join(info.author.first_names), 100) + product_elem[4][0][1].text = cls.utf_trunc(info.author.last_name, 100) + xml.append(product_elem) + + cover.VirtualoCover( + u' '.join(info.author.first_names + (info.author.last_name,)), + info.title + ).save(os.path.join(outfile_dir, slug+'.jpg')) + outfile = os.path.join(outfile_dir, '1.epub') + outfile_sample = os.path.join(outfile_dir, '1.sample.epub') + epub.transform(provider, file_path=main_input, output_file=outfile) + epub.transform(provider, file_path=main_input, output_file=outfile_sample, sample=25) + except ParseError, e: + print '%(file)s:%(name)s:%(message)s' % { + 'file': main_input, + 'name': e.__class__.__name__, + 'message': e.message + } + + xml_file = open(os.path.join(output_dir, 'import_products.xml'), 'w') + xml_file.write(etree.tostring(xml, pretty_print=True, encoding=unicode).encode('utf-8')) + xml_file.close() diff --git a/librarian/res/cover-gandalf.png b/librarian/res/cover-gandalf.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1513296a97a1045821d42831219fa8ff16f990 GIT binary patch literal 13175 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 literal 0 HcmV?d00001 diff --git a/librarian/res/wl-logo.png b/librarian/res/wl-logo.png index 03b46b5fd6ab6ddd869a20b7c7005f8f342c2b88..1194a1c2809fc85ae623674cc4fd81f48589411d 100644 GIT binary patch literal 34275 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 literal 33773 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 J5P$mW{{R6qS7`tM diff --git a/scripts/book2partner b/scripts/book2partner index 136fffc..b121333 100755 --- a/scripts/book2partner +++ b/scripts/book2partner @@ -4,162 +4,9 @@ # This file is part of Librarian, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # -import os.path import optparse -from copy import deepcopy -from lxml import etree - -from librarian import epub, pdf, DirDocProvider, ParseError, cover -from librarian.dcparser import BookInfo - - -def utf_trunc(text, limit): - """ truncates text to at most `limit' bytes in utf-8 """ - if text is None: - return text - orig_text = text - if len(text.encode('utf-8')) > limit: - newlimit = limit - 3 - while len(text.encode('utf-8')) > newlimit: - text = text[:(newlimit - len(text.encode('utf-8'))) / 4] - text += '...' - return text - - -def virtualo(filenames, output_dir, verbose): - xml = etree.fromstring(""" - """) - product = etree.fromstring(""" - - - - - - - Jan - Kowalski - - - 0.0 - PL - """) - - try: - for main_input in input_filenames: - if options.verbose: - print main_input - path, fname = os.path.realpath(main_input).rsplit('/', 1) - provider = DirDocProvider(path) - slug, ext = os.path.splitext(fname) - - outfile_dir = os.path.join(output_dir, slug) - os.makedirs(os.path.join(output_dir, slug)) - - info = BookInfo.from_file(main_input) - - product_elem = deepcopy(product) - product_elem[0].text = utf_trunc(slug, 100) - product_elem[1].text = utf_trunc(info.title, 255) - product_elem[2].text = utf_trunc(info.description, 255) - product_elem[3].text = utf_trunc(info.source_name, 3000) - product_elem[4][0][0].text = utf_trunc(u' '.join(info.author.first_names), 100) - product_elem[4][0][1].text = utf_trunc(info.author.last_name, 100) - xml.append(product_elem) - - cover.VirtualoCover( - u' '.join(info.author.first_names + (info.author.last_name,)), - info.title - ).save(os.path.join(outfile_dir, slug+'.jpg')) - outfile = os.path.join(outfile_dir, '1.epub') - outfile_sample = os.path.join(outfile_dir, '1.sample.epub') - epub.transform(provider, file_path=main_input, output_file=outfile) - epub.transform(provider, file_path=main_input, output_file=outfile_sample, sample=25) - except ParseError, e: - print '%(file)s:%(name)s:%(message)s' % { - 'file': main_input, - 'name': e.__class__.__name__, - 'message': e.message - } - - xml_file = open(os.path.join(output_dir, 'import_products.xml'), 'w') - xml_file.write(etree.tostring(xml, pretty_print=True, encoding=unicode).encode('utf-8')) - xml_file.close() - - -def prestigio(filenames, output_dir, verbose): - try: - for main_input in input_filenames: - if options.verbose: - print main_input - path, fname = os.path.realpath(main_input).rsplit('/', 1) - provider = DirDocProvider(path) - slug, ext = os.path.splitext(fname) - - if output_dir != '': - try: - os.makedirs(output_dir) - except: - pass - outfile = os.path.join(output_dir, slug + '.epub') - epub.transform(provider, file_path=main_input, output_file=outfile, - cover=cover.PrestigioCover, flags=('less-advertising',)) - except ParseError, e: - print '%(file)s:%(name)s:%(message)s' % { - 'file': main_input, - 'name': e.__class__.__name__, - 'message': e.message - } - - -def prestigio_pdf(filenames, output_dir, verbose): - try: - for main_input in input_filenames: - if options.verbose: - print main_input - path, fname = os.path.realpath(main_input).rsplit('/', 1) - provider = DirDocProvider(path) - slug, ext = os.path.splitext(fname) - - if output_dir != '': - try: - os.makedirs(output_dir) - except: - pass - outfile = os.path.join(output_dir, slug + '.pdf') - pdf.transform(provider, file_path=main_input, output_file=outfile, - cover=cover.PrestigioCover, verbose=options.verbose, flags=('less-advertising',)) - except ParseError, e: - print '%(file)s:%(name)s:%(message)s' % { - 'file': main_input, - 'name': e.__class__.__name__, - 'message': e.message - } - - -def bookoteka(filenames, output_dir, verbose): - try: - for main_input in input_filenames: - if options.verbose: - print main_input - path, fname = os.path.realpath(main_input).rsplit('/', 1) - provider = DirDocProvider(path) - slug, ext = os.path.splitext(fname) - - if output_dir != '': - try: - os.makedirs(output_dir) - except: - pass - outfile = os.path.join(output_dir, slug + '.epub') - epub.transform(provider, file_path=main_input, output_file=outfile, - cover=cover.BookotekaCover) - except ParseError, e: - print '%(file)s:%(name)s:%(message)s' % { - 'file': main_input, - 'name': e.__class__.__name__, - 'message': e.message - } +from librarian import packagers if __name__ == '__main__': @@ -175,6 +22,8 @@ if __name__ == '__main__': help='specifies the directory for output') parser.add_option('--bookoteka', action='store_true', dest='bookoteka', default=False, help='prepare files for Bookoteka') + parser.add_option('--gandalf', action='store_true', dest='gandalf', default=False, + help='prepare files for Gandalf') parser.add_option('--virtualo', action='store_true', dest='virtualo', default=False, help='prepare files for Virtualo API') parser.add_option('--prestigio', action='store_true', dest='prestigio', default=False, @@ -189,10 +38,12 @@ if __name__ == '__main__': exit(1) if options.bookoteka: - bookoteka(input_filenames, options.output_dir, options.verbose) + packagers.BookotekaEpubPackager.prepare(input_filenames, options.output_dir, options.verbose) + if options.gandalf: + packagers.GandalfEpubPackager.prepare(input_filenames, options.output_dir, options.verbose) if options.virtualo: - virtualo(input_filenames, options.output_dir, options.verbose) + packagers.VirtualoEpubPackager.prepare(input_filenames, options.output_dir, options.verbose) if options.prestigio: - prestigio(input_filenames, options.output_dir, options.verbose) + packagers.PrestigioEpubPackager.prepare(input_filenames, options.output_dir, options.verbose) if options.prestigio_pdf: - prestigio_pdf(input_filenames, options.output_dir, options.verbose) + packagers.PrestigioPdfPackager.prepare(input_filenames, options.output_dir, options.verbose) -- 2.20.1