utils.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3. import datetime
  4. from gettext import gettext as _
  5. class SimpleBookFormatter:
  6. """格式化calibre book的字段"""
  7. def __init__(self, calibre_book_item, cdn_url):
  8. self.cdn_url = cdn_url
  9. self.book = calibre_book_item
  10. def get_collector(self):
  11. collector = self.book.get("collector", None)
  12. if isinstance(collector, dict):
  13. collector = collector.get("username", None)
  14. elif collector:
  15. collector = collector.username
  16. return collector
  17. def val(self, k, default_value=_("Unknown")):
  18. v = self.book.get(k, None)
  19. if not v:
  20. v = default_value
  21. if isinstance(v, datetime.datetime):
  22. return f'{v.year:04}-{v.month:02}-{v.day:02}'
  23. return v
  24. def format(self):
  25. b = self.book
  26. b["ts"] = b["timestamp"].strftime("%s")
  27. return {
  28. "id": b["id"],
  29. "title": b["title"],
  30. "rating": b["rating"],
  31. "timestamp": self.val("timestamp"),
  32. "pubdate": self.val("pubdate"),
  33. "author": ", ".join(b["authors"]),
  34. "authors": b["authors"],
  35. "author_sort": self.val("author_sort"),
  36. "tag": " / ".join(b["tags"]),
  37. "tags": b["tags"],
  38. "publisher": self.val("publisher"),
  39. "comments": self.val("comments", _(u"暂无简介")),
  40. "series": self.val("series", None),
  41. "language": self.val("language", None),
  42. "isbn": self.val("isbn", None),
  43. "img": self.cdn_url + "/get/cover/%(id)s.jpg?t=%(ts)s" % b,
  44. "thumb": self.cdn_url + "/get/thumb_60x80/%(id)s.jpg?t=%(ts)s" % b,
  45. # 额外填充的字段
  46. "collector": self.get_collector(),
  47. "count_visit": self.val("count_visit", 0),
  48. "count_download": self.val("count_download", 0),
  49. }
  50. class BookFormatter:
  51. def __init__(self, tornado_handler, calibre_book_item):
  52. self.db = tornado_handler.db
  53. self.book = calibre_book_item
  54. self.cdn_url = tornado_handler.cdn_url
  55. self.api_url = tornado_handler.api_url
  56. self.handler = tornado_handler
  57. def get_files(self):
  58. files = []
  59. book_id = self.book["id"]
  60. for fmt in self.book.get("available_formats", ""):
  61. try:
  62. filesize = self.db.sizeof_format(book_id, fmt, index_is_id=True)
  63. except:
  64. continue
  65. item = {
  66. "format": fmt,
  67. "size": filesize,
  68. "href": self.cdn_url + "/api/book/%s.%s" % (book_id, fmt),
  69. }
  70. files.append(item)
  71. return files
  72. def get_permissions(self):
  73. h = self.handler
  74. return {
  75. # 图书权限数据
  76. "is_public": True,
  77. "is_owner": h.is_admin() or h.is_book_owner(self.book["id"], h.user_id()),
  78. }
  79. def format(self, with_files=False, with_perms=False):
  80. f = SimpleBookFormatter(self.book, self.cdn_url)
  81. data = f.format()
  82. data.update(
  83. {
  84. "author_url": self.api_url + "/author/" + f.val("author_sort"),
  85. "publisher_url": self.api_url + "/publisher/" + f.val("publisher"),
  86. }
  87. )
  88. if with_files:
  89. data["files"] = self.get_files()
  90. if with_perms:
  91. data.update(self.get_permissions())
  92. return data
  93. def compare_books_by_rating_or_id(x, y):
  94. a = x.get("rating", 0) or 0
  95. b = y.get("rating", 0) or 0
  96. if a > b:
  97. return 1
  98. elif a < b:
  99. return -1
  100. elif x["id"] > y["id"]:
  101. return 1
  102. else:
  103. return -1