1 # -*- coding: utf-8 -*-
 
   3 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
 
   4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 
   8 Classes for packaging ebooks for some old partners.
 
   9 These should be removed from librarian to separate package,
 
  10 along with custom cover images etc.
 
  12 New partners shouldn't be added here, but in the partners repository.
 
  15 from librarian import packagers, cover
 
  16 from wolnelektury.utils import makedirs
 
  19 class GandalfEpub(packagers.EpubPackager):
 
  20     cover = cover.GandalfCover
 
  23 class GandalfPdf(packagers.PdfPackager):
 
  24     cover = cover.GandalfCover
 
  27 class BookotekaEpub(packagers.EpubPackager):
 
  28     cover = cover.BookotekaCover
 
  31 class PrestigioEpub(packagers.EpubPackager):
 
  32     cover = cover.PrestigioCover
 
  33     flags = ('less-advertising',)
 
  36 class PrestigioPdf(packagers.PdfPackager):
 
  37     cover = cover.PrestigioCover
 
  38     flags = ('less-advertising',)
 
  41 class Virtualo(packagers.Packager):
 
  43     def utf_trunc(text, limit):
 
  44         """ truncates text to at most `limit' bytes in utf-8 """
 
  47         if len(text.encode('utf-8')) > limit:
 
  49             while len(text.encode('utf-8')) > newlimit:
 
  50                 text = text[:(newlimit - len(text.encode('utf-8'))) / 4]
 
  55     def prepare(cls, input_filenames, output_dir='', verbose=False):
 
  56         from lxml import etree
 
  57         from librarian import DirDocProvider, ParseError
 
  58         from librarian.parser import WLDocument
 
  59         from copy import deepcopy
 
  62         xml = etree.fromstring("""<?xml version="1.0" encoding="utf-8"?>
 
  63             <products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></products>""")
 
  64         product = etree.fromstring("""<product>
 
  65                 <publisherProductId></publisherProductId>
 
  68                 <description></description>
 
  72                         <lastName>Kowalski</lastName>
 
  76                 <language>PL</language>
 
  80             for main_input in input_filenames:
 
  83                 path, fname = os.path.realpath(main_input).rsplit('/', 1)
 
  84                 provider = DirDocProvider(path)
 
  85                 slug, ext = os.path.splitext(fname)
 
  87                 outfile_dir = os.path.join(output_dir, slug)
 
  88                 makedirs(os.path.join(output_dir, slug))
 
  90                 doc = WLDocument.from_file(main_input, provider=provider)
 
  93                 product_elem = deepcopy(product)
 
  94                 product_elem[0].text = cls.utf_trunc(slug, 100)
 
  95                 product_elem[1].text = cls.utf_trunc(info.title, 255)
 
  96                 product_elem[2].text = cls.utf_trunc(info.description, 255)
 
  97                 product_elem[3].text = cls.utf_trunc(info.source_name, 3000)
 
  98                 product_elem[4][0][0].text = cls.utf_trunc(u' '.join(info.author.first_names), 100)
 
  99                 product_elem[4][0][1].text = cls.utf_trunc(info.author.last_name, 100)
 
 100                 xml.append(product_elem)
 
 102                 cover.VirtualoCover(info).save(os.path.join(outfile_dir, slug+'.jpg'))
 
 103                 outfile = os.path.join(outfile_dir, '1.epub')
 
 104                 outfile_sample = os.path.join(outfile_dir, '1.sample.epub')
 
 105                 doc.save_output_file(doc.as_epub(), output_path=outfile)
 
 106                 doc.save_output_file(doc.as_epub(doc, sample=25), output_path=outfile_sample)
 
 107                 outfile = os.path.join(outfile_dir, '1.mobi')
 
 108                 outfile_sample = os.path.join(outfile_dir, '1.sample.mobi')
 
 109                 doc.save_output_file(doc.as_mobi(cover=cover.VirtualoCover), output_path=outfile)
 
 110                 doc.save_output_file(
 
 111                     doc.as_mobi(doc, cover=cover.VirtualoCover, sample=25),
 
 112                     output_path=outfile_sample)
 
 113         except ParseError, e:
 
 114             print '%(file)s:%(name)s:%(message)s' % {
 
 116                 'name': e.__class__.__name__,
 
 120         xml_file = open(os.path.join(output_dir, 'import_products.xml'), 'w')
 
 121         xml_file.write(etree.tostring(xml, pretty_print=True, encoding=unicode).encode('utf-8'))