@laplace.live/internal 1.2.57 → 1.3.1

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.
@@ -1,1739 +1,4 @@
1
- /**
2
- * The Global LAPLACE typings
3
- * Maintained by laplace.live
4
- */
5
-
6
- /** Used for brain-fucked bilibili devs */
7
- type StringBoolean = 'true' | 'false'
8
-
9
- /** Emote list */
10
- export interface SimpleEmotesList {
11
- [key: string]: SimpleEmote
12
- }
13
-
14
- /**
15
- * Used by bmotes and remote emotes
16
- */
17
- export interface SimpleEmote {
18
- url: string
19
- width?: number
20
- height?: number
21
- }
22
-
23
- /**
24
- * 用于 `DANMU` 事件中 @ 用户回复的 type
25
- * Used by:
26
- * - chat.laplace.chat
27
- */
28
- export interface DanmakuReplyProps {
29
- uid: number
30
- uname: string
31
- }
32
-
33
- /**
34
- * LAPLACE fans medal
35
- */
36
- export interface FansMedal {
37
- /**
38
- * 当没佩戴粉丝勋章时,返回 0
39
- */
40
- level: number
41
- /**
42
- * 当没佩戴粉丝勋章时,返回空字符串
43
- */
44
- name: string
45
- /**
46
- * 当前粉丝勋章的房间号,并不是所有的事件都支持,例如弹幕事件支持,礼物事件就不支持
47
- *
48
- * 不支持的时候会返回 0,返回 0 时会影响千舰、万舰的头像框和粉丝勋章图标的判断
49
- */
50
- room: number
51
- /**
52
- * 此字段通过计算事件中返回的 `uinfo.medal.guard_icon` 而来,不过 guard_icon 并不是
53
- * 所有的事件都会返回(例如大航海就返回空),因此仅作为兜底使用
54
- * 目前大航海图标只区分是否千舰,不区分万舰,只有大航海头像框区分
55
- */
56
- resolvedPerkLevel?: number
57
- /**
58
- * 粉丝勋章图标,千舰、万舰会有区别
59
- * @link https://i0.hdslb.com/bfs/live/98a201c14a64e860a758f089144dcf3f42e7038c.png
60
- * @deprecated 直接传 URL 的方式已弃用,会增大事件体积,请使用上方的 `resolvedPerkLevel` 进行判断
61
- */
62
- guardIcon?: string
63
- /**
64
- * 粉丝牌所对应主播的 UID,当 `type` 为 1 时,此时为粉丝团套票,此处的 UID 等于粉丝团 id😅
65
- */
66
- uid?: number
67
- /** Color in decimal color */
68
- // colorBorder: number;
69
- /** Color in decimal color */
70
- // colorStart: number;
71
- /** Color in decimal color */
72
- // colorEnd: number;
73
- /**
74
- * 0: 白字
75
- * 1: 总督
76
- * 2: 提督
77
- * 3: 舰长
78
- */
79
- guardType: number
80
- /**
81
- * 粉丝勋章是否点亮
82
- *
83
- * 1: 点亮
84
- * 0: 未点亮
85
- */
86
- lightened: number
87
- /**
88
- * 粉丝勋章类型,后加的属性,为了兼容性,因此为可选
89
- *
90
- * 0: 普通粉丝牌
91
- * 1: 大航海套票
92
- */
93
- type?: number
94
- }
95
-
96
- /**
97
- * b豆 emote props
98
- * @deprecated Use `SimpleBmote` instead
99
- */
100
- export interface Bmote {
101
- emoticon_id: number
102
- emoji: string
103
- descript: string
104
- url: string
105
- width: number
106
- height: number
107
- emoticon_unique: string
108
- count: number
109
- }
110
-
111
- /**
112
- * `buvid` props
113
- */
114
- export interface BuvidProps {
115
- token: string
116
- }
117
-
118
- /**
119
- * Protobuf data from danmu v2 props
120
- * @deprecated Not bilibili no longer returns protobuf
121
- */
122
- export type ProtobufDanmuV2Props = {
123
- user: {
124
- face: string
125
- }
126
- }
127
-
128
- /** 内部连接方式 */
129
- export type ConnectionModes = 'direct' | 'builtin' | 'qrcode' | 'open-platform'
130
-
131
- /**
132
- * LAPLACE 内部 typings
133
- */
134
- export declare namespace LaplaceInternal {
135
- /**
136
- * HTTP(S) 协议类型的 API
137
- */
138
- export namespace HTTPS {
139
- /**
140
- * LAPLACE Workers
141
- */
142
- export namespace Workers {
143
- /**
144
- * 获取云端弹幕机配置
145
- * /laplace/remote-config
146
- */
147
- export interface RemoteConfig {
148
- headerText?: string
149
- headerSubtitle?: string
150
- headerLink?: string
151
- headerLogo?: string
152
- headerLogoWidth?: number
153
- headerLogoHeight?: number
154
- footerExtraText?: string
155
- footerText?: string
156
- footerLink?: string
157
- }
158
-
159
- /**
160
- * Gatus status response
161
- * /laplace/network
162
- */
163
- export interface NetworkItem {
164
- /** "miscs" */
165
- group: string
166
- /** miscs_bilibili-fingerprint-reporter */
167
- key: string
168
- /** bilibili-fingerprint-reporter */
169
- name: string
170
- results: {
171
- status: number
172
- duration: number
173
- hostname?: string
174
- success: boolean
175
- /** 2024-04-28T08:22:07.19385135Z */
176
- timestamp: string
177
- errors?: string[]
178
- conditionResults?: {
179
- /** "[CERTIFICATE_EXPIRATION] > 48h" */
180
- condition: string
181
- success: boolean
182
- }[]
183
- }[]
184
- }
185
-
186
- /**
187
- * Login Sync info
188
- * A subset of `BilibiliInternal.HTTPS.Prod.LiveGetUserInfo`
189
- */
190
- export interface LoginSyncInfo {
191
- /** 0: 成功 */
192
- code: number
193
- message: string
194
- data: {
195
- isLogin: boolean
196
- face: string
197
- mid: number
198
- uname: string
199
- /** The actual `buvid` */
200
- ack: string
201
- fetchMode: 'login-sync' | 'anonymous' | 'built-in'
202
- ackMode: 'guest' | 'passthrough' | 'builtin-passthrough'
203
- fetcher: number
204
- syncServer: boolean
205
- }
206
- }
207
-
208
- /**
209
- * 获取云端表情包
210
- * /laplace/remote-emotes
211
- */
212
- export interface PspRemoteEmotesProps {
213
- /**
214
- * - 0: valid result
215
- * - 403: not valid
216
- */
217
- status: number
218
- data: {
219
- emoji: {
220
- server_base: string
221
- map: {
222
- [key: string]: string
223
- }
224
- }
225
- }
226
- }
227
-
228
- /**
229
- * 直播间排名列表,由外部 API 聚合而来
230
- * /laplace/ranking
231
- */
232
- export interface RankingItem {
233
- /**
234
- * @minimum 1
235
- */
236
- _laplace_rank: number
237
- cate: string
238
- uname: string
239
- uid: number
240
- face: string
241
- cover: string
242
- system_cover: string
243
- start_time: number
244
- roomid: number
245
- watched?: number
246
- watched_avg?: number
247
- ten_minutes_counter: number
248
- interaction_avg?: number
249
- income?: number
250
- income_avg?: number
251
- danmakus?: number
252
- danmakus_avg?: number
253
- title: string
254
- tags?: string[]
255
- commentCount?: number
256
- lastLiveIncome?: number
257
- /**
258
- * laplace/loveava 独有的热度/人气字段
259
- */
260
- count?: number
261
- /**
262
- * 平均观看人数
263
- */
264
- count_avg?: number
265
- }
266
-
267
- /** 关注 API 的数据库扩展 */
268
- interface FollowingResponseExtended extends BilibiliInternal.HTTPS.Prod.GameCenterFollowingList {
269
- /**
270
- * 最后 KV 缓存写入时间戳
271
- */
272
- last: number
273
- /**
274
- * 数据来源
275
- */
276
- from: 'cache' | 'origin'
277
- }
278
-
279
- /**
280
- * 由 vtbs 整理来的直播间开播状态
281
- */
282
- interface LiveState {
283
- name: string
284
- room: number
285
- liveStatus: number
286
- lastLive: {
287
- time: number
288
- }
289
- title: string
290
- time: number
291
- liveStartTime: number
292
- }
293
-
294
- /**
295
- * UID by Room
296
- */
297
- interface UidByRoom {
298
- /**
299
- * 0 正常,404 未找到直播间
300
- */
301
- status: 0 | 404
302
- uid: number
303
- /** 真实房间号 */
304
- roomId: number
305
- /** 短房间号 */
306
- shortRoomId: number
307
- /** 用户名 */
308
- username: string | null
309
- }
310
-
311
- /**
312
- * 哔哩哔哩装扮列表
313
- */
314
- interface Suit {
315
- id: number
316
- name: string
317
- description: string
318
- startTime: number
319
- totalPurchaseCount: number
320
- user: number
321
- username: string
322
- owner: number
323
- image_cover: string | null
324
- createdAt: string
325
- updatedAt: string
326
- ownerDetails: {
327
- id: number
328
- room: number
329
- username: string
330
- guild: null
331
- avatar: string
332
- updatedAt: string
333
- } | null
334
- }
335
-
336
- /**
337
- * 哔哩哔哩收藏集列表
338
- */
339
- interface Collection {
340
- id: number
341
- name: string
342
- description: string
343
- startTime: number
344
- relatedUsers: number[]
345
- totalPreorderCount: number
346
- totalPurchaseCount: number
347
- /** @deprecated use `lottery_image` */
348
- act_square_img: string
349
- lottery_image: string
350
- createdAt: string
351
- updatedAt: string
352
- }
353
-
354
- /**
355
- * 日程表项目
356
- * @link https://laplace.live/schedule
357
- */
358
- export interface WeekItem {
359
- /** 年份,例如 2024 */
360
- year: number
361
- /** 当前周数,例如 19 */
362
- week: number
363
- /** 哔哩哔哩动态对应 ID,只需要填入 ID 即可 */
364
- bilibili_url?: string
365
- events: EventItem[]
366
- }
367
-
368
- /**
369
- * Item of WeekItem events
370
- * 此处 type 为简化版 `string`,在 laplace 本体仓库中有详细定义
371
- */
372
- export interface EventItem {
373
- /** 日期字符串,格式 YYYY-MM-DD */
374
- date: string
375
- /** 日程类型 */
376
- type: string
377
- /** 日程标题 */
378
- title: string
379
- /** 录播链接,此应填入完整 URL */
380
- rec?: string
381
- /** 是否被取消,此字段用于 iCal 日历 */
382
- cancelled?: boolean
383
- /** 取消原因 */
384
- reason?: string
385
- /** 录播是否为第三方录入 */
386
- fans_rec?: boolean
387
- }
388
-
389
- /** 多媒体可用语言 */
390
- export type MediaLanguages = 'zh' | 'en' | 'ja' | 'yue' | 'kr' | 'ru' | 'es' | 'fr'
391
-
392
- /**
393
- * 多媒体项目
394
- */
395
- export interface MediaItem {
396
- ver: number
397
- /** 当前媒体语言,例如 `en` */
398
- lang: MediaLanguages
399
- /** 日期 */
400
- date: string
401
- /** 是否有切片,完整 URL */
402
- clips?: string
403
- /** 标题 */
404
- title: string
405
- /** alternate 名称,通常用于提供标题的无翻译原文 */
406
- altName?: string
407
- /** 是否为官方发布 */
408
- official?: boolean
409
- /** 作者/艺术家 */
410
- author: string
411
- /** 备注内容 */
412
- note?: string
413
- /** 是否为本站首发,LAPLACE 内部字段 */
414
- exclusive?: boolean
415
- /**
416
- * 标签
417
- * 如果一场直播内唱了多次同一首歌曲,会导致声称的文件名重复,用此属性定义额外后缀防止冲突
418
- */
419
- tags?: string
420
- }
421
-
422
- /**
423
- * 时间线项目
424
- * @link https://laplace.live/timeline
425
- */
426
- export interface TimelineItem {
427
- /**
428
- * - `hitokoto`: 一言
429
- * - `video`: 视频
430
- * - `event`: 事件
431
- */
432
- type: 'hitokoto' | 'video' | 'event'
433
- /** 内容 */
434
- content: string
435
- /** 事件关联人物 */
436
- from_who: string
437
- /** 是否含有音声,LAPLACE 内部字段 */
438
- hasVoice?: boolean
439
- /** 音声对应文件名,LAPLACE 内部字段 */
440
- voiceFilename?: string
441
- /** 事件发生点 */
442
- from?: string
443
- /** 事件消息来源 */
444
- source?: string
445
- /** 事件日期 */
446
- date?: string
447
- }
448
-
449
- /**
450
- * 开发日志项目
451
- * @link https://laplace.live/blog
452
- */
453
- export interface BlogItem {
454
- id: number
455
- date: string
456
- title?: string
457
- content: string | null
458
- /** 给 Atom RSS 用的纯文本输出 */
459
- plain?: string
460
- author?: string
461
- tags?: string[]
462
- }
463
-
464
- /**
465
- * SuperChat FoS
466
- * @link /laplace/superchat-fos
467
- */
468
- export interface SuperChatFoS {
469
- code: number
470
- /** 报错时会返回 */
471
- message?: string
472
- content: string
473
- moderated: boolean
474
- }
475
-
476
- /**
477
- * 用户信息
478
- * @link /laplace/bilibili-user/:uid
479
- */
480
- export interface BilibiliUser {
481
- /** 对应 UID */
482
- id: number
483
- username: string
484
- /**
485
- * 之前泄漏的工会字段
486
- *
487
- * @deprecated use `guildInfo` instead
488
- */
489
- guild: string
490
- room: number
491
- liveFansCount: number
492
- liveFansMedal: string | null
493
- avatar: string | null
494
- /** 2024-12-15T03:44:13.788Z */
495
- updatedAt: string
496
- /**
497
- * 工会详细信息
498
- *
499
- * @deprecated use `guildInfo` instead
500
- */
501
- guildDetails: {
502
- id: number
503
- name: string
504
- } | null
505
- /** 工会详细信息 */
506
- guildInfo: {
507
- /**
508
- * @deprecated use `history` instead, latest guild is now migrated to history in Sep 25, 2025, 4:51:27 AM PDT
509
- */
510
- current: {
511
- name: string
512
- /** Unix timestamp
513
- *
514
- * @example 1758039520166
515
- */
516
- updatedAt: number
517
- } | null
518
- history: {
519
- name: string
520
- /** Unix timestamp
521
- *
522
- * @example 1758039520166
523
- */
524
- updatedAt: number
525
- }[]
526
- } | null
527
- /** MCN 机构详细信息 (mcnId is internal-only, not exposed in public API) */
528
- mcnInfo: {
529
- history: {
530
- /** MCN agency name */
531
- mcnName: string
532
- /** Unix timestamp
533
- *
534
- * @example 1758039520166
535
- */
536
- updatedAt: number
537
- }[]
538
- } | null
539
- /** Resolved tags with usage counts. Only present when `?fields=tags` is requested. */
540
- tags?: LaplaceInternal.HTTPS.Workers.TagWithCount[]
541
- }
542
-
543
- /**
544
- * 列表哔哩哔哩用户(分页)
545
- * @link /laplace/bilibili-users
546
- *
547
- * Query params:
548
- * - `?page=1` — page number (min 1, default 1)
549
- * - `?pageSize=100` — items per page (1–500, default 100)
550
- * - `?all=true` — return all rows without pagination
551
- * - `?tags=1,2,3` — filter to users who have all listed tag IDs (AND)
552
- * - `?search=keyword` — filter by UID (exact) or username (case-insensitive partial match)
553
- */
554
- export interface ListBilibiliUsers {
555
- data: ListBilibiliUsersItem[]
556
- total: number
557
- }
558
-
559
- /**
560
- * Single user item returned by the list endpoint.
561
- *
562
- * Differs from {@link BilibiliUser} (single-user endpoint) because the list
563
- * query returns raw DB rows without relation joins or sanitization:
564
- * - `guild` is a raw numeric FK (not a resolved name string)
565
- * - `tags` is a raw `int[]` (not resolved {@link TagWithCount} objects)
566
- * - `mcnInfo.history` entries include `mcnId` (stripped in single-user endpoint)
567
- * - No `guildDetails` relation (only present when joined via single-user query)
568
- */
569
- export interface ListBilibiliUsersItem {
570
- id: number
571
- room: number | null
572
- username: string
573
- liveFansCount: number | null
574
- liveFansMedal: string | null
575
- liveStatus: number | null
576
- /** @deprecated use `guildInfo` instead */
577
- guild: number | null
578
- avatar: string | null
579
- guildInfo: {
580
- history: {
581
- name: string
582
- /** Unix timestamp */
583
- updatedAt: number
584
- }[]
585
- } | null
586
- mcnInfo: {
587
- history: {
588
- mcnId: number
589
- mcnName: string
590
- /** Unix timestamp */
591
- updatedAt: number
592
- }[]
593
- } | null
594
- /** Raw integer tag IDs assigned to this user */
595
- tags: number[] | null
596
- /** ISO 8601 timestamp */
597
- updatedAt: string
598
- }
599
-
600
- // ============================================
601
- // Tag Types
602
- // ============================================
603
-
604
- /** Tag definition (viewer-facing, no internal fields) */
605
- export interface Tag {
606
- id: number
607
- name: string
608
- color: string | null
609
- /** Emoji fallback -- shown when `icon` is not set. When both exist, `icon` takes priority. */
610
- emoji: string | null
611
- /** Icon URL -- takes priority over `emoji` when both are set. */
612
- icon: string | null
613
- description: string | null
614
- }
615
-
616
- /** Tag with usage count (viewer-facing, entity type is not exposed) */
617
- export interface TagWithCount extends Tag {
618
- /** Number of entities using this tag, computed on-the-fly for the requested entity type. */
619
- count: number
620
- }
621
-
622
- /** Full tag definition (admin-facing, includes internal fields) */
623
- export interface TagAdmin extends Tag {
624
- scope: string[] | null
625
- /** Per-entity-type usage counts, computed on-the-fly. Keys are entity type names (e.g. `bilibili_user`, `bilibili_meme`). */
626
- entityCounts: Record<string, number>
627
- createdAt: string
628
- updatedAt: string
629
- }
630
-
631
- /** Request body for POST /laplace/tags (create tag) */
632
- export interface TagCreateRequest {
633
- name: string
634
- color?: string
635
- emoji?: string
636
- icon?: string
637
- description?: string
638
- scope?: string[]
639
- }
640
-
641
- /** Request body for PATCH /laplace/tags/:id (update tag) */
642
- export interface TagUpdateRequest {
643
- name?: string
644
- color?: string | null
645
- emoji?: string | null
646
- icon?: string | null
647
- description?: string | null
648
- scope?: string[] | null
649
- }
650
-
651
- /** Request body for POST /laplace/tags/assign (assign tags to entity) */
652
- export interface TagAssignRequest {
653
- tagIds: number[]
654
- entityType: string
655
- entityId: number
656
- }
657
-
658
- /** Request body for DELETE /laplace/tags/assign (unassign tags from entity) */
659
- export interface TagUnassignRequest {
660
- tagIds: number[]
661
- entityType: string
662
- entityId: number
663
- }
664
-
665
- /**
666
- * 礼物配置信息
667
- */
668
- export interface RoomGiftItem extends BilibiliInternal.HTTPS.Prod.RoomGiftItemPick {
669
- /** 出现的时间 */
670
- firstSeen?: Date
671
- /** 出现的直播间 */
672
- firstSeenRoom?: number
673
- }
674
-
675
- /**
676
- * 礼物配置列表
677
- * @link /bilibili/room-gift-config/25034104?list=1
678
- */
679
- export interface RoomGiftConfigList {
680
- code: number
681
- message: string
682
- ttl: number
683
- gift_ttl: number
684
- gift_version: number
685
- data: {
686
- list: RoomGiftItem[]
687
- }
688
- }
689
-
690
- /**
691
- * 获取直播分区列表
692
- * @link /bilibili/live-areas
693
- */
694
- export interface LiveAreas {
695
- /** 0 代表成功 */
696
- code: number
697
- /** 成功时返回 "success" */
698
- message: string
699
- /** 直播分区列表 */
700
- data: LiveAreaItem[]
701
- }
702
-
703
- /**
704
- * 直播分区项
705
- */
706
- export interface LiveAreaItem {
707
- /** 分区 ID */
708
- id: string
709
- /** 分区名称 */
710
- name: string
711
- /** 父分区 ID */
712
- parentId: string
713
- /** 父分区名称 */
714
- parentName: string
715
- /** 完整分区名称,格式为 `${parentName}-${name}` */
716
- cate: string
717
- /** 分区图标 URL */
718
- icon: string
719
- }
720
-
721
- /**
722
- * Response interface for the transformed LiveGiftEffect data
723
- * Used by frontend to consume the simplified gift effect data
724
- * @example /bilibili/live-gift-effect/25034104
725
- */
726
- export interface LiveGiftEffect {
727
- code: number
728
- message: string
729
- data: LiveGiftEffectItem[]
730
- }
731
-
732
- /**
733
- * Simplified gift effect item with only necessary fields
734
- */
735
- export interface LiveGiftEffectItem {
736
- type: number
737
- id: number
738
- bind_gift_ids: number[]
739
- video: string
740
- /** json config URL, only the hash part */
741
- json: string
742
- }
743
-
744
- /**
745
- * Successful response for guild members list
746
- * @example /laplace/bilibili-guilds/:guildName
747
- */
748
- export interface ListGuildMembers {
749
- success: true
750
- guild: string
751
- count: number
752
- members: LaplaceInternal.HTTPS.Workers.BilibiliUser[]
753
- }
754
-
755
- /**
756
- * Error response when guild is not found
757
- * @example /laplace/bilibili-guilds/:guildName
758
- */
759
- export interface ListGuildMembersNotFound {
760
- success: false
761
- error: string
762
- guild: string
763
- }
764
-
765
- /**
766
- * Request body for guild info update
767
- * @example POST /laplace/guild-update
768
- */
769
- export interface UpdateGuildInfoRequest {
770
- uid: number
771
- guildName: string
772
- updatedAt?: number
773
- }
774
-
775
- /**
776
- * Successful response for guild info update
777
- * @example POST /laplace/guild-update
778
- */
779
- export interface UpdateGuildInfoResponse {
780
- success: true
781
- message: string
782
- uid: number
783
- guildName: string
784
- updatedAt: number
785
- }
786
-
787
- /**
788
- * Error response for guild info update
789
- * @example POST /laplace/guild-update
790
- */
791
- export interface UpdateGuildInfoError {
792
- success: false
793
- error: string
794
- uid?: number
795
- details?: string
796
- }
797
-
798
- // ============================================
799
- // Fertility Cycle Types
800
- // ============================================
801
-
802
- /**
803
- * Fertility status enum values
804
- *
805
- * @since Jan 29, 2026
806
- * @example GET /bilibili/fertility/:uid
807
- * @example GET /bilibili/fertilities
808
- */
809
- export type FertilityStatus = 'menstruating' | 'fertile' | 'ovulating' | 'normal'
810
-
811
- /**
812
- * A single cycle history entry - tracks each period event
813
- * Stored in the `cycleHistory` JSONB column
814
- */
815
- export interface CycleHistoryItem {
816
- /** Unix timestamp (ms) - when this period started */
817
- periodStart: number
818
- /** Optional: days this period lasted (user may not track) */
819
- periodLength?: number
820
- /** Unix timestamp (ms) - when this entry was recorded */
821
- submittedAt: number
822
- /** Optional: URL or description of the evidence source (e.g., livestream clip, tweet) */
823
- source?: string
824
- }
825
-
826
- /**
827
- * Result of fertility status calculation
828
- * Returned by calculateFertilityStatus utility
829
- */
830
- export interface CycleCalculationResult {
831
- status: FertilityStatus
832
- /** Current day in the menstrual cycle (1-indexed) */
833
- dayInCycle: number
834
- /** Calculated from history or user-stated preference */
835
- effectiveCycleLength: number
836
- /** Calculated from history or user-stated preference */
837
- effectivePeriodLength: number
838
- /** Calculated ovulation day (cycleLength - 14) */
839
- ovulationDay: number
840
- /** Predicted next period start date */
841
- nextPeriod: Date
842
- /** How many history entries used for calculation */
843
- dataPoints: number
844
- }
845
-
846
- /**
847
- * Response for GET /bilibili/fertility/:uid
848
- */
849
- export interface FertilityUserResponse {
850
- uid: number
851
- user: {
852
- username: string
853
- avatar: string | null
854
- room: number | null
855
- /** 0 = offline, 1 = live, 2 = rotating */
856
- liveStatus: number | null
857
- /** Number of live room membership */
858
- liveFansCount: number | null
859
- /** Guild membership info */
860
- guildInfo: {
861
- history: {
862
- name: string
863
- /** Unix timestamp in milliseconds */
864
- updatedAt: number
865
- }[]
866
- } | null
867
- /** MCN agency membership info */
868
- mcnInfo: {
869
- history: {
870
- /** MCN agency ID */
871
- mcnId: number
872
- /** MCN agency name */
873
- mcnName: string
874
- /** Unix timestamp in milliseconds */
875
- updatedAt: number
876
- }[]
877
- } | null
878
- } | null
879
- status: FertilityStatus
880
- dayInCycle: number
881
- ovulationDay: number
882
- /** ISO date string (YYYY-MM-DD) */
883
- nextPeriod: string
884
- effectiveCycleLength: number
885
- effectivePeriodLength: number
886
- dataPoints: number
887
- userPreferences: {
888
- cycleLength: number
889
- periodLength: number
890
- }
891
- history: CycleHistoryItem[]
892
- }
893
-
894
- /**
895
- * Single user item in list response
896
- * @example GET /bilibili/fertilities
897
- */
898
- export interface FertilityListItem {
899
- uid: number
900
- user: {
901
- username: string
902
- avatar: string | null
903
- room: number | null
904
- /** 0 = offline, 1 = live, 2 = rotating */
905
- liveStatus: number | null
906
- /** Number of live room followers */
907
- liveFansCount: number | null
908
- /** Guild membership info */
909
- guildInfo: {
910
- history: {
911
- name: string
912
- /** Unix timestamp in milliseconds */
913
- updatedAt: number
914
- }[]
915
- } | null
916
- /** MCN agency membership info */
917
- mcnInfo: {
918
- history: {
919
- /** MCN agency ID */
920
- mcnId: number
921
- /** MCN agency name */
922
- mcnName: string
923
- /** Unix timestamp in milliseconds */
924
- updatedAt: number
925
- }[]
926
- } | null
927
- } | null
928
- status: FertilityStatus
929
- dayInCycle: number
930
- /** Expected ovulation day in cycle (effectiveCycleLength - 14) */
931
- ovulationDay: number
932
- /** ISO date string (YYYY-MM-DD) */
933
- nextPeriod: string
934
- /** Calculated cycle length based on history (median) or user preference */
935
- effectiveCycleLength: number
936
- /** Calculated period length based on history (mean) or user preference */
937
- effectivePeriodLength: number
938
- /** Number of history entries used for calculation */
939
- dataPoints: number
940
- }
941
-
942
- /**
943
- * Response for GET /bilibili/fertilities
944
- */
945
- export interface FertilityListResponse {
946
- data: FertilityListItem[]
947
- total: number
948
- }
949
-
950
- /**
951
- * Request body for POST /bilibili/fertility-submit
952
- */
953
- export interface FertilitySubmitRequest {
954
- /** Bilibili user ID */
955
- uid: number
956
- /** Unix timestamp (ms) when period started */
957
- periodStart: number
958
- /** Optional: How many days this period lasted (1-15) */
959
- periodLength?: number
960
- /** Optional: Update user's preferred cycle length (15-60) */
961
- cycleLength?: number
962
- /** Optional: Evidence URL (must be a valid URL, max 256 chars) */
963
- source?: string
964
- }
965
-
966
- /**
967
- * Success response for POST /bilibili/fertility-submit
968
- */
969
- export interface FertilitySubmitResponse {
970
- success: true
971
- uid: number
972
- historyCount: number
973
- /** ISO timestamp string */
974
- lastPeriodStart: string
975
- }
976
-
977
- // ============================================
978
- // Fertility Cycle Entry Management (Admin)
979
- // ============================================
980
-
981
- /**
982
- * Request body for PATCH /laplace/fertility-entry/:uid
983
- * Updates a specific history entry identified by originalPeriodStart
984
- */
985
- export interface FertilityEntryUpdateRequest {
986
- /** Required: periodStart of the entry to update (identifier) */
987
- originalPeriodStart: number
988
- /** Optional: New periodStart value (Unix timestamp ms) */
989
- periodStart?: number
990
- /** Optional: Period length (1-15 days), or null to clear */
991
- periodLength?: number | null
992
- /** Optional: Evidence URL, or null to clear */
993
- source?: string | null
994
- }
995
-
996
- /**
997
- * Request body for DELETE /laplace/fertility-entry/:uid
998
- * Deletes a specific history entry identified by periodStart
999
- */
1000
- export interface FertilityEntryDeleteRequest {
1001
- /** Required: periodStart of the entry to delete */
1002
- periodStart: number
1003
- }
1004
-
1005
- /**
1006
- * Response for PATCH/DELETE /laplace/fertility-entry/:uid
1007
- */
1008
- export interface FertilityEntryActionResponse {
1009
- success: true
1010
- uid: number
1011
- historyCount: number
1012
- /** ISO timestamp string */
1013
- lastPeriodStart: string
1014
- }
1015
-
1016
- // ============================================
1017
- // Fertility Contribution Types (Anonymous Submissions)
1018
- // ============================================
1019
-
1020
- /**
1021
- * Status of a fertility contribution
1022
- */
1023
- export type ContributionStatus = 'pending' | 'approved' | 'rejected'
1024
-
1025
- /**
1026
- * Request body for POST /laplace/fertility-contribute
1027
- * Anonymous users submit period data with Turnstile verification
1028
- */
1029
- export interface FertilityContributeRequest {
1030
- /** Bilibili user ID */
1031
- uid: number
1032
- /** Unix timestamp (ms) when period started */
1033
- periodStart: number
1034
- /** Optional: How many days this period lasted (1-15) */
1035
- periodLength?: number
1036
- /** Optional: Update user's preferred cycle length (15-60) */
1037
- cycleLength?: number
1038
- /** Evidence URL (required, must be HTTP/HTTPS, max 256 chars) */
1039
- source: string
1040
- /** Cloudflare Turnstile token for bot verification */
1041
- turnstileToken: string
1042
- }
1043
-
1044
- /**
1045
- * A fertility contribution record
1046
- * Returned by GET /laplace/fertility-contributions
1047
- */
1048
- export interface FertilityContribution {
1049
- id: number
1050
- uid: number
1051
- periodStart: number
1052
- periodLength?: number
1053
- cycleLength?: number
1054
- source?: string
1055
- status: ContributionStatus
1056
- contributorIp?: string
1057
- /** ISO timestamp string */
1058
- createdAt: string
1059
- /** ISO timestamp string */
1060
- reviewedAt?: string
1061
- rejectReason?: string
1062
- }
1063
-
1064
- /**
1065
- * Query parameters for GET /laplace/fertility-contributions
1066
- */
1067
- export interface FertilityContributionsListQuery {
1068
- /** Filter by status */
1069
- status?: ContributionStatus
1070
- /** Filter by target user UID */
1071
- uid?: number
1072
- /** Maximum number of results (1-500, default: 100) */
1073
- limit?: number
1074
- /** Offset for pagination (default: 0) */
1075
- offset?: number
1076
- /** Field to sort by (default: 'createdAt') */
1077
- sortBy?: 'createdAt' | 'reviewedAt'
1078
- /** Sort order (default: 'desc') */
1079
- sort?: 'asc' | 'desc'
1080
- }
1081
-
1082
- /**
1083
- * Response for GET /laplace/fertility-contributions
1084
- */
1085
- export interface FertilityContributionsListResponse {
1086
- data: FertilityContribution[]
1087
- total: number
1088
- }
1089
-
1090
- /**
1091
- * Success response for POST /laplace/fertility-contribute
1092
- */
1093
- export interface FertilityContributeResponse {
1094
- success: true
1095
- id: number
1096
- message: string
1097
- }
1098
-
1099
- /**
1100
- * Request body for POST /laplace/fertility-contribution-reject/:id
1101
- */
1102
- export interface FertilityContributionRejectRequest {
1103
- reason?: string
1104
- }
1105
-
1106
- /**
1107
- * Response for approve/reject endpoints
1108
- */
1109
- export interface FertilityContributionActionResponse {
1110
- success: true
1111
- id: number
1112
- status: ContributionStatus
1113
- }
1114
-
1115
- /**
1116
- * Request body for PATCH /laplace/fertility-contribution-update/:id
1117
- * All fields are optional - only provided fields will be updated
1118
- */
1119
- export interface FertilityContributionUpdateRequest {
1120
- /** Bilibili user ID */
1121
- uid?: number
1122
- /** Unix timestamp (ms) when period started */
1123
- periodStart?: number
1124
- /** How many days this period lasted (1-15), or null to clear */
1125
- periodLength?: number | null
1126
- /** User's preferred cycle length (15-60), or null to clear */
1127
- cycleLength?: number | null
1128
- /** Evidence URL (must be HTTP/HTTPS, max 256 chars), or null to remove */
1129
- source?: string | null
1130
- }
1131
-
1132
- /**
1133
- * Response for PATCH /laplace/fertility-contribution-update/:id
1134
- */
1135
- export interface FertilityContributionUpdateResponse {
1136
- success: true
1137
- id: number
1138
- contribution?: FertilityContribution
1139
- }
1140
-
1141
- /**
1142
- * Response for GET /laplace/fertility-contribution-stats
1143
- * Public endpoint showing contribution statistics
1144
- */
1145
- export interface FertilityContributionStatsResponse {
1146
- pending: number
1147
- approved: number
1148
- rejected: number
1149
- total: number
1150
- /** Average time from submission to approval/rejection in milliseconds */
1151
- avgProcessingTimeMs: number | null
1152
- /** Average time from submission to approval/rejection in hours (1 decimal) */
1153
- avgProcessingTimeHours: number | null
1154
- }
1155
-
1156
- // ============================================
1157
- // Meme Types
1158
- // ============================================
1159
-
1160
- /** Meme list item with resolved tags and user info (GET /laplace/memes) */
1161
- export interface Meme {
1162
- id: number
1163
- uid: number
1164
- content: string
1165
- tags: TagWithCount[]
1166
- copyCount: number
1167
- createdAt: string
1168
- updatedAt: string
1169
- }
1170
-
1171
- /** Meme with user details (list response item) */
1172
- export interface MemeWithUser extends Meme {
1173
- username: string | null
1174
- avatar: string | null
1175
- room: number | null
1176
- }
1177
-
1178
- /** Query params for GET /laplace/memes */
1179
- export interface MemeListQuery {
1180
- uid?: number
1181
- tags?: number[]
1182
- sortBy?: 'copyCount' | 'createdAt'
1183
- sort?: 'asc' | 'desc'
1184
- limit?: number
1185
- offset?: number
1186
- }
1187
-
1188
- /** Response for GET /laplace/memes */
1189
- export interface MemeListResponse {
1190
- data: MemeWithUser[]
1191
- total: number
1192
- }
1193
-
1194
- /** Request body for POST /laplace/memes (admin direct add) */
1195
- export interface MemeCreateRequest {
1196
- uid: number
1197
- content: string
1198
- }
1199
-
1200
- /** Request body for PATCH /laplace/memes/:id (update approved meme) */
1201
- export interface MemeUpdateRequest {
1202
- content?: string
1203
- tags?: number[] | null
1204
- }
1205
-
1206
- /** Response for POST /laplace/memes and DELETE /laplace/memes/:id (admin only) */
1207
- export interface MemeActionResponse {
1208
- success: true
1209
- id: number
1210
- }
1211
-
1212
- /** Request body for POST /laplace/meme-contribute */
1213
- export interface MemeContributeRequest {
1214
- uid: number
1215
- content: string
1216
- note?: string
1217
- /** Existing tag IDs to suggest for this meme (max 10) */
1218
- tags?: number[]
1219
- turnstileToken: string
1220
- }
1221
-
1222
- /** Success response for POST /laplace/meme-contribute */
1223
- export interface MemeContributeResponse {
1224
- success: true
1225
- id: number
1226
- message: string
1227
- }
1228
-
1229
- /** Meme contribution record (GET /laplace/meme-contributions) */
1230
- export interface MemeContribution {
1231
- id: number
1232
- uid: number
1233
- content: string
1234
- note?: string | null
1235
- tags?: number[] | null
1236
- status: ContributionStatus
1237
- contributorIp?: string
1238
- createdAt: string
1239
- reviewedAt?: string
1240
- rejectReason?: string
1241
- }
1242
-
1243
- /** Query params for GET /laplace/meme-contributions */
1244
- export interface MemeContributionsListQuery {
1245
- status?: ContributionStatus
1246
- uid?: number
1247
- limit?: number
1248
- offset?: number
1249
- sortBy?: 'createdAt' | 'reviewedAt'
1250
- sort?: 'asc' | 'desc'
1251
- }
1252
-
1253
- /** Response for GET /laplace/meme-contributions */
1254
- export interface MemeContributionsListResponse {
1255
- data: MemeContribution[]
1256
- total: number
1257
- }
1258
-
1259
- /** Request body for POST /laplace/meme-contribution-reject/:id */
1260
- export interface MemeContributionRejectRequest {
1261
- reason?: string
1262
- }
1263
-
1264
- /** Response for approve/reject meme contribution */
1265
- export interface MemeContributionActionResponse {
1266
- success: true
1267
- id: number
1268
- status: ContributionStatus
1269
- }
1270
-
1271
- /** Request body for PATCH /laplace/meme-contribution-update/:id */
1272
- export interface MemeContributionUpdateRequest {
1273
- uid?: number
1274
- content?: string
1275
- note?: string | null
1276
- tags?: number[] | null
1277
- }
1278
-
1279
- /** Response for PATCH /laplace/meme-contribution-update/:id */
1280
- export interface MemeContributionUpdateResponse {
1281
- success: true
1282
- id: number
1283
- contribution?: MemeContribution
1284
- }
1285
-
1286
- /** Response for GET /laplace/meme-contribution-stats */
1287
- export interface MemeContributionStatsResponse {
1288
- pending: number
1289
- approved: number
1290
- rejected: number
1291
- total: number
1292
- avgProcessingTimeMs: number | null
1293
- avgProcessingTimeHours: number | null
1294
- }
1295
-
1296
- /** Response for POST /laplace/meme-copy/:id */
1297
- export interface MemeCopyResponse {
1298
- success: true
1299
- id: number
1300
- copyCount: number
1301
- }
1302
-
1303
- // ============================================
1304
- // Guild History Types
1305
- // ============================================
1306
-
1307
- /**
1308
- * A single guild history entry - tracks each guild membership change
1309
- * Stored in the `guildInfo.history` JSONB column on bilibili_users table
1310
- */
1311
- export interface GuildHistoryItem {
1312
- /** Guild name */
1313
- name: string
1314
- /** Unix timestamp (ms) - when this guild membership was recorded */
1315
- updatedAt: number
1316
- }
1317
-
1318
- // ============================================
1319
- // MCN History Types
1320
- // ============================================
1321
-
1322
- /**
1323
- * A single MCN agency history entry - tracks each MCN membership change
1324
- * Stored in the `mcnInfo.history` JSONB column on bilibili_users table
1325
- */
1326
- export interface McnHistoryItem {
1327
- /** MCN agency ID */
1328
- mcnId: number
1329
- /** MCN agency name */
1330
- mcnName: string
1331
- /** Unix timestamp (ms) - when this MCN membership was recorded */
1332
- updatedAt: number
1333
- }
1334
-
1335
- /**
1336
- * Response for GET /laplace/guild-entry/:uid
1337
- * Returns guild history for a specific user
1338
- */
1339
- export interface GuildHistoryResponse {
1340
- success: true
1341
- uid: number
1342
- user: {
1343
- id: number
1344
- username: string
1345
- avatar: string | null
1346
- room: number | null
1347
- }
1348
- history: GuildHistoryItem[]
1349
- historyCount: number
1350
- }
1351
-
1352
- /**
1353
- * Request body for POST /laplace/guild-entry/:uid
1354
- * Adds a new guild history entry
1355
- */
1356
- export interface GuildEntryAddRequest {
1357
- /** Guild name (max 100 chars, no special characters) */
1358
- name: string
1359
- /** Optional: Unix timestamp (ms) - defaults to current time */
1360
- updatedAt?: number
1361
- }
1362
-
1363
- /**
1364
- * Request body for PATCH /laplace/guild-entry/:uid
1365
- * Updates a specific guild history entry identified by originalUpdatedAt
1366
- */
1367
- export interface GuildEntryUpdateRequest {
1368
- /** Required: updatedAt of the entry to update (identifier) */
1369
- originalUpdatedAt: number
1370
- /** Optional: New guild name */
1371
- name?: string
1372
- /** Optional: New timestamp (Unix timestamp ms) */
1373
- updatedAt?: number
1374
- }
1375
-
1376
- /**
1377
- * Request body for DELETE /laplace/guild-entry/:uid
1378
- * Deletes a specific guild history entry identified by updatedAt
1379
- */
1380
- export interface GuildEntryDeleteRequest {
1381
- /** Required: updatedAt of the entry to delete */
1382
- updatedAt: number
1383
- }
1384
-
1385
- /**
1386
- * Response for POST/PATCH/DELETE /laplace/guild-entry/:uid
1387
- */
1388
- export interface GuildEntryActionResponse {
1389
- success: true
1390
- uid: number
1391
- historyCount: number
1392
- }
1393
-
1394
- // ============================================
1395
- // MCN Batch Update Types
1396
- // ============================================
1397
-
1398
- /**
1399
- * A single entry in the MCN batch update request
1400
- * Maps to the raw export format from the MCN agency data (laplace-scripts)
1401
- */
1402
- export interface McnBatchUpdateEntry {
1403
- /** User's Bilibili UID (maps to bilibili_users.id) */
1404
- upper_mid: number
1405
- /** MCN agency ID */
1406
- mcn_id: number
1407
- /** MCN agency company name */
1408
- mcn_company_name: string
1409
- }
1410
-
1411
- /**
1412
- * Request body for POST /laplace/mcn-batch-update
1413
- * Batch updates MCN info for multiple users (max 10,000 entries)
1414
- */
1415
- export interface McnBatchUpdateRequest {
1416
- entries: McnBatchUpdateEntry[]
1417
- }
1418
-
1419
- /**
1420
- * Response for POST /laplace/mcn-batch-update
1421
- */
1422
- export interface McnBatchUpdateResponse {
1423
- success: true
1424
- /** Total entries received */
1425
- total: number
1426
- /** Count of users whose mcnInfo was changed */
1427
- updated: number
1428
- /** UIDs whose mcnInfo was changed (new MCN or MCN change) */
1429
- updatedUids: number[]
1430
- /** Count of users whose MCN matched the latest history entry (no-op) */
1431
- unchanged: number
1432
- /** UIDs whose MCN matched the latest history entry (no-op) */
1433
- unchangedUids: number[]
1434
- /** Count of UIDs not found in bilibili_users */
1435
- skipped: number
1436
- /** List of missing UIDs */
1437
- skippedUids: number[]
1438
- }
1439
-
1440
- // ============================================
1441
- // Guild Batch Update Types
1442
- // ============================================
1443
-
1444
- /**
1445
- * A single entry in the guild batch update request
1446
- * Maps to the raw export format from the agency data
1447
- */
1448
- export interface GuildBatchUpdateEntry {
1449
- /** User's Bilibili UID (maps to bilibili_users.id) */
1450
- upper_mid: number
1451
- /** Guild name (null if user is not in any guild) */
1452
- live_guild_name: string | null
1453
- }
1454
-
1455
- /**
1456
- * Request body for POST /laplace/guild-batch-update
1457
- * Batch updates guild info for multiple users (max 10,000 entries)
1458
- */
1459
- export interface GuildBatchUpdateRequest {
1460
- entries: GuildBatchUpdateEntry[]
1461
- }
1462
-
1463
- /**
1464
- * Response for POST /laplace/guild-batch-update
1465
- */
1466
- export interface GuildBatchUpdateResponse {
1467
- success: true
1468
- /** Total entries received */
1469
- total: number
1470
- /** Count of users whose guildInfo was changed */
1471
- updated: number
1472
- /** UIDs whose guildInfo was changed (new guild or guild change) */
1473
- updatedUids: number[]
1474
- /** Count of users whose guild matched the latest history entry (no-op) */
1475
- unchanged: number
1476
- /** UIDs whose guild matched the latest history entry (no-op) */
1477
- unchangedUids: number[]
1478
- /** Count of UIDs not found in bilibili_users */
1479
- skipped: number
1480
- /** List of missing UIDs */
1481
- skippedUids: number[]
1482
- }
1483
- }
1484
-
1485
- /** Migrated from experiments.sparanoid.net */
1486
- export namespace Experiments {
1487
- /**
1488
- * fixer.io API
1489
- * @link http://data.fixer.io/api/latest?access_key=
1490
- * */
1491
- interface Fixer {
1492
- success: boolean
1493
- timestamp: number
1494
- base: string
1495
- date: string
1496
- rates: FixerRates
1497
- }
1498
-
1499
- /** Props of Fixer */
1500
- interface FixerRates {
1501
- [key: string]: number
1502
- }
1503
-
1504
- /**
1505
- * Spotify API
1506
- */
1507
- export namespace Spotify {
1508
- /**
1509
- * Spotify get access token
1510
- * @link https://developer.spotify.com/documentation/web-api/tutorials/getting-started
1511
- */
1512
- interface Token {
1513
- access_token: string
1514
- token_type: 'Bearer'
1515
- expires_in: 3600
1516
- }
1517
-
1518
- /**
1519
- * Search result
1520
- */
1521
- export interface Search {
1522
- tracks: Tracks
1523
- }
1524
-
1525
- /** Track list of `Search` */
1526
- export interface Tracks {
1527
- href: string
1528
- items: Track[] | []
1529
- limit: number
1530
- next: string | null
1531
- offset: number
1532
- previous: null
1533
- total: number
1534
- }
1535
-
1536
- /** Track item of `Tracks` */
1537
- export interface Track {
1538
- album: Album
1539
- artists: Artist[]
1540
- available_markets: string[]
1541
- disc_number: number
1542
- duration_ms: number
1543
- explicit: boolean
1544
- external_ids: ExternalIDS
1545
- external_urls: ExternalUrls
1546
- href: string
1547
- id: string
1548
- is_local: boolean
1549
- name: string
1550
- popularity: number
1551
- preview_url: null
1552
- track_number: number
1553
- type: string
1554
- uri: string
1555
- }
1556
-
1557
- /** Album item of `Track` */
1558
- export interface Album {
1559
- album_type: string
1560
- artists: Artist[]
1561
- available_markets: string[]
1562
- external_urls: ExternalUrls
1563
- href: string
1564
- id: string
1565
- images: Image[] | []
1566
- name: string
1567
- release_date: Date
1568
- release_date_precision: string
1569
- total_tracks: number
1570
- type: string
1571
- uri: string
1572
- }
1573
-
1574
- /** Artist props */
1575
- export interface Artist {
1576
- external_urls: ExternalUrls
1577
- href: string
1578
- id: string
1579
- name: string
1580
- type: string
1581
- uri: string
1582
- }
1583
-
1584
- /** External URLs */
1585
- export interface ExternalUrls {
1586
- spotify: string
1587
- }
1588
-
1589
- /** 专辑封面 */
1590
- export interface Image {
1591
- height: number
1592
- url: string
1593
- width: number
1594
- }
1595
-
1596
- /** External IDs */
1597
- export interface ExternalIDS {
1598
- isrc: string
1599
- }
1600
- }
1601
-
1602
- /** Apple API */
1603
- export namespace Apple {
1604
- /** Apple Music API */
1605
- export interface Music {
1606
- results: MusicSearchResults
1607
- meta: MusicSearchMeta
1608
- }
1609
-
1610
- /** Props of `Music` */
1611
- export interface MusicSearchMeta {
1612
- results: MusicSearchMetaResults
1613
- }
1614
-
1615
- /** Props of `MusicSearchMeta` */
1616
- export interface MusicSearchMetaResults {
1617
- order: string[]
1618
- rawOrder: string[]
1619
- }
1620
-
1621
- /** Props of `Music` */
1622
- export interface MusicSearchResults {
1623
- songs: Songs
1624
- }
1625
-
1626
- /** Props of `Songs` */
1627
- export interface Songs {
1628
- href: string
1629
- next: string
1630
- data: Datum[]
1631
- }
1632
-
1633
- /** Props of `Datum` */
1634
- export interface Datum {
1635
- id: string
1636
- type: string
1637
- href: string
1638
- attributes: Attributes
1639
- }
1640
-
1641
- /** Props of `Attributes` */
1642
- export interface Attributes {
1643
- albumName: string
1644
- genreNames: string[]
1645
- trackNumber: number
1646
- durationInMillis: number
1647
- releaseDate: Date
1648
- isrc: string
1649
- artwork: Artwork
1650
- playParams: PlayParams
1651
- url: string
1652
- discNumber: number
1653
- hasCredits: boolean
1654
- isAppleDigitalMaster: boolean
1655
- hasLyrics: boolean
1656
- name: string
1657
- previews: Preview[]
1658
- artistName: string
1659
- composerName?: string
1660
- }
1661
-
1662
- /** Props of `Attributes` */
1663
- export interface Artwork {
1664
- width: number
1665
- height: number
1666
- url: string
1667
- bgColor: string
1668
- textColor1: string
1669
- textColor2: string
1670
- textColor3: string
1671
- textColor4: string
1672
- }
1673
-
1674
- /** Props of `Attributes` */
1675
- export interface PlayParams {
1676
- id: string
1677
- kind: string
1678
- }
1679
-
1680
- /** Props of `Attributes` */
1681
- export interface Preview {
1682
- url: string
1683
- }
1684
- }
1685
-
1686
- /**
1687
- * Address Completion
1688
- * @link /experiments/address-completion
1689
- */
1690
- export interface AddressCompletion {
1691
- code: number
1692
- /** 报错时会返回 */
1693
- message?: string
1694
- data: {
1695
- /** 地址信息,通常为 `poiInfo` + `houseInfo` */
1696
- addrInfo: string
1697
- /** 门牌号,通常为 address line 2 */
1698
- houseInfo: string
1699
- /** 详细地址,通常为 address line 1 */
1700
- poiInfo: string
1701
- /** 街道 */
1702
- street: string
1703
- /** 城市 */
1704
- city: string
1705
- /** 地区 */
1706
- district: string
1707
- /** 省 */
1708
- province: string
1709
- /** 收件人 */
1710
- person: string
1711
- /** 手机/电话 */
1712
- phone: string
1713
- }
1714
- }
1715
- }
1716
- }
1717
-
1718
- /**
1719
- * WebSocket 协议
1720
- */
1721
- export namespace WebSocket {
1722
- /**
1723
- * 线上环境
1724
- */
1725
- export namespace Prod {
1726
- /**
1727
- * 内置系统消息
1728
- */
1729
- export interface SYSTEM_MSG {
1730
- timestamp: number
1731
- username?: string
1732
- message?: string
1733
- }
1734
- }
1735
- }
1736
- }
1
+ import type { StringBoolean } from '../common'
1737
2
 
