Repository navigation
Expand file tree
/
Copy pathMissAV 3.0.js
More file actions
2249 lines (2014 loc) · 104 KB
/
Copy pathMissAV 3.0.js
File metadata and controls
2249 lines (2014 loc) · 104 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
WidgetMetadata = {
id: "Missav",
title: "MissAV_ovo",
author: "𝙈𝙖𝙠𝙠𝙖𝙋𝙖𝙠𝙠𝙖|CC|EL|Eric|墨白",
description: "MissAV 视频聚合模块,支持其他模块聚合missav资源、支持高清海报、封面图、预告片、相似推荐、演员信息及头像",
version: "3.0.1",
requiredVersion: "0.0.1",
site: "https://missav.ai",
modules: [
{
title: "最近更新",
functionName: "loadRecentUpdates",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" }
]
},
{
title: "中文字幕",
functionName: "loadList",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" },
{ name: "endpoint", title: "endpoint", type: "enumeration", value: "dm278/cn/chinese-subtitle", enumOptions: [{ title: "中文字幕", value: "dm278/cn/chinese-subtitle" }] },
{ name: "filters", title: "中文字幕筛选", type: "enumeration", value: "", enumOptions: [
{ title: "所有", value: "" },
{ title: "单人作品", value: "individual" },
{ title: "多人作品", value: "multiple" },
{ title: "中文字幕", value: "chinese-subtitle" }
] },
{ name: "sort_by", title: "排序", type: "enumeration", value: "released_at", enumOptions: getSortOptions() }
]
},
{
title: "日本AV",
functionName: "loadList",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" },
{ name: "endpoint", title: "endpoint", type: "enumeration", value: "dm632/cn/release", enumOptions: [
{ title: "最新发布", value: "dm632/cn/release" },
{ title: "本周热门", value: "dm170/cn/weekly-hot" },
{ title: "月度热门", value: "dm266/cn/monthly-hot" }
] },
{ name: "sort_by", title: "排序", type: "enumeration", value: "released_at", enumOptions: [
{ title: "发行日期", value: "released_at" },
{ title: "最近更新", value: "published_at" },
{ title: "收藏数", value: "saved" },
{ title: "今日浏览数", value: "today_views" },
{ title: "本周浏览数", value: "weekly_views" },
{ title: "本月浏览数", value: "monthly_views" },
{ title: "总浏览数", value: "views" }
] }
]
},
{
title: "素人",
functionName: "loadList",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" },
{ name: "endpoint", title: "endpoint", type: "enumeration", value: "dm36/cn/siro", enumOptions: [
{ title: "SIRO", value: "dm36/cn/siro" },
{ title: "LUXU", value: "dm34/cn/luxu" },
{ title: "GANA", value: "dm32/cn/gana" },
{ title: "PRESTIGE PREMIUM", value: "dm999/cn/maan" },
{ title: "S-CUTE", value: "dm38/cn/scute" },
{ title: "ARA", value: "dm34/cn/ara" }
] },
{ name: "sort_by", title: "排序", type: "enumeration", value: "released_at", enumOptions: [
{ title: "发行日期", value: "released_at" },
{ title: "最近更新", value: "published_at" },
{ title: "收藏数", value: "saved" },
{ title: "今日浏览数", value: "today_views" },
{ title: "本周浏览数", value: "weekly_views" },
{ title: "本月浏览数", value: "monthly_views" },
{ title: "总浏览数", value: "views" }
] }
]
},
{
title: "无码影片",
functionName: "loadList",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" },
{ name: "endpoint", title: "endpoint", type: "enumeration", value: "dm816/cn/uncensored-leak", enumOptions: [
{ title: "无码流出", value: "dm816/cn/uncensored-leak" },
{ title: "FC2", value: "dm473/cn/fc2" },
{ title: "HEYZO", value: "dm1977446/cn/heyzo" },
{ title: "东京热", value: "dm42/cn/tokyohot" },
{ title: "一本道", value: "dm4364834/cn/1pondo" },
{ title: "Caribbeancom", value: "dm7414012/cn/caribbeancom" },
{ title: "Caribbeancompr", value: "dm83900/cn/caribbeancompr" },
{ title: "10musume", value: "dm6341956/cn/10musume" },
{ title: "pacopacomama", value: "dm2479243/cn/pacopacomama" },
{ title: "Gachinco", value: "dm150/cn/gachinco" },
{ title: "XXX-AV", value: "dm42/cn/xxxav" },
{ title: "人妻斬", value: "dm37/cn/marriedslash" },
{ title: "顽皮4610", value: "dm33/cn/naughty4610" },
{ title: "顽皮0930", value: "dm37/cn/naughty0930" }
] },
{ name: "sort_by", title: "排序", type: "enumeration", value: "released_at", enumOptions: [
{ title: "发行日期", value: "released_at" },
{ title: "最近更新", value: "published_at" },
{ title: "收藏数", value: "saved" },
{ title: "今日浏览数", value: "today_views" },
{ title: "本周浏览数", value: "weekly_views" },
{ title: "本月浏览数", value: "monthly_views" },
{ title: "总浏览数", value: "views" }
] }
]
},
{
title: "亚洲AV",
functionName: "loadList",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" },
{ name: "endpoint", title: "endpoint", type: "enumeration", value: "dm63/cn/madou", enumOptions: [
{ title: "麻豆传媒", value: "dm63/cn/madou" },
{ title: "TWAV", value: "dm31/cn/twav" },
{ title: "Furuke", value: "dm15/cn/furuke" },
{ title: "韩国直播", value: "cn/klive" },
{ title: "中国直播", value: "cn/clive" }
] },
{ name: "sort_by", title: "排序", type: "enumeration", value: "released_at", enumOptions: [
{ title: "发行日期", value: "released_at" },
{ title: "最近更新", value: "published_at" },
{ title: "收藏数", value: "saved" },
{ title: "今日浏览数", value: "today_views" },
{ title: "本周浏览数", value: "weekly_views" },
{ title: "本月浏览数", value: "monthly_views" },
{ title: "总浏览数", value: "views" }
] }
]
},
{
title: "女优",
functionName: "loadList",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" },
{ name: "endpoint", title: "endpoint", type: "enumeration", value: "dm179/cn/actresses/%E7%80%AC%E6%88%B8%E7%92%B0%E5%A5%88", enumOptions: [
{ title: "瀬戸環奈", value: "dm179/cn/actresses/%E7%80%AC%E6%88%B8%E7%92%B0%E5%A5%88" },
{ title: "逢泽みゆ", value: "dm179/cn/actresses/%E9%80%A2%E6%B2%A2%E3%81%BF%E3%82%86" },
{ title: "河北彩花", value: "dm179/cn/actresses/%E6%B2%B3%E5%8C%97%E5%BD%A9%E8%8A%B1" },
{ title: "松本一香", value: "dm179/cn/actresses/%E6%9D%BE%E6%9C%AC%E4%B8%80%E9%A6%99" },
{ title: "美园和花", value: "dm179/cn/actresses/%E7%BE%8E%E5%9B%AD%E5%92%8C%E8%8A%B1" },
{ title: "北冈果林", value: "dm179/cn/actresses/%E5%8C%97%E5%B2%A1%E6%9E%9C%E6%9E%97" },
{ title: "柏木こなつ", value: "dm179/cn/actresses/%E6%9F%8F%E6%9C%A8%E3%81%93%E3%81%AA%E3%81%A4" },
{ title: "浅野こころ", value: "dm179/cn/actresses/%E6%B5%85%E9%87%8E%E3%81%93%E3%81%93%E3%82%8D" },
{ title: "北野未奈", value: "dm179/cn/actresses/%E5%8C%97%E9%87%8E%E6%9C%AA%E5%A5%88" },
{ title: "清原みゆう", value: "dm179/cn/actresses/%E6%B8%85%E5%8E%9F%E3%81%BF%E3%82%86%E3%81%86" },
{ title: "沙月惠奈", value: "dm179/cn/actresses/%E6%B2%99%E6%9C%88%E6%83%A0%E5%A5%88" },
{ title: "miru", value: "dm179/cn/actresses/miru" },
{ title: "七森莉莉", value: "dm179/cn/actresses/%E4%B8%83%E6%A3%AE%E8%8E%89%E8%8E%89" },
{ title: "七濑爱丽丝", value: "dm179/cn/actresses/%E4%B8%83%E6%BF%91%E7%88%B1%E4%B8%BD%E4%B8%9D" },
{ title: "鹫尾芽衣", value: "dm179/cn/actresses/%E9%B9%AB%E5%B0%BE%E8%8A%BD%E8%A1%A3" },
{ title: "博多彩叶", value: "dm179/cn/actresses/%E5%8D%9A%E5%A4%9A%E5%BD%A9%E5%8F%B6" },
{ title: "石川澪", value: "dm179/cn/actresses/%E7%9F%B3%E5%B7%9D%E6%BE%AA" },
{ title: "白上咲花", value: "dm179/cn/actresses/%E7%99%BD%E4%B8%8A%E5%92%B2%E8%8A%B1" },
{ title: "田野忧", value: "dm179/cn/actresses/%E7%94%B0%E9%87%8E%E5%BF%A7" },
{ title: "未步なな", value: "dm179/cn/actresses/%E6%9C%AA%E6%AD%A5%E3%81%AA%E3%81%AA" },
{ title: "村上悠华", value: "dm179/cn/actresses/%E6%9D%91%E4%B8%8A%E6%82%A0%E5%8D%8E" },
{ title: "三田真铃", value: "dm179/cn/actresses/%E4%B8%89%E7%94%B0%E7%9C%9F%E9%93%83" },
{ title: "八掛うみ", value: "dm179/cn/actresses/%E5%85%AB%E6%8E%9B%E3%81%86%E3%81%BF" },
{ title: "初美なのか", value: "dm179/cn/actresses/%E5%88%9D%E7%BE%8E%E3%81%AA%E3%81%AE%E3%81%8B" },
{ title: "宮下玲奈", value: "dm179/cn/actresses/%E5%AE%AE%E4%B8%8B%E7%8E%B2%E5%A5%88" },
{ title: "新有菜", value: "dm58/actresses/%E6%A9%8B%E6%9C%AC%E6%9C%89%E8%8F%9C%20%28%E6%96%B0%E6%9C%89%E8%8F%9C%29" },
{ title: "新木希空", value: "dm179/cn/actresses/%E6%96%B0%E6%9C%A8%E5%B8%8C%E7%A9%BA" },
{ title: "明里つむぎ", value: "dm179/cn/actresses/%E6%98%8E%E9%87%8C%E3%81%A4%E3%82%80%E3%81%8E" },
{ title: "本庄鈴", value: "dm179/cn/actresses/%E6%9C%AC%E5%BA%84%E9%88%B4" },
{ title: "桃乃木かな", value: "dm179/cn/actresses/%E6%A1%83%E4%B9%83%E6%9C%A8%E3%81%8B%E3%81%AA" },
{ title: "桜空もも", value: "dm179/cn/actresses/%E6%A1%9C%E7%A9%BA%E3%82%82%E3%82%82" },
{ title: "楓ふうあ", value: "dm63/actresses/%E6%A5%93%E3%81%B5%E3%81%86%E3%81%82" },
{ title: "楓可憐", value: "dm38/actresses/%E6%A5%93%E5%8F%AF%E6%86%90%20%28%E7%94%B0%E4%B8%AD%E6%AA%B8%E6%AA%AC%29" },
{ title: "涼森れむ", value: "dm179/cn/actresses/%E6%B6%BC%E6%A3%AE%E3%82%8C%E3%82%80" },
{ title: "瀧本雫葉", value: "dm179/cn/actresses/%E7%80%A7%E6%9C%AC%E9%9B%AB%E8%91%89" },
{ title: "田中レモン", value: "dm179/cn/actresses/%E7%94%B0%E4%B8%AD%E3%83%AC%E3%83%A2%E3%83%B3" },
{ title: "相沢みなみ", value: "dm179/cn/actresses/%E7%9B%B8%E6%B2%A2%E3%81%BF%E3%81%AA%E3%81%BF" },
{ title: "神木麗", value: "dm179/cn/actresses/%E7%A5%9E%E6%9C%A8%E9%BA%97" },
{ title: "美ノ嶋めぐり", value: "dm179/cn/actresses/%E7%BE%8E%E3%83%8E%E5%B6%8B%E3%82%81%E3%81%90%E3%82%8A" },
{ title: "野々浦暖", value: "dm179/cn/actresses/%E9%87%8E%E3%80%85%E6%B5%A6%E6%9A%96" },
{ title: "青空ひかり", value: "dm179/cn/actresses/%E9%9D%92%E7%A9%BA%E3%81%B2%E3%81%8B%E3%82%8A" },
{ title: "三上悠亚", value: "dm179/cn/actresses/%E4%B8%89%E4%B8%8A%E6%82%A0%E4%BA%9A" },
{ title: "榊原萌", value: "dm179/cn/actresses/%E6%A6%8A%E5%8E%9F%E8%90%8C" },
{ title: "彩月七绪", value: "dm179/cn/actresses/%E5%BD%A9%E6%9C%88%E4%B8%83%E7%BB%AA" },
{ title: "神宫寺奈绪", value: "dm179/cn/actresses/%E7%A5%9E%E5%AE%AB%E5%AF%BA%E5%A5%88%E7%BB%AA" },
{ title: "有村のぞみ", value: "dm179/cn/actresses/%E6%9C%89%E6%9D%91%E3%81%AE%E3%81%9E%E3%81%BF" }
] },
{ name: "sort_by", title: "排序", type: "enumeration", value: "released_at", enumOptions: [
{ title: "发行日期", value: "released_at" },
{ title: "最近更新", value: "published_at" },
{ title: "收藏数", value: "saved" },
{ title: "今日浏览数", value: "today_views" },
{ title: "本周浏览数", value: "weekly_views" },
{ title: "本月浏览数", value: "monthly_views" },
{ title: "总浏览数", value: "views" }
] }
]
},
{
title: "类型",
functionName: "loadList",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" },
{ name: "endpoint", title: "endpoint", type: "enumeration", value: "dm96/cn/genres/%E9%AB%98%E6%B8%85", enumOptions: [
{ title: "高清", value: "dm96/cn/genres/%E9%AB%98%E6%B8%85" },
{ title: "独家", value: "dm139/cn/genres/%E7%8B%AC%E5%AE%B6" },
{ title: "中出", value: "dm130/cn/genres/%E4%B8%AD%E5%87%BA" },
{ title: "单体作品", value: "dm122/cn/genres/%E5%8D%95%E4%BD%93%E4%BD%9C%E5%93%81" },
{ title: "巨乳", value: "dm120/cn/genres/%E5%B7%A8%E4%B9%B3" },
{ title: "人妻", value: "dm77/cn/genres/%E4%BA%BA%E5%A6%BB" },
{ title: "熟女", value: "dm118/cn/genres/%E7%86%9F%E5%A5%B3" },
{ title: "素人", value: "dm123/cn/genres/%E7%B4%A0%E4%BA%BA" },
{ title: "美少女", value: "dm437/cn/genres/%E7%BE%8E%E5%B0%91%E5%A5%B3" },
{ title: "口交", value: "dm1301/cn/genres/%E5%8F%A3%E4%BA%A4" },
{ title: "多人运动", value: "dm321/cn/genres/%E5%A4%9A%E4%BA%BA%E8%BF%90%E5%8A%A8" },
{ title: "薄格", value: "dm76/cn/genres/%E8%96%84%E6%A0%BC" },
{ title: "骑乘", value: "dm486/cn/genres/%E9%AA%91%E4%B9%98" },
{ title: "痴女", value: "dm313/cn/genres/%E7%97%B4%E5%A5%B3" },
{ title: "4小时以上", value: "dm738/cn/genres/4%E5%B0%8F%E6%97%B6%E4%BB%A5%E4%B8%8A" },
{ title: "女高中生", value: "dm4448/cn/genres/%E5%A5%B3%E9%AB%98%E4%B8%AD%E7%94%9F" },
{ title: "潮吹", value: "dm161/cn/genres/%E6%BD%AE%E5%90%B9" },
{ title: "苗条", value: "dm757/cn/genres/%E8%8B%97%E6%9D%A1" },
{ title: "自拍", value: "dm978/cn/genres/%E8%87%AA%E6%8B%8D" },
{ title: "合集", value: "dm784/cn/genres/%E5%90%88%E9%9B%86" },
{ title: "乳交", value: "dm594/cn/genres/%E4%B9%B3%E4%BA%A4" },
{ title: "恋物癖", value: "dm117/cn/genres/%E6%81%8B%E7%89%A9%E7%99%96" },
{ title: "美乳", value: "dm215/cn/genres/%E7%BE%8E%E4%B9%B3" },
{ title: "NTR", value: "dm736/cn/genres/NTR" },
{ title: "企划", value: "dm341/cn/genres/%E4%BC%81%E5%88%92" },
{ title: "乱伦", value: "dm56/cn/genres/%E4%B9%B1%E4%BC%A6" },
{ title: "搭讪", value: "dm292/cn/genres/%E6%90%AD%E8%AE%AA" },
{ title: "颜射", value: "dm319/cn/genres/%E9%A2%9C%E5%B0%84" },
{ title: "淫乱", value: "dm903/cn/genres/%E6%B7%AB%E4%B9%B1" },
{ title: "偷拍", value: "dm516/cn/genres/%E5%81%B7%E6%8B%8D" },
{ title: "剧情", value: "dm98/cn/genres/%E5%89%A7%E6%83%85" },
{ title: "自慰", value: "dm7606/cn/genres/%E8%87%AA%E6%85%B0" },
{ title: "4K", value: "dm55/cn/genres/4K" },
{ title: "手淫", value: "dm94/cn/genres/%E6%89%8B%E6%B7%AB" },
{ title: "姐姐", value: "dm793/cn/genres/%E5%A7%90%E5%A7%90" },
{ title: "羞辱", value: "dm161/cn/genres/%E7%BE%9E%E8%BE%B1" }
] },
{ name: "sort_by", title: "排序", type: "enumeration", value: "released_at", enumOptions: [
{ title: "发行日期", value: "released_at" },
{ title: "最近更新", value: "published_at" },
{ title: "收藏数", value: "saved" },
{ title: "今日浏览数", value: "today_views" },
{ title: "本周浏览数", value: "weekly_views" },
{ title: "本月浏览数", value: "monthly_views" },
{ title: "总浏览数", value: "views" }
] }
]
},
{
title: "发行商",
functionName: "loadList",
type: "video",
params: [
{ name: "page", title: "页码", type: "page" },
{ name: "endpoint", title: "endpoint", type: "enumeration", value: "dm825/cn/makers/Moody%27s", enumOptions: [
{ title: "Moody's", value: "dm825/cn/makers/Moody%27s" },
{ title: "Prestige", value: "dm825/cn/makers/Prestige" },
{ title: "Madonna", value: "dm825/cn/makers/Madonna" },
{ title: "S1", value: "dm825/cn/makers/S1" },
{ title: "SOD", value: "dm825/cn/makers/SOD" },
{ title: "IdeaPocket", value: "dm825/cn/makers/IdeaPocket" },
{ title: "Attackers", value: "dm825/cn/makers/Attackers" },
{ title: "Glory Quest", value: "dm825/cn/makers/Glory%20Quest" },
{ title: "ビッグモーカル", value: "dm825/cn/makers/%E3%83%93%E3%83%83%E3%82%B0%E3%83%A2%E3%83%BC%E3%82%AB%E3%83%AB" },
{ title: "NATURAL HIGH", value: "dm825/cn/makers/NATURAL%20HIGH" },
{ title: "Wanz Factory", value: "dm825/cn/makers/Wanz%20Factory" },
{ title: "Takara Visual", value: "dm825/cn/makers/Takara%20Visual" },
{ title: "Fc2", value: "dm825/cn/makers/Fc2" },
{ title: "Premium", value: "dm825/cn/makers/Premium" },
{ title: "Fitch", value: "dm825/cn/makers/Fitch" },
{ title: "VENUS", value: "dm825/cn/makers/VENUS" },
{ title: "DEEP'S", value: "dm825/cn/makers/DEEP%27S" },
{ title: "本中", value: "dm825/cn/makers/%E6%9C%AC%E4%B8%AD" },
{ title: "Hunter", value: "dm825/cn/makers/Hunter" },
{ title: "溜池ゴロー", value: "dm825/cn/makers/%E6%BA%9C%E6%B1%A0%E3%82%B4%E3%83%AD%E3%83%BC" },
{ title: "TMA", value: "dm825/cn/makers/TMA" },
{ title: "センタービレッジ", value: "dm825/cn/makers/%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%93%E3%83%AC%E3%83%83%E3%82%B8" },
{ title: "Das", value: "dm825/cn/makers/Das" },
{ title: "Waap Entertainment", value: "dm825/cn/makers/Waap%20Entertainment" },
{ title: "Crystal-Eizou", value: "dm825/cn/makers/Crystal-Eizou" },
{ title: "kawaii", value: "dm825/cn/makers/kawaii" },
{ title: "ゴーゴーズ", value: "dm825/cn/makers/%E3%82%B4%E3%83%BC%E3%82%B4%E3%83%BC%E3%82%BA" },
{ title: "プラネットプラス", value: "dm825/cn/makers/%E3%83%97%E3%83%A9%E3%83%8D%E3%83%83%E3%83%88%E3%83%97%E3%83%A9%E3%82%B9" },
{ title: "OPPAI", value: "dm825/cn/makers/OPPAI" },
{ title: "STAR PARADISE", value: "dm825/cn/makers/STAR%20PARADISE" },
{ title: "E-BODY", value: "dm825/cn/makers/E-BODY" },
{ title: "セレブの友", value: "dm825/cn/makers/%E3%82%BB%E3%83%AC%E3%83%96%E3%81%AE%E5%8F%8B" },
{ title: "ドグマ", value: "dm825/cn/makers/%E3%83%89%E3%82%B0%E3%83%9E" },
{ title: "Alice Japan", value: "dm825/cn/makers/Alice%20Japan" },
{ title: "KM Produce", value: "dm825/cn/makers/KM%20Produce" },
{ title: "桃太郎映像出版", value: "dm825/cn/makers/%E6%A1%83%E5%A4%AA%E9%83%8E%E6%98%A0%E5%83%8F%E5%87%BA%E7%89%88" }
] },
{ name: "sort_by", title: "排序", type: "enumeration", value: "released_at", enumOptions: [
{ title: "发行日期", value: "released_at" },
{ title: "最近更新", value: "published_at" },
{ title: "收藏数", value: "saved" },
{ title: "今日浏览数", value: "today_views" },
{ title: "本周浏览数", value: "weekly_views" },
{ title: "本月浏览数", value: "monthly_views" },
{ title: "总浏览数", value: "views" }
] }
]
},
{
title: "🔍 搜索视频",
functionName: "searchList",
type: "video",
params: [
{ name: "keyword", title: "关键词", type: "input", value: "" },
{ name: "page", title: "页码", type: "page" }
]
},
{
id: "loadResource",
title: "MissAV 播放源",
description: "智能提取关联上下文番号并多路自动抓取 MissAV 正片链接供给播放",
functionName: "loadResource",
type: "stream",
params: []
}
],
search: {
title: "🌐 全局搜索",
functionName: "searchGlobal",
params: [
{ name: "keyword", title: "关键词", type: "input", description: "搜索的关键词", value: "" },
{ name: "page", title: "页码", type: "page", value: "1" }
]
}
};
const BASE_URL = "https://missav.ai";
const AVATAR_BASE_URL = "https://missav.ai";
const HEADERS = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Referer": "https://missav.ai/",
"Connection": "keep-alive"
};
const PEOPLE_AVATAR_CACHE = {};
const RECENT_UPDATES_CATEGORY = "recent_updates";
const RECENT_UPDATES_ENDPOINT = "dm539/cn/new";
const VIDEO_URL_CACHE = {};
function getSortOptions() {
return [
{ title: "发行日期", value: "released_at" },
{ title: "最近更新", value: "published_at" },
{ title: "收藏数", value: "saved" },
{ title: "今日浏览数", value: "today_views" },
{ title: "本周浏览数", value: "weekly_views" },
{ title: "本月浏览数", value: "monthly_views" },
{ title: "总浏览数", value: "views" }
];
}
function getPrimaryCategoryOptions() {
return [
{ title: "中文字幕", value: "dm278/cn/chinese-subtitle" },
{ title: "日本AV", value: "dm632/cn/release" },
{ title: "素人", value: "amateur" },
{ title: "无码影片", value: "uncensored" },
{ title: "亚洲AV", value: "asia" },
{ title: "女优", value: "actress" },
{ title: "类型", value: "genre" },
{ title: "发行商", value: "maker" },
{ title: "🔍 搜索视频", value: "search" }
];
}
function getCategoryOptions() {
return [
{ title: "SIRO", value: "dm36/cn/siro", group: "amateur" },
{ title: "LUXU", value: "dm34/cn/luxu", group: "amateur" },
{ title: "GANA", value: "dm32/cn/gana", group: "amateur" },
{ title: "PRESTIGE PREMIUM", value: "dm999/cn/maan", group: "amateur" },
{ title: "S-CUTE", value: "dm38/cn/scute", group: "amateur" },
{ title: "ARA", value: "dm34/cn/ara", group: "amateur" },
{ title: "无码流出", value: "dm816/cn/uncensored-leak", group: "uncensored" },
{ title: "FC2", value: "dm473/cn/fc2", group: "uncensored" },
{ title: "HEYZO", value: "dm1977446/cn/heyzo", group: "uncensored" },
{ title: "东京热", value: "dm42/cn/tokyohot", group: "uncensored" },
{ title: "一本道", value: "dm4364834/cn/1pondo", group: "uncensored" },
{ title: "Caribbeancom", value: "dm7414012/cn/caribbeancom", group: "uncensored" },
{ title: "Caribbeancompr", value: "dm83900/cn/caribbeancompr", group: "uncensored" },
{ title: "10musume", value: "dm6341956/cn/10musume", group: "uncensored" },
{ title: "pacopacomama", value: "dm2479243/cn/pacopacomama", group: "uncensored" },
{ title: "Gachinco", value: "dm150/cn/gachinco", group: "uncensored" },
{ title: "XXX-AV", value: "dm42/cn/xxxav", group: "uncensored" },
{ title: "人妻斬", value: "dm37/cn/marriedslash", group: "uncensored" },
{ title: "顽皮4610", value: "dm33/cn/naughty4610", group: "uncensored" },
{ title: "顽皮0930", value: "dm37/cn/naughty0930", group: "uncensored" },
{ title: "麻豆传媒", value: "dm63/cn/madou", group: "asia" },
{ title: "TWAV", value: "dm31/cn/twav", group: "asia" },
{ title: "Furuke", value: "dm15/cn/furuke", group: "asia" },
{ title: "韩国直播", value: "cn/klive", group: "asia" },
{ title: "中国直播", value: "cn/clive", group: "asia" },
...ACTRESS_ENDPOINTS.map((item) => ({ title: item.title, value: item.value, group: "actress" })),
...GENRES_ENDPOINTS.map((item) => ({ title: item.title, value: item.value, group: "genre" })),
...MAKERS_ENDPOINTS.map((item) => ({ title: item.title, value: item.value, group: "maker" }))
];
}
function filterCategoryOptions(group) {
return getCategoryOptions().filter((item) => item.group === group).map(({ title, value }) => ({ title, value }));
}
function getDirectListEndpoints() { return ["dm278/cn/chinese-subtitle", "dm632/cn/release"]; }
function getSortableCategoryGroups() { return ["amateur", "uncensored", "asia", "actress", "genre", "maker"]; }
function normalizePeopleId(value) {
if (!value) return "";
let id = String(value).trim();
id = id.replace(BASE_URL, "").replace(/^https?:\/\/[^/]+\//, "");
id = id.replace(/^\/+/, "").split("?")[0].replace(/\/$/, "");
return id;
}
function normalizeGenreId(value) {
if (!value) return "";
let id = String(value).trim();
id = id.replace(BASE_URL, "").replace(/^https?:\/\/[^/]+\//, "");
id = id.replace(/^\/+/, "").split("?")[0].replace(/\/$/, "");
return id;
}
function normalizePeopleTitle(title) {
return normalizePeopleKey(title);
}
function normalizeDetailLabel(label) {
return (label || "").replace(/\s+/g, "").replace(/:/g, ":").toLowerCase();
}
function isActressLabel(label) {
return ["女优:", "女優:", "actress:", "actresses:"].includes(label);
}
function isGenreLabel(label) {
return ["类型:", "類型:", "分类:", "分類:", "genre:", "genres:", "category:", "categories:"].includes(label);
}
function getImageFromElement($, $el) {
return $el.find("img").attr("data-src") ||
$el.find("img").attr("src") ||
"";
}
function isInvalidAvatarUrl(url) {
if (!url) return true;
return /fourhoi\.com\/[^/]+\/(cover|preview|thumbnail)[^/]*\.(jpg|jpeg|png|webp)(?:\?.*)?$/i.test(url);
}
function pickFirstAvatar($) {
const ogImg = $('meta[property="og:image"]').attr('content') || $('meta[name="twitter:image"]').attr('content');
if (ogImg && !ogImg.includes("logo") && !ogImg.includes("square") && !ogImg.includes("cover")) return ogImg;
const selector = ".avatar img, [class*='avatar'] img, .rounded-full img, img[alt*='女优'], img[alt*='女優'], img[alt*='Actress'], img[alt*='actress']";
const $img = $(selector).first();
return $img.attr("data-src") || $img.attr("src") || "";
}
function resolveAvatarImageUrl(path) {
if (!path) return "";
if (path.startsWith("http")) return path;
return `${AVATAR_BASE_URL}${path.startsWith("/") ? path : `/${path}`}`;
}
function resolveAvatarPageUrl(peopleId) {
if (!peopleId) return "";
const normalized = normalizePeopleId(peopleId);
if (!normalized || !normalized.includes("/actresses/")) return "";
return `${AVATAR_BASE_URL}/${normalized}`;
}
function normalizePeopleKey(value) {
return (value || "").replace(/\s+/g, "").replace(/[·•・]/g, "").toLowerCase();
}
function normalizeDisplayTitle(value) {
return (value || "").replace(/\s+/g, " ").trim();
}
function buildPeopleItem(name, avatar, href) {
const title = normalizeDisplayTitle(name);
if (!title) return null;
const peopleId = normalizePeopleId(href) || `cn/actresses/${encodeURIComponent(title)}`;
return {
id: peopleId,
title,
avatar: resolveUrl(avatar || ""),
role: "主演"
};
}
function buildGenreItem(name, href) {
const title = normalizeDisplayTitle(name);
const genreId = normalizeGenreId(href);
if (!title || !genreId || !genreId.includes("/genres/")) return null;
return { id: genreId, title };
}
function isRecentUpdatesCategory(primaryCategory) {
return primaryCategory === RECENT_UPDATES_CATEGORY || primaryCategory === RECENT_UPDATES_ENDPOINT;
}
function resolveEndpointByPrimaryCategory(primaryCategory, endpoint) {
if (isRecentUpdatesCategory(primaryCategory)) return RECENT_UPDATES_ENDPOINT;
if (getDirectListEndpoints().includes(primaryCategory)) return primaryCategory;
if (primaryCategory && ["amateur", "uncensored", "asia", "actress", "genre", "maker"].includes(primaryCategory)) {
const matched = getCategoryOptions().find((item) => item.group === primaryCategory);
return matched ? matched.value : (endpoint || primaryCategory || "dm632/cn/release");
}
return endpoint || primaryCategory || "dm632/cn/release";
}
function buildPeopleContext(id, title, avatar = "") {
if (!id) return null;
return { id, title, avatar: resolveUrl(avatar || ""), role: "主演" };
}
function buildGenreContext(id, title) {
if (!id) return null;
return { id, title };
}
async function resolvePeopleAvatar(peopleId) {
if (!peopleId || !peopleId.includes("/actresses/")) return "";
if (Object.prototype.hasOwnProperty.call(PEOPLE_AVATAR_CACHE, peopleId)) return PEOPLE_AVATAR_CACHE[peopleId];
try {
const avatarPageUrl = resolveAvatarPageUrl(peopleId);
if (!avatarPageUrl) return "";
const res = await Widget.http.get(avatarPageUrl, { headers: HEADERS });
if (!res.data || res.data.includes("Just a moment")) return "";
const $ = Widget.html.load(res.data);
const avatar = pickFirstAvatar($);
if (!avatar || isInvalidAvatarUrl(avatar)) {
PEOPLE_AVATAR_CACHE[peopleId] = "";
return "";
}
PEOPLE_AVATAR_CACHE[peopleId] = resolveAvatarImageUrl(avatar);
return PEOPLE_AVATAR_CACHE[peopleId];
} catch (e) {
return "";
}
}
const ACTRESS_ENDPOINTS = [
{ title: "瀬户环奈", value: "dm179/cn/actresses/%E7%80%AC%E6%88%B8%E7%92%B0%E5%A5%88" },
{ title: "逢泽みゆ", value: "dm179/cn/actresses/%E9%80%A2%E6%B2%A2%E3%81%BF%E3%82%86" },
{ title: "河北彩花", value: "dm179/cn/actresses/%E6%B2%B3%E5%8C%97%E5%BD%A9%E8%8A%B1" },
{ title: "松本一香", value: "dm179/cn/actresses/%E6%9D%BE%E6%9C%AC%E4%B8%80%E9%A6%99" },
{ title: "美园和花", value: "dm179/cn/actresses/%E7%BE%8E%E5%9B%AD%E5%92%8C%E8%8A%B1" },
{ title: "北冈果林", value: "dm179/cn/actresses/%E5%8C%97%E5%B2%A1%E6%9E%9C%E6%9E%97" },
{ title: "柏木こなつ", value: "dm179/cn/actresses/%E6%9F%8F%E6%9C%A8%E3%81%93%E3%81%AA%E3%81%A4" },
{ title: "浅野こころ", value: "dm179/cn/actresses/%E6%B5%85%E9%87%8E%E3%81%93%E3%81%93%E3%82%8D" },
{ title: "北野未奈", value: "dm179/cn/actresses/%E5%8C%97%E9%87%8E%E6%9C%AA%E5%A5%88" },
{ title: "清原みゆう", value: "dm179/cn/actresses/%E6%B8%85%E5%8E%9F%E3%81%BF%E3%82%86%E3%81%86" },
{ title: "沙月惠奈", value: "dm179/cn/actresses/%E6%B2%99%E6%9C%88%E6%83%A0%E5%A5%88" },
{ title: "miru", value: "dm179/cn/actresses/miru" },
{ title: "七森莉莉", value: "dm179/cn/actresses/%E4%B8%83%E6%A3%AE%E8%8E%89%E8%8E%89" },
{ title: "七濑爱丽丝", value: "dm179/cn/actresses/%E4%B8%83%E6%BF%91%E7%88%B1%E4%B8%BD%E4%B8%9D" },
{ title: "鹫尾芽衣", value: "dm179/cn/actresses/%E9%B9%AB%E5%B0%BE%E8%8A%BD%E8%A1%A3" },
{ title: "博多彩叶", value: "dm179/cn/actresses/%E5%8D%9A%E5%A4%9A%E5%BD%A9%E5%8F%B6" },
{ title: "石川澪", value: "dm179/cn/actresses/%E7%9F%B3%E5%B7%9D%E6%BE%AA" },
{ title: "白上咲花", value: "dm179/cn/actresses/%E7%99%BD%E4%B8%8A%E5%92%B2%E8%8A%B1" },
{ title: "田野忧", value: "dm179/cn/actresses/%E7%94%B0%E9%87%8E%E5%BF%A7" },
{ title: "未步なな", value: "dm179/cn/actresses/%E6%9C%AA%E6%AD%A5%E3%81%AA%E3%81%AA" },
{ title: "村上悠华", value: "dm179/cn/actresses/%E6%9D%91%E4%B8%8A%E6%82%A0%E5%8D%8E" },
{ title: "三田真铃", value: "dm179/cn/actresses/%E4%B8%89%E7%94%B0%E7%9C%9F%E9%93%83" },
{ title: "八挂うみ", value: "dm179/cn/actresses/%E5%85%AB%E6%8E%9B%E3%81%86%E3%81%BF" },
{ title: "初美なのか", value: "dm179/cn/actresses/%E5%88%9D%E7%BE%8E%E3%81%AA%E3%81%AE%E3%81%8B" },
{ title: "宫下玲奈", value: "dm179/cn/actresses/%E5%AE%AE%E4%B8%8B%E7%8E%B2%E5%A5%88" },
{ title: "新有菜", value: "dm58/actresses/%E6%A9%8B%E6%9C%AC%E6%9C%89%E8%8F%9C%20%28%E6%96%B0%E6%9C%89%E8%8F%9C%29" },
{ title: "新木希空", value: "dm179/cn/actresses/%E6%96%B0%E6%9C%A8%E5%B8%8C%E7%A9%BA" },
{ title: "明里つむぎ", value: "dm179/cn/actresses/%E6%98%8E%E9%87%8C%E3%81%A4%E3%82%80%E3%81%8E" },
{ title: "小野六花", value: "dm179/cn/actresses/%E5%B0%8F%E9%87%8E%E5%85%AD%E8%8A%B1" },
{ title: "宇都宫紫苑", value: "dm179/cn/actresses/%E5%AE%87%E9%83%BD%E5%AE%AE%E7%B4%AB%E8%8B%91" },
{ title: "小宵こなん", value: "dm179/cn/actresses/%E5%B0%8F%E5%AE%B5%E3%81%93%E3%81%AA%E3%82%93" },
{ title: "本庄鈴", value: "dm179/cn/actresses/%E6%9C%AC%E5%BA%84%E9%88%B4" },
{ title: "桃乃木かな", value: "dm179/cn/actresses/%E6%A1%83%E4%B9%83%E6%9C%A8%E3%81%8B%E3%81%AA" },
{ title: "桜空もも", value: "dm179/cn/actresses/%E6%A1%9C%E7%A9%BA%E3%82%82%E3%82%82" },
{ title: "楓ふうあ", value: "dm179/cn/actresses/%E6%A1%AB%E3%81%B5%E3%81%86%E3%81%82" },
{ title: "楓カレン", value: "dm179/cn/actresses/%E6%A5%93%E3%82%AB%E3%83%AC%E3%83%B3" },
{ title: "涼森れむ", value: "dm179/cn/actresses/%E6%B6%BC%E6%A3%AE%E3%82%8C%E3%82%80" },
{ title: "瀧本雫葉", value: "dm179/cn/actresses/%E7%80%A7%E6%9C%AC%E9%9B%AB%E8%91%89" },
{ title: "田中レモン", value: "dm179/cn/actresses/%E7%94%B0%E4%B8%AD%E3%83%AC%E3%83%A2%E3%83%B3" },
{ title: "相沢みなみ", value: "dm179/cn/actresses/%E7%9B%B8%E6%B2%A2%E3%81%BF%E3%81%AA%E3%81%BF" },
{ title: "神木麗", value: "dm179/cn/actresses/%E7%A5%9E%E6%9C%A8%E9%BA%97" },
{ title: "美ノ嶋めぐり", value: "dm179/cn/actresses/%E7%BE%8E%E3%83%8E%E5%B6%8B%E3%82%81%E3%81%90%E3%82%8A" },
{ title: "野々浦暖", value: "dm179/cn/actresses/%E9%87%8E%E3%80%85%E6%B5%A6%E6%9A%96" },
{ title: "青空ひかり", value: "dm179/cn/actresses/%E9%9D%92%E7%A9%BA%E3%81%B2%E3%81%8B%E3%82%8A" },
{ title: "三上悠亚", value: "dm179/cn/actresses/%E4%B8%89%E4%B8%8A%E6%82%A0%E4%BA%9A" },
{ title: "榊原萌", value: "dm179/cn/actresses/%E6%A6%8A%E5%8E%9F%E8%90%8C" },
{ title: "彩月七绪", value: "dm179/cn/actresses/%E5%BD%A9%E6%9C%88%E4%B8%83%E7%BB%AA" },
{ title: "神宫寺奈绪", value: "dm179/cn/actresses/%E7%A5%9E%E5%AE%AB%E5%AF%BA%E5%A5%88%E7%BB%AA" },
{ title: "有村のぞみ", value: "dm179/cn/actresses/%E6%9C%89%E6%9D%91%E3%81%AE%E3%81%9E%E3%81%BF" }
];
const GENRES_ENDPOINTS = [
{ title: "高清", value: "dm96/cn/genres/%E9%AB%98%E6%B8%85" },
{ title: "独家", value: "dm139/cn/genres/%E7%8B%AC%E5%AE%B6" },
{ title: "中出", value: "dm130/cn/genres/%E4%B8%AD%E5%87%BA" },
{ title: "单体作品", value: "dm122/cn/genres/%E5%8D%95%E4%BD%93%E4%BD%9C%E5%93%81" },
{ title: "巨乳", value: "dm120/cn/genres/%E5%B7%A8%E4%B9%B3" },
{ title: "人妻", value: "dm77/cn/genres/%E4%BA%BA%E5%A6%BB" },
{ title: "熟女", value: "dm118/cn/genres/%E7%86%9F%E5%A5%B3" },
{ title: "素人", value: "dm123/cn/genres/%E7%B4%A0%E4%BA%BA" },
{ title: "美少女", value: "dm437/cn/genres/%E7%BE%8E%E5%B0%91%E5%A5%B3" },
{ title: "口交", value: "dm1301/cn/genres/%E5%8F%A3%E4%BA%A4" },
{ title: "多人运动", value: "dm321/cn/genres/%E5%A4%9A%E4%BA%BA%E8%BF%90%E5%8A%A8" },
{ title: "薄格", value: "dm76/cn/genres/%E8%96%84%E6%A0%BC" },
{ title: "骑乘", value: "dm486/cn/genres/%E9%AA%91%E4%B9%98" },
{ title: "痴女", value: "dm313/cn/genres/%E7%97%B4%E5%A5%B3" },
{ title: "4小时以上", value: "dm738/cn/genres/4%E5%B0%8F%E6%97%B6%E4%BB%A5%E4%B8%8A" },
{ title: "女高中生", value: "dm4448/cn/genres/%E5%A5%B3%E9%AB%98%E4%B8%AD%E7%94%9F" },
{ title: "潮吹", value: "dm161/cn/genres/%E6%BD%AE%E5%90%B9" },
{ title: "苗条", value: "dm757/cn/genres/%E8%8B%97%E6%9D%A1" },
{ title: "自拍", value: "dm978/cn/genres/%E8%87%AA%E6%8B%8D" },
{ title: "合集", value: "dm784/cn/genres/%E5%90%88%E9%9B%86" },
{ title: "乳交", value: "dm594/cn/genres/%E4%B9%B3%E4%BA%A4" },
{ title: "恋物癖", value: "dm117/cn/genres/%E6%81%8B%E7%89%A9%E7%99%96" },
{ title: "美乳", value: "dm215/cn/genres/%E7%BE%8E%E4%B9%B3" },
{ title: "NTR", value: "dm736/cn/genres/NTR" },
{ title: "企划", value: "dm341/cn/genres/%E4%BC%81%E5%88%92" },
{ title: "乱伦", value: "dm56/cn/genres/%E4%B9%B1%E4%BC%A6" },
{ title: "搭讪", value: "dm292/cn/genres/%E6%90%AD%E8%AE%AA" },
{ title: "颜射", value: "dm319/cn/genres/%E9%A2%9C%E5%B0%84" },
{ title: "淫乱", value: "dm903/cn/genres/%E6%B7%AB%E4%B9%B1" },
{ title: "偷拍", value: "dm516/cn/genres/%E5%81%B7%E6%8B%8D" },
{ title: "剧情", value: "dm98/cn/genres/%E5%89%A7%E6%83%85" },
{ title: "自慰", value: "dm7606/cn/genres/%E8%87%AA%E6%85%B0" },
{ title: "4K", value: "dm55/cn/genres/4K" },
{ title: "手淫", value: "dm94/cn/genres/%E6%89%8B%E6%B7%AB" },
{ title: "姐姐", value: "dm793/cn/genres/%E5%A7%90%E5%A7%90" },
{ title: "羞辱", value: "dm161/cn/genres/%E7%BE%9E%E8%BE%B1" }
];
const MAKERS_ENDPOINTS = [
{ title: "Moody's", value: "dm825/cn/makers/Moody%27s" },
{ title: "Prestige", value: "dm825/cn/makers/Prestige" },
{ title: "Madonna", value: "dm825/cn/makers/Madonna" },
{ title: "S1", value: "dm825/cn/makers/S1" },
{ title: "SOD", value: "dm825/cn/makers/SOD" },
{ title: "IdeaPocket", value: "dm825/cn/makers/IdeaPocket" },
{ title: "Attackers", value: "dm825/cn/makers/Attackers" },
{ title: "Glory Quest", value: "dm825/cn/makers/Glory%20Quest" },
{ title: "ビッグモーカル", value: "dm825/cn/makers/%E3%83%93%E3%83%83%E3%82%B0%E3%83%A2%E3%83%BC%E3%82%AB%E3%83%AB" },
{ title: "NATURAL HIGH", value: "dm825/cn/makers/NATURAL%20HIGH" },
{ title: "Wanz Factory", value: "dm825/cn/makers/Wanz%20Factory" },
{ title: "Takara Visual", value: "dm825/cn/makers/Takara%20Visual" },
{ title: "Fc2", value: "dm825/cn/makers/Fc2" },
{ title: "Premium", value: "dm825/cn/makers/Premium" },
{ title: "Fitch", value: "dm825/cn/makers/Fitch" },
{ title: "VENUS", value: "dm825/cn/makers/VENUS" },
{ title: "DEEP'S", value: "dm825/cn/makers/DEEP%27S" },
{ title: "本中", value: "dm825/cn/makers/%E6%9C%AC%E4%B8%AD" },
{ title: "Hunter", value: "dm825/cn/makers/Hunter" },
{ title: "溜池ゴロー", value: "dm825/cn/makers/%E6%BA%9C%E6%B1%A0%E3%82%B4%E3%83%AD%E3%83%BC" },
{ title: "TMA", value: "dm825/cn/makers/TMA" },
{ title: "センタービレッジ", value: "dm825/cn/makers/%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%93%E3%83%AC%E3%83%83%E3%82%B8" },
{ title: "Das", value: "dm825/cn/makers/Das" },
{ title: "Waap Entertainment", value: "dm825/cn/makers/Waap%20Entertainment" },
{ title: "Crystal-Eizou", value: "dm825/cn/makers/Crystal-Eizou" },
{ title: "kawaii", value: "dm825/cn/makers/kawaii" },
{ title: "ゴーゴーズ", value: "dm825/cn/makers/%E3%82%B4%E3%83%BC%E3%82%B4%E3%83%BC%E3%82%BA" },
{ title: "プラネットプラス", value: "dm825/cn/makers/%E3%83%97%E3%83%A9%E3%83%8D%E3%83%83%E3%83%88%E3%83%97%E3%83%A9%E3%82%B9" },
{ title: "OPPAI", value: "dm825/cn/makers/OPPAI" },
{ title: "STAR PARADISE", value: "dm825/cn/makers/STAR%20PARADISE" },
{ title: "E-BODY", value: "dm825/cn/makers/E-BODY" },
{ title: "セレブの友", value: "dm825/cn/makers/%E3%82%BB%E3%83%AC%E3%83%96%E3%81%AE%E5%8F%8B" },
{ title: "ドグマ", value: "dm825/cn/makers/%E3%83%89%E3%82%B0%E3%83%9E" },
{ title: "Alice Japan", value: "dm825/cn/makers/Alice%20Japan" },
{ title: "KM Produce", value: "dm825/cn/makers/KM%20Produce" },
{ title: "桃太郎映像出版", value: "dm825/cn/makers/%E6%A1%83%E5%A4%AA%E9%83%8E%E6%98%A0%E5%83%8F%E5%87%BA%E7%89%88" }
];
const GENRES_STATIC = GENRES_ENDPOINTS;
const MAKERS_STATIC = MAKERS_ENDPOINTS;
function buildListUrl(endpoint, page = 1, filters = "", sort_by = "") {
const params = [];
if (filters) params.push(`filters=${encodeURIComponent(filters)}`);
if (sort_by) params.push(`sort=${encodeURIComponent(sort_by)}`);
if (page > 1) params.push(`page=${page}`);
return `${BASE_URL}/${endpoint}${params.length ? `?${params.join("&")}` : ""}`;
}
function unpackPacker(html) {
if (!html) return "";
let unpackedResults = [];
const packerRegex = /eval\s*\(\s*function\s*\(\s*p\s*,\s*a\s*,\s*c\s*,\s*k\s*,\s*e\s*,\s*d\s*\)[\s\S]+?\}\s*\(\s*'([\s\S]+?)'\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*'([\s\S]+?)'[\s\S]+?\)/g;
let match;
while ((match = packerRegex.exec(html)) !== null) {
try {
let p = match[1].replace(/\\'/g, "'");
let a = parseInt(match[2], 10);
let c = parseInt(match[3], 10);
let k = match[4].split('|');
let cIdx = c;
while (cIdx > 0) {
cIdx--;
if (k[cIdx]) {
let w = cIdx.toString(36);
let reg = new RegExp('\\b' + w + '\\b', 'g');
p = p.replace(reg, k[cIdx]);
}
}
unpackedResults.push(p);
} catch (err) {}
}
return unpackedResults.join('\n');
}
function getText(value) { return String(value || "").trim(); }
function extractSearchCode(text, options = {}) {
const allowPureNumeric = options.allowPureNumeric !== false;
const s = getText(text).toUpperCase();
if (!s) return "";
const normalized = s.replace(/\./g, " ").replace(/_/g, "-").replace(/\s+/g, " ").trim();
const patterns = [
/\bFC2(简介)?(?:[- ]?PPV)?[- ]?\d{5,8}\b/,
/\bCARIB[- ]?\d{6,8}\b/,
/\b1PONDO[- ]?\d{6,8}\b/,
/\bHEYZO[- ]?\d{3,6}\b/,
/\bT28[- ]?\d{6,8}\b/,
/\b(?:S2M|MIAA|SSNI|SNIS|IPX|IPZZ|SSIS|JUQ|MIDE|MIDV|STARS|ABW|RKI|DVAJ|WANZ|LULU|DLDSS|VRTM|SDMU|SDDE|MKMP|HMN|MUDR|ADN|CAWD|PPPE|PRED|MGR|SHKD|MXGS|FSDSS|JUL|KTB|MIAB|GVH|MIMK|JUY|JUTA|IDBD|HND|DASD|CLO|BF|HONB|ROE|CEMD|MIUM|NITR|RCTD|RCT|IPVR|MIBD|JUR|JURD|SOE|ORE|PYO|START|NSFS)\s*[-_ ]?\d{2,6}[A-Z]?(?:[-_ ]?[A-Z]{0,4})?\b/,
/\b[A-Z]{2,10}\s*[-_ ]?\d{2,8}[A-Z]?\b/
];
if (allowPureNumeric) patterns.push(/\b\d{6,8}\b/);
for (const reg of patterns) {
const match = normalized.match(reg);
if (match?.[0]) return match[0].replace(/\s+/g, "").replace(/_/g, "-").replace(/-+/g, "-").toUpperCase();
}
return "";
}
function collectStringValues(value, depth = 0, out = [], visited = new Set()) {
if (value === null || value === undefined || depth > 5) return out;
const valueType = typeof value;
if (valueType === "string" || valueType === "number") {
const text = String(value).trim();
if (text) out.push(text);
return out;
}
if (valueType !== "object" || visited.has(value)) return out;
visited.add(value);
if (Array.isArray(value)) {
for (const item of value) collectStringValues(item, depth + 1, out, visited);
return out;
}
for (const key of Object.keys(value)) collectStringValues(value[key], depth + 1, out, visited);
return out;
}
function extractCodeFromParams(params = {}) {
const priorityCandidates = [
params.code, params.videoId, params.number, params.fileName, params.filename, params.title
];
for (const value of priorityCandidates) {
const code = extractSearchCode(value, { allowPureNumeric: true });
if (code) return code;
}
const allStrings = collectStringValues(params);
for (const value of allStrings) {
const code = extractSearchCode(value, { allowPureNumeric: false });
if (code) return code;
}
return "";
}
const JAVTRAILERS_URL_CACHE = {};
const JAVTRAILERS_URL_PROMISE_CACHE = {};
const JAVTRAILERS_FETCH_TIMEOUT_MS = 1200;
const JAVTRAILERS_MGSTAGE_PREFIXES = new Set(["ABF", "ABW", "JUFE", "MAAN", "PPT", "SIRO", "LUXU", "GANA", "ABP", "CHN"]);
function parseJavCodeParts(title) {
const raw = String(title || "").toUpperCase();
const match = raw.match(/\b([A-Z0-9]+)-?(\d{2,5})\b/);
if (!match) return null;
const prefix = match[1];
const prefixLower = prefix.toLowerCase();
const number5 = match[2].padStart(5, "0");
const numericContentPrefixMap = {
WSA: "2",
// FALENO 厂牌系列:Content ID 带数字前缀 1
FSDSS: "1", FCDSS: "1", FNS: "1", FTHTD: "1",
FALENO: "1", FGAN: "1", FSNF: "1", FLAV: "1",
// MGStage/Prestige 系:Content ID 带数字前缀 118
ABP: "118", CHN: "118",
// SOD Create 系:Content ID 带数字前缀 1
STARS: "1", STAR: "1", START: "1",
// SOD Create 其他系列
SODS: "1",
// REbecca 系:Content ID 带前缀 h_346
REBD: "h_346", REBDB: "h_346", GSHRB: "h_346"
};
const numericContentPrefix = numericContentPrefixMap[prefix] || "";
return {
prefix,
prefixLower,
number: match[2],
number3: match[2].padStart(3, "0"),
number5,
code: `${numericContentPrefix}${prefixLower}${number5}`,
plainCode: `${prefixLower}${number5}`
};
}
function buildJavTrailersFallbackUrl(title) {
const parts = parseJavCodeParts(title);
if (!parts) return "";
const first = parts.code[0];
const folder = parts.code.slice(0, 3);
return `https://media.javtrailers.com/hlsvideo/freepv/${first}/${folder}/${parts.code}/playlist.m3u8`;
}
function isJavTrailersMgstageTitle(title) {
const parts = parseJavCodeParts(title);
return !!parts && JAVTRAILERS_MGSTAGE_PREFIXES.has(parts.prefix);
}
function shouldFetchJavTrailersPage(title) {
const parts = parseJavCodeParts(title);
if (!parts) return false;
return isJavTrailersMgstageTitle(title) || parts.prefix.includes("VR");
}
function buildJavTrailersPageIds(title) {
const parts = parseJavCodeParts(title);
if (!parts) return [];
const ids = [];
if (JAVTRAILERS_MGSTAGE_PREFIXES.has(parts.prefix)) {
ids.push(`118${parts.prefixLower}${parts.number5}`);
}
ids.push(parts.code);
return ids.filter((id, index, arr) => id && arr.indexOf(id) === index);
}
function extractJavTrailersMediaUrl(html) {
if (!html || html.includes("Just a moment")) return "";
const source = String(html);
const mediaMatches = source.match(/https:\/\/media\.javtrailers\.com\/[^"'\\\s<]+?(?:\.m3u8|\.mp4)/g);
if (mediaMatches && mediaMatches.length > 0) return mediaMatches[0];
const mgstageMatches = source.match(/https:\/\/sample\.mgstage\.com\/[^"'\\\s<]+?\.mp4/g);
if (mgstageMatches && mgstageMatches.length > 0) return mgstageMatches[0];
const dmmMatches = source.match(/https:\/\/cc3001\.dmm\.co\.jp\/[^"'\\\s<]+?(?:\.m3u8|\.mp4)/g);
return dmmMatches && dmmMatches.length > 0 ? dmmMatches[0] : "";
}
function fetchJavTrailersPageUrl(pageId) {
return Widget.http.get(`https://javtrailers.com/video/${pageId}`, { headers: HEADERS })
.then((res) => extractJavTrailersMediaUrl(res.data))
.catch(() => "");
}
async function buildJavTrailersUrl(title) {
const parts = parseJavCodeParts(title);
if (!parts) return "";
if (Object.prototype.hasOwnProperty.call(JAVTRAILERS_URL_CACHE, parts.code)) return JAVTRAILERS_URL_CACHE[parts.code];
const fallbackUrl = buildJavTrailersFallbackUrl(title);
const isMgstage = isJavTrailersMgstageTitle(title);
if (!shouldFetchJavTrailersPage(title)) {
JAVTRAILERS_URL_CACHE[parts.code] = fallbackUrl;
return fallbackUrl;
}
if (!JAVTRAILERS_URL_PROMISE_CACHE[parts.code]) {
const pageIds = buildJavTrailersPageIds(title);
JAVTRAILERS_URL_PROMISE_CACHE[parts.code] = Promise.all(pageIds.map((pageId) => fetchJavTrailersPageUrl(pageId)))
.then((urls) => urls.find(Boolean) || (isMgstage ? "" : fallbackUrl))
.then((url) => {
if (url || !isMgstage) JAVTRAILERS_URL_CACHE[parts.code] = url;
return url;
});
}
try {
if (isMgstage) return await JAVTRAILERS_URL_PROMISE_CACHE[parts.code];
return await Promise.race([
JAVTRAILERS_URL_PROMISE_CACHE[parts.code],
new Promise((resolve) => setTimeout(() => resolve(fallbackUrl), JAVTRAILERS_FETCH_TIMEOUT_MS))
]);
} catch (e) {
return isMgstage ? "" : fallbackUrl;
}
}
function buildTrailerCoverUrl(title) {
const parts = parseJavCodeParts(title);
if (!parts) return "";
const mgstageCoverPrefixes = new Set(["ABF", "ABW", "JUFE", "SQTE"]);
if (mgstageCoverPrefixes.has(parts.prefix)) {
return `https://image.mgstage.com/images/prestige/${parts.prefixLower}/${parts.number3}/pb_e_${parts.prefixLower}-${parts.number3}.jpg`;
}
return `https://pics.dmm.co.jp/digital/video/${parts.code}/${parts.code}pl.jpg`;
}
function extractVideoId(href) {
if (!href) return "";
const cleanHref = href.split('#')[0].split('?')[0];
const slug = cleanHref.split('/').pop() || "";
return slug.replace(/-(uncensored-leak|chinese-subtitle)$/, "").toUpperCase();
}
function buildMissavListCoverUrl(link) {
const videoId = extractVideoId(link || "");
return videoId ? `https://fourhoi.com/${videoId.toLowerCase()}/cover-t.jpg` : "";
}
// ==================== 高清封面 URL 规则(替代 0oo0 私人服务) ====================
//
// 约定:
// - posterUrl = 高清竖图,用于 coverUrl,Forward 详情页主图最依赖这个字段
// - backdropUrl = 高清横图,用于 detailPoster / backdropPath / image
//
// 重要:
// - URL 规则只能“猜”图片地址,不能保证图片存在。
// - 因此列表页的 detailPoster 会使用 pickAvailableBackdropUrl() 做轻量可用性检测。
// - 为了控制速度,只检测横图,不检测竖图。
const MGSTAGE_COVER_RULES = {
// Prestige / MGStage 常见系列
ABF: { maker: "prestige" },
ABW: { maker: "prestige" },
ABP: { maker: "prestige" },
CHN: { maker: "prestige" },
JUFE: { maker: "prestige" },
MAAN: { maker: "prestige" },
PPT: { maker: "prestige" },
// 你提供的 jackson 例子:390JAC-220
"390JAC": { maker: "jackson" }
};
const IMAGE_AVAILABLE_CACHE = {};
const IMAGE_CHECK_TIMEOUT_MS = 900;
function compactUniqueUrls(urls) {
const seen = new Set();
const results = [];
urls.forEach((url) => {
const clean = String(url || "").trim();
if (!clean || seen.has(clean)) return;
seen.add(clean);
results.push(clean);
});
return results;
}
function buildMgstageCoverCandidatesFromParts(parts, rule) {
if (!parts || !rule || !rule.maker) {
return { posterCandidates: [], backdropCandidates: [] };
}
const prefixLower = parts.prefixLower;
const number = String(parseInt(parts.number, 10));
if (!prefixLower || !number || number === "NaN") {
return { posterCandidates: [], backdropCandidates: [] };
}
const dvdDash = `${prefixLower}-${number}`;
const base = `https://image.mgstage.com/images/${rule.maker}/${prefixLower}/${number}`;
return {
posterCandidates: compactUniqueUrls([
`${base}/pf_e_${dvdDash}.jpg`,
`${base}/pf_o1_${dvdDash}.jpg`
]),
backdropCandidates: compactUniqueUrls([
`${base}/pb_e_${dvdDash}.jpg`,
`${base}/pb_o1_${dvdDash}.jpg`
])
};
}
function buildDmmCoverCandidatesFromParts(parts) {
if (!parts) return { posterCandidates: [], backdropCandidates: [] };
// 优先复用 parseJavCodeParts() 里已有的 contentId 逻辑: