自建legado书源

起源

本文简述了如何使用 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": ""

}