@forward-widget/danmu-universe 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -2
- package/dist/danmu-universe.js +136 -110
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
### 一键安装
|
|
21
21
|
|
|
22
|
-
[](forward://widget?url=https%3A%2F%2Funpkg.com%2F%40forward-widget%2Fdanmu-universe)
|
|
22
|
+
[](https://gocy.pages.dev/#forward://widget?url=https%3A%2F%2Funpkg.com%2F%40forward-widget%2Fdanmu-universe)
|
|
23
23
|
|
|
24
24
|
### 手动安装
|
|
25
25
|
|
|
@@ -32,7 +32,9 @@ https://unpkg.com/@forward-widget/danmu-universe
|
|
|
32
32
|
|
|
33
33
|
## 开发
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
项目自豪的使用 [forward-widget-libs](https://github.com/baranwang/forward-widget-libs) 开发工具链
|
|
36
|
+
|
|
37
|
+
欢迎社区贡献,如果你想为项目做出贡献可按照以下流程:
|
|
36
38
|
|
|
37
39
|
### 环境要求
|
|
38
40
|
|
|
@@ -41,12 +43,16 @@ https://unpkg.com/@forward-widget/danmu-universe
|
|
|
41
43
|
|
|
42
44
|
### 安装依赖
|
|
43
45
|
|
|
46
|
+
仓库根目录
|
|
47
|
+
|
|
44
48
|
```bash
|
|
45
49
|
pnpm install
|
|
46
50
|
```
|
|
47
51
|
|
|
48
52
|
### 开发模式
|
|
49
53
|
|
|
54
|
+
项目目录
|
|
55
|
+
|
|
50
56
|
```bash
|
|
51
57
|
pnpm dev
|
|
52
58
|
```
|
|
@@ -63,6 +69,10 @@ pnpm build
|
|
|
63
69
|
pnpm test
|
|
64
70
|
```
|
|
65
71
|
|
|
72
|
+
### 提交
|
|
73
|
+
|
|
74
|
+
在仓库根目录执行 `pnpm changeset` 创建 changeset 文件,同时使用标准的 Conventional Commits 提交代码
|
|
75
|
+
|
|
66
76
|
## 鸣谢
|
|
67
77
|
|
|
68
78
|
- [misaka_danmu_server](https://github.com/l429609201/misaka_danmu_server)
|
package/dist/danmu-universe.js
CHANGED
|
@@ -695,8 +695,8 @@ var __webpack_modules__ = {
|
|
|
695
695
|
var r = t + n, i = e[r];
|
|
696
696
|
e[r] = (i << 8 | i >>> 24) & 0x00ff00ff | (i << 24 | i >>> 8) & 0xff00ff00;
|
|
697
697
|
}
|
|
698
|
-
var o = this._hash.words, s = e[t + 0], u = e[t + 1], f = e[t + 2], h = e[t + 3], m = e[t + 4], g = e[t + 5], v = e[t + 6], y = e[t + 7], b = e[t + 8], _ = e[t + 9], w = e[t + 10], x = e[t + 11], k = e[t + 12], j = e[t + 13],
|
|
699
|
-
z = l(z, O, I, $, s, 7, a[0]), $ = l($, z, O, I, u, 12, a[1]), I = l(I, $, z, O, f, 17, a[2]), O = l(O, I, $, z, h, 22, a[3]), z = l(z, O, I, $, m, 7, a[4]), $ = l($, z, O, I, g, 12, a[5]), I = l(I, $, z, O, v, 17, a[6]), O = l(O, I, $, z, y, 22, a[7]), z = l(z, O, I, $, b, 7, a[8]), $ = l($, z, O, I, _, 12, a[9]), I = l(I, $, z, O, w, 17, a[10]), O = l(O, I, $, z, x, 22, a[11]), z = l(z, O, I, $, k, 7, a[12]), $ = l($, z, O, I, j, 12, a[13]), I = l(I, $, z, O,
|
|
698
|
+
var o = this._hash.words, s = e[t + 0], u = e[t + 1], f = e[t + 2], h = e[t + 3], m = e[t + 4], g = e[t + 5], v = e[t + 6], y = e[t + 7], b = e[t + 8], _ = e[t + 9], w = e[t + 10], x = e[t + 11], k = e[t + 12], j = e[t + 13], E = e[t + 14], S = e[t + 15], z = o[0], O = o[1], I = o[2], $ = o[3];
|
|
699
|
+
z = l(z, O, I, $, s, 7, a[0]), $ = l($, z, O, I, u, 12, a[1]), I = l(I, $, z, O, f, 17, a[2]), O = l(O, I, $, z, h, 22, a[3]), z = l(z, O, I, $, m, 7, a[4]), $ = l($, z, O, I, g, 12, a[5]), I = l(I, $, z, O, v, 17, a[6]), O = l(O, I, $, z, y, 22, a[7]), z = l(z, O, I, $, b, 7, a[8]), $ = l($, z, O, I, _, 12, a[9]), I = l(I, $, z, O, w, 17, a[10]), O = l(O, I, $, z, x, 22, a[11]), z = l(z, O, I, $, k, 7, a[12]), $ = l($, z, O, I, j, 12, a[13]), I = l(I, $, z, O, E, 17, a[14]), O = l(O, I, $, z, S, 22, a[15]), z = c(z, O, I, $, u, 5, a[16]), $ = c($, z, O, I, v, 9, a[17]), I = c(I, $, z, O, x, 14, a[18]), O = c(O, I, $, z, s, 20, a[19]), z = c(z, O, I, $, g, 5, a[20]), $ = c($, z, O, I, w, 9, a[21]), I = c(I, $, z, O, S, 14, a[22]), O = c(O, I, $, z, m, 20, a[23]), z = c(z, O, I, $, _, 5, a[24]), $ = c($, z, O, I, E, 9, a[25]), I = c(I, $, z, O, h, 14, a[26]), O = c(O, I, $, z, b, 20, a[27]), z = c(z, O, I, $, j, 5, a[28]), $ = c($, z, O, I, f, 9, a[29]), I = c(I, $, z, O, y, 14, a[30]), O = c(O, I, $, z, k, 20, a[31]), z = d(z, O, I, $, g, 4, a[32]), $ = d($, z, O, I, b, 11, a[33]), I = d(I, $, z, O, x, 16, a[34]), O = d(O, I, $, z, E, 23, a[35]), z = d(z, O, I, $, u, 4, a[36]), $ = d($, z, O, I, m, 11, a[37]), I = d(I, $, z, O, y, 16, a[38]), O = d(O, I, $, z, w, 23, a[39]), z = d(z, O, I, $, j, 4, a[40]), $ = d($, z, O, I, s, 11, a[41]), I = d(I, $, z, O, h, 16, a[42]), O = d(O, I, $, z, v, 23, a[43]), z = d(z, O, I, $, _, 4, a[44]), $ = d($, z, O, I, k, 11, a[45]), I = d(I, $, z, O, S, 16, a[46]), O = d(O, I, $, z, f, 23, a[47]), z = p(z, O, I, $, s, 6, a[48]), $ = p($, z, O, I, y, 10, a[49]), I = p(I, $, z, O, E, 15, a[50]), O = p(O, I, $, z, g, 21, a[51]), z = p(z, O, I, $, k, 6, a[52]), $ = p($, z, O, I, h, 10, a[53]), I = p(I, $, z, O, w, 15, a[54]), O = p(O, I, $, z, u, 21, a[55]), z = p(z, O, I, $, b, 6, a[56]), $ = p($, z, O, I, S, 10, a[57]), I = p(I, $, z, O, v, 15, a[58]), O = p(O, I, $, z, j, 21, a[59]), z = p(z, O, I, $, m, 6, a[60]), $ = p($, z, O, I, x, 10, a[61]), I = p(I, $, z, O, f, 15, a[62]), O = p(O, I, $, z, _, 21, a[63]), o[0] = o[0] + z | 0, o[1] = o[1] + O | 0, o[2] = o[2] + I | 0, o[3] = o[3] + $ | 0;
|
|
700
700
|
},
|
|
701
701
|
_doFinalize: function() {
|
|
702
702
|
var e = this._data, n = e.words, r = 8 * this._nDataBytes, i = 8 * e.sigBytes;
|
|
@@ -4047,13 +4047,16 @@ class Fetch {
|
|
|
4047
4047
|
}, s), r = storage.getJson(n);
|
|
4048
4048
|
if (r) return console.debug("fetch cache hit", n), Promise.resolve(r);
|
|
4049
4049
|
}
|
|
4050
|
-
let a = o ? void 0 : n, { timeout: u, schema: l,
|
|
4051
|
-
console.debug("fetch", t, a,
|
|
4052
|
-
|
|
4050
|
+
let a = o ? void 0 : n, { timeout: u, schema: l, params: c, ...d } = s, p = t;
|
|
4051
|
+
c && (p = `${t}?${url_parse.qs.stringify(c)}`), console.debug("\u2B06\uFE0F fetch", t, null != a ? a : "", {
|
|
4052
|
+
...d,
|
|
4053
|
+
params: c
|
|
4054
|
+
});
|
|
4055
|
+
let f = o ? Widget.http.get(p, d) : Widget.http.post(p, a, d);
|
|
4053
4056
|
return u && u > 0 ? Promise.race([
|
|
4054
|
-
|
|
4057
|
+
f,
|
|
4055
4058
|
this.createTimeoutPromise(u)
|
|
4056
|
-
]) :
|
|
4059
|
+
]) : f;
|
|
4057
4060
|
}
|
|
4058
4061
|
getCacheKey(e, t) {
|
|
4059
4062
|
var n;
|
|
@@ -4255,29 +4258,6 @@ class BaseScraper {
|
|
|
4255
4258
|
sleep(e) {
|
|
4256
4259
|
return new Promise((t)=>setTimeout(t, e));
|
|
4257
4260
|
}
|
|
4258
|
-
formatComments(e, t) {
|
|
4259
|
-
let n = new Set(), r = new Map();
|
|
4260
|
-
for (let i of e){
|
|
4261
|
-
if (!i) continue;
|
|
4262
|
-
let e = t(i);
|
|
4263
|
-
if (!e || n.has(e.id)) continue;
|
|
4264
|
-
n.add(e.id);
|
|
4265
|
-
let o = e.content, s = r.get(o);
|
|
4266
|
-
s ? (e.timestamp < s.item.timestamp && (s.item = e), s.count += 1) : r.set(o, {
|
|
4267
|
-
item: e,
|
|
4268
|
-
count: 1
|
|
4269
|
-
});
|
|
4270
|
-
}
|
|
4271
|
-
let i = [];
|
|
4272
|
-
return r.forEach((e)=>{
|
|
4273
|
-
let { item: t, count: n } = e, r = n > 1 ? `${t.content} \xd7 ${n}` : t.content;
|
|
4274
|
-
i.push({
|
|
4275
|
-
cid: t.id,
|
|
4276
|
-
p: `${t.timestamp.toFixed(2)},${t.mode},${t.color},[${this.providerName}]`,
|
|
4277
|
-
m: r
|
|
4278
|
-
});
|
|
4279
|
-
}), i;
|
|
4280
|
-
}
|
|
4281
4261
|
getEpisodeIndexFromTitle(e) {
|
|
4282
4262
|
if (!e) return null;
|
|
4283
4263
|
let t = /(?:第)?(\d+)(?:集|话)?$/.exec(e.trim());
|
|
@@ -4361,22 +4341,22 @@ class BilibiliScraper extends BaseScraper {
|
|
|
4361
4341
|
async getComments(e, t) {
|
|
4362
4342
|
var n;
|
|
4363
4343
|
let { aid: r, cid: i, seasonId: o } = null != (n = this.parseIdString(e)) ? n : {};
|
|
4364
|
-
if (!r || !i || !o) return
|
|
4344
|
+
if (!r || !i || !o) return null;
|
|
4365
4345
|
let s = await this.getPgcEpisodes(o);
|
|
4366
|
-
if (!(null == s ? void 0 : s.find((e)=>e.aid === parseInt(r) && e.cid === parseInt(i)))) return
|
|
4346
|
+
if (!(null == s ? void 0 : s.find((e)=>e.aid === parseInt(r) && e.cid === parseInt(i)))) return null;
|
|
4367
4347
|
let a = await this.fetchCommentsForCid(r, i, t);
|
|
4368
|
-
return
|
|
4348
|
+
return a ? a.map((e)=>{
|
|
4369
4349
|
var t, n, r;
|
|
4370
4350
|
if (!e.progress) return null;
|
|
4371
4351
|
let i = (null == (t = e.content) ? void 0 : t.toString().replace(/\0/g, "")) || "";
|
|
4372
4352
|
return i ? {
|
|
4373
|
-
id: e.id,
|
|
4353
|
+
id: e.id.toString(),
|
|
4374
4354
|
timestamp: e.progress / 1000.0,
|
|
4375
4355
|
mode: null != (n = e.mode) ? n : 1,
|
|
4376
4356
|
color: null != (r = e.color) ? r : 16777215,
|
|
4377
4357
|
content: i
|
|
4378
4358
|
} : null;
|
|
4379
|
-
});
|
|
4359
|
+
}) : null;
|
|
4380
4360
|
}
|
|
4381
4361
|
async getPgcEpisodes(e) {
|
|
4382
4362
|
var t;
|
|
@@ -4391,18 +4371,17 @@ class BilibiliScraper extends BaseScraper {
|
|
|
4391
4371
|
})).data) ? void 0 : t.result.episodes;
|
|
4392
4372
|
}
|
|
4393
4373
|
async fetchCommentsForCid(e, t, n) {
|
|
4394
|
-
let r = [];
|
|
4395
4374
|
try {
|
|
4396
|
-
let
|
|
4375
|
+
let r = await this.fetch.get(`https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=${t}&pid=${e}&segment_index=${n}`, {
|
|
4397
4376
|
base64Data: !0
|
|
4398
4377
|
});
|
|
4399
|
-
if (404 ===
|
|
4400
|
-
let
|
|
4401
|
-
|
|
4378
|
+
if (404 === r.statusCode || 304 === r.statusCode) return null;
|
|
4379
|
+
let i = this.DmSegMobileReply.decode(base64ToUint8Array(r.data));
|
|
4380
|
+
return console.log(i), i.elems;
|
|
4402
4381
|
} catch (r) {
|
|
4403
4382
|
console.error(`\u{83B7}\u{53D6}\u{5206}\u{6BB5} ${n} \u{5931}\u{8D25} (aid=${e}, cid=${t}): ${r}`);
|
|
4404
4383
|
}
|
|
4405
|
-
return
|
|
4384
|
+
return null;
|
|
4406
4385
|
}
|
|
4407
4386
|
constructor(){
|
|
4408
4387
|
super(), bilibili_define_property(this, "providerName", "bilibili"), bilibili_define_property(this, "idSchema", bilibiliIdSchema), bilibili_define_property(this, "DmSegMobileReply", dm_proto.biliproto.community.service.dm.v1.DmSegMobileReply), this.fetch.setHeaders({
|
|
@@ -5319,13 +5298,13 @@ class IqiyiScraper extends BaseScraper {
|
|
|
5319
5298
|
let a = await this.fetch.get(s, {
|
|
5320
5299
|
zlibMode: !0
|
|
5321
5300
|
}), u = this.xmlParser.parse(a.data), { success: l, data: c, error: d } = iqiyiCommentsResponseSchema.safeParse(u);
|
|
5322
|
-
return l ?
|
|
5301
|
+
return l ? c.map((e)=>{
|
|
5323
5302
|
let t = 16777215;
|
|
5324
5303
|
try {
|
|
5325
5304
|
t = parseInt(e.color, 16);
|
|
5326
5305
|
} catch (e) {}
|
|
5327
5306
|
return {
|
|
5328
|
-
id: e.contentId,
|
|
5307
|
+
id: e.contentId.toString(),
|
|
5329
5308
|
timestamp: e.showTime,
|
|
5330
5309
|
mode: 1,
|
|
5331
5310
|
color: t,
|
|
@@ -5378,8 +5357,7 @@ class IqiyiScraper extends BaseScraper {
|
|
|
5378
5357
|
entityId: t
|
|
5379
5358
|
}),
|
|
5380
5359
|
episodeTitle: e.title,
|
|
5381
|
-
episodeNumber: null != (p = this.getEpisodeIndexFromTitle(e.short_display_name)) ? p : h
|
|
5382
|
-
url: e.page_url
|
|
5360
|
+
episodeNumber: null != (p = this.getEpisodeIndexFromTitle(e.short_display_name)) ? p : h
|
|
5383
5361
|
}), h += 1));
|
|
5384
5362
|
}
|
|
5385
5363
|
}
|
|
@@ -5507,8 +5485,7 @@ class TencentScraper extends BaseScraper {
|
|
|
5507
5485
|
vid: e.vid
|
|
5508
5486
|
}),
|
|
5509
5487
|
episodeTitle: e.union_title && e.union_title !== e.title ? e.union_title : e.title,
|
|
5510
|
-
episodeNumber: r
|
|
5511
|
-
url: `https://v.qq.com/x/cover/${n.cid}/${e.vid}.html`
|
|
5488
|
+
episodeNumber: r
|
|
5512
5489
|
};
|
|
5513
5490
|
});
|
|
5514
5491
|
if (void 0 !== t) {
|
|
@@ -5552,13 +5529,13 @@ class TencentScraper extends BaseScraper {
|
|
|
5552
5529
|
let n = this.parseIdString(e);
|
|
5553
5530
|
if (!(null == n ? void 0 : n.vid)) return [];
|
|
5554
5531
|
let r = await this.internalGetComments(n.vid, t);
|
|
5555
|
-
return r && 0 !== r.length ?
|
|
5532
|
+
return r && 0 !== r.length ? r.map((e)=>{
|
|
5556
5533
|
let t = 1, n = 16777215;
|
|
5557
5534
|
if (e.content_style && (2 === e.content_style.position ? t = 5 : 3 === e.content_style.position && (t = 4), e.content_style.color)) try {
|
|
5558
5535
|
n = parseInt(e.content_style.color, 10);
|
|
5559
5536
|
} catch (e) {}
|
|
5560
5537
|
return {
|
|
5561
|
-
id: e.id,
|
|
5538
|
+
id: e.id.toString(),
|
|
5562
5539
|
timestamp: parseInt(e.time_offset, 10) / 1000.0,
|
|
5563
5540
|
mode: t,
|
|
5564
5541
|
color: n,
|
|
@@ -5645,6 +5622,7 @@ const youkuIdSchema = schemas_object({
|
|
|
5645
5622
|
}), youkuEpisodeInfoSchema = schemas_object({
|
|
5646
5623
|
id: schemas_string(),
|
|
5647
5624
|
title: schemas_string(),
|
|
5625
|
+
seq: schemas_string().transform((e)=>parseInt(e)).optional(),
|
|
5648
5626
|
duration: schemas_string(),
|
|
5649
5627
|
category: schemas_string(),
|
|
5650
5628
|
link: schemas_string()
|
|
@@ -5688,35 +5666,49 @@ class YoukuScraper extends BaseScraper {
|
|
|
5688
5666
|
async getEpisodes(e, t) {
|
|
5689
5667
|
let n = this.parseIdString(e);
|
|
5690
5668
|
if (!n) return [];
|
|
5691
|
-
let r =
|
|
5692
|
-
|
|
5693
|
-
|
|
5694
|
-
|
|
5695
|
-
|
|
5696
|
-
|
|
5697
|
-
|
|
5698
|
-
|
|
5669
|
+
let r = 20, i = null != t ? t : 1, o = Math.max(1, Math.ceil(i / 20));
|
|
5670
|
+
try {
|
|
5671
|
+
var s, a;
|
|
5672
|
+
let e = (e)=>e.filter((e)=>!this.EPISODE_BLACKLIST_KEYWORDS.some((t)=>e.title.includes(t))), u = (e, t)=>({
|
|
5673
|
+
provider: this.providerName,
|
|
5674
|
+
episodeId: this.generateIdString({
|
|
5675
|
+
showId: n.showId,
|
|
5676
|
+
vid: e.id
|
|
5677
|
+
}),
|
|
5678
|
+
episodeTitle: e.title,
|
|
5679
|
+
episodeNumber: t
|
|
5680
|
+
}), l = await this.getEpisodesPage(n.showId, o, r), c = e(null != (s = null == l ? void 0 : l.videos) ? s : []), d = c.find((e)=>e.seq === i);
|
|
5681
|
+
if (d) return [
|
|
5682
|
+
u(d, i)
|
|
5683
|
+
];
|
|
5684
|
+
let p = Number(null != (a = null == l ? void 0 : l.total) ? a : 0), f = Math.max(1, Math.ceil(p / r)), h = Array.from({
|
|
5685
|
+
length: f
|
|
5686
|
+
}, (e, t)=>t + 1).filter((e)=>e !== o), m = [];
|
|
5687
|
+
for (let e of h){
|
|
5688
|
+
await this.sleep(500);
|
|
5689
|
+
let t = await this.getEpisodesPage(n.showId, e, r);
|
|
5690
|
+
m.push(t);
|
|
5691
|
+
}
|
|
5692
|
+
let g = e(m.flatMap((e)=>{
|
|
5693
|
+
var t;
|
|
5694
|
+
return null != (t = null == e ? void 0 : e.videos) ? t : [];
|
|
5695
|
+
})), v = [
|
|
5696
|
+
...c,
|
|
5697
|
+
...g
|
|
5698
|
+
];
|
|
5699
|
+
if (void 0 !== t) {
|
|
5700
|
+
let e = v.find((e)=>e.seq === i);
|
|
5701
|
+
return e ? [
|
|
5702
|
+
u(e, i)
|
|
5703
|
+
] : [];
|
|
5704
|
+
}
|
|
5705
|
+
return v.sort((e, t)=>{
|
|
5706
|
+
var n, r;
|
|
5707
|
+
return (null != (n = e.seq) ? n : Number.MAX_SAFE_INTEGER) - (null != (r = t.seq) ? r : Number.MAX_SAFE_INTEGER);
|
|
5708
|
+
}).map((e, t)=>u(e, t + 1));
|
|
5699
5709
|
} catch (e) {
|
|
5700
|
-
console.error(`Youku:
|
|
5701
|
-
break;
|
|
5710
|
+
return console.error(`Youku: \u{83B7}\u{53D6}\u{5206}\u{96C6}\u{5931}\u{8D25} showId=${n.showId}:`, e), [];
|
|
5702
5711
|
}
|
|
5703
|
-
let a = r.map((e, t)=>({
|
|
5704
|
-
provider: this.providerName,
|
|
5705
|
-
episodeId: this.generateIdString({
|
|
5706
|
-
showId: n.showId,
|
|
5707
|
-
vid: e.id
|
|
5708
|
-
}),
|
|
5709
|
-
episodeTitle: e.title,
|
|
5710
|
-
episodeNumber: t + 1,
|
|
5711
|
-
url: e.link
|
|
5712
|
-
}));
|
|
5713
|
-
if (void 0 !== t) {
|
|
5714
|
-
let e = a.find((e)=>e.episodeNumber === t);
|
|
5715
|
-
return e ? [
|
|
5716
|
-
e
|
|
5717
|
-
] : [];
|
|
5718
|
-
}
|
|
5719
|
-
return a;
|
|
5720
5712
|
}
|
|
5721
5713
|
async getSegments(e) {
|
|
5722
5714
|
var t;
|
|
@@ -5822,7 +5814,7 @@ class YoukuScraper extends BaseScraper {
|
|
|
5822
5814
|
})
|
|
5823
5815
|
})).data) || null == (u = l.data.result) ? void 0 : u.data.result) ? c : [];
|
|
5824
5816
|
if (console.log(`Youku: \u{83B7}\u{53D6}\u{5230}\u{5206}\u{6BB5} ${t} \u{7684}\u{5F39}\u{5E55} ${e.length} \u{6761}`), !e || 0 === e.length) return [];
|
|
5825
|
-
return
|
|
5817
|
+
return e.map((e)=>{
|
|
5826
5818
|
let t = 1, n = 16777215;
|
|
5827
5819
|
try {
|
|
5828
5820
|
let r = e.propertis;
|
|
@@ -5853,26 +5845,34 @@ class YoukuScraper extends BaseScraper {
|
|
|
5853
5845
|
].join("&")).toString().toLowerCase();
|
|
5854
5846
|
}
|
|
5855
5847
|
async ensureTokenCookie() {
|
|
5856
|
-
|
|
5857
|
-
|
|
5848
|
+
this.fetch.cookie = {};
|
|
5849
|
+
try {
|
|
5850
|
+
await this.fetch.get("https://log.mmstat.com/eg.js", {
|
|
5851
|
+
headers: {
|
|
5852
|
+
Cookie: "",
|
|
5853
|
+
"If-None-Match": ""
|
|
5854
|
+
}
|
|
5855
|
+
});
|
|
5858
5856
|
} catch (e) {
|
|
5859
5857
|
console.warn(`Youku: \u{65E0}\u{6CD5}\u{8FDE}\u{63A5}\u{5230} youku.com \u{83B7}\u{53D6} 'cna' cookie\u{3002}\u{9519}\u{8BEF}: ${e}`);
|
|
5860
5858
|
}
|
|
5861
|
-
|
|
5862
|
-
|
|
5859
|
+
try {
|
|
5860
|
+
await this.fetch.get("https://acs.youku.com/h5/mtop.com.youku.aplatform.weakget/1.0/?jsv=2.5.1&appKey=24679788");
|
|
5863
5861
|
} catch (e) {
|
|
5864
5862
|
console.error(`Youku: \u{65E0}\u{6CD5}\u{8FDE}\u{63A5}\u{5230} acs.youku.com \u{83B7}\u{53D6}\u{4EE4}\u{724C} cookie\u{3002}\u{5F39}\u{5E55}\u{83B7}\u{53D6}\u{5F88}\u{53EF}\u{80FD}\u{4F1A}\u{5931}\u{8D25}\u{3002}\u{9519}\u{8BEF}: ${e}`);
|
|
5865
5863
|
}
|
|
5866
5864
|
this.cna && this.token || console.warn(`Youku: \u{672A}\u{80FD}\u{83B7}\u{53D6}\u{5230}\u{5F39}\u{5E55}\u{7B7E}\u{540D}\u{6240}\u{9700}\u{7684}\u{5168}\u{90E8} cookie\u{3002} cna: '${this.cna}', token: '${this.token}'`);
|
|
5867
5865
|
}
|
|
5868
|
-
constructor(
|
|
5869
|
-
super(
|
|
5866
|
+
constructor(){
|
|
5867
|
+
super(), youku_define_property(this, "providerName", "youku"), youku_define_property(this, "idSchema", youkuIdSchema), youku_define_property(this, "EPISODE_BLACKLIST_KEYWORDS", [
|
|
5870
5868
|
"\u5F69\u86CB",
|
|
5871
5869
|
"\u52A0\u66F4",
|
|
5872
5870
|
"\u8D70\u5FC3",
|
|
5873
5871
|
"\u89E3\u5FE7",
|
|
5874
5872
|
"\u7EAF\u4EAB"
|
|
5875
|
-
])
|
|
5873
|
+
]), this.fetch.setHeaders({
|
|
5874
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
|
5875
|
+
});
|
|
5876
5876
|
}
|
|
5877
5877
|
}
|
|
5878
5878
|
function scrapers_define_property(e, t, n) {
|
|
@@ -5914,16 +5914,43 @@ class scrapers_Scraper {
|
|
|
5914
5914
|
}
|
|
5915
5915
|
async getSegmentWithTime() {
|
|
5916
5916
|
let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0;
|
|
5917
|
-
for(var t = arguments.length,
|
|
5918
|
-
let
|
|
5919
|
-
for (let { provider: t, idString:
|
|
5920
|
-
|
|
5921
|
-
|
|
5922
|
-
|
|
5923
|
-
|
|
5924
|
-
|
|
5917
|
+
for(var t, n = arguments.length, r = Array(n > 1 ? n - 1 : 0), i = 1; i < n; i++)r[i - 1] = arguments[i];
|
|
5918
|
+
let o = [];
|
|
5919
|
+
for (let { provider: t, idString: n } of r)o.push((async ()=>{
|
|
5920
|
+
let r = await this.getSegmentsByProvider(t, n);
|
|
5921
|
+
if (!r.length) return null;
|
|
5922
|
+
let i = this.findSegmentAtTime(r, e);
|
|
5923
|
+
if (!i) return null;
|
|
5924
|
+
let o = this.scraperMap[t];
|
|
5925
|
+
if (!o) return null;
|
|
5926
|
+
let s = await o.getComments(n, i.segmentId);
|
|
5927
|
+
return s ? {
|
|
5928
|
+
comments: s,
|
|
5929
|
+
provider: t
|
|
5930
|
+
} : null;
|
|
5925
5931
|
})());
|
|
5926
|
-
|
|
5932
|
+
let s = await Promise.all(o), a = new Map();
|
|
5933
|
+
for (let e of s)if (null == e || null == (t = e.comments) ? void 0 : t.length) for (let t of e.comments){
|
|
5934
|
+
if (!t) continue;
|
|
5935
|
+
let n = [
|
|
5936
|
+
t.mode,
|
|
5937
|
+
t.color,
|
|
5938
|
+
t.content
|
|
5939
|
+
].join("___"), r = a.get(n);
|
|
5940
|
+
r ? (t.timestamp < r.item.timestamp && (r.item = t), r.count += 1) : a.set(n, {
|
|
5941
|
+
item: t,
|
|
5942
|
+
count: 1,
|
|
5943
|
+
provider: e.provider
|
|
5944
|
+
});
|
|
5945
|
+
}
|
|
5946
|
+
let u = [];
|
|
5947
|
+
return a.forEach((e)=>{
|
|
5948
|
+
let { item: t, count: n, provider: r } = e, i = n > 1 ? `${t.content} \xd7 ${n}` : t.content;
|
|
5949
|
+
u.push({
|
|
5950
|
+
p: `${t.timestamp.toFixed(2)},${t.mode},${t.color},[${r}]`,
|
|
5951
|
+
m: i
|
|
5952
|
+
});
|
|
5953
|
+
}), u;
|
|
5927
5954
|
}
|
|
5928
5955
|
getDanmuWithSegmentTimeByVideoId(e, t) {
|
|
5929
5956
|
let n = e.split(",").map((e)=>{
|
|
@@ -5938,38 +5965,37 @@ class scrapers_Scraper {
|
|
|
5938
5965
|
async getEpisodes() {
|
|
5939
5966
|
for(var e = arguments.length, t = Array(e), n = 0; n < e; n++)t[n] = arguments[n];
|
|
5940
5967
|
let r = [];
|
|
5941
|
-
for (let { provider: e, idString: n } of t){
|
|
5968
|
+
for (let { provider: e, idString: n, episodeNumber: i } of t){
|
|
5942
5969
|
let t = this.scraperMap[e];
|
|
5943
|
-
t && r.push(t.getEpisodes(n).catch((e)=>(console.error(e), [])));
|
|
5970
|
+
t && r.push(t.getEpisodes(n, i).catch((e)=>(console.error(e), [])));
|
|
5944
5971
|
}
|
|
5945
5972
|
return (await Promise.all(r).catch((e)=>(console.error(e), []))).flat().map((e)=>({
|
|
5946
5973
|
...e,
|
|
5947
5974
|
episodeId: `${e.provider}:${e.episodeId}`
|
|
5948
5975
|
}));
|
|
5949
5976
|
}
|
|
5950
|
-
|
|
5951
|
-
|
|
5952
|
-
return "tv" === t && r ? e.filter((e)=>e.episodeNumber === r) : e;
|
|
5977
|
+
getEpisodeNumber(e, t) {
|
|
5978
|
+
if ("tv" === e && t) return parseInt(t);
|
|
5953
5979
|
}
|
|
5954
5980
|
async getDetailWithAnimeId(e, t, n) {
|
|
5955
|
-
let [r, i] = e.split(":")
|
|
5981
|
+
let [r, i] = e.split(":");
|
|
5982
|
+
return await this.getEpisodes({
|
|
5956
5983
|
provider: r,
|
|
5957
|
-
idString: i
|
|
5984
|
+
idString: i,
|
|
5985
|
+
episodeNumber: this.getEpisodeNumber(t, n)
|
|
5958
5986
|
});
|
|
5959
|
-
return this.formatEpisodeResult(o, t, n);
|
|
5960
5987
|
}
|
|
5961
5988
|
async getDetailWithDoubanId(e, t, n) {
|
|
5962
|
-
let r = await getVideoPlatformInfoByDoubanId(e.toString()), i = [];
|
|
5963
|
-
Object.entries(r.providers).forEach((e)=>{
|
|
5989
|
+
let r = await getVideoPlatformInfoByDoubanId(e.toString()), i = this.getEpisodeNumber(t, n), o = [];
|
|
5990
|
+
return Object.entries(r.providers).forEach((e)=>{
|
|
5964
5991
|
var t, n;
|
|
5965
|
-
let [r,
|
|
5966
|
-
|
|
5992
|
+
let [r, s] = e;
|
|
5993
|
+
o.push({
|
|
5967
5994
|
provider: r,
|
|
5968
|
-
idString: null != (n = null == (t = this.scraperMap[r]) ? void 0 : t.generateIdString(
|
|
5995
|
+
idString: null != (n = null == (t = this.scraperMap[r]) ? void 0 : t.generateIdString(s)) ? n : "",
|
|
5996
|
+
episodeNumber: i
|
|
5969
5997
|
});
|
|
5970
|
-
});
|
|
5971
|
-
let o = await this.getEpisodes(...i);
|
|
5972
|
-
return this.formatEpisodeResult(o, t, n);
|
|
5998
|
+
}), this.getEpisodes(...o);
|
|
5973
5999
|
}
|
|
5974
6000
|
constructor(){
|
|
5975
6001
|
scrapers_define_property(this, "scrapers", []), scrapers.forEach((e)=>{
|
|
@@ -5982,7 +6008,7 @@ WidgetMetadata = {
|
|
|
5982
6008
|
title: "\u901A\u7528\u5F39\u5E55",
|
|
5983
6009
|
description: "\u901A\u7528\u5F39\u5E55\u63D2\u4EF6\uFF0C\u652F\u6301\u817E\u8BAF\u3001\u4F18\u9177\u3001\u7231\u5947\u827A\u3001\u54D4\u54E9\u54D4\u54E9\u7B49\u5E73\u53F0",
|
|
5984
6010
|
author: "Baran",
|
|
5985
|
-
version: "0.0.
|
|
6011
|
+
version: "0.0.6",
|
|
5986
6012
|
site: "https://github.com/baranwang/forward-widgets/tree/main/packages/danmu-universe",
|
|
5987
6013
|
requiredVersion: "0.0.2",
|
|
5988
6014
|
modules: [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forward-widget/danmu-universe",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/danmu-universe.js",
|
|
6
6
|
"exports": {
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"zod": "^4.0.17"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@forward-widget/libs": "^1.8.
|
|
23
|
-
"@forward-widget/rslib-plugin": "^1.8.
|
|
22
|
+
"@forward-widget/libs": "^1.8.4",
|
|
23
|
+
"@forward-widget/rslib-plugin": "^1.8.4",
|
|
24
24
|
"@rslib/core": "^0.12.4",
|
|
25
25
|
"@rstest/core": "^0.3.1",
|
|
26
26
|
"@types/crypto-js": "^4.2.2",
|