translators = models.ManyToManyField(Tag, blank=True)
narrators = models.ManyToManyField(Tag, blank=True, related_name='narrated')
has_audio = models.BooleanField(default=False)
-
+ read_time = models.IntegerField(blank=True, null=True)
+ pages = models.IntegerField(blank=True, null=True)
+
html_built = django.dispatch.Signal()
published = django.dispatch.Signal()
def isbn_mobi(self):
return self.get_extra_info_json().get('isbn_mobi')
+ @property
+ def redakcja(self):
+ return self.get_extra_info_json().get('about')
+
def is_accessible_to(self, user):
if not self.preview:
return True
None, ContentFile(sync)
)
-
def get_sync(self):
if not self.has_sync_file():
- return '[]'
+ return []
with self.get_media('sync').first().file.open('r') as f:
sync = f.read().split('\n')
offset = float(sync[0])
continue
start, end, elid = line.split()
items.append([elid, float(start) + offset])
- return json.dumps(items)
-
+ return items
+
+ def sync_ts(self, ts):
+ elid = None
+ for cur_id, t in self.get_sync():
+ if ts >= t:
+ elid = cur_id
+ else:
+ break
+ return elid
+
+ def sync_elid(self, elid):
+ for cur_id, t in self.get_sync():
+ if cur_id == elid:
+ return t
+
def has_audio_epub_file(self):
return self.has_media("audio.epub")
book.load_toc()
book.save()
+ book.update_stats()
+
meta_tags = Tag.tags_from_info(book_info)
just_tags = [t for (t, rel) in meta_tags if not rel]
cls.published.send(sender=cls, instance=book)
return book
+ def update_stats(self):
+ stats = self.wldocument2().get_statistics()['total']
+ self.pages = round(
+ stats['verses_with_fn'] / 30 +
+ stats['chars_out_verse_with_fn'] / 1800)
+ self.read_time = round(self.get_time())
+ self.save(update_fields=['pages', 'read_time'])
+ if self.parent is not None:
+ self.parent.update_stats()
+
def update_references(self):
Entity = apps.get_model('references', 'Entity')
doc = self.wldocument2()
elif isinstance(publisher, list):
return ', '.join(publisher)
+ def get_recommended(self, limit=4):
+ books_qs = type(self).objects.filter(findable=True)
+ books_qs = books_qs.exclude(common_slug=self.common_slug).exclude(ancestor=self)
+ books = type(self).tagged.related_to(self, books_qs)[:limit]
+ return books
+
@classmethod
def tagged_top_level(cls, tags):
""" Returns top-level books tagged with `tags`.
return 'https://ridero.eu/%s/books/wl_%s/' % (get_language(), self.slug.replace('-', '_'))
def elevenreader_link(self):
- return 'https://elevenreader.io/audiobooks/wolnelektury:' + self.get_first_text().slug
+ first_text = self.get_first_text()
+ if first_text is None:
+ return None
+ return 'https://elevenreader.io/audiobooks/wolnelektury:' + first_text.slug
def content_warnings(self):
warnings_def = {