@mr-quin/dango-manifests 0.1.0 → 0.3.0

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.
@@ -0,0 +1,126 @@
1
+ {
2
+ "apiVersion": 1,
3
+ "id": "dandanplay",
4
+ "name": "DanDanPlay",
5
+ "version": "0.3.0",
6
+ "hosts": ["*"],
7
+ "configSchema": {
8
+ "type": "object",
9
+ "properties": {
10
+ "baseUrl": {
11
+ "type": "string",
12
+ "title": "Base URL",
13
+ "description": "Root of the DanDanPlay (or compatible) API. Defaults to the official https://api.dandanplay.net. Point this at a proxy or self-hosted server to override."
14
+ },
15
+ "appId": {
16
+ "type": "string",
17
+ "title": "App ID",
18
+ "description": "DanDanPlay open-platform App ID. Required for the official API; omit when using a proxy that signs server-side."
19
+ },
20
+ "appSecret": {
21
+ "type": "string",
22
+ "title": "App Secret",
23
+ "description": "DanDanPlay open-platform App Secret, used to sign requests. Only feeds the local signature, never sent."
24
+ },
25
+ "auth": {
26
+ "type": "object",
27
+ "title": "Authentication",
28
+ "description": "Custom request headers (e.g. a token) sent on every request. Used instead of signing when appId/appSecret are absent, e.g. a self-hosted compatible server.",
29
+ "properties": {
30
+ "enabled": {
31
+ "type": "boolean",
32
+ "default": false,
33
+ "title": "Enable auth headers"
34
+ },
35
+ "headers": {
36
+ "type": "array",
37
+ "title": "Headers",
38
+ "items": {
39
+ "type": "object",
40
+ "required": ["key", "value"],
41
+ "properties": {
42
+ "key": { "type": "string", "title": "Header name" },
43
+ "value": { "type": "string", "title": "Value" }
44
+ }
45
+ }
46
+ }
47
+ }
48
+ },
49
+ "chConvert": {
50
+ "type": "integer",
51
+ "enum": [0, 1, 2],
52
+ "default": 0,
53
+ "title": "Chinese conversion",
54
+ "description": "0 = no conversion, 1 = convert to simplified, 2 = convert to traditional"
55
+ }
56
+ }
57
+ },
58
+ "search": {
59
+ "inputs": ["q"],
60
+ "steps": [
61
+ {
62
+ "type": "assign",
63
+ "id": "prep",
64
+ "values": {
65
+ "req": "($base := baseUrl ? $replace(baseUrl, /\\/$/, '') : 'https://api.dandanplay.net'; $p := '/api/v2/search/anime'; $ts := $string($now()); $headers := (appId and appSecret) ? { 'X-AppId': appId, 'X-Timestamp': $ts, 'X-Signature': $sha256Base64(appId & $ts & $p & appSecret) } : ((auth.enabled and auth.headers) ? $merge(auth.headers.{ key: value }) : {}); { 'url': $base & $p, 'headers': $headers })"
66
+ }
67
+ },
68
+ {
69
+ "type": "http",
70
+ "id": "search",
71
+ "request": {
72
+ "method": "GET",
73
+ "url": "prep.req.url",
74
+ "query": "{ 'keyword': q }",
75
+ "headers": "prep.req.headers"
76
+ }
77
+ }
78
+ ],
79
+ "output": "[search.animes.{ 'providerIds': { 'animeId': animeId, 'bangumiId': bangumiId }, 'indexedId': $string(animeId), 'title': animeTitle, 'type': type, 'typeDescription': typeDescription, 'imageUrl': imageUrl, 'episodeCount': episodeCount, 'year': startDate and $contains(startDate, '-') ? $number($substringBefore(startDate, '-')) : undefined }]"
80
+ },
81
+ "episodes": {
82
+ "inputs": ["bangumiId"],
83
+ "steps": [
84
+ {
85
+ "type": "assign",
86
+ "id": "prep",
87
+ "values": {
88
+ "req": "($base := baseUrl ? $replace(baseUrl, /\\/$/, '') : 'https://api.dandanplay.net'; $p := '/api/v2/bangumi/' & $string(bangumiId); $ts := $string($now()); $headers := (appId and appSecret) ? { 'X-AppId': appId, 'X-Timestamp': $ts, 'X-Signature': $sha256Base64(appId & $ts & $p & appSecret) } : ((auth.enabled and auth.headers) ? $merge(auth.headers.{ key: value }) : {}); { 'url': $base & $p, 'headers': $headers })"
89
+ }
90
+ },
91
+ {
92
+ "type": "http",
93
+ "id": "bangumi",
94
+ "request": {
95
+ "method": "GET",
96
+ "url": "prep.req.url",
97
+ "headers": "prep.req.headers"
98
+ }
99
+ }
100
+ ],
101
+ "output": "[bangumi.bangumi.episodes.{ 'providerIds': { 'episodeId': episodeId, 'animeId': %.animeId, 'bangumiId': %.bangumiId }, 'indexedId': $string(episodeId), 'title': episodeTitle, 'episodeNumber': $match(episodeNumber, /^\\d+$/) ? $number(episodeNumber) : episodeNumber }]"
102
+ },
103
+ "danmaku": {
104
+ "inputs": ["episodeId"],
105
+ "steps": [
106
+ {
107
+ "type": "assign",
108
+ "id": "prep",
109
+ "values": {
110
+ "req": "($base := baseUrl ? $replace(baseUrl, /\\/$/, '') : 'https://api.dandanplay.net'; $p := '/api/v2/comment/' & $string(episodeId); $ts := $string($now()); $headers := (appId and appSecret) ? { 'X-AppId': appId, 'X-Timestamp': $ts, 'X-Signature': $sha256Base64(appId & $ts & $p & appSecret) } : ((auth.enabled and auth.headers) ? $merge(auth.headers.{ key: value }) : {}); { 'url': $base & $p, 'headers': $headers })"
111
+ }
112
+ },
113
+ {
114
+ "type": "http",
115
+ "id": "comments",
116
+ "request": {
117
+ "method": "GET",
118
+ "url": "prep.req.url",
119
+ "query": "{ 'withRelated': 'true', 'chConvert': chConvert ? $string(chConvert) : undefined }",
120
+ "headers": "prep.req.headers"
121
+ }
122
+ }
123
+ ],
124
+ "output": "[comments.comments]"
125
+ }
126
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "apiVersion": 1,
3
- "id": "builtin:hanjutv",
3
+ "id": "hanjutv",
4
4
  "name": "Hanjutv",
5
- "version": "1.0.0",
5
+ "version": "0.3.0",
6
6
  "hosts": ["hxqapi.hiyun.tv", "hxqapi.zmdcq.com"],
7
7
  "search": {
8
8
  "inputs": ["q"],
@@ -46,7 +46,7 @@
46
46
  }
47
47
  }
48
48
  ],
49
- "output": "($sidStr := $string(sid); [detail.playItems[$exists(pid)].{ 'providerIds': { 'sid': $sidStr, 'pid': $string(pid) }, 'indexedId': $string(pid), 'title': $exists(title) and title != '' ? title : ('第' & $string(serialNo) & '集'), 'episodeNumber': $string(serialNo) }])"
49
+ "output": "($sidStr := $string(sid); [detail.playItems[$exists(pid)].{ 'providerIds': { 'sid': $sidStr, 'pid': $string(pid) }, 'indexedId': $string(pid), 'title': $exists(title) and title != '' ? title : ('第' & $string(serialNo) & '集'), 'episodeNumber': serialNo }])"
50
50
  },
51
51
  "danmaku": {
52
52
  "inputs": ["pid"],
@@ -72,6 +72,6 @@
72
72
  "breakOn": "$count($) = 0"
73
73
  }
74
74
  ],
75
- "output": "[segments.{ 'cid': $number(did), 'p': $string(t / 1000) & ',' & $string(tp = 2 ? 5 : tp) & ',' & $string($number(sc)), 'm': con }]"
75
+ "output": "[segments.{ 'cid': $number(did), 'p': $string(t / 1000) & ',' & $string(tp = 2 ? 5 : (tp in [1,4,5,6] ? tp : 1)) & ',' & $string($number(sc)), 'm': con }]"
76
76
  }
77
77
  }
@@ -0,0 +1,130 @@
1
+ {
2
+ "apiVersion": 1,
3
+ "id": "iqiyi",
4
+ "name": "iQIYI",
5
+ "version": "0.3.0",
6
+ "hosts": [
7
+ "mesh.if.iqiyi.com",
8
+ "pcw-api.iq.com",
9
+ "pcw-api.iqiyi.com",
10
+ "www.iqiyi.com",
11
+ "cmts.iqiyi.com"
12
+ ],
13
+ "search": {
14
+ "inputs": ["q"],
15
+ "steps": [
16
+ {
17
+ "type": "http",
18
+ "id": "search",
19
+ "request": {
20
+ "method": "GET",
21
+ "url": "'https://mesh.if.iqiyi.com/portal/lw/search/homePageV3'",
22
+ "query": "{ 'key': q, 'current_page': '1', 'mode': '1', 'source': 'input', 'pcv': '13.074.22699', 'version': '13.074.22699', 'pageNum': '1', 'pageSize': '25', 'u': 'f6440fc5d919dca1aea12b6aff56e1c7', 'scale': '200', 'userVip': '0', 'vipType': '-1', 'osShortName': 'win10' }",
23
+ "rewriteHeaders": {
24
+ "Origin": "'https://www.iqiyi.com'",
25
+ "Referer": "'https://www.iqiyi.com/'"
26
+ }
27
+ }
28
+ }
29
+ ],
30
+ "output": "[search.data.templates[template in [101,102,103]].albumInfo[pageUrl ~> /iqiyi\\.com\\/v_/].($linkId := $regexExtract(pageUrl, '/v_(\\\\w+?)\\\\.html'); $chan := channel ? channel : ''; $mediaType := $contains($chan, '电影') ? '电影' : ($contains($chan, '动漫') ? '动漫' : ($contains($chan, '综艺') ? '综艺' : ($contains($chan, '纪录片') ? '纪录片' : '电视剧'))); { 'providerIds': { 'linkId': $linkId }, 'indexedId': $linkId, 'title': $replace(title, /<[^>]+>/, ''), 'type': $mediaType, 'year': year.value ? $number(year.value) : undefined, 'imageUrl': img ? img : imgH, 'episodeCount': videos and $count(videos) > 0 ? $count(videos) : ($regexExtract(subscriptContent ? subscriptContent : '', '(\\\\d+)') ? $number($regexExtract(subscriptContent ? subscriptContent : '', '(\\\\d+)')) : undefined) })]"
31
+ },
32
+ "episodes": {
33
+ "inputs": ["linkId"],
34
+ "steps": [
35
+ {
36
+ "type": "http",
37
+ "id": "decode",
38
+ "request": {
39
+ "method": "GET",
40
+ "url": "'https://pcw-api.iq.com/api/decode/' & linkId",
41
+ "query": "{ 'platformId': '3', 'modeCode': 'intl', 'langCode': 'sg' }"
42
+ },
43
+ "extract": { "tvid": "$string(data)" }
44
+ },
45
+ {
46
+ "type": "assign",
47
+ "id": "p",
48
+ "values": {
49
+ "params": "{ 'entity_id': decode.tvid, 'device_id': 'qd5fwuaj4hunxxdgzwkcqmefeb3ww5hx', 'auth_cookie': '', 'user_id': '0', 'vip_type': '-1', 'vip_status': '0', 'conduit_id': '', 'pcv': '13.082.22866', 'app_version': '13.082.22866', 'ext': '', 'app_mode': 'standard', 'scale': '100', 'timestamp': $string($millis()), 'src': 'pca_tvg', 'os': '', 'ad_ext': '{\"r\":\"2.2.0-ares6-pure\"}' }"
50
+ }
51
+ },
52
+ {
53
+ "type": "assign",
54
+ "id": "signed",
55
+ "values": {
56
+ "params": "$merge([p.params, { 'sign': $uppercase($md5($sortedRawString(p.params) & '&secret_key=howcuteitis')) }])"
57
+ }
58
+ },
59
+ {
60
+ "type": "http",
61
+ "id": "base",
62
+ "request": {
63
+ "method": "GET",
64
+ "url": "'https://www.iqiyi.com/prelw/tvg/v2/lw/base_info'",
65
+ "query": "signed.params",
66
+ "rewriteHeaders": { "Referer": "'https://www.iqiyi.com/'" }
67
+ },
68
+ "extract": {
69
+ "videoListEps": "[data.template.tabs[0].blocks[bk_type='video_list' and 'episodes' in tag].data.data.videos.data[content_type=1]]",
70
+ "albumGroups": "[data.template.tabs[0].blocks[bk_type='album_episodes' and 'episodes' in tag].data.data]"
71
+ }
72
+ },
73
+ {
74
+ "type": "forEach",
75
+ "id": "selectorPages",
76
+ "in": "[base.albumGroups[$type(videos) = 'string'].videos]",
77
+ "as": "selectorUrl",
78
+ "concurrency": 2,
79
+ "throttleMs": 0,
80
+ "request": {
81
+ "method": "GET",
82
+ "url": "selectorUrl",
83
+ "rewriteHeaders": { "Referer": "'https://www.iqiyi.com/'" }
84
+ },
85
+ "collect": "[data.videos.feature_paged.*[content_type=1]]"
86
+ }
87
+ ],
88
+ "output": "[[$append(base.videoListEps, $append(selectorPages, [base.albumGroups[$type(videos) = 'object'].videos.feature_paged.*[content_type=1]]))].($tvid := $regexExtract(play_url ? play_url : '', 'tvid=(\\\\d+)'); $tvid ? { 'providerIds': { 'tvid': $tvid }, 'indexedId': $tvid, 'title': $trim((short_display_name ? short_display_name : (title ? title : '')) & ' ' & (subtitle ? subtitle : '')), 'episodeNumber': album_order ? $number(album_order) : undefined } : undefined)]"
89
+ },
90
+ "danmaku": {
91
+ "inputs": ["tvid"],
92
+ "steps": [
93
+ {
94
+ "type": "http",
95
+ "id": "info",
96
+ "request": {
97
+ "method": "GET",
98
+ "url": "'https://pcw-api.iqiyi.com/video/video/baseinfo/' & tvid",
99
+ "rewriteHeaders": { "Referer": "'https://www.iqiyi.com/'" }
100
+ },
101
+ "extract": {
102
+ "durationSec": "data.durationSec",
103
+ "albumId": "$string(data.albumId)",
104
+ "categoryId": "$string(data.channelId ? data.channelId : data.categoryId)"
105
+ }
106
+ },
107
+ {
108
+ "type": "forEach",
109
+ "id": "segments",
110
+ "in": "$range(1, $ceil(info.durationSec / 300) + 1)",
111
+ "as": "i",
112
+ "concurrency": 3,
113
+ "throttleMs": 100,
114
+ "request": {
115
+ "method": "GET",
116
+ "url": "'https://cmts.iqiyi.com/bullet/' & $substring(tvid, $length(tvid) - 4, 2) & '/' & $substring(tvid, $length(tvid) - 2, 2) & '/' & tvid & '_300_' & $string(i) & '.z'",
117
+ "query": "{ 'rn': '0.123456789', 'business': 'danmu', 'is_iqiyi': 'true', 'is_video_page': 'true', 'tvid': tvid, 'albumid': info.albumId, 'categoryid': info.categoryId, 'qypid': '010102101000000000' }",
118
+ "format": "xml",
119
+ "decompress": "deflate",
120
+ "rewriteHeaders": { "Referer": "'https://www.iqiyi.com/'" }
121
+ },
122
+ "extract": {
123
+ "items": "[danmu.data.entry.list.bulletInfo]"
124
+ },
125
+ "collect": "items"
126
+ }
127
+ ],
128
+ "output": "[segments.{ 'p': $string($number(showTime)) & ',1,' & $string(color ? $hexToInt(color) : 16777215) & ',' & (contentId ? $string(contentId) : ''), 'm': content }]"
129
+ }
130
+ }
@@ -0,0 +1,96 @@
1
+ {
2
+ "apiVersion": 1,
3
+ "id": "maiduidui",
4
+ "name": "Maiduidui",
5
+ "version": "0.3.0",
6
+ "hosts": ["mob.mddcloud.com.cn"],
7
+ "search": {
8
+ "inputs": ["q"],
9
+ "steps": [
10
+ {
11
+ "type": "assign",
12
+ "id": "sig",
13
+ "values": {
14
+ "time": "$millis()",
15
+ "suffix": "'/searchApi/search/getAllSearchResult4820.action'",
16
+ "data": "{ 'keyWord': q }"
17
+ }
18
+ },
19
+ {
20
+ "type": "http",
21
+ "id": "search",
22
+ "request": {
23
+ "method": "POST",
24
+ "url": "'https://mob.mddcloud.com.cn' & sig.suffix",
25
+ "headers": {
26
+ "Content-Type": "'application/json'"
27
+ },
28
+ "rewriteHeaders": {
29
+ "User-Agent": "'Mdd/5.8.00 (Android+32+)'",
30
+ "Referer": "'mdd'"
31
+ },
32
+ "body": "{ 'channel': '1000', 'data': sig.data, 'deviceNum': '853BDD7A1DC011F1C341455071C03AEB', 'deviceType': 0, 'jsonSign': 0, 'os': 'Android', 'sign': $md5('os:Android|version:5.8.00|action:' & sig.suffix & '|time:' & $string(sig.time) & '|appToken:|privateKey:e1be6b4cf4021b3d181170d1879a530a9e4130b69032144d5568abfd6cd6c1c2|data:' & $sortedRawString(sig.data) & '&'), 'sourceVersion': 0, 'terminalType': 'APP', 'thirdStatus': 0, 'time': sig.time, 'version': '5.8.00', 'visitorStatus': 0 }"
33
+ }
34
+ }
35
+ ],
36
+ "output": "[search.data[typeName in ['剧集', '电影', '综艺']].($tn := typeName; vodList.{ 'providerIds': { 'vodUuid': uuid }, 'indexedId': uuid, 'title': name, 'type': $tn, 'year': $exists(year) ? $number(year) : undefined, 'imageUrl': coverImage, 'episodeCount': undefined })]"
37
+ },
38
+ "episodes": {
39
+ "inputs": ["vodUuid"],
40
+ "steps": [
41
+ {
42
+ "type": "assign",
43
+ "id": "sig",
44
+ "values": {
45
+ "time": "$millis()",
46
+ "suffix": "'/api/vod/listVodSactions.action'",
47
+ "data": "{ 'hasIntroduction': 0, 'vodUuid': vodUuid }"
48
+ }
49
+ },
50
+ {
51
+ "type": "http",
52
+ "id": "ep",
53
+ "request": {
54
+ "method": "POST",
55
+ "url": "'https://mob.mddcloud.com.cn' & sig.suffix",
56
+ "headers": {
57
+ "Content-Type": "'application/json'"
58
+ },
59
+ "rewriteHeaders": {
60
+ "User-Agent": "'Mdd/5.8.00 (Android+32+)'",
61
+ "Referer": "'mdd'"
62
+ },
63
+ "body": "{ 'channel': '1000', 'data': sig.data, 'deviceNum': '853BDD7A1DC011F1C341455071C03AEB', 'deviceType': 0, 'jsonSign': 0, 'os': 'Android', 'sign': $md5('os:Android|version:5.8.00|action:' & sig.suffix & '|time:' & $string(sig.time) & '|appToken:|privateKey:e1be6b4cf4021b3d181170d1879a530a9e4130b69032144d5568abfd6cd6c1c2|data:' & $sortedRawString(sig.data) & '&'), 'sourceVersion': 0, 'terminalType': 'APP', 'thirdStatus': 0, 'time': sig.time, 'version': '5.8.00', 'visitorStatus': 0 }"
64
+ }
65
+ }
66
+ ],
67
+ "output": "[ep.data.($idx := $; { 'providerIds': { 'sactionUuid': uuid, 'vodUuid': $$.vodUuid, 'durationSec': $exists(duration) ? $number(duration) : 0 }, 'indexedId': uuid, 'title': name ? name : ('第' & $string(sort) & '集'), 'episodeNumber': $exists(sort) ? $number(sort) : undefined })]"
68
+ },
69
+ "danmaku": {
70
+ "inputs": ["sactionUuid", "vodUuid", "durationSec"],
71
+ "steps": [
72
+ {
73
+ "type": "forEach",
74
+ "id": "segments",
75
+ "in": "$range(0, $ceil((durationSec > 0 ? durationSec : 5400) / 60))",
76
+ "as": "i",
77
+ "concurrency": 5,
78
+ "throttleMs": 50,
79
+ "request": {
80
+ "method": "POST",
81
+ "url": "'https://mob.mddcloud.com.cn/api/barrage/vodBarrage396.action'",
82
+ "headers": {
83
+ "Content-Type": "'application/json'"
84
+ },
85
+ "rewriteHeaders": {
86
+ "User-Agent": "'Mdd/5.8.00 (Android+32+)'",
87
+ "Referer": "'mdd'"
88
+ },
89
+ "body": "($t := $millis(); $sx := '/api/barrage/vodBarrage396.action'; $d := { 'sactionUuid': sactionUuid, 'times': i * 60, 'vodUuid': vodUuid }; { 'channel': '1000', 'data': $d, 'deviceNum': '853BDD7A1DC011F1C341455071C03AEB', 'deviceType': 0, 'jsonSign': 0, 'os': 'Android', 'sign': $md5('os:Android|version:5.8.00|action:' & $sx & '|time:' & $string($t) & '|appToken:|privateKey:e1be6b4cf4021b3d181170d1879a530a9e4130b69032144d5568abfd6cd6c1c2|data:' & $sortedRawString($d) & '&'), 'sourceVersion': 0, 'terminalType': 'APP', 'thirdStatus': 0, 'time': $t, 'version': '5.8.00', 'visitorStatus': 0 })"
90
+ },
91
+ "collect": "[data.barrageList]"
92
+ }
93
+ ],
94
+ "output": "[segments.{ 'p': $string(times) & ',1,' & $string($hexToInt($replace(color ? color : '#FFFFFF', /^#/, ''))) & ',' & (uuid ? $string(uuid) : ''), 'm': content }]"
95
+ }
96
+ }
@@ -0,0 +1,114 @@
1
+ {
2
+ "apiVersion": 1,
3
+ "id": "mango",
4
+ "name": "Mango TV",
5
+ "version": "0.3.0",
6
+ "hosts": [
7
+ "mobileso.bz.mgtv.com",
8
+ "pcweb.api.mgtv.com",
9
+ "galaxy.bz.mgtv.com",
10
+ "*.mgtv.com",
11
+ "*.hitv.com"
12
+ ],
13
+ "search": {
14
+ "inputs": ["q"],
15
+ "steps": [
16
+ {
17
+ "type": "http",
18
+ "id": "search",
19
+ "request": {
20
+ "method": "GET",
21
+ "url": "'https://mobileso.bz.mgtv.com/msite/search/v2'",
22
+ "query": "{ 'q': q, 'pc': '30', 'pn': '1', 'sort': '-99', 'ty': '0', 'du': '0', 'pt': '0', 'corr': '1', 'abroad': '0', '_support': '10000000000000000' }",
23
+ "rewriteHeaders": { "Referer": "'https://www.mgtv.com/'" }
24
+ }
25
+ }
26
+ ],
27
+ "output": "[search.data.contents[type='media'].data[source='imgo'].($cid := $regexExtract(url, '/b/(\\\\d+)'); { 'providerIds': { 'collectionId': $cid }, 'indexedId': $cid, 'title': $replace(title, /<[^>]+>/, ''), 'type': $substringBefore(desc[0], '/') ~> $replace('类型:', '') ~> $trim, 'year': $number($regexExtract(desc[0], '([12][890][0-9][0-9])')), 'imageUrl': img, 'episodeCount': videoCount })[providerIds.collectionId]]"
28
+ },
29
+ "episodes": {
30
+ "inputs": ["collectionId"],
31
+ "steps": [
32
+ {
33
+ "type": "http",
34
+ "id": "bootstrap",
35
+ "request": {
36
+ "method": "GET",
37
+ "url": "'https://pcweb.api.mgtv.com/variety/showlist'",
38
+ "query": "{ 'allowedRC': '1', 'collection_id': collectionId, 'month': '', 'page': '1', '_support': '10000000' }",
39
+ "rewriteHeaders": { "Referer": "'https://www.mgtv.com/'" }
40
+ },
41
+ "extract": {
42
+ "months": "data.tab_m.m"
43
+ }
44
+ },
45
+ {
46
+ "type": "forEach",
47
+ "id": "pages",
48
+ "in": "bootstrap.months",
49
+ "as": "month",
50
+ "request": {
51
+ "method": "GET",
52
+ "url": "'https://pcweb.api.mgtv.com/variety/showlist'",
53
+ "query": "{ 'allowedRC': '1', 'collection_id': collectionId, 'month': month, 'page': '1', '_support': '10000000' }",
54
+ "rewriteHeaders": { "Referer": "'https://www.mgtv.com/'" }
55
+ },
56
+ "extract": {
57
+ "items": "data.list"
58
+ },
59
+ "collect": "items",
60
+ "throttleMs": 100
61
+ }
62
+ ],
63
+ "output": "[$filter(pages, function($p) { $p.src_clip_id = collectionId }).($n := $regexExtract(t1 & t2, '第(\\\\d+)集'); { 'providerIds': { 'vid': video_id, 'cid': $string($$.collectionId) }, 'indexedId': $string(video_id), 'title': $trim(t1 & ' ' & t2), 'episodeNumber': $n ? $number($n) : undefined })]"
64
+ },
65
+ "danmaku": {
66
+ "inputs": ["cid", "vid"],
67
+ "steps": [
68
+ {
69
+ "type": "http",
70
+ "id": "info",
71
+ "request": {
72
+ "method": "GET",
73
+ "url": "'https://pcweb.api.mgtv.com/video/info'",
74
+ "query": "{ 'cid': cid, 'vid': vid }",
75
+ "rewriteHeaders": { "Referer": "'https://www.mgtv.com/'" }
76
+ },
77
+ "extract": {
78
+ "durationSec": "$timeToSeconds(data.info.time)"
79
+ }
80
+ },
81
+ {
82
+ "type": "http",
83
+ "id": "ctl",
84
+ "request": {
85
+ "method": "GET",
86
+ "url": "'https://galaxy.bz.mgtv.com/getctlbarrage'",
87
+ "query": "{ 'version': '8.1.39', 'abroad': '0', 'uuid': '', 'os': '10.15.7', 'platform': '0', 'mac': '', 'vid': vid, 'pid': '', 'cid': cid, 'ticket': '' }",
88
+ "rewriteHeaders": { "Referer": "'https://www.mgtv.com/'" }
89
+ },
90
+ "extract": {
91
+ "cdn": "$substringBefore(data.cdn_list, ',')",
92
+ "version": "data.cdn_version"
93
+ }
94
+ },
95
+ {
96
+ "type": "forEach",
97
+ "id": "segments",
98
+ "in": "(ctl.cdn and ctl.version) ? $range(0, $ceil(info.durationSec / 60)) : []",
99
+ "as": "i",
100
+ "request": {
101
+ "method": "GET",
102
+ "url": "'https://' & ctl.cdn & '/' & ctl.version & '/' & $string(i) & '.json'"
103
+ },
104
+ "extract": {
105
+ "items": "data.items"
106
+ },
107
+ "collect": "items",
108
+ "throttleMs": 50,
109
+ "concurrency": 4
110
+ }
111
+ ],
112
+ "output": "[segments.{ 'p': $string($number(time) / 1000) & ',1,16777215,' & $string(uid), 'm': content }]"
113
+ }
114
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "apiVersion": 1,
3
- "id": "builtin:migu",
3
+ "id": "migu",
4
4
  "name": "Migu Video",
5
- "version": "1.0.0",
5
+ "version": "0.3.0",
6
6
  "hosts": ["jadeite.migu.cn", "v3-sc.miguvideo.com", "webapi.miguvideo.com"],
7
7
  "search": {
8
8
  "inputs": ["q"],
@@ -51,7 +51,7 @@
51
51
  }
52
52
  }
53
53
  ],
54
- "output": "($epsIdStr := $string(epsId); [picked.items.{ 'providerIds': { 'epsId': $epsIdStr, 'pId': $string(pID) }, 'indexedId': $string(pID), 'title': name, 'episodeNumber': $exists(episodeNumber) ? episodeNumber : name }])"
54
+ "output": "($epsIdStr := $string(epsId); [picked.items.{ 'providerIds': { 'epsId': $epsIdStr, 'pId': $string(pID) }, 'indexedId': $string(pID), 'title': name, 'episodeNumber': $exists(episodeNumber) ? episodeNumber : undefined }])"
55
55
  },
56
56
  "danmaku": {
57
57
  "inputs": ["epsId", "pId"],
@@ -99,6 +99,6 @@
99
99
  "collect": "comments"
100
100
  }
101
101
  ],
102
- "output": "[segments.{ 'cid': $number(cid), 'p': $string(playtime) & ',1,' & $string($hexToInt(textcolor)), 'm': msg }]"
102
+ "output": "[segments.{ 'cid': $number(cid), 'p': $string(playtime) & ',1,' & $string(textcolor ? $hexToInt(textcolor) : 16777215), 'm': msg }]"
103
103
  }
104
104
  }
@@ -0,0 +1,122 @@
1
+ {
2
+ "apiVersion": 1,
3
+ "id": "renren",
4
+ "name": "Renren",
5
+ "version": "0.3.0",
6
+ "hosts": ["api.gorafie.com", "static-dm.qwdjapp.com"],
7
+ "search": {
8
+ "inputs": ["q"],
9
+ "steps": [
10
+ {
11
+ "type": "assign",
12
+ "id": "sig",
13
+ "values": {
14
+ "ts": "$millis()",
15
+ "path": "'/qwtv/search'",
16
+ "params": "{ 'searchWord': q, 'num': 30, 'searchNext': '', 'well': 'match' }"
17
+ }
18
+ },
19
+ {
20
+ "type": "http",
21
+ "id": "search",
22
+ "request": {
23
+ "method": "GET",
24
+ "url": "'https://api.gorafie.com' & sig.path",
25
+ "query": "sig.params",
26
+ "headers": {
27
+ "clientVersion": "'1.2.2'",
28
+ "p": "'Android'",
29
+ "deviceid": "'tWEtIN7JG2DTDkBBigvj6A%3D%3D'",
30
+ "token": "''",
31
+ "aliid": "'aYN4D0XfSREDAJaw3UAjG33K'",
32
+ "umid": "''",
33
+ "clienttype": "'android_qwtv_RRSP'",
34
+ "pkt": "'rrmj'",
35
+ "t": "$string(sig.ts)",
36
+ "sign": "$md5(sig.path & 't' & $string(sig.ts) & 'num' & $string(sig.params.num) & 'searchNext' & sig.params.searchNext & 'searchWord' & sig.params.searchWord & 'well' & sig.params.well & 'cf65GPholnICgyw1xbrpA79XVkizOdMq')",
37
+ "isAgree": "'1'",
38
+ "et": "'2'"
39
+ },
40
+ "rewriteHeaders": { "User-Agent": "'okhttp/3.12.13'" }
41
+ }
42
+ }
43
+ ],
44
+ "output": "[search.data[id and title].{ 'providerIds': { 'seriesId': $string(id) }, 'indexedId': $string(id), 'title': title, 'type': classify ? classify : 'Renren', 'year': $exists(year) ? $number(year) : undefined, 'imageUrl': cover }]"
45
+ },
46
+ "episodes": {
47
+ "inputs": ["seriesId"],
48
+ "steps": [
49
+ {
50
+ "type": "assign",
51
+ "id": "sig",
52
+ "values": {
53
+ "ts": "$millis()",
54
+ "path": "'/qwtv/drama/details'",
55
+ "params": "{ 'isAgeLimit': 'false', 'seriesId': seriesId, 'episodeId': '', 'clarity': 'HD', 'caption': '0', 'hevcOpen': '1' }"
56
+ }
57
+ },
58
+ {
59
+ "type": "http",
60
+ "id": "detail",
61
+ "request": {
62
+ "method": "GET",
63
+ "url": "'https://api.gorafie.com' & sig.path",
64
+ "query": "sig.params",
65
+ "headers": {
66
+ "clientVersion": "'1.2.2'",
67
+ "p": "'Android'",
68
+ "deviceid": "'tWEtIN7JG2DTDkBBigvj6A%3D%3D'",
69
+ "token": "''",
70
+ "aliid": "'aYN4D0XfSREDAJaw3UAjG33K'",
71
+ "umid": "''",
72
+ "clienttype": "'android_qwtv_RRSP'",
73
+ "pkt": "'rrmj'",
74
+ "t": "$string(sig.ts)",
75
+ "sign": "$md5(sig.path & 't' & $string(sig.ts) & 'caption' & sig.params.caption & 'clarity' & sig.params.clarity & 'episodeId' & sig.params.episodeId & 'hevcOpen' & sig.params.hevcOpen & 'isAgeLimit' & sig.params.isAgeLimit & 'seriesId' & sig.params.seriesId & 'cf65GPholnICgyw1xbrpA79XVkizOdMq')",
76
+ "isAgree": "'1'",
77
+ "et": "'2'"
78
+ },
79
+ "rewriteHeaders": { "User-Agent": "'okhttp/3.12.13'" }
80
+ }
81
+ }
82
+ ],
83
+ "output": "[detail.data.episodeList[sid].{ 'providerIds': { 'sid': $string(sid) }, 'indexedId': $string(sid), 'title': title and $length(title) > 0 ? title : ('第' & $string(episodeNo ? episodeNo : 1) & '集'), 'episodeNumber': $exists(episodeNo) ? $number(episodeNo) : undefined }]"
84
+ },
85
+ "danmaku": {
86
+ "inputs": ["sid"],
87
+ "steps": [
88
+ {
89
+ "type": "assign",
90
+ "id": "sig",
91
+ "values": {
92
+ "ts": "$millis()",
93
+ "path": "'/v1/produce/danmu/EPISODE/' & sid"
94
+ }
95
+ },
96
+ {
97
+ "type": "http",
98
+ "id": "fetch",
99
+ "request": {
100
+ "method": "GET",
101
+ "url": "'https://static-dm.qwdjapp.com' & sig.path",
102
+ "headers": {
103
+ "clientVersion": "'1.2.2'",
104
+ "p": "'Android'",
105
+ "deviceid": "'tWEtIN7JG2DTDkBBigvj6A%3D%3D'",
106
+ "token": "''",
107
+ "aliid": "'aYN4D0XfSREDAJaw3UAjG33K'",
108
+ "umid": "''",
109
+ "clienttype": "'android_qwtv_RRSP'",
110
+ "pkt": "'rrmj'",
111
+ "t": "$string(sig.ts)",
112
+ "sign": "$md5(sig.path & 't' & $string(sig.ts) & 'cf65GPholnICgyw1xbrpA79XVkizOdMq')",
113
+ "isAgree": "'1'",
114
+ "et": "'2'"
115
+ },
116
+ "rewriteHeaders": { "User-Agent": "'okhttp/3.12.13'" }
117
+ }
118
+ }
119
+ ],
120
+ "output": "[(fetch.data ? fetch.data : fetch).($parts := $split(p, ','); { 'p': $parts[0] & ',1,' & $parts[3] & ',' & $parts[6], 'm': d })]"
121
+ }
122
+ }