feat(lr): 懒人听书平台接入——App 通道搜索、web 章节列表、账密登录取流

This commit is contained in:
snowy-yang committed 2026-10-02 19:43:21 +08:00
1 parent 83d3eb3b49
commit 6fb866e343
6 files changed
+243

No files matched your search

+54
View File
@@ -0,0 +1,54 @@
// 懒人听书(lrts.me)平台模块
// 匿名可用面(2026-10-02 实测):搜索(App 通道游客态)/ 章节列表(web 免签)。
// 取流需登录(web getPlayPath,免费章节也要会话):POST /login/lr 账号密码登录。
// 章节 songmid 为复合 id "<bookId>:<section>";有声内容不参与聚合(noAggregate)。
import lrApi from '../apis/lr.ts'
import musicSearch from './musicSearch.ts'
import { getBookMenu } from './menu.ts'
import { getLrCookie } from './auth.ts'
const lr = {
musicSearch,
getMusicUrl(songInfo, type) {
return lrApi.getMusicUrl(songInfo, type)
},
getPic(songInfo) {
const bookId = String(songInfo.songmid ?? '').split(':')[0]
// 书籍封面无独立免签接口;搜索结果的 img 字段已带封面(这里返回空由调用方回退)
return Promise.resolve(null)
},
album: {
async getAlbumDetail(bookId: string, page = 1, limit = 30) {
const { total, list } = await getBookMenu(bookId, page, limit)
return {
info: { name: `书籍 ${bookId}`, total },
list: list.slice(0, limit).map((item: any) => ({
songmid: `${bookId}:${item.section}`,
name: item.name || `第${item.section}节`,
singer: '',
albumId: String(bookId),
albumName: '',
interval: 0,
payPlay: String(item.listenPrice) !== '0',
img: null,
lrc: '',
lrcx: '',
types: [],
_types: {},
disabled: false,
})),
total,
limit,
allPage: Math.ceil(total / 30) || page,
source: 'lr' as const,
}
},
},
getMusicDetailPageUrl(songInfo) {
const bookId = String(songInfo.songmid ?? '').split(':')[0]
return `https://m.lrts.me/book/${bookId}`
},
}
export { status } from './auth.ts'
export default lr