起源
本文简述了如何使用 pocketbase+legado 搭建自己的图片书源。
阅读(legado)是安卓上出名的开源阅读软件,主要使用书源配置规则,从各种网站等获取文字、图片等数据,并展示到手机上。:https://github.com/gedoor/legado
pocketbase 是一个简单的 go 后台,提供了一个简单的管理界面和 api:https://github.com/pocketbase/pocketbase
pocketbase 配置
pocketbase 建立 1+n 个 Collections,一个命名为 books,存放书本基础信息,n 个为 n 个书籍。
books 字段有name书名,author作者,pic封面,info简介,ref对应 Collections 的 id,field分类
书 Collections 的名称为上述ref,字段有field多个图片文件,pn数字排序,p章节名,info正文 rich text
权限 list/search、view 都要进行放开。
书源
书源的编写规则可见 legado 项目 readme,下面为上述配置对应的书源。
其中,重点要介绍的是正文规则
$.field@js:result.split(\"\\n\").sort().map(x=>'').join(\"\")
legado在加载超长图片时,滑动会卡顿,解决方案是先切分成多个图(从上到下切分)
$.field:书Collections field字段,因为多个图片文件,所以用\n分割
.sort():当存在多个图片时,必须保证图片是按顺序拼合
.map(x=>'').join(\"\"):转化为多个img,这将会加载多个图片并拼合
如果是想自定义正文,可以将正文规则简单的设为$.info然后就可以通过编写每个记录的info字段实现展示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
{
"bookSourceName": "pocketbase",
"bookSourceType": 2,
"bookSourceUrl": "http://书源域名/_/",
"customOrder": 0,
"enabled": true,
"enabledCookieJar": false,
"enabledExplore": false,
"exploreUrl": "",
"lastUpdateTime": 1710170295968,
"respondTime": 180000,
"ruleBookInfo": {
"author": "$.author",
"coverUrl": "/api/files/{$.collectionId}/{$.id}/{$.pic}",
"downloadUrls": "",
"intro": "$.info",
"kind": "$.field",
"name": "$.name",
"tocUrl": "/api/collections/{$.ref}/records?sort=pn&perPage=10000"
},
"ruleContent": {
"content": "$.field@js:result.split(\"\\n\").sort().map(x=>'').join(\"\")",
"imageStyle": "FULL",
"nextContentUrl": "",
"sourceRegex": "",
"title": "$.p",
"webJs": ""
},
"ruleExplore": {
"author": "",
"bookList": "",
"bookUrl": "",
"coverUrl": "",
"intro": "",
"kind": "",
"name": ""
},
"ruleReview": {},
"ruleSearch": {
"author": "$.author",
"bookList": "$.items",
"bookUrl": "/api/collections/books/records/{$.id}",
"coverUrl": "/api/files/{$.collectionId}/{$.id}/{$.pic}",
"intro": "$.info",
"kind": "$.field",
"name": "$.name"
},
"ruleToc": {
"chapterList": "$.items",
"chapterName": "$.p",
"chapterUrl": "/api/collections/{$.collectionId}/records/{$.id}"
},
"searchUrl": "/api/collections/books/records?filter=(name='{{key}}')",
"weight": 0,
"loginUrl": ""
}