@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,70 @@
1
+ {
2
+ "apiVersion": 1,
3
+ "id": "sohu",
4
+ "name": "Sohu",
5
+ "version": "0.3.0",
6
+ "hosts": ["m.so.tv.sohu.com", "api.tv.sohu.com", "api.danmu.tv.sohu.com"],
7
+ "search": {
8
+ "inputs": ["q"],
9
+ "steps": [
10
+ {
11
+ "type": "http",
12
+ "id": "search",
13
+ "request": {
14
+ "method": "GET",
15
+ "url": "'https://m.so.tv.sohu.com/search/pc/keyword'",
16
+ "query": "{ 'key': q, 'type': '1', 'page': '1', 'page_size': '20', 'tabsChosen': '0', 'poster': '4', 'tuple': '6', 'extSource': '1', 'show_star_detail': '3', 'pay': '1', 'hl': '3', 'uid': $string($millis() * 1000), 'plat': '-1', 'ssl': '0' }",
17
+ "rewriteHeaders": {
18
+ "Referer": "'https://so.tv.sohu.com/'",
19
+ "Origin": "'https://so.tv.sohu.com'"
20
+ }
21
+ }
22
+ }
23
+ ],
24
+ "output": "[search.data.items[aid and album_name and site = 1 and (is_trailer ? is_trailer != 1 : true) and (corner_mark.text ? corner_mark.text != '预告' : true)].($metaTxt := [meta.txt][$contains($, '|')][0]; $type := $metaTxt ? $trim($split($metaTxt, '|')[0]) : 'Sohu'; { 'providerIds': { 'aid': $string(aid) }, 'indexedId': $string(aid), 'title': $replace(album_name, /<<<|>>>/, ''), 'type': $type, 'year': year ? $number(year) : undefined, 'imageUrl': ver_big_pic, 'episodeCount': total_video_count > 0 ? total_video_count : undefined })]"
25
+ },
26
+ "episodes": {
27
+ "inputs": ["aid"],
28
+ "steps": [
29
+ {
30
+ "type": "http",
31
+ "id": "album",
32
+ "request": {
33
+ "method": "GET",
34
+ "url": "'https://api.tv.sohu.com/v4/album/videos/' & aid & '.json'",
35
+ "query": "{ 'page': '1', 'page_size': '500' }",
36
+ "rewriteHeaders": { "Referer": "'https://tv.sohu.com/'" }
37
+ }
38
+ }
39
+ ],
40
+ "output": "[album.data.videos[$exists(vid)].{ 'providerIds': { 'vid': $string(vid), 'aid': $string(aid), 'durationSec': total_duration > 0 ? $number(total_duration) : 0 }, 'indexedId': $string(vid), 'title': video_name ? video_name : ('第' & $string(albumAbsoluteOrder ? albumAbsoluteOrder : 1) & '集'), 'episodeNumber': albumAbsoluteOrder ? $number(albumAbsoluteOrder) : undefined }]"
41
+ },
42
+ "danmaku": {
43
+ "inputs": ["vid", "aid", "durationSec"],
44
+ "steps": [
45
+ {
46
+ "type": "assign",
47
+ "id": "info",
48
+ "values": {
49
+ "maxTime": "durationSec > 0 ? $ceil(durationSec) : 10800"
50
+ }
51
+ },
52
+ {
53
+ "type": "forEach",
54
+ "id": "segments",
55
+ "in": "$range(0, $ceil(info.maxTime / 300))",
56
+ "as": "i",
57
+ "concurrency": 5,
58
+ "throttleMs": 50,
59
+ "request": {
60
+ "method": "GET",
61
+ "url": "'https://api.danmu.tv.sohu.com/dmh5/dmListAll'",
62
+ "query": "{ 'act': 'dmlist_v2', 'vid': vid, 'aid': aid, 'pct': '2', 'time_begin': $string(i * 300), 'time_end': $string((i + 1) * 300), 'dct': '1', 'request_from': 'h5_js' }",
63
+ "rewriteHeaders": { "Referer": "'https://tv.sohu.com/'" }
64
+ },
65
+ "collect": "info.comments"
66
+ }
67
+ ],
68
+ "output": "[segments.($cr := $string(t.c ? t.c : '16777215'); $color := $contains($cr, '#') ? $hexToInt($replace($cr, '#', '')) : $number($cr); $vt := v ? $string(v) : '0'; { 'p': $vt & ',1,' & $string($color) & ',' & (uid ? $string(uid) : ''), 'm': c })]"
69
+ }
70
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "apiVersion": 1,
3
- "id": "builtin:tencent",
3
+ "id": "tencent",
4
4
  "name": "Tencent Video",
5
- "version": "1.0.0",
5
+ "version": "0.3.0",
6
6
  "hosts": ["pbaccess.video.qq.com", "dm.video.qq.com"],
7
7
  "urlMatch": [
8
8
  {
@@ -60,7 +60,7 @@
60
60
  "throttleMs": 100
61
61
  }
62
62
  ],
63
- "output": "[pages.{ 'providerIds': { 'vid': vid, 'cid': cid }, 'indexedId': vid, 'title': play_title, 'episodeNumber': title, 'alternativeTitle': union_title and union_title != '' ? [union_title] : undefined, 'imageUrl': image_url }]"
63
+ "output": "[pages.{ 'providerIds': { 'vid': vid, 'cid': cid }, 'indexedId': vid, 'title': play_title, 'episodeNumber': $match(title, /^\\d+$/) ? $number(title) : (title and title != '' ? title : undefined), 'alternativeTitle': union_title and union_title != '' ? [union_title] : undefined, 'imageUrl': image_url }]"
64
64
  },
