3a6829a8bc3dd28dbeea8c1026c0fd629841384d
[redakcja.git] / src / depot / legimi.py
1 from datetime import date
2 import re
3 from django.conf import settings
4 from librarian.functions import lang_code_3to2
5 from librarian.html import transform_abstrakt
6 from librarian.builders import EpubBuilder, MobiBuilder
7 from librarian.cover import LegimiCornerCover, LegimiCover
8 import requests
9
10
11
12 fundraising=[
13             "Książka, którą czytasz, pochodzi z <a href=\"https://wolnelektury.pl/\">Wolnych Lektur</a>. Naszą misją jest wspieranie dzieciaków w dostępie do lektur szkolnych oraz zachęcanie ich do czytania. Miło Cię poznać!",
14             "Podoba Ci się to, co robimy? Jesteśmy organizacją pożytku publicznego. Wesprzyj Wolne Lektury drobną wpłatą: <a href=\"https://wolnelektury.pl/towarzystwo/\">wolnelektury.pl/towarzystwo/</a>",
15             "Przyjaciele Wolnych Lektur otrzymują dostęp do prapremier wcześniej niż inni. Zadeklaruj stałą wpłatę i dołącz do Towarzystwa Przyjaciół Wolnych Lektur: <a href=\"https://wolnelektury.pl/towarzystwo/\">wolnelektury.pl/towarzystwo/</a>",
16             "Informacje o nowościach w naszej bibliotece w Twojej skrzynce mailowej? Nic prostszego, zapisz się do newslettera. Kliknij, by pozostawić swój adres e-mail: <a href=\"https://wolnelektury.pl/newsletter/zapisz-sie/\">wolnelektury.pl/newsletter/zapisz-sie/</a>",
17             "Przekaż 1% podatku na Wolne Lektury.<br/>\nKRS: 0000070056<br/>\nNazwa organizacji: Fundacja Nowoczesna Polska<br/>\nKażda wpłacona kwota zostanie przeznaczona na rozwój Wolnych Lektur."
18 ]
19
20 class Legimi:
21     #BASE_URL = 'https://wydawca.legimi.com'
22     BASE_URL = 'https://panel.legimi.pl'
23     LOGIN_URL = BASE_URL + '/publishers/membership'
24     UPLOAD_URL = BASE_URL + '/administration/upload/start'
25     CREATE_URL = BASE_URL + '/publishers/publications/create'
26     EDIT_URL = BASE_URL + '/publishers/publications/edit/%s'
27     EDIT_FILES_URL = BASE_URL + '/publishers/publications/editfiles/%s'
28     
29     def __init__(self, username, password, publisher_id):
30         self.username = username
31         self.password = password
32         self.publisher_id = publisher_id
33         self._session = None
34
35     @property
36     def session(self):
37         if self._session is None:
38             session = requests.Session()
39             response = session.post(
40                 self.LOGIN_URL,
41                 data={
42                     'ValidationTrue': 'true',
43                     'UserName': self.username,
44                     'Password': self.password,
45                 })
46             self._session = session
47         return self._session
48         
49     def list(self):
50         return self.session.get('https://wydawca.legimi.com/publishers/publications')
51         
52     def upload(self, content):
53         response = self.session.post(
54             self.UPLOAD_URL,
55             files={
56                 "files": content,
57             })
58         model = response.json()['model']
59         return {
60             "name": model['Name'],
61             "token": model['Token'],
62             "url": model['Url'],
63         }
64
65 #    name=files[]
66 #    filename
67 #    content-type
68 #    response: json
69 #     success: true
70 #     model.Url
71
72     def send_book(self, book):
73         wlbook = book.wldocument(librarian2=True)
74         meta = wlbook.meta
75
76         cover = LegimiCornerCover(meta, width=1200).output_file()
77         epub_file = EpubBuilder(cover=LegimiCover, fundraising=fundraising).build(wlbook).get_file()
78         mobi_file = MobiBuilder(cover=LegimiCover, fundraising=fundraising).build(wlbook).get_file()
79
80         book_data = {
81             "Title": meta.title,
82             "Author": ", ".join(p.readable() for p in meta.authors),
83             "Year": meta.created_at[:4],
84
85             'GenreId': '11', # TODO
86             'Isbn': '',
87             'LanguageLocale': lang_code_3to2(meta.language),
88
89             'Description': '<p>—</p>',
90         }
91         if meta.isbn_html:
92             isbn = meta.isbn_html
93             if isbn.upper().startswith('ISBN '):
94                 isbn = isbn[5:]
95             isbn = isbn.strip()
96             book_data['Isbn'] = isbn
97
98         files_data = {}
99
100         abstract = wlbook.tree.find('.//abstrakt')
101         if abstract is not None:
102             book_data['Description'] = transform_abstrakt(abstract)
103         
104
105         cover_data = self.upload(
106             (meta.url.slug + '.jpg', cover.get_file(), 'image/jpeg')
107         )
108         book_data.update({
109             "Cover.Name": cover_data['name'],
110             "Cover.Token": cover_data['token'],
111             "Cover.Url": cover_data['url'],
112         })
113
114         epub_data = self.upload(
115             (meta.url.slug + '.epub', epub_file, 'application/epub+zip')
116         )
117         files_data.update({
118             'BookEpub.Token': epub_data['token'],
119             'BookEpub.Name': epub_data['name'],
120         })
121
122         mobi_data = self.upload(
123             (meta.url.slug + '.mobi', mobi_file, 'application/x-mobipocket-ebook')
124         )
125         files_data.update({
126             'BookMobi.Token': mobi_data['token'],
127             'BookMobi.Name': mobi_data['name'],
128         })
129         
130         if book.legimi_id:
131             self.edit(
132                 book.legimi_id,
133                 book_data
134             )
135             self.edit_files(
136                 book.legimi_id,
137                 files_data
138             )
139         else:
140             legimi_id = self.create_book(book_data, files_data)
141             if legimi_id:
142                 book.legimi_id = legimi_id
143                 book.save(update_fields=['legimi_id'])
144
145     def create_book(self, book_data, files_data):
146         data = {
147             'createValidationTrue': 'true',
148             'PublisherId': self.publisher_id,#3609954
149             'IsLibraryPass': 'False',
150
151             'SamplesGenerationType': 'Quantity',
152             'SamplesGenerationPercent': '10',
153
154             'EnterToTheMarketType': 'No',
155             'EnterToTheMarketDate': date.today().strftime('%d.%m.%Y'),
156             'HidingDate': '',
157             'SalesNoLimitOption': 'false',
158             'SalesNoLimitKindle': 'false',
159             'SalesInStoreEbookGrossValue': '0,00',
160             'SalesPromotion': 'False',
161             'SalesPromotionGrossValue': '0,00',
162             'SalesPromotionDatesRange.DateStart': '',
163             'SalesPromotionDatesRange.DateEnd': '',
164         }
165
166         for form in 'Epub', 'Mobi', 'Pdf':
167             data.update({
168                 f'Book{form}.Token': '',
169                 f'Book{form}.Name': '',
170                 f'Book{form}.StorageName': '',
171                 f'Book{form}.Order': '',
172
173                 f'Sample{form}Type': 'Files',
174                 f'Sample{form}.Token': '',
175                 f'Sample{form}.Name': '',
176                 f'Sample{form}.StorageName': '',
177                 f'Sample{form}.Order': '',
178             })
179
180         data.update(book_data)
181         data.update(files_data)
182
183         response = self.session.post(self.CREATE_URL, data=data)
184         m = re.search(r'/(\d+)$', response.url)
185         if m is not None:
186             return m.group(1)
187
188     def edit(self, legimi_id, data):
189         current = {
190             'ValidationTrue': 'true',
191             'Is': legimi_id
192         }
193
194         current.update(data)
195         
196         self.session.post(
197             self.EDIT_URL % legimi_id,
198             data=current
199         )
200
201     def edit_files(self, legimi_id, files_data):
202         current = {
203             'ValidationTrue': 'true',
204             'Id': legimi_id,
205             'SamplesGenerationType': 'Quantity',
206             'SamplesGenerationPercent': '10',
207         }
208
209         for form in 'Epub', 'Mobi', 'Pdf':
210             current.update({
211                 f'Book{form}.Token': '',
212                 f'Book{form}.Name': '',
213                 f'Book{form}.StorageName': '',
214                 f'Book{form}.Order': '',
215
216                 f'Sample{form}.Type': 'Files',
217                 f'Sample{form}.Token': '',
218                 f'Sample{form}.Name': '',
219                 f'Sample{form}.StorageName': '',
220                 f'Sample{form}.Order': '',
221             })
222
223         current.update(files_data)
224  
225         response = self.session.post(
226             self.EDIT_FILES_URL % legimi_id,
227             data=current
228         )
229
230
231 legimi = Legimi(
232     settings.LEGIMI_USERNAME,
233     settings.LEGIMI_PASSWORD,
234     settings.LEGIMI_PUBLISHER_ID,
235 )