@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.
- package/README.md +90 -36
- package/catalog.json +96 -0
- package/package.json +7 -4
- package/src/manifests/aiyifan.json +152 -0
- package/src/manifests/bahamut.json +61 -0
- package/src/manifests/{builtin-bilibili.json → bilibili.json} +9 -8
- package/src/manifests/dandanplay.json +126 -0
- package/src/manifests/{builtin-hanjutv.json → hanjutv.json} +4 -4
- package/src/manifests/iqiyi.json +130 -0
- package/src/manifests/maiduidui.json +96 -0
- package/src/manifests/mango.json +114 -0
- package/src/manifests/{builtin-migu.json → migu.json} +4 -4
- package/src/manifests/renren.json +122 -0
- package/src/manifests/sohu.json +70 -0
- package/src/manifests/{builtin-tencent.json → tencent.json} +6 -5
- package/src/manifests/youku.json +119 -0
- package/src/manifests/builtin-dandanplay.json +0 -64
- package/src/manifests/builtin-ddp-compat.json +0 -96
|
@@ -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": "
|
|
3
|
+
"id": "hanjutv",
|
|
4
4
|
"name": "Hanjutv",
|
|
5
|
-
"version": "
|
|
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':
|
|
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": "
|
|
3
|
+
"id": "migu",
|
|
4
4
|
"name": "Migu Video",
|
|
5
|
-
"version": "
|
|
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 :
|
|
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
|
+
}
|