1738
3
  /**
1739
4
  * 哔哩哔哩内部 typings
@@ -6058,6 +4323,8 @@ export declare namespace BilibiliInternal {
6058
4323
  cid: number
6059
4324
  /** 视频分辨率 */
6060
4325
  dimension: VideoMetaDimension
4326
+ /** 合集 ID */
4327
+ season_id?: number
6061
4328
  premiere: null
6062
4329
  /** 青少年模式,`1` 为开启 */
6063
4330
  teenage_mode: number
@@ -6077,7 +4344,7 @@ export declare namespace BilibiliInternal {
6077
4344
  pages: VideoMetaPage[]
6078
4345
  /** 字幕信息 */
6079
4346
  subtitle: VideoMetaSubtitle
6080
- label: { type: number }
4347
+ label?: { type: number }
6081
4348
  /** 是否为合集展示 */
6082
4349
  is_season_display: boolean
6083
4350
  /** 用户装扮信息 */
@@ -6086,7 +4353,7 @@ export declare namespace BilibiliInternal {
6086
4353
  url_image_ani_cut: string
6087
4354
  }
6088
4355
  /** 荣誉信息 */
6089
- honor_reply: { honor: VideoMetaHonor[] }
4356
+ honor_reply: { honor?: VideoMetaHonor[] }
6090
4357
  like_icon: string
6091
4358
  need_jump_bv: boolean
6092
4359
  disable_show_up_info: boolean
@@ -9069,908 +7336,3 @@ export declare namespace BilibiliInternal {
9069
7336
  }
9070
7337
  }