65
65
  "danmaku": {
66
66
  "inputs": ["vid"],
@@ -102,7 +102,8 @@
102
102
  "collect": "barrage_list"
103
103
  }
104
104
  ],
105
- "output": "[segments.($s := content_style and content_style != '' ? $jsonParse(content_style) : null; $g := $s.gradient_colors; $hex := $exists($g[0]) and $g[0] != '' ? $g[0] : $s.color; $color := $exists($hex) and $hex != '' ? $hexToInt($replace($hex, /^#/, '')) : 16777215; { 'p': $string($number(time_offset) / 1000) & ',1,' & $string($color) & ',' & (vuid ? $string(vuid) : ''), 'm': content })]"
105
+ "output": "[segments]",
106
+ "map": "($s := content_style and content_style != '' ? $jsonParse(content_style) : null; $g := $s.gradient_colors; $hex := $exists($g[0]) and $g[0] != '' ? $g[0] : $s.color; $color := $exists($hex) and $hex != '' ? $hexToInt($replace($hex, /^#/, '')) : 16777215; { 'p': $string($number(time_offset) / 1000) & ',1,' & $string($color) & ',' & (vuid ? $string(vuid) : ''), 'm': content })"
106
107
  },
107
108
  "cookieSet": {
108
109
  "url": "https://v.qq.com",
@@ -173,6 +174,6 @@
173
174
  }
174
175
  }
175
176
  ],
176
- "output": "{ 'seasonInsert': { 'providerIds': { 'cid': picked.season.item_params.`report.cid` }, 'indexedId': picked.season.item_params.`report.cid`, 'title': picked.season.item_params.title, 'type': $string(picked.season.item_type), 'imageUrl': picked.season.item_params.new_pic_vt, 'episodeCount': picked.season.item_params.episode_all }, 'episodeMeta': $exists(picked.ep) ? { 'providerIds': { 'vid': picked.ep.vid }, 'indexedId': picked.ep.vid, 'title': picked.ep.play_title, 'episodeNumber': picked.ep.title, 'alternativeTitle': picked.ep.union_title and picked.ep.union_title != '' ? [picked.ep.union_title] : undefined, 'imageUrl': picked.ep.image_url } : undefined }"
177
+ "output": "{ 'seasonInsert': { 'providerIds': { 'cid': picked.season.item_params.`report.cid` }, 'indexedId': picked.season.item_params.`report.cid`, 'title': picked.season.item_params.title, 'type': $string(picked.season.item_type), 'imageUrl': picked.season.item_params.new_pic_vt, 'episodeCount': picked.season.item_params.episode_all }, 'episodeMeta': $exists(picked.ep) ? { 'providerIds': { 'vid': picked.ep.vid }, 'indexedId': picked.ep.vid, 'title': picked.ep.play_title, 'episodeNumber': $match(picked.ep.title, /^\\d+$/) ? $number(picked.ep.title) : (picked.ep.title and picked.ep.title != '' ? picked.ep.title : undefined), 'alternativeTitle': picked.ep.union_title and picked.ep.union_title != '' ? [picked.ep.union_title] : undefined, 'imageUrl': picked.ep.image_url } : undefined }"
177
178
  }
