Xteink Lover: một cái kệ sách riêng trên web. Thả file vào từ điện thoại hay máy tính, ở đâu cũng được. Máy đọc mở kệ qua OPDS là tải về, WiFi nào cũng được, không cần cùng mạng.

Nó làm được gì?

  • Thả file là lên kệ: EPUB gửi thẳng. MOBI, AZW3, PDF, truyện tranh CBZ, Markdown, TXT, HTML thì tự chuyển sang EPUB ngay trên trình duyệt, file không phải đi qua máy chủ nào để chuyển.
  • Dán link bài báo: trang tự cắt lấy nội dung chính và ảnh, làm thành EPUB. Trên Android thì cài trang như app, ở app nào cũng bấm Chia sẻ → Xteink Lover.
  • Tủ trưng bày: mỗi tầng một hàng bìa trên tấm ván, tên tầng khắc trên biển đồng. Kéo thả sách giữa các tầng. Mỗi cuốn nằm ở một tầng, như tủ sách thật.
  • Bìa tự tìm: sách có ISBN thì tự lấy bìa đúng bản in. Không có thì bấm tìm trên Google Books và Open Library rồi tự chọn.
  • Máy đọc thấy đúng kệ: trên máy, mỗi tầng hiện như một thư mục trong OPDS. Sách chưa xếp tầng thì máy không thấy, nên kệ trên máy luôn gọn.
  • Đồng bộ tiến độ đọc: nói được giao thức KOSync của KOReader, nên đọc trên Xteink rồi mở trên Kindle đã jailbreak chạy KOReader là đọc tiếp đúng trang.
  • Ảnh “tháng này đọc gì”: máy đồng bộ quá 97% thì tự ghi ngày đọc xong. Bấm Chia sẻ là ra một tấm ảnh tủ sách với bìa các cuốn đã đọc, đăng Facebook hay Zalo đều vừa.

Tủ trưng bày: bìa thật cho cuốn tìm được, bìa chữ cho cuốn không tìm được. Dấu ✓ là đã đọc xong.

Ba cách dùng, tuỳ độ lười

CáchHợp với aiMáy tính phải bật?
Dùng thử ở xteinklover.ongk.devMuốn xem nó ra sao trướcKhông
Tự dựng trên Cloudflare (nút Deploy to Cloudflare)Muốn kệ riêng, dùng ở đâu cũng được, miễn phíKhông
Tự chạy bằng Docker (NAS, máy chủ nhà)Dân self-host, không thích CloudflareMáy chủ phải bật
Tải về dùng luôn (Windows, macOS, Linux)Không muốn đụng dòng lệnhCó

Bản dùng thử có giới hạn chỗ vì dùng chung. Dùng hằng ngày thì nên tự dựng một bản: gói miễn phí của Cloudflare cho 1 GB chứa sách, không cần thẻ.

Bản tải về: nhấp đúp là chạy

Vào trang Releases, tải file đúng máy (Windows khoảng 35 MB), giải nén, nhấp đúp xteinklover. Cửa sổ dòng lệnh hiện địa chỉ OPDS để điền vào máy đọc, trình duyệt tự mở kệ. Lần đầu tạo tài khoản luôn. Đóng cửa sổ là tắt.

App chưa ký với Microsoft hay Apple, nên:

  • Windows hiện “Windows protected your PC” → bấm More info → Run anyway. Hỏi quyền mạng thì bấm Allow, không thì máy đọc không vào được.
  • macOS lần đầu: chuột phải vào file → Open.

Bản Docker

git clone https://github.com/ptk862010/xteinklover && cd xteinklover
echo "SIGNUP_CODE=tu-chon-mot-tu" > .env
docker compose up -d

Mở trang ở cổng 8787, tạo tài khoản bằng mã mời vừa đặt. Tài khoản và danh mục nằm trong một file SQLite, sách nằm trong một thư mục, gói gọn trong volume /data. Muốn dùng từ ngoài nhà thì đặt sau Cloudflare Tunnel hoặc Tailscale.

Đổ kệ thẳng xuống thẻ nhớ

Cái này chỉ bản Docker và bản tải về làm được, vì máy chạy Xteink Lover nằm chung mạng với máy đọc.

Tải qua OPDS thì CrossPoint bỏ hết sách vào một thư mục. Mình muốn tầng Trinh thám trên web thì trên máy cũng có thư mục Trinh thám. Đào code CrossPoint mới thấy muốn vậy phải sửa firmware. Nhưng chế độ File Transfer của CrossPoint lại có sẵn một API nhỏ: xem thư mục, tạo thư mục, chép, chuyển, xoá file.

Thế là có nút 📲 Đổ xuống máy: trên máy đọc mở File Transfer, trên web gõ IP hiện trên màn hình máy, bấm Kiểm tra. Trang so kệ với thẻ nhớ rồi:

  • chép cuốn còn thiếu vào /Sach/<Tên tầng>/, tên file “Tác giả - Tên sách.epub”;
  • chép lại cuốn vừa sửa file;
  • đổi tầng trên web thì chuyển file sang thư mục mới;
  • cuốn đã gỡ khỏi kệ thì liệt kê để mình tự tích xoá, không tự xoá gì.

Nó chỉ đụng tới thư mục mang tên tầng, thư mục khác trên thẻ (PDF, font, ảnh chụp màn hình) để yên.

Chuyện có thật

Lúc thử, mình gửi máy một lệnh chép file mà không kèm file để xem máy trả lời gì. Máy đứng rồi tự khởi động lại. CrossPoint chạy trên con chip nhỏ, gặp request lạ là dễ dỗi. Nên bản chính thức chép từng cuốn một, lệnh nào cũng đủ tham số.

Ảnh “tháng này đọc gì”

Ảnh vẽ ngay trên trình duyệt, không gửi đi đâu. Chọn tháng này, tháng trước, năm nay, năm trước hoặc tự chọn khoảng ngày. Mười cuốn thì xếp 4 + 3 + 3 cho cân, quá 20 cuốn thì ghi “và N cuốn nữa”.

Vài thứ học được khi làm

  • Tìm bìa sách tiếng Việt khó hơn tưởng. Tìm nguyên cụm tên sách trên Google Books hay ra sách khác cùng tác giả. Chuyển sang tìm từng chữ rồi xếp theo độ khớp tên thì đúng hơn hẳn, nhưng vẫn để người dùng tự chọn, không tự gán.
  • Cùng một mã chạy được ba chỗ. Bản Cloudflare, Docker và bản tải về dùng chung toàn bộ mã máy chủ, chỉ thay phần lưu trữ: Cloudflare D1 và KV đổi thành SQLite và một thư mục. Cả ba chạy cùng một bộ 36 bài test tích hợp trước khi phát hành, bản macOS cũng được test trên máy Mac thật của GitHub.
  • Bản tải về nặng là do Node, không phải do app. Phần app chỉ khoảng 2,6 MB, còn Node chiếm hơn 90 MB. Nén lại còn khoảng 35 MB, chấp nhận được cho một file nhấp đúp là chạy.

Mã nguồn

Xteink Lover mã nguồn mở, giấy phép MIT: github.com/ptk862010/xteinklover. Máy đọc cần firmware CrossPoint (firmware gốc của Xteink không có OPDS), cách cài xem bài này.