9071
7338
  }
9072
-
9073
- /**
9074
- * vtbs.moe API
9075
- */
9076
- export declare namespace Vtbs {
9077
- /**
9078
- * VUP 列表,经过筛选的,并非 vtbs 官方列表,由 vtb 和 vdb 聚合而来
9079
- * @link https://github.com/sparanoid/vup.json
9080
- */
9081
- export interface VupListItem {
9082
- uid: number
9083
- name: string
9084
- type: string
9085
- room: number | null
9086
- face: string
9087
- group_name: string
9088
- }
9089
-
9090
- /**
9091
- * 根据 vup list 增强后的数据
9092
- */
9093
- export interface EnrichedGlobalGuardItem extends GlobalGuardItem {
9094
- uid: number
9095
- _t1: number
9096
- _t2: number
9097
- _t3: number
9098
- _price_t1: number
9099
- _price_t2: number
9100
- _price_t3: number
9101
- _price_sum: number
9102
- ddEnriched: VupListItem[][]
9103
- }
9104
-
9105
- /**
9106
- * dd 大航海
9107
- */
9108
- export interface GlobalGuard {
9109
- [key: string]: GlobalGuardItem
9110
- }
9111
-
9112
- /**
9113
- * dd 大航海 item
9114
- * @link https://api.vtbs.moe/v1/guard/all
9115
- * @link https://api.vtbs.moe/v1/guard/some
9116
- */
9117
- export interface GlobalGuardItem {
9118
- uname: string
9119
- face: string
9120
- mid: number
9121
- dd: [number[], number[], number[]]
9122
- }
9123
-
9124
- /**
9125
- * 大航海历史 chart
9126
- */
9127
- export interface LiveGuardsHistoryItem {
9128
- guardNum: number
9129
- time: number
9130
- }
9131
-
9132
- /**
9133
- * 直播间详细信息
9134
- */
9135
- export interface LiveDetails {
9136
- mid: number
9137
- uuid: string
9138
- uname: string
9139
- video: number
9140
- roomid: number
9141
- sign: string
9142
- notice: string
9143
- face: string
9144
- rise: number
9145
- topPhoto: string
9146
- archiveView: number
9147
- follower: number
9148
- liveStatus: number
9149
- recordNum: number
9150
- guardNum: number
9151
- lastLive: {
9152
- online: number
9153
- time: number
9154
- }
9155
- guardChange: number
9156
- /**
9157
- * 总督,提督,舰长
9158
- */
9159
- guardType: [number, number, number]
9160
- online: number
9161
- title: string
9162
- time: number
9163
- liveStartTime: number
9164
- }
9165
- }
9166
-
9167
- /**
9168
- * danmakus.com API
9169
- * @link https://ukamnads.icu/swagger
9170
- */
9171
- export declare namespace Danmakus {
9172
- /**
9173
- * 直播实时排行榜
9174
- * @link https://ukamnads.icu/api/v2/living
9175
- */
9176
- export interface RankingProps {
9177
- /**
9178
- * 200: success
9179
- */
9180
- code: number
9181
- message: string
9182
- data: RankingItem[]
9183
- }
9184
-
9185
- /** Item of `RankingProps` */
9186
- export interface RankingItem {
9187
- uId: number
9188
- uName: string
9189
- roomId: number
9190
- faceUrl: string
9191
- frameUrl: string
9192
- isLiving: boolean
9193
- title: string
9194
- tags: string[]
9195
- lastLiveDate: number
9196
- lastLiveDanmakuCount: number
9197
- totalDanmakuCount: number
9198
- totalIncome: {
9199
- value: string
9200
- type: 'Big Number'
9201
- }
9202
- totalLiveCount: number
9203
- totalLiveSecond: number
9204
- addDate: Date
9205
- /** can be empty in some rare case due to some program error */
9206
- livingInfo?: LiveItem
9207
- commentCount: number
9208
- lastLiveIncome: number
9209
- }
9210
-
9211
- /**
9212
- * 频道信息(直播记录列表)
9213
- * @link https://ukamnads.icu/api/v2/channel?uId=2132180406
9214
- */
9215
- export interface ChannelProps {
9216
- /**
9217
- * 200: success
9218
- */
9219
- code: number
9220
- message: string
9221
- data: ChannelData
9222
- }
9223
-
9224
- /** Data of `ChannelProps` */
9225
- export interface ChannelData {
9226
- channel: ChannelInfoProps
9227
- lives: LiveItem[]
9228
- extra?: {
9229
- fansHistory: {
9230
- archiveView: number
9231
- follower: number
9232
- time: number
9233
- }[]
9234
- guardHistory: {
9235
- guardNum: number
9236
- areaRank: number
9237
- time: number
9238
- }[]
9239
- }
9240
- }
9241
-
9242
- /** Props of `ChannelData` */
9243
- export interface ChannelInfoProps {
9244
- uId: number
9245
- uName: string
9246
- roomId: number
9247
- faceUrl: string
9248
- frameUrl: string
9249
- isLiving: boolean
9250
- title: string
9251
- tags: string[]
9252
- lastLiveDate: number
9253
- lastLiveDanmakuCount: number
9254
- totalDanmakuCount: number
9255
- totalIncome: number
9256
- totalLiveCount: number
9257
- totalLiveSecond: number
9258
- addDate: Date
9259
- commentCount: number
9260
- lastLiveIncome: number
9261
- }
9262
-
9263
- /** General live stream item */
9264
- export interface LiveItem {
9265
- liveId: string
9266
- isFinish: boolean
9267
- isFull: boolean
9268
- parentArea: string
9269
- area: string
9270
- coverUrl: string
9271
- danmakusCount: number
9272
- startDate: number
9273
- stopDate: number
9274
- title: string
9275
- totalIncome: number
9276
- watchCount: number
9277
- likeCount: number
9278
- payCount: number
9279
- interactionCount: number
9280
- onlineRank: number
9281
- maxOnlineCount: number
9282
- }
9283
-
9284
- /** General danmaku event props */
9285
- export interface DanmakuProps {
9286
- uId: number
9287
- uName: string
9288
- /**
9289
- * - 0: 普通消息
9290
- * - 1: 礼物
9291
- * - 2: 上舰
9292
- * - 3: SuperChat
9293
- * - 4: 进入直播间
9294
- * - 5: 标题变动
9295
- * - 6: 分区变动
9296
- * - 7: 直播中止
9297
- * - 8: 直播继续
9298
- * - 9: 用户封禁
9299
- */
9300
- type: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
9301
- sendDate: number
9302
- message: string
9303
- price: number
9304
- ct: string
9305
- count: number
9306
- }
9307
-
9308
- /** Extra props for live item */
9309
- export interface ExtraProps {
9310
- wordCloud: { [key: string]: number }
9311
- onlineRank: { [key: string]: number }
9312
- blockUsers: number[]
9313
- }
9314
-
9315
- /**
9316
- * 单场直播信息
9317
- * @link https://ukamnads.icu/api/v2/live?liveid=cafc0eb5-a79a-4a0d-b283-3360b6a1a814&includeExtra=true
9318
- */
9319
- export interface LiveProps {
9320
- /**
9321
- * 200: success
9322
- */
9323
- code: number
9324
- message: string
9325
- data: LiveData
9326
- }
9327
-
9328
- /** Data of `LiveProps` */
9329
- export interface LiveData {
9330
- total: number
9331
- pageNum: number
9332
- pageSize: number
9333
- hasMore: boolean
9334
- data: {
9335
- channel: ChannelInfoProps
9336
- live: {
9337
- liveId: string
9338
- isFinish: boolean
9339
- isFull: boolean
9340
- parentArea: string
9341
- area: string
9342
- coverUrl: string
9343
- danmakusCount: number
9344
- startDate: number
9345
- stopDate: number
9346
- title: string
9347
- totalIncome: number
9348
- watchCount: number
9349
- likeCount: number
9350
- payCount: number
9351
- interactionCount: number
9352
- onlineRank: number
9353
- maxOnlineCount: number
9354
- extra: ExtraProps
9355
- }
9356
- danmakus: DanmakuProps[]
9357
- }
9358
- }
9359
-
9360
- /**
9361
- * 用户看过的主播
9362
- * @link https://ukamnads.icu/api/v2/user/watchedChannels?uid=2132180406
9363
- */
9364
- export interface WatchedChannels {
9365
- /**
9366
- * 200: success
9367
- */
9368
- code: number
9369
- message: string
9370
- data: WatchedChannelsItem[]
9371
- }
9372
-
9373
- /** Item of `WatchedChannels` */
9374
- export interface WatchedChannelsItem {
9375
- uId: number
9376
- uName: string
9377
- roomId: number
9378
- faceUrl: string
9379
- frameUrl: string
9380
- isLiving: boolean
9381
- title: string
9382
- tags: string[]
9383
- lastLiveDate: number
9384
- lastLiveDanmakuCount: number
9385
- totalDanmakuCount: number
9386
- totalIncome: number
9387
- totalLiveCount: number
9388
- totalLiveSecond: number
9389
- addDate: Date
9390
- commentCount: number
9391
- lastLiveIncome: number
9392
- }
9393
-
9394
- /**
9395
- * 用户观看/事件记录
9396
- */
9397
- export interface User {
9398
- code: number
9399
- message: string
9400
- data: UserData
9401
- }
9402
-
9403
- /** Data of `User` */
9404
- export interface UserData {
9405
- total: number
9406
- pageNum: number
9407
- pageSize: number
9408
- hasMore: boolean
9409
- data: {
9410
- records: UserDataRecordsItem[]
9411
- }
9412
- }
9413
-
9414
- /** Item of `UserData` */
9415
- export interface UserDataRecordsItem {
9416
- channel: WatchedChannelsItem
9417
- live: LiveItem
9418
- danmakus: DanmakuProps[]
9419
- }
9420
- }
9421
-
9422
- export declare namespace Aicu {
9423
- /**
9424
- * Root API response
9425
- *
9426
- * @example
9427
- * {
9428
- * code: 0,
9429
- * data: { ... },
9430
- * message: "",
9431
- * ttl: 1
9432
- * }
9433
- * @link https://api.aicu.cc/api/v3/search/getlivedm?uid=32210417&pn=1&ps=100&keyword=
9434
- */
9435
- export interface LiveDm {
9436
- /** Status code, 0 indicates success */
9437
- code: number
9438
-
9439
- /** Main payload */
9440
- data: {
9441
- /**
9442
- * List of room + danmu records
9443
- *
9444
- * @example
9445
- * [
9446
- * {
9447
- * roominfo: { ... },
9448
- * danmu: [ ... ]
9449
- * }
9450
- * ]
9451
- */
9452
- list: {
9453
- /**
9454
- * Room metadata
9455
- *
9456
- * @example
9457
- * {
9458
- * upname: "五条悟跳舞",
9459
- * upuid: "32210417",
9460
- * roomid: "2156755",
9461
- * roomname: "让俺移动端看看怎么个事儿"
9462
- * }
9463
- */
9464
- roominfo: {
9465
- /** Streamer display name */
9466
- upname: string
9467
-
9468
- /** Streamer UID (stringified number) */
9469
- upuid: string
9470
-
9471
- /** Room ID (stringified number) */
9472
- roomid: string
9473
-
9474
- /** Room title */
9475
- roomname: string
9476
- }
9477
-
9478
- /**
9479
- * Danmu (chat messages) sent in this room
9480
- *
9481
- * @example
9482
- * [
9483
- * { uname: "五条悟跳舞", text: "666", ts: 1766410063 }
9484
- * ]
9485
- */
9486
- danmu: {
9487
- /** Username of the sender */
9488
- uname: string
9489
-
9490
- /**
9491
- * Message content
9492
- * Can be plain text or emoticon codes like "[Icomochi_萌萌]"
9493
- */
9494
- text: string
9495
-
9496
- /**
9497
- * Unix timestamp (seconds)
9498
- *
9499
- * @example
9500
- * 1767347950
9501
- */
9502
- ts: number
9503
- }[]
9504
- }[]
9505
-
9506
- /**
9507
- * Pagination cursor info
9508
- *
9509
- * @example
9510
- * {
9511
- * is_end: false,
9512
- * all_count: 180
9513
- * }
9514
- */
9515
- cursor: {
9516
- /**
9517
- * Whether this is the last page
9518
- *
9519
- * @example false
9520
- */
9521
- is_end: boolean
9522
-
9523
- /**
9524
- * Total available records
9525
- *
9526
- * @example 180
9527
- */
9528
- all_count: number
9529
- }
9530
- }
9531
-
9532
- /** Optional message, usually empty on success */
9533
- message: string
9534
-
9535
- /** Cache TTL in seconds */
9536
- ttl: number
9537
- }
9538
- }
9539
-
9540
- /**
9541
- * vup.loveava.top API
9542
- */
9543
- export declare namespace LoveAvA {
9544
- /** 直播实时排行 */
9545
- export interface RankingProps {
9546
- /**
9547
- * 0: success
9548
- */
9549
- code: number
9550
- /**
9551
- * `'success'`
9552
- */
9553
- message: string
9554
- data: {
9555
- rooms: RankingItem[]
9556
- ctime: number
9557
- }
9558
- }
9559
-
9560
- /** Item of `RankingProps` */
9561
- export interface RankingItem {
9562
- roomid: number
9563
- uid: number
9564
- title: string
9565
- uname: string
9566
- system_cover: string
9567
- cover: string
9568
- face: string
9569
- parent_id: number
9570
- parent_name: string
9571
- area_id: number
9572
- area_name: string
9573
- area_v2_parent_id: number
9574
- area_v2_parent_name: string
9575
- area_v2_id: number
9576
- area_v2_name: string
9577
- start_time: number
9578
- /**
9579
- * 热度,danmakus 没有
9580
- */
9581
- count: number
9582
- ten_minutes_counter: number
9583
- }
9584
- }
9585
-
9586
- /**
9587
- * Zeroroku API
9588
- */
9589
- export declare namespace Zeroroku {
9590
- /**
9591
- * 被知名 UP 关注
9592
- */
9593
- export interface FamousFansItem {
9594
- name: string
9595
- mid: number
9596
- face: string
9597
- fans: number
9598
- }
9599
-
9600
- /**
9601
- * /fans-history API 中粉丝数项目
9602
- */
9603
- export interface FansItem {
9604
- fans: number
9605
- created_at: string
9606
- date: string
9607
- }
9608
- }
9609
-
9610
- /**
9611
- * Aliyun API
9612
- */
9613
- export declare namespace Aliyun {
9614
- /**
9615
- * 物流面单信息提取
9616
- * @url https://help.aliyun.com/zh/address-purification/addrpapi/developer-reference/logistics-information-extraction
9617
- */
9618
- export interface ExtractExpress {
9619
- RequestId: string
9620
- /** 正常时返回 */
9621
- Data?: string
9622
- /** 报错时返回 */
9623
- Code?: string
9624
- /** 报错时返回 */
9625
- Message?: string
9626
- /** 报错时返回 */
9627
- HostId?: string
9628
- /** 报错时返回 */
9629
- Recommend?: string
9630
- }
9631
-
9632
- /**
9633
- * Need JSON.parse() to get from `ExtractExpress.Data`
9634
- */
9635
- export interface ExtractExpressData {
9636
- /** 提取内容,当传入的地址无效时,会直接返回空对象 */
9637
- express_extract:
9638
- | {
9639
- house_info: string
9640
- poi_info: string
9641
- town: string
9642
- city: string
9643
- district: string
9644
- /** 电话号码 */
9645
- tel: string
9646
- /** 地址信息 */
9647
- addr_info: string
9648
- /** 姓名 */
9649
- per: string
9650
- prov: string
9651
- }
9652
- // biome-ignore lint/complexity/noBannedTypes: expected empty object
9653
- | {}
9654
- /** 状态,'OK',当传入的地址无效时,依然返回 OK 😅 */
9655
- status: string
9656
- /** 算法处理耗时 */
9657
- time_used: {
9658
- rt: {
9659
- basic_chunking: number
9660
- segment: number
9661
- address_correct: number
9662
- complete: number
9663
- express_extract: number
9664
- address_search: number
9665
- structure: number
9666
- }
9667
- start: number
9668
- }
9669
- }
9670
- }
9671
-
9672
- /**
9673
- * Kuaidi100 API
9674
- */
9675
- export declare namespace Kuaidi100 {
9676
- /**
9677
- * 地址解析
9678
- */
9679
- export interface AddressResolution {
9680
- code: number
9681
- data: {
9682
- taskId: string
9683
- result: {
9684
- /** 用户输入的地址 */
9685
- content: string
9686
- mobile: number[]
9687
- /** 姓名 */
9688
- name: string
9689
- /** 解析后的地址 */
9690
- address: string
9691
- xzq: {
9692
- /** 完整地址:广东省,深圳市,南山区 */
9693
- fullName: string
9694
- /** 本字段将返回省份简称,例如:广东 */
9695
- province: string
9696
- /** 本字段返回市级行政区简称,例如:深圳市 */
9697
- city: string
9698
- /** 本字段返回区县简称,例如:南山区 */
9699
- district: string
9700
- /** 详细地址 */
9701
- subArea: string
9702
- /** 行政区父节点编码 */
9703
- parentCode: string
9704
- /** 行政区编码 */
9705
- code: string
9706
- /** 行政区级别 */
9707
- level: 3
9708
- }
9709
- }[]
9710
- }
9711
- /** 是否成功,`success` */
9712
- message: string
9713
- /** 通常为 0,时间,可忽略 */
9714
- time: number
9715
- /** true提交成功,false失败 */
9716
- success: boolean
9717
- }
9718
-
9719
- /**
9720
- * /fans-history API 中粉丝数项目
9721
- */
9722
- export interface FansItem {
9723
- fans: number
9724
- created_at: string
9725
- date: string
9726
- }
9727
- }
9728
-
9729
- /**
9730
- * Steam Store API
9731
- * @link https://store.steampowered.com/api/appdetails
9732
- */
9733
- export declare namespace SteamInternal {
9734
- /**
9735
- * Steam Store appdetails API response, keyed by appid string
9736
- * @link https://store.steampowered.com/api/appdetails?appids={appid}
9737
- * @example /steam/game-meta/730
9738
- */
9739
- export interface GameMeta {
9740
- [appid: string]: {
9741
- /** Whether the lookup was successful */
9742
- success: boolean
9743
- /** Absent when `success` is `false` */
9744
- data?: GameMetaData
9745
- }
9746
- }
9747
-
9748
- /** App detail data */
9749
- export interface GameMetaData {
9750
- /**
9751
- * App type
9752
- * @example "game"
9753
- */
9754
- type: string
9755
- /** App name @example "Counter-Strike 2" */
9756
- name: string
9757
- /** Steam App ID @example 730 */
9758
- steam_appid: number
9759
- /** Minimum age requirement, `0` for no restriction @example 0 */
9760
- required_age: number
9761
- /** Whether the app is free to play */
9762
- is_free: boolean
9763
- /** DLC app IDs @example [2678630] */
9764
- dlc?: number[]
9765
- /** Full HTML description */
9766
- detailed_description: string
9767
- /** HTML about section */
9768
- about_the_game: string
9769
- /** Short text description */
9770
- short_description: string
9771
- /** Supported languages in HTML format */
9772
- supported_languages: string
9773
- /** Header image URL @example "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/730/header.jpg" */
9774
- header_image: string
9775
- /** Capsule image URL (231x87) */
9776
- capsule_image: string
9777
- /** Capsule image URL v5 (184x69) */
9778
- capsule_imagev5: string
9779
- /** Official website URL, `null` if not set @example "http://counter-strike.net/" */
9780
- website: string | null
9781
- /** PC system requirements, empty array `[]` when not available */
9782
- pc_requirements: GameMetaRequirements | []
9783
- /** Mac system requirements, empty array `[]` when not available */
9784
- mac_requirements: GameMetaRequirements | []
9785
- /** Linux system requirements, empty array `[]` when not available */
9786
- linux_requirements: GameMetaRequirements | []
9787
- /** Legal notice text @example "© 2024 ambr, Inc." */
9788
- legal_notice?: string
9789
- /** Developer names @example ["Valve"] */
9790
- developers: string[]
9791
- /** Publisher names @example ["Valve"] */
9792
- publishers: string[]
9793
- /** Package IDs available for purchase */
9794
- packages: number[]
9795
- /** Purchase option groups */
9796
- package_groups: GameMetaPackageGroup[]
9797
- /** Platform availability */
9798
- platforms: GameMetaPlatforms
9799
- /** Category tags (multi-player, workshop, etc.) */
9800
- categories: GameMetaCategory[]
9801
- /** Genre classifications */
9802
- genres: GameMetaGenre[]
9803
- /** Screenshots */
9804
- screenshots: GameMetaScreenshot[]
9805
- /** Trailer videos */
9806
- movies?: GameMetaMovie[]
9807
- /** User recommendations */
9808
- recommendations?: { total: number }
9809
- /** Achievements info */
9810
- achievements?: GameMetaAchievements
9811
- /** Release date info */
9812
- release_date: GameMetaReleaseDate
9813
- /** Support contact info */
9814
- support_info: { url: string; email: string }
9815
- /** Store page background image URL */
9816
- background: string
9817
- /** Raw background image URL */
9818
- background_raw: string
9819
- /** Content descriptor IDs and notes */
9820
- content_descriptors: GameMetaContentDescriptors
9821
- /** Price overview, absent for free games */
9822
- price_overview?: GameMetaPriceOverview
9823
- /** Metacritic score, absent if not rated */
9824
- metacritic?: GameMetaMetacritic
9825
- /** Age ratings by region */
9826
- ratings?: Record<string, GameMetaRating>
9827
- /**
9828
- * Controller support level
9829
- * @example "full"
9830
- */
9831
- controller_support?: string
9832
- /** Demo app IDs */
9833
- demos?: { appid: number; description: string }[]
9834
- }
9835
-
9836
- /** System requirements (minimum and optionally recommended) */
9837
- export interface GameMetaRequirements {
9838
- /** Minimum requirements in HTML */
9839
- minimum: string
9840
- /** Recommended requirements in HTML */
9841
- recommended?: string
9842
- }
9843
-
9844
- export interface GameMetaPackageGroup {
9845
- /** @example "default" */
9846
- name: string
9847
- /** @example "Buy Counter-Strike 2" */
9848
- title: string
9849
- description: string
9850
- /** @example "Select a purchase option" */
9851
- selection_text: string
9852
- save_text: string
9853
- display_type: number
9854
- is_recurring_subscription: string
9855
- subs: GameMetaPackageSub[]
9856
- }
9857
-
9858
- export interface GameMetaPackageSub {
9859
- /** Package ID @example 298963 */
9860
- packageid: number
9861
- /** @example " " */
9862
- percent_savings_text: string
9863
- /** Discount percentage, `0` for no discount */
9864
- percent_savings: number
9865
- /** @example "Counter-Strike 2 - Free" */
9866
- option_text: string
9867
- option_description: string
9868
- can_get_free_license: string
9869
- is_free_license: boolean
9870
- /** Price in cents with discount applied @example 0 */
9871
- price_in_cents_with_discount: number
9872
- }
9873
-
9874
- export interface GameMetaPlatforms {
9875
- windows: boolean
9876
- mac: boolean
9877
- linux: boolean
9878
- }
9879
-
9880
- export interface GameMetaCategory {
9881
- /** @example 1 */
9882
- id: number
9883
- /** @example "Multi-player" */
9884
- description: string
9885
- }
9886
-
9887
- export interface GameMetaGenre {
9888
- /** @example "1" */
9889
- id: string
9890
- /** @example "Action" */
9891
- description: string
9892
- }
9893
-
9894
- export interface GameMetaScreenshot {
9895
- /** Screenshot index @example 0 */
9896
- id: number
9897
- /** Thumbnail URL (600x338) */
9898
- path_thumbnail: string
9899
- /** Full size URL (1920x1080) */
9900
- path_full: string
9901
- }
9902
-
9903
- export interface GameMetaMovie {
9904
- /** Movie ID @example 256972298 */
9905
- id: number
9906
- /** @example "Launch Trailer" */
9907
- name: string
9908
- /** Thumbnail URL */
9909
- thumbnail: string
9910
- /** DASH AV1 manifest URL */
9911
- dash_av1: string
9912
- /** DASH H.264 manifest URL */
9913
- dash_h264: string
9914
- /** HLS H.264 master playlist URL */
9915
- hls_h264: string
9916
- /** Whether this is a highlighted trailer */
9917
- highlight: boolean
9918
- }
9919
-
9920
- export interface GameMetaAchievements {
9921
- /** Total number of achievements @example 1 */
9922
- total: number
9923
- /** Featured achievements shown on the store page */
9924
- highlighted: {
9925
- name: string
9926
- path: string
9927
- }[]
9928
- }
9929
-
9930
- export interface GameMetaReleaseDate {
9931
- /** Whether the game is unreleased */
9932
- coming_soon: boolean
9933
- /** Formatted release date @example "21 Aug, 2012" */
9934
- date: string
9935
- }
9936
-
9937
- export interface GameMetaContentDescriptors {
9938
- /** Content descriptor IDs @example [2, 5] */
9939
- ids: number[]
9940
- /** @example "Includes intense violence and blood." */
9941
- notes: string | null
9942
- }
9943
-
9944
- export interface GameMetaPriceOverview {
9945
- /** Currency code @example "USD" */
9946
- currency: string
9947
- /** Original price in cents @example 5999 */
9948
- initial: number
9949
- /** Final price in cents after discount @example 5999 */
9950
- final: number
9951
- /** Discount percentage, `0` for no discount */
9952
- discount_percent: number
9953
- /** Formatted original price @example "$59.99" */
9954
- initial_formatted: string
9955
- /** Formatted final price @example "$59.99" */
9956
- final_formatted: string
9957
- }
9958
-
9959
- export interface GameMetaMetacritic {
9960
- /** Metacritic score @example 83 */
9961
- score: number
9962
- /** Metacritic page URL */
9963
- url: string
9964
- }
9965
-
9966
- export interface GameMetaRating {
9967
- rating: string
9968
- /** Age rating descriptors */
9969
- descriptors?: string
9970
- /** Whether rating was auto-generated */
9971
- rating_generated?: string
9972
- required_age?: string
9973
- banned?: string
9974
- use_age_gate?: string
9975
- }
9976
- }