178
179
  }
@@ -0,0 +1,119 @@
1
+ {
2
+ "apiVersion": 1,
3
+ "id": "youku",
4
+ "name": "Youku",
5
+ "version": "0.3.0",
6
+ "hosts": [
7
+ "search.youku.com",
8
+ "openapi.youku.com",
9
+ "acs.youku.com",
10
+ "log.mmstat.com"
11
+ ],
12
+ "search": {
13
+ "inputs": ["q"],
14
+ "steps": [
15
+ {
16
+ "type": "http",
17
+ "id": "search",
18
+ "request": {
19
+ "method": "GET",
20
+ "url": "'https://search.youku.com/api/search'",
21
+ "query": "{ 'keyword': q, 'site': '1', 'categories': '0', 'ftype': '0', 'ob': '0', 'pg': '1' }",
22
+ "rewriteHeaders": { "Referer": "'https://www.youku.com/'" }
23
+ }
24
+ }
25
+ ],
26
+ "output": "[search.pageComponentList[commonData.isYouku=1 or commonData.hasYouku=1].commonData.($parts := $split(feature, ' · '); { 'providerIds': { 'showId': showId }, 'indexedId': showId, 'title': $replace(titleDTO.displayName, /<[^>]+>/, '') ~> $trim, 'type': $trim($parts[1]), 'year': $number($regexExtract(feature, '([12][890][0-9][0-9])')), 'imageUrl': posterDTO.vThumbUrl, 'episodeCount': episodeTotal })[providerIds.showId]]"
27
+ },
28
+ "episodes": {
29
+ "inputs": ["showId"],
30
+ "steps": [
31
+ {
32
+ "type": "forEach",
33
+ "id": "pages",
34
+ "in": "$range(1, 51)",
35
+ "as": "page",
36
+ "request": {
37
+ "method": "GET",
38
+ "url": "'https://openapi.youku.com/v2/shows/videos.json'",
39
+ "query": "{ 'client_id': '53e6cc67237fc59a', 'package': 'com.huawei.hwvplayer.youku', 'ext': 'show', 'show_id': showId, 'page': $string(page), 'count': '100' }"
40
+ },
41
+ "collect": "videos",
42
+ "breakOn": "$count($) < 100",
43
+ "throttleMs": 100
44
+ }
45
+ ],
46
+ "output": "[pages.{ 'providerIds': { 'vid': id }, 'indexedId': id, 'title': title, 'episodeNumber': $number(stage), 'imageUrl': thumbnail_v2 }]"
47
+ },
48
+ "danmaku": {
49
+ "inputs": ["vid"],
50
+ "steps": [
51
+ {
52
+ "type": "http",
53
+ "id": "info",
54
+ "request": {
55
+ "method": "GET",
56
+ "url": "'https://openapi.youku.com/v2/videos/show.json'",
57
+ "query": "{ 'client_id': '53e6cc67237fc59a', 'video_id': vid, 'package': 'com.huawei.hwvplayer.youku', 'ext': 'show' }"
58
+ },
59
+ "extract": {
60
+ "durationSec": "$number(duration)"
61
+ }
62
+ },
63
+ {
64
+ "type": "http",
65
+ "id": "cna",
66
+ "request": {
67
+ "method": "GET",
68
+ "url": "'https://log.mmstat.com/eg.js'",
69
+ "format": "text",
70
+ "credentials": "include"
71
+ },
72
+ "extractHeaders": {
73
+ "value": "$replace(`etag`, /^\"|\"$/, '')"
74
+ }
75
+ },
76
+ {
77
+ "type": "http",
78
+ "id": "tkEnc",
79
+ "request": {
80
+ "method": "GET",
81
+ "url": "'https://acs.youku.com/h5/mtop.com.youku.aplatform.weakget/1.0/'",
82
+ "query": "{ 'jsv': '2.5.1', 'appKey': '24679788' }",
83
+ "credentials": "include"
84
+ },
85
+ "extractHeaders": {
86
+ "tk": "$regexExtract(`set-cookie`, '_m_h5_tk=([^;]+)')"
87
+ }
88
+ },
89
+ {
90
+ "type": "assign",
91
+ "id": "prep",
92
+ "values": {
93
+ "iters": "$map($range(0, $floor(info.durationSec / 60) + 1), function($mat) { ($t := $millis(); $msg := { 'ctime': $t, 'ctype': 10004, 'cver': 'v1.0', 'guid': cna.value, 'mat': $mat, 'mcount': 1, 'pid': 0, 'sver': '3.1.0', 'type': 1, 'vid': vid }; $msgB64 := $base64Encode($stringify($msg)); $innerSign := $md5($msgB64 & 'MkmC9SoIw6xCkSKHhJ7b5D2r51kBiREr'); $data := $stringify($merge([$msg, { 'msg': $msgB64, 'sign': $innerSign }])); $outerSign := $md5($substring(tkEnc.tk, 0, 32) & '&' & $string($t) & '&24679788&' & $data); { 'url': 'https://acs.youku.com/h5/mopen.youku.danmu.list/1.0/?' & $sortedQueryString({ 'jsv': '2.5.6', 'appKey': '24679788', 't': $string($t), 'sign': $outerSign, 'api': 'mopen.youku.danmu.list', 'v': '1.0', 'type': 'originaljson', 'dataType': 'jsonp', 'timeout': '20000', 'jsonpIncPrefix': 'utility' }), 'body': 'data=' & $encodeUrlComponent($data) }) })"
94
+ }
95
+ },
96
+ {
97
+ "type": "forEach",
98
+ "id": "segments",
99
+ "in": "prep.iters",
100
+ "as": "iter",
101
+ "concurrency": 4,
102
+ "throttleMs": 100,
103
+ "request": {
104
+ "method": "POST",
105
+ "url": "iter.url",
106
+ "headers": { "Content-Type": "'application/x-www-form-urlencoded'" },
107
+ "body": "iter.body",
108
+ "credentials": "include",
109
+ "rewriteHeaders": { "Referer": "'https://v.youku.com'" }
110
+ },
111
+ "extract": {
112
+ "items": "$jsonParse(data.result).data.result"
113
+ },
114
+ "collect": "items"
115
+ }
116
+ ],
117
+ "output": "[segments.{ 'p': $string($number(playat) / 1000) & ',1,16777215,' & $string(uid), 'm': content }]"
118
+ }
119
+ }
@@ -1,64 +0,0 @@
1
- {
2
- "apiVersion": 1,
3
- "id": "builtin:dandanplay",
4
- "name": "DanDanPlay",
5
- "version": "1.0.0",
6
- "hosts": ["api.danmaku.weeblify.app"],
7
- "configSchema": {
8
- "type": "object",
9
- "properties": {
10
- "chConvert": {
11
- "type": "integer",
12
- "enum": [0, 1, 2],
13
- "default": 0,
14
- "title": "Chinese conversion",
15
- "description": "0 = no conversion, 1 = convert to simplified, 2 = convert to traditional"
16
- }
17
- }
18
- },
19
- "search": {
20
- "inputs": ["q"],
21
- "steps": [
22
- {
23
- "type": "http",
24
- "id": "search",
25
- "request": {
26
- "method": "GET",
27
- "url": "'https://api.danmaku.weeblify.app/ddp/v1'",
28
- "query": "{ 'path': '/v2/search/anime?' & $sortedQueryString({ 'keyword': q }) }"
29
- }
30
- }
31
- ],
32
- "output": "[search.animes.{ 'providerIds': { 'animeId': animeId, 'bangumiId': bangumiId }, 'indexedId': $string(animeId), 'title': animeTitle, 'type': type, 'typeDescription': typeDescription, 'imageUrl': imageUrl, 'episodeCount': episodeCount, 'year': $number($substringBefore(startDate, '-')) }]"
33
- },
34
- "episodes": {
35
- "inputs": ["bangumiId"],
36
- "steps": [
37
- {
38
- "type": "http",
39
- "id": "bangumi",
40
- "request": {
41
- "method": "GET",
42
- "url": "'https://api.danmaku.weeblify.app/ddp/v1'",
43
- "query": "{ 'path': '/v2/bangumi/' & $string(bangumiId) }"
44
- }
45
- }
46
- ],
47
- "output": "[bangumi.bangumi.episodes.{ 'providerIds': { 'episodeId': episodeId, 'animeId': %.animeId, 'bangumiId': %.bangumiId }, 'indexedId': $string(episodeId), 'title': episodeTitle, 'episodeNumber': episodeNumber }]"
48
- },
49
- "danmaku": {
50
- "inputs": ["episodeId"],
51
- "steps": [
52
- {
53
- "type": "http",
54
- "id": "comments",
55
- "request": {
56
- "method": "GET",
57
- "url": "'https://api.danmaku.weeblify.app/ddp/v1'",
58
- "query": "{ 'path': '/v2/comment/' & $string(episodeId) & '?' & $sortedQueryString({ 'withRelated': 'true', 'chConvert': chConvert ? $string(chConvert) : undefined }) }"
59
- }
60
- }
61
- ],
62
- "output": "[comments.comments]"
63
- }
64
- }
@@ -1,96 +0,0 @@
1
- {
2
- "apiVersion": 1,
3
- "id": "builtin:ddp-compat",
4
- "name": "DanDanPlay Compatible",
5
- "version": "1.0.0",
6
- "hosts": ["*"],
7
- "configSchema": {
8
- "type": "object",
9
- "required": ["baseUrl"],
10
- "properties": {
11
- "baseUrl": {
12
- "type": "string",
13
- "title": "Base URL",
14
- "description": "Root of the DanDanPlay-compatible API (e.g. https://my-server.com)"
15
- },
16
- "chConvert": {
17
- "type": "integer",
18
- "enum": [0, 1, 2],
19
- "default": 0,
20
- "title": "Chinese conversion",
21
- "description": "0 = no conversion, 1 = convert to simplified, 2 = convert to traditional"
22
- },
23
- "auth": {
24
- "type": "object",
25
- "title": "Authentication",
26
- "description": "Custom request headers (e.g. Authorization) sent on every request",
27
- "properties": {
28
- "enabled": {
29
- "type": "boolean",
30
- "default": false,
31
- "title": "Enable auth headers"
32
- },
33
- "headers": {
34
- "type": "array",
35
- "title": "Headers",
36
- "items": {
37
- "type": "object",
38
- "required": ["key", "value"],
39
- "properties": {
40
- "key": { "type": "string", "title": "Header name" },
41
- "value": { "type": "string", "title": "Value" }
42
- }
43
- }
44
- }
45
- }
46
- }
47
- }
48
- },
49
- "search": {
50
- "inputs": ["q", "baseUrl", "auth"],
51
- "steps": [
52
- {
53
- "type": "http",
54
- "id": "search",
55
- "request": {
56
- "method": "GET",
57
- "url": "$replace(baseUrl, /\\/$/, '') & '/v2/search/anime'",
58
- "query": "{ 'keyword': q }",
59
- "headers": "$merge((auth.enabled and auth.headers ? auth.headers : []).{ key: value })"
60
- }
61
- }
62
- ],
63
- "output": "[search.animes.{ 'providerIds': { 'animeId': animeId, 'bangumiId': bangumiId }, 'indexedId': $string(animeId), 'title': animeTitle, 'type': type, 'typeDescription': typeDescription, 'imageUrl': imageUrl, 'episodeCount': episodeCount, 'year': $number($substringBefore(startDate, '-')) }]"
64
- },
65
- "episodes": {
66
- "inputs": ["bangumiId", "baseUrl", "auth"],
67
- "steps": [
68
- {
69
- "type": "http",
70
- "id": "bangumi",
71
- "request": {
72
- "method": "GET",
73
- "url": "$replace(baseUrl, /\\/$/, '') & '/v2/bangumi/' & $string(bangumiId)",
74
- "headers": "$merge((auth.enabled and auth.headers ? auth.headers : []).{ key: value })"
75
- }
76
- }
77
- ],
78
- "output": "[bangumi.bangumi.episodes.{ 'providerIds': { 'episodeId': episodeId, 'animeId': %.animeId, 'bangumiId': %.bangumiId }, 'indexedId': $string(episodeId), 'title': episodeTitle, 'episodeNumber': episodeNumber }]"
79
- },
80
- "danmaku": {
81
- "inputs": ["episodeId", "baseUrl", "auth"],
82
- "steps": [
83
- {
84
- "type": "http",
85
- "id": "comments",
86
- "request": {
87
- "method": "GET",
88
- "url": "$replace(baseUrl, /\\/$/, '') & '/v2/comment/' & $string(episodeId)",
89
- "query": "{ 'withRelated': 'true', 'chConvert': chConvert ? $string(chConvert) : undefined }",
90
- "headers": "$merge((auth.enabled and auth.headers ? auth.headers : []).{ key: value })"
91
- }
92
- }
93
- ],
94
- "output": "[comments.comments]"
95
- }
96
- }