Python 3.4-3.7 support;
[librarian.git] / librarian / partners.py
1 # -*- coding: utf-8 -*-
2 #
3 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
5 #
6
7 """
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.
11
12 New partners shouldn't be added here, but in the partners repository.
13 """
14 from __future__ import print_function, unicode_literals
15
16 from librarian import packagers, cover
17 from .util import makedirs
18
19
20 class GandalfEpub(packagers.EpubPackager):
21     cover = cover.GandalfCover
22
23
24 class GandalfPdf(packagers.PdfPackager):
25     cover = cover.GandalfCover
26
27
28 class BookotekaEpub(packagers.EpubPackager):
29     cover = cover.BookotekaCover
30
31
32 class PrestigioEpub(packagers.EpubPackager):
33     cover = cover.PrestigioCover
34     flags = ('less-advertising',)
35
36
37 class PrestigioPdf(packagers.PdfPackager):
38     cover = cover.PrestigioCover
39     flags = ('less-advertising',)
40
41
42 class Virtualo(packagers.Packager):
43     @staticmethod
44     def utf_trunc(text, limit):
45         """ truncates text to at most `limit' bytes in utf-8 """
46         if text is None:
47             return text
48         if len(text.encode('utf-8')) > limit:
49             newlimit = limit - 3
50             while len(text.encode('utf-8')) > newlimit:
51                 text = text[:(newlimit - len(text.encode('utf-8'))) / 4]
52             text += '...'
53         return text
54
55     @classmethod
56     def prepare(cls, input_filenames, output_dir='', verbose=False):
57         from lxml import etree
58         from librarian import DirDocProvider, ParseError
59         from librarian.parser import WLDocument
60         from copy import deepcopy
61         import os.path
62
63         xml = etree.fromstring("""<?xml version="1.0" encoding="utf-8"?>
64             <products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></products>""")
65         product = etree.fromstring("""<product>
66                 <publisherProductId></publisherProductId>
67                 <title></title>
68                 <info></info>
69                 <description></description>
70                 <authors>
71                     <author>
72                         <names>Jan</names>
73                         <lastName>Kowalski</lastName>
74                     </author>
75                 </authors>
76                 <price>0.0</price>
77                 <language>PL</language>
78             </product>""")
79
80         try:
81             for main_input in input_filenames:
82                 if verbose:
83                     print(main_input)
84                 path, fname = os.path.realpath(main_input).rsplit('/', 1)
85                 provider = DirDocProvider(path)
86                 slug, ext = os.path.splitext(fname)
87
88                 outfile_dir = os.path.join(output_dir, slug)
89                 makedirs(os.path.join(output_dir, slug))
90
91                 doc = WLDocument.from_file(main_input, provider=provider)
92                 info = doc.book_info
93
94                 product_elem = deepcopy(product)
95                 product_elem[0].text = cls.utf_trunc(slug, 100)
96                 product_elem[1].text = cls.utf_trunc(info.title, 255)
97                 product_elem[2].text = cls.utf_trunc(info.description, 255)
98                 product_elem[3].text = cls.utf_trunc(info.source_name, 3000)
99                 product_elem[4][0][0].text = cls.utf_trunc(u' '.join(info.author.first_names), 100)
100                 product_elem[4][0][1].text = cls.utf_trunc(info.author.last_name, 100)
101                 xml.append(product_elem)
102
103                 cover.VirtualoCover(info).save(os.path.join(outfile_dir, slug+'.jpg'))
104                 outfile = os.path.join(outfile_dir, '1.epub')
105                 outfile_sample = os.path.join(outfile_dir, '1.sample.epub')
106                 doc.save_output_file(doc.as_epub(), output_path=outfile)
107                 doc.save_output_file(doc.as_epub(doc, sample=25), output_path=outfile_sample)
108                 outfile = os.path.join(outfile_dir, '1.mobi')
109                 outfile_sample = os.path.join(outfile_dir, '1.sample.mobi')
110                 doc.save_output_file(doc.as_mobi(cover=cover.VirtualoCover), output_path=outfile)
111                 doc.save_output_file(
112                     doc.as_mobi(doc, cover=cover.VirtualoCover, sample=25),
113                     output_path=outfile_sample)
114         except ParseError as e:
115             print('%(file)s:%(name)s:%(message)s' % {
116                 'file': main_input,
117                 'name': e.__class__.__name__,
118                 'message': e.message
119             })
120
121         xml_file = open(os.path.join(output_dir, 'import_products.xml'), 'w')
122         xml_file.write(etree.tostring(xml, pretty_print=True, encoding='unicode').encode('utf-8'))
123         xml_file.close()