@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 CHANGED
@@ -19,7 +19,7 @@
19
19
 
20
20
  ### 一键安装
21
21
 
22
- [![Forward Widget](https://img.shields.io/badge/dynamic/json?url=http%3A%2F%2Funpkg.com%2F%40forward-widget%2Fdanmu-universe%2Fpackage.json&query=%24.version&prefix=%E9%80%9A%E7%94%A8%E5%BC%B9%E5%B9%95%20v&style=flat-square&label=Forward%20Widget&labelColor=black)](forward://widget?url=https%3A%2F%2Funpkg.com%2F%40forward-widget%2Fdanmu-universe)
22
+ [![Forward Widget](https://img.shields.io/badge/dynamic/json?url=http%3A%2F%2Funpkg.com%2F%40forward-widget%2Fdanmu-universe%2Fpackage.json&query=%24.version&prefix=%E9%80%9A%E7%94%A8%E5%BC%B9%E5%B9%95%20v&style=flat-square&label=Forward%20Widget&labelColor=black)](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)
@@ -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], S = e[t + 14], E = 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, S, 17, a[14]), O = l(O, I, $, z, E, 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, E, 14, a[22]), O = c(O, I, $, z, m, 20, a[23]), z = c(z, O, I, $, _, 5, a[24]), $ = c($, z, O, I, S, 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, S, 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, E, 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, S, 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, E, 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;
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, ...c } = s;
4051
- console.debug("fetch", t, a, c);
4052
- let d = o ? Widget.http.get(t, c) : Widget.http.post(t, a, c);
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
- d,
4057
+ f,
4055
4058
  this.createTimeoutPromise(u)
4056
- ]) : d;
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 this.formatComments(a, (e)=>{
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 i = await this.fetch.get(`https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=${t}&pid=${e}&segment_index=${n}`, {
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 === i.statusCode || 304 === i.statusCode) return r;
4400
- let o = this.DmSegMobileReply.decode(base64ToUint8Array(i.data));
4401
- r.push(...o.elems);
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 r;
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 ? this.formatComments(c, (e)=>{
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 ? this.formatComments(r, (e)=>{
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 = [], i = 1, o = 20, s = 0;
5692
- for(;;)try {
5693
- let e = await this.getEpisodesPage(n.showId, i, o);
5694
- if (!e || !e.videos || 0 === e.videos.length) break;
5695
- 1 === i && e.total && (s = e.total);
5696
- let a = e.videos.filter((e)=>!this.EPISODE_BLACKLIST_KEYWORDS.some((t)=>e.title.includes(t)));
5697
- if (r.push(...a), r.length >= s || e.videos.length < o || t && r.length >= t) break;
5698
- i++, await this.sleep(300);
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: Failed to get episodes page ${i} for media_id ${n.showId}:`, e);
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 this.formatComments(e, (e)=>{
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
- if (!this.cna) try {
5857
- console.debug("Youku: 'cna' cookie \u672A\u627E\u5230, \u6B63\u5728\u8BBF\u95EE youku.com \u4EE5\u83B7\u53D6..."), await this.fetch.get("https://log.mmstat.com/eg.js");
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
- if (!this.token) try {
5862
- console.debug("Youku: '_m_h5_tk' cookie \u672A\u627E\u5230, \u6B63\u5728\u4ECE acs.youku.com \u8BF7\u6C42..."), await this.fetch.get("https://acs.youku.com/h5/mtop.com.youku.aplatform.weakget/1.0/?jsv=2.5.1&appKey=24679788");
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(...e){
5869
- super(...e), youku_define_property(this, "providerName", "youku"), youku_define_property(this, "idSchema", youkuIdSchema), youku_define_property(this, "EPISODE_BLACKLIST_KEYWORDS", [
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, n = Array(t > 1 ? t - 1 : 0), r = 1; r < t; r++)n[r - 1] = arguments[r];
5918
- let i = [];
5919
- for (let { provider: t, idString: r } of n)i.push((async ()=>{
5920
- var n;
5921
- let i = await this.getSegmentsByProvider(t, r);
5922
- if (!i.length) return [];
5923
- let o = this.findSegmentAtTime(i, e);
5924
- return o ? null == (n = this.scraperMap[t]) ? void 0 : n.getComments(r, o.segmentId) : [];
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
- return (await Promise.all(i)).flat();
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
- formatEpisodeResult(e, t, n) {
5951
- let r = n ? parseInt(null != n ? n : "") : void 0;
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(":"), o = await this.getEpisodes({
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, o] = e;
5966
- i.push({
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(o)) ? n : ""
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.4",
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.4",
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.3",
23
- "@forward-widget/rslib-plugin": "^1.8.3",
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",