├── ForwardWeb.fwd
├── ForwardWidgets.fwd
├── Jable_en.fwd
├── README.md
├── Widgets
├── ForwardWidgets.js
├── jable.js
└── jable_en.js
└── icon
├── icon.PNG
├── icon1.PNG
└── icon2.PNG
/ForwardWeb.fwd:
--------------------------------------------------------------------------------
1 | {
2 | "title": "𝓑𝓾𝓽𝓽𝓮𝓻𝓯𝓵𝔂 ‘𝓼 𝓦𝓲𝓭𝓰𝓮𝓽𝓼",
3 | "description": "汇集各类瑟瑟网页、直播、VOD、RSS播客等模块",
4 | "icon": "https://raw.githubusercontent.com/quantumultxx/FW-Widgets/refs/heads/main/icon/icon1.PNG",
5 | "widgets": [
6 | {
7 | "id": "tv_live",
8 | "title": "电视台",
9 | "description": "获取热门电视直播频道",
10 | "requiredVersion": "0.0.1",
11 | "version": "1.0.0",
12 | "author": "两块",
13 | "url": "https://raw.githubusercontent.com/2kuai/ForwardWidgets/refs/heads/main/Widgets/TvLive.js"
14 | },
15 | {
16 | "id": "live",
17 | "title": "直播(电视+网络)",
18 | "description": "解析直播订阅链接【五折码:CHEAP.5;七折码:CHEAP】",
19 | "requiredVersion": "0.0.1",
20 | "version": "1.0.7",
21 | "author": "huangxd",
22 | "url": "https://raw.githubusercontent.com/huangxd-/ForwardWidgets/refs/heads/main/widgets/live.js"
23 | },
24 | {
25 | "id": "ti.bemarkt.podcast",
26 | "title": "Podcast",
27 | "description": "获取 RSS 播客数据",
28 | "requiredVersion": "0.0.1",
29 | "version": "1.0.0",
30 | "author": "Ti",
31 | "url": "https://raw.githubusercontent.com/bemarkt/scripts/refs/heads/master/provider/Forward/widgets/podcast.js"
32 | },
33 | {
34 | "id": "ti.bemarkt.vod.maccms",
35 | "title": "VOD",
36 | "description": "获取苹果CMS的VOD视频列表和搜索结果",
37 | "requiredVersion": "0.0.1",
38 | "version": "1.0.0",
39 | "author": "Ti",
40 | "url": "https://raw.githubusercontent.com/bemarkt/scripts/refs/heads/master/provider/Forward/widgets/vod.js"
41 | },
42 | {
43 | "id": "jable",
44 | "title": "Jable",
45 | "description": "获取Jable全站视频",
46 | "requiredVersion": "0.0.1",
47 | "version": "1.0.5",
48 | "author": "nibiru",
49 | "url": "https://raw.githubusercontent.com/quantumultxx/FW-Widgets/refs/heads/main/Widgets/jable.js"
50 | }
51 | ]
52 | }
53 |
--------------------------------------------------------------------------------
/ForwardWidgets.fwd:
--------------------------------------------------------------------------------
1 | {
2 | "title": "𝓑𝓾𝓽𝓽𝓮𝓻𝓯𝓵𝔂 ‘𝓼 𝓦𝓲𝓭𝓰𝓮𝓽𝓼",
3 | "description": "汇集豆瓣、TMDB、IMDB、猫眼和Bangumi的各类榜单",
4 | "icon": "https://raw.githubusercontent.com/quantumultxx/FW-Widgets/refs/heads/main/icon/icon2.PNG",
5 | "widgets": [
6 | {
7 | "id": "douban",
8 | "title": "豆瓣",
9 | "description": "解析豆瓣片单,获取视频信息",
10 | "requiredVersion": "0.0.1",
11 | "version": "1.0.0",
12 | "author": "pack1r",
13 | "url": "https://raw.githubusercontent.com/pack1r/ForwardWidgets/refs/heads/main/widgets/douban.js"
14 | },
15 | {
16 | "id": "imdb",
17 | "title": "IMDB",
18 | "description": "IMDB",
19 | "requiredVersion": "0.0.1",
20 | "version": "1.0.0",
21 | "author": "pack1r",
22 | "url": "https://raw.githubusercontent.com/pack1r/ForwardWidgets/refs/heads/main/widgets/imdb.js"
23 | },
24 | {
25 | "id": "bangumi_charts_tmdb_v4_final",
26 | "title": "Bangumi 热门榜单",
27 | "description": "从Bangumi获取近期热门、每日放送数据,支持榜单筛选,智能匹配TMDB数据。",
28 | "requiredVersion": "0.0.1",
29 | "version": "1.0.3",
30 | "author": "Autism",
31 | "url": "https://raw.githubusercontent.com/opix-maker/Forward/refs/heads/main/js/Bangumi.js"
32 | },
33 | {
34 | "id": "hot_picks",
35 | "title": "热门精选",
36 | "description": "获取最新热播剧和热门影片推荐",
37 | "requiredVersion": "0.0.1",
38 | "version": "1.1.0",
39 | "author": "两块",
40 | "url": "https://raw.githubusercontent.com/2kuai/ForwardWidgets/refs/heads/main/Widgets/HotPicks.js"
41 | },
42 | {
43 | "id": "yatu",
44 | "title": "雅图(每日放送+点播排行榜+评分排行榜)",
45 | "description": "解析雅图每日放送更新以及各类排行榜【五折码:CHEAP.5;七折码:CHEAP】",
46 | "requiredVersion": "0.0.1",
47 | "version": "1.0.4",
48 | "author": "huangxd",
49 | "url": "https://raw.githubusercontent.com/huangxd-/ForwardWidgets/refs/heads/main/widgets/yatu.js"
50 | },
51 | {
52 | "id": "douban",
53 | "title": "豆瓣我看&豆瓣个性化推荐",
54 | "description": "解析豆瓣想看、在看、已看以及根据个人数据生成的个性化推荐【五折码:CHEAP.5;七折码:CHEAP】",
55 | "requiredVersion": "0.0.1",
56 | "version": "1.0.7",
57 | "author": "huangxd",
58 | "url": "https://raw.githubusercontent.com/huangxd-/ForwardWidgets/refs/heads/main/widgets/douban.js"
59 | },
60 | {
61 | "id": "trakt",
62 | "title": "Trakt我看&Trakt个性化推荐",
63 | "description": "解析Trakt想看、在看、已看、片单、追剧日历以及根据个人数据生成的个性化推荐【五折码:CHEAP.5;七折码:CHEAP】",
64 | "requiredVersion": "0.0.1",
65 | "version": "1.0.9",
66 | "author": "huangxd",
67 | "url": "https://raw.githubusercontent.com/huangxd-/ForwardWidgets/refs/heads/main/widgets/trakt.js"
68 | },
69 | {
70 | "id": "zhuijurili",
71 | "title": "追剧日历(今/明日播出、各项榜单、今日推荐)",
72 | "description": "解析追剧日历今/明日播出剧集/番剧、各项榜单、今日推荐等【五折码:CHEAP.5;七折码:CHEAP】",
73 | "requiredVersion": "0.0.1",
74 | "version": "1.0.1",
75 | "author": "huangxd",
76 | "url": "https://raw.githubusercontent.com/huangxd-/ForwardWidgets/refs/heads/main/widgets/zhuijurili.js"
77 | },
78 | {
79 | "id": "forward.combined.media.lists",
80 | "title": "影视榜单",
81 | "description": "聚合豆瓣、TMDB、IMDB和Bangumi的电影、剧集、动画片单与榜单",
82 | "requiredVersion": "0.0.1",
83 | "version": "1.2.6",
84 | "author": "阿米诺斯",
85 | "url": "https://raw.githubusercontent.com/quantumultxx/FW-Widgets/refs/heads/main/Widgets/ForwardWidgets.js"
86 | }
87 | ]
88 | }
89 |
--------------------------------------------------------------------------------
/Jable_en.fwd:
--------------------------------------------------------------------------------
1 | {
2 | "title": "𝓑𝓾𝓽𝓽𝓮𝓻𝓯𝓵𝔂 ‘𝓼 𝓦𝓲𝓭𝓰𝓮𝓽𝓼",
3 | "description": "Porn JavaScript",
4 | "icon": "https://raw.githubusercontent.com/quantumultxx/FW-Widgets/refs/heads/main/icon.png",
5 | "widgets": [
6 | {
7 | "id": "jable",
8 | "title": "Jable Detailed Categories",
9 | "description": "Fetch Jable category rankings",
10 | "requiredVersion": "0.0.1",
11 | "version": "1.0.2",
12 | "author": "nibiru",
13 | "url": "https://raw.githubusercontent.com/quantumultxx/FW-Widgets/refs/heads/main/Widgets/jable_en.js"
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # FW-Widgets
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | [**简体中文 🇨🇳**](README.md)
12 |
13 |
14 |
15 | # ForwardWidgets
16 |
17 | 本仓库仅对 Forward 模块进行整理,模块经过个人测试,不对使用结果做任何负责,如有任何问题,请自行联系模块作者。
18 | 如果需要添加模块,可以申请 PR,经过测试后即可合并。
19 |
20 | ## 免责声明
21 |
22 | 1. **知识产权提醒**:本项目内容均来自第三方贡献,如您认为任何内容侵犯了您的权益,请通过 Issues 提交移除请求,将及时处理。
23 |
24 | 2. **使用目的限定**:本项目内容仅可用于个人学习、研究和技术探索,不得:
25 | 1. 用于任何直接或间接商业活动
26 | 2. 应用于实际生产环境
27 | 3. 在公开平台传播或推广
28 |
29 | 3. **地域使用限制**:严禁在不允许此类技术应用的法律管辖区内使用本项目内容,**否则使用者需自行承担一切后果**。使用者必须自行了解并遵守所在地区的相关法规。
30 |
31 | 4. **责任边界明确**:
32 | 1. 维护者不对模块的功能、安全性、合规性提供任何形式的保证
33 | 2. 使用过程中产生的任何直接或间接损失,均由使用者自行承担,**否则使用者需自行承担一切后果**
34 | 3. 技术问题请直接联系原模块作者,维护者不提供技术支持
35 |
36 | 5. **使用后处理要求**:
37 | 1. 完成研究学习后,使用者应在合理时间内(建议不超过24小时)删除相关内容,**否则使用者需自行承担一切后果**
38 | 2. 不建议长期保存或分发项目内容
39 |
40 | 6. **第三方关联澄清**:
41 | 1. 本项目与所涉及的任何硬件、软件厂商无关联关系
42 | 2. 不代表对任何第三方产品的推荐或认可
43 |
44 | ## 最终解释
45 |
46 | 本协议的最终解释权归项目维护者所有。使用本项目即视为您已充分理解并接受上述全部条款。违反本协议任何条款,**使用者需自行承担一切后果**。
47 |
48 | ---
49 |
50 | *访问、下载或使用本项目内容,即表示您完全同意本协议的所有条款。*
51 |
--------------------------------------------------------------------------------
/Widgets/jable.js:
--------------------------------------------------------------------------------
1 | WidgetMetadata = {
2 | id: "jable",
3 | title: "Jable",
4 | description: "获取Jable全站视频",
5 | author: "nibiru",
6 | site: "https://github.com/quantumultxx/FW-Widgets",
7 | version: "1.0.5",
8 | requiredVersion: "0.0.1",
9 | modules: [
10 | // 热门模块
11 | {
12 | title: "热门",
13 | description: "热门影片",
14 | requiresWebView: false,
15 | functionName: "loadPage",
16 | params: [
17 | {
18 | name: "url",
19 | title: "列表地址",
20 | type: "constant",
21 | description: "列表地址",
22 | value:
23 | "https://jable.tv/hot/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
24 | },
25 | {
26 | name: "sort_by",
27 | title: "排序",
28 | type: "enumeration",
29 | description: "排序",
30 | enumOptions: [
31 | { title: "今日热门", value: "video_viewed_today" },
32 | { title: "本周热门", value: "video_viewed_week" },
33 | { title: "本月热门", value: "video_viewed_month" },
34 | { title: "所有时间", value: "video_viewed" },
35 | ],
36 | },
37 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
38 | ],
39 | },
40 | // 最新模块
41 | {
42 | title: "最新",
43 | description: "最新上市影片",
44 | requiresWebView: false,
45 | functionName: "loadPage",
46 | params: [
47 | {
48 | name: "url",
49 | title: "列表地址",
50 | type: "constant",
51 | description: "列表地址",
52 | value:
53 | "https://jable.tv/new-release/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
54 | },
55 | {
56 | name: "sort_by",
57 | title: "排序",
58 | type: "enumeration",
59 | description: "排序",
60 | enumOptions: [
61 | { title: "最新发布", value: "latest-updates" },
62 | { title: "最多观看", value: "video_viewed" },
63 | { title: "最多收藏", value: "most_favourited" },
64 | ],
65 | },
66 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
67 | ],
68 | },
69 |
70 | // 中文模块
71 | {
72 | title: "中文",
73 | description: "中文字幕影片",
74 | requiresWebView: false,
75 | functionName: "loadPage",
76 | params: [
77 | {
78 | name: "url",
79 | title: "列表地址",
80 | type: "constant",
81 | description: "列表地址",
82 | value:
83 | "https://jable.tv/categories/chinese-subtitle/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
84 | },
85 | {
86 | name: "sort_by",
87 | title: "排序",
88 | type: "enumeration",
89 | description: "排序",
90 | enumOptions: [
91 | { title: "最近更新", value: "post_date" },
92 | { title: "最多观看", value: "video_viewed" },
93 | { title: "最多收藏", value: "most_favourited" },
94 | ],
95 | },
96 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
97 | ],
98 | },
99 | // 女优模块
100 | {
101 | title: "女优",
102 | description: "按女优分类浏览影片",
103 | requiresWebView: false,
104 | functionName: "loadPage",
105 | params: [
106 | {
107 | name: "url",
108 | title: "选择女优",
109 | type: "enumeration",
110 | belongTo: {
111 | paramName: "sort_by",
112 | value: ["post_date","video_viewed","most_favourited"],
113 | },
114 | enumOptions: [
115 | {
116 | title: "三上悠亚",
117 | value: "https://jable.tv/s1/models/yua-mikami/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
118 | },
119 | {
120 | title: "楪可怜",
121 | value: "https://jable.tv/models/86b2f23f95cc485af79fe847c5b9de8d/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
122 | },
123 | {
124 | title: "小野夕子",
125 | value: "https://jable.tv/models/2958338aa4f78c0afb071e2b8a6b5f1b/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
126 | },
127 | {
128 | title: "大槻响",
129 | value: "https://jable.tv/models/hibiki-otsuki/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
130 | },
131 | {
132 | title: "藤森里穗",
133 | value: "https://jable.tv/models/riho-fujimori/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
134 | },
135 | {
136 | title: "JULIA",
137 | value: "https://jable.tv/models/julia/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
138 | },
139 | {
140 | title: "明里䌷",
141 | value: "https://jable.tv/models/tsumugi-akari/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
142 | },
143 | {
144 | title: "桃乃木香奈",
145 | value: "https://jable.tv/models/momonogi-kana/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
146 | },
147 | {
148 | title: "水户香奈",
149 | value: "https://jable.tv/models/kana-mito/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
150 | },
151 | {
152 | title: "篠田ゆう",
153 | value: "https://jable.tv/s1/models/shinoda-yuu/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
154 | },
155 | {
156 | title: "枫可怜",
157 | value: "https://jable.tv/models/kaede-karen/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
158 | },
159 | {
160 | title: "吉沢明歩",
161 | value: "https://jable.tv/models/akiho-yoshizawa/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
162 | },
163 | {
164 | title: "羽月希",
165 | value: "https://jable.tv/models/21e145d3f4d7c8c818fc7eae19342a7a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
166 | },
167 | {
168 | title: "美谷朱里",
169 | value: "https://jable.tv/s1/models/mitani-akari/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
170 | },
171 | {
172 | title: "山岸逢花",
173 | value: "https://jable.tv/models/yamagishi-aika/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
174 | },
175 | {
176 | title: "佐佐木明希",
177 | value: "https://jable.tv/models/sasaki-aki/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
178 | },
179 | {
180 | title: "神木麗",
181 | value: "https://jable.tv/models/ef9b1ab9a21b58d6ee4d7d97ab883288/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
182 | },
183 | {
184 | title: "七泽美亚",
185 | value: "https://jable.tv/models/nanasawa-mia/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
186 | },
187 | {
188 | title: "瀬戸環奈",
189 | value: "https://jable.tv/models/1a71be5a068c6f9e00fac285b31019f9/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
190 | },
191 | {
192 | title: "瀧本雫葉",
193 | value: "https://jable.tv/models/7ffb432871f53eda0b4d80be34fff86a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
194 | },
195 | {
196 | title: "さくらわかな",
197 | value: "https://jable.tv/models/0b96db26c8b192b0a54e24d878380765/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
198 | },
199 | {
200 | title: "彩月七緒",
201 | value: "https://jable.tv/models/e82b22cd3275fd0e569147d82fa1999d/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
202 | },
203 | {
204 | title: "鈴乃ウト",
205 | value: "https://jable.tv/models/559904d22cbf03091f790258aa4e9b8c/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
206 | },
207 | {
208 | title: "三田真鈴",
209 | value: "https://jable.tv/models/7749dd641e0426f55342972d920513a7/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
210 | },
211 | {
212 | title: "七ツ森りり",
213 | value: "https://jable.tv/models/9ed214792a2144520430dd494c93f651/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
214 | },
215 | {
216 | title: "七嶋舞",
217 | value: "https://jable.tv/models/6ab2e738a33eafc3db27cab0b83cf5cd/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
218 | },
219 | {
220 | title: "八掛うみ",
221 | value: "https://jable.tv/models/83397477054d35cd07e2c48685335a86/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
222 | },
223 | {
224 | title: "八木奈々",
225 | value: "https://jable.tv/models/3610067a1d725dab8ee8cd3ffe828850/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
226 | },
227 | {
228 | title: "宮下玲奈",
229 | value: "https://jable.tv/models/b435825a4941964079157dd2fc0a8e5a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
230 | },
231 | {
232 | title: "小湊よつ葉",
233 | value: "https://jable.tv/models/ff8ce98f2419126e00a90bc1f3385824/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
234 | },
235 | {
236 | title: "小野六花",
237 | value: "https://jable.tv/models/0478c4db9858c4e6c60af7fbf828009a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
238 | },
239 | {
240 | title: "工藤ゆら",
241 | value: "https://jable.tv/models/e7ba849893aa7ce8afcc3003a4075c20/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
242 | },
243 | {
244 | title: "本庄鈴",
245 | value: "https://jable.tv/models/honjou-suzu/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
246 | },
247 | {
248 | title: "桜空もも",
249 | value: "https://jable.tv/models/sakura-momo/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
250 | },
251 | {
252 | title: "楓ふうあ",
253 | value: "https://jable.tv/models/f88e49c4c1adb0fd1bae71ac122d6b82/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
254 | },
255 | {
256 | title: "河北彩伽",
257 | value: "https://jable.tv/models/saika-kawakita2/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
258 | },
259 | {
260 | title: "矢埜愛茉",
261 | value: "https://jable.tv/models/0903b1921df6c616c29041be11c3d2e8/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
262 | },
263 | {
264 | title: "石川澪",
265 | value: "https://jable.tv/models/a855133fa44ca5e7679cac0a0ab7d1cb/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
266 | },
267 | {
268 | title: "美ノ嶋めぐり",
269 | value: "https://jable.tv/models/d1ebb3d61ee367652e6b1f35b469f2b6/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
270 | },
271 | {
272 | title: "野々浦暖",
273 | value: "https://jable.tv/models/6b0ce5c4944edce04ab48d4bb608fd4c/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
274 | },
275 | {
276 | title: "青空ひかり",
277 | value: "https://jable.tv/models/4c7a2cfa27b343e3e07659650400f61d/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
278 | },
279 | {
280 | title: "香澄りこ",
281 | value: "https://jable.tv/models/6c2e861e04b9327701a80ca77a088814/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
282 | },
283 | {
284 | title: "新ありな",
285 | value: "https://jable.tv/models/e763382dc86aa703456d964ca25d0e8b/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
286 | },
287 | {
288 | title: "未歩なな",
289 | value: "https://jable.tv/models/c9535c2f157202cd0e934d62ef582e2e/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
290 | },
291 | {
292 | title: "凪ひかる",
293 | value: "https://jable.tv/models/91fca8d824e07075d09de0282f6e9076/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
294 | },
295 | {
296 | title: "三宮つばき",
297 | value: "https://jable.tv/models/f0e279c00b2a7e1aca2ef4d31d611020/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
298 | },
299 | {
300 | title: "藍芽みずき",
301 | value: "https://jable.tv/models/679c69a5488daa35a5544749b75556c6/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
302 | },
303 | {
304 | title: "つばさ舞",
305 | value: "https://jable.tv/models/0d7709a62cc199f923107c120d30893b/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
306 | },
307 | {
308 | title: "朝日りお",
309 | value: "https://jable.tv/models/ad0935cfa1449ab126dde2b0c0929ad0/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
310 | },
311 | {
312 | title: "日下部加奈",
313 | value: "https://jable.tv/models/dfea76fd68bc52e0888a78e0fedce073/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
314 | },
315 | {
316 | title: "弓乃りむ",
317 | value: "https://jable.tv/models/06c22ca98d8ec82963046ad17e0fad4a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
318 | },
319 | {
320 | title: "夏希まろん",
321 | value: "https://jable.tv/models/1c0f1b4475962e88b541f9f0db1584fe/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
322 | },
323 | {
324 | title: "水川スミレ",
325 | value: "https://jable.tv/models/7415fde573b12a4e87e83ef33ea354d5/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
326 | },
327 | {
328 | title: "実浜みき",
329 | value: "https://jable.tv/models/299c2d256b9c509f80302d261ea0b5a9/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
330 | },
331 | {
332 | title: "弥生みづき",
333 | value: "https://jable.tv/s1/models/mizuki-yayoi/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
334 | },
335 | {
336 | title: "天川そら",
337 | value: "https://jable.tv/models/3e69d39a117c2d25a407dfd57e204e48/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
338 | },
339 | {
340 | title: "新名あみん",
341 | value: "https://jable.tv/models/0dba31ccef2f1fca3563c56dbcf3fa7d/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
342 | },
343 | {
344 | title: "小泽菜穗",
345 | value: "https://jable.tv/models/2ec30dc8e35906a29fe5c8f5b97e6c89/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
346 | },
347 | {
348 | title: "三原ほのか",
349 | value: "https://jable.tv/models/mihara-honoka/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
350 | },
351 | {
352 | title: "涼森れむ",
353 | value: "https://jable.tv/models/7cadf3e484f607dc7d0f1c0e7a83b007/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
354 | },
355 | {
356 | title: "森日向子",
357 | value: "https://jable.tv/models/1a7543f89b125421e489d98de472ebf4/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
358 | },
359 | {
360 | title: "金松季歩",
361 | value: "https://jable.tv/models/48ace5552227a2a4f867af73efa18f2d/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
362 | }
363 | ],
364 | value: "https://jable.tv/s1/models/yua-mikami/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
365 | },
366 | {
367 | name: "sort_by",
368 | title: "排序",
369 | type: "enumeration",
370 | description: "排序",
371 | enumOptions: [
372 | { title: "最近更新", value: "post_date" },
373 | { title: "最多观看", value: "video_viewed" },
374 | { title: "最多收藏", value: "most_favourited" },
375 | ],
376 | },
377 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
378 | ],
379 | },
380 |
381 | // 衣着模块
382 | {
383 | title: "衣着",
384 | description: "按衣着分类浏览影片",
385 | requiresWebView: false,
386 | functionName: "loadPage",
387 | params: [
388 | {
389 | name: "url",
390 | title: "选择衣着",
391 | type: "enumeration",
392 | belongTo: {
393 | paramName: "sort_by",
394 | value: ["post_date","video_viewed","most_favourited"],
395 | },
396 | enumOptions: [
397 | {
398 | title: "黑丝",
399 | value: "https://jable.tv/tags/black-pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
400 | },
401 | {
402 | title: "肉丝",
403 | value: "https://jable.tv/tags/flesh-toned-pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
404 | },
405 | {
406 | title: "丝袜",
407 | value: "https://jable.tv/tags/pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
408 | },
409 | {
410 | title: "兽耳",
411 | value: "https://jable.tv/tags/kemonomimi/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
412 | },
413 | {
414 | title: "渔网",
415 | value: "https://jable.tv/tags/fishnets/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
416 | },
417 | {
418 | title: "水着",
419 | value: "https://jable.tv/tags/swimsuit/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
420 | },
421 | {
422 | title: "校服",
423 | value: "https://jable.tv/tags/school-uniform/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
424 | },
425 | {
426 | title: "旗袍",
427 | value: "https://jable.tv/tags/cheongsam/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
428 | },
429 | {
430 | title: "婚纱",
431 | value: "https://jable.tv/tags/wedding-dress/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
432 | },
433 | {
434 | title: "女僕",
435 | value: "https://jable.tv/tags/maid/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
436 | },
437 | {
438 | title: "和服",
439 | value: "https://jable.tv/tags/kimono/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
440 | },
441 | {
442 | title: "眼镜娘",
443 | value: "https://jable.tv/tags/glasses/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
444 | },
445 | {
446 | title: "过膝袜",
447 | value: "https://jable.tv/tags/knee-socks/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
448 | },
449 | {
450 | title: "运动装",
451 | value: "https://jable.tv/tags/sportswear/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
452 | },
453 | {
454 | title: "兔女郎",
455 | value: "https://jable.tv/tags/bunny-girl/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
456 | },
457 | {
458 | title: "Cosplay",
459 | value: "https://jable.tv/tags/Cosplay/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
460 | }
461 | ],
462 | value: "https://jable.tv/tags/black-pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
463 | },
464 | {
465 | name: "sort_by",
466 | title: "排序",
467 | type: "enumeration",
468 | description: "排序",
469 | enumOptions: [
470 | { title: "最近更新", value: "post_date" },
471 | { title: "最多观看", value: "video_viewed" },
472 | { title: "最多收藏", value: "most_favourited" },
473 | ],
474 | },
475 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
476 | ],
477 | },
478 | // 剧情模块
479 | {
480 | title: "剧情",
481 | description: "按剧情分类浏览影片",
482 | requiresWebView: false,
483 | functionName: "loadPage",
484 | params: [
485 | {
486 | name: "url",
487 | title: "选择剧情",
488 | type: "enumeration",
489 | belongTo: {
490 | paramName: "sort_by",
491 | value: ["post_date","video_viewed","most_favourited"],
492 | },
493 | enumOptions: [
494 | {
495 | title: "出轨",
496 | value: "https://jable.tv/tags/affair/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
497 | },
498 | {
499 | title: "醉男",
500 | value: "https://jable.tv/tags/ugly-man/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
501 | },
502 | {
503 | title: "亲属",
504 | value: "https://jable.tv/tags/kinship/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
505 | },
506 | {
507 | title: "童贞",
508 | value: "https://jable.tv/tags/virginity/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
509 | },
510 | {
511 | title: "复仇",
512 | value: "https://jable.tv/tags/avenge/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
513 | },
514 | {
515 | title: "巨汉",
516 | value: "https://jable.tv/tags/giant/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
517 | },
518 | {
519 | title: "媚药",
520 | value: "https://jable.tv/tags/love-potion/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
521 | },
522 | {
523 | title: "催眠",
524 | value: "https://jable.tv/tags/hypnosis//?mode=async&function=get_block&block_id=list_videos_common_videos_list"
525 | },
526 | {
527 | title: "偷拍",
528 | value: "https://jable.tv/tags/private-cam/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
529 | },
530 | {
531 | title: "NTR",
532 | value: "https://jable.tv/tags/ntr/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
533 | },
534 | {
535 | title: "年龄差",
536 | value: "https://jable.tv/tags/age-difference/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
537 | },
538 | {
539 | title: "下雨天",
540 | value: "https://jable.tv/tags/rainy-day/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
541 | },
542 | {
543 | title: "时间停止",
544 | value: "https://jable.tv/tags/time-stop/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
545 | }
546 | ],
547 | value: "https://jable.tv/tags/affair/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
548 | },
549 | {
550 | name: "sort_by",
551 | title: "排序",
552 | type: "enumeration",
553 | description: "排序",
554 | enumOptions: [
555 | { title: "最近更新", value: "post_date" },
556 | { title: "最多观看", value: "video_viewed" },
557 | { title: "最多收藏", value: "most_favourited" },
558 | ],
559 | },
560 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
561 | ],
562 | },
563 |
564 | // 地点模块
565 | {
566 | title: "地点",
567 | description: "按地点分类浏览影片",
568 | requiresWebView: false,
569 | functionName: "loadPage",
570 | params: [
571 | {
572 | name: "url",
573 | title: "选择地点",
574 | type: "enumeration",
575 | belongTo: {
576 | paramName: "sort_by",
577 | value: ["post_date","video_viewed","most_favourited"],
578 | },
579 | enumOptions: [
580 | {
581 | title: "电车",
582 | value: "https://jable.tv/tags/tram/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
583 | },
584 | {
585 | title: "处女",
586 | value: "https://jable.tv/tags/first-night/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
587 | },
588 | {
589 | title: "监狱",
590 | value: "https://jable.tv/tags/prison/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
591 | },
592 | {
593 | title: "温泉",
594 | value: "https://jable.tv/tags/hot-spring/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
595 | },
596 | {
597 | title: "泳池",
598 | value: "https://jable.tv/tags/swimming-pool/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
599 | },
600 | {
601 | title: "汽车",
602 | value: "https://jable.tv/tags/car/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
603 | },
604 | {
605 | title: "厕所",
606 | value: "https://jable.tv/tags/toilet/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
607 | },
608 | {
609 | title: "学校",
610 | value: "https://jable.tv/tags/school/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
611 | },
612 | {
613 | title: "魔镜号",
614 | value: "https://jable.tv/tags/magic-mirror/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
615 | },
616 | {
617 | title: "洗浴场",
618 | value: "https://jable.tv/tags/bathing-place/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
619 | },
620 | {
621 | title: "图书馆",
622 | value: "https://jable.tv/tags/library/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
623 | },
624 | {
625 | title: "健身房",
626 | value: "https://jable.tv/tags/gym-room/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
627 | },
628 | {
629 | title: "便利店",
630 | value: "https://jable.tv/tags/store/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
631 | }
632 | ],
633 | value: "https://jable.tv/tags/tram/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
634 | },
635 | {
636 | name: "sort_by",
637 | title: "排序",
638 | type: "enumeration",
639 | description: "排序",
640 | enumOptions: [
641 | { title: "最近更新", value: "post_date" },
642 | { title: "最多观看", value: "video_viewed" },
643 | { title: "最多收藏", value: "most_favourited" },
644 | ],
645 | },
646 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
647 | ],
648 | },
649 | // 身材模块
650 | {
651 | title: "身材",
652 | description: "按身材分类浏览影片",
653 | requiresWebView: false,
654 | functionName: "loadPage",
655 | params: [
656 | {
657 | name: "url",
658 | title: "选择身材",
659 | type: "enumeration",
660 | belongTo: {
661 | paramName: "sort_by",
662 | value: ["post_date","video_viewed","most_favourited"],
663 | },
664 | enumOptions: [
665 | {
666 | title: "长身",
667 | value: "https://jable.tv/tags/tall/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
668 | },
669 | {
670 | title: "软体",
671 | value: "https://jable.tv/tags/flexible-body/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
672 | },
673 | {
674 | title: "贫乳",
675 | value: "https://jable.tv/tags/small-tits/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
676 | },
677 | {
678 | title: "美腿",
679 | value: "https://jable.tv/tags/beautiful-leg/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
680 | },
681 | {
682 | title: "美尻",
683 | value: "https://jable.tv/tags/beautiful-butt/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
684 | },
685 | {
686 | title: "纹身",
687 | value: "https://jable.tv/tags/tattoo/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
688 | },
689 | {
690 | title: "短发",
691 | value: "https://jable.tv/tags/short-hair/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
692 | },
693 | {
694 | title: "白虎",
695 | value: "https://jable.tv/tags/hairless-pussy/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
696 | },
697 | {
698 | title: "熟女",
699 | value: "https://jable.tv/tags/mature-woman/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
700 | },
701 | {
702 | title: "巨乳",
703 | value: "https://jable.tv/tags/big-tits/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
704 | },
705 | {
706 | title: "少女",
707 | value: "https://jable.tv/tags/girl/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
708 | },
709 | {
710 | title: "娇小",
711 | value: "https://jable.tv/tags/dainty/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
712 | }
713 | ],
714 | value: "https://jable.tv/tags/tall/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
715 | },
716 | {
717 | name: "sort_by",
718 | title: "排序",
719 | type: "enumeration",
720 | description: "排序",
721 | enumOptions: [
722 | { title: "最近更新", value: "post_date" },
723 | { title: "最多观看", value: "video_viewed" },
724 | { title: "最多收藏", value: "most_favourited" },
725 | ],
726 | },
727 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
728 | ],
729 | },
730 | // 角色模块
731 | {
732 | title: "角色",
733 | description: "按角色分类浏览影片",
734 | requiresWebView: false,
735 | functionName: "loadPage",
736 | params: [
737 | {
738 | name: "url",
739 | title: "选择角色",
740 | type: "enumeration",
741 | belongTo: {
742 | paramName: "sort_by",
743 | value: ["post_date","video_viewed","most_favourited"],
744 | },
745 | enumOptions: [
746 | {
747 | title: "人妻",
748 | value: "https://jable.tv/tags/wife/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
749 | },
750 | {
751 | title: "医生",
752 | value: "https://jable.tv/tags/doctor/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
753 | },
754 | {
755 | title: "护士",
756 | value: "https://jable.tv/tags/nurse/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
757 | },
758 | {
759 | title: "老师",
760 | value: "https://jable.tv/tags/teacher/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
761 | },
762 | {
763 | title: "空姐",
764 | value: "https://jable.tv/tags/flight-attendant/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
765 | },
766 | {
767 | title: "逃犯",
768 | value: "https://jable.tv/tags/fugitive/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
769 | },
770 | {
771 | title: "情侣",
772 | value: "https://jable.tv/tags/couple/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
773 | },
774 | {
775 | title: "主播",
776 | value: "https://jable.tv/tags/female-anchor/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
777 | },
778 | {
779 | title: "风俗娘",
780 | value: "https://jable.tv/tags/club-hostess-and-sex-worker/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
781 | },
782 | {
783 | title: "家政妇",
784 | value: "https://jable.tv/tags/housewife/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
785 | },
786 | {
787 | title: "搜查官",
788 | value: "https://jable.tv/tags/detective/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
789 | },
790 | {
791 | title: "未亡人",
792 | value: "https://jable.tv/tags/widow/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
793 | },
794 | {
795 | title: "家庭教师",
796 | value: "https://jable.tv/tags/private-teacher/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
797 | },
798 | {
799 | title: "球队经理",
800 | value: "https://jable.tv/tags/team-manager/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
801 | }
802 | ],
803 | value: "https://jable.tv/tags/wife/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
804 | },
805 | {
806 | name: "sort_by",
807 | title: "排序",
808 | type: "enumeration",
809 | description: "排序",
810 | enumOptions: [
811 | { title: "最近更新", value: "post_date" },
812 | { title: "最多观看", value: "video_viewed" },
813 | { title: "最多收藏", value: "most_favourited" },
814 | ],
815 | },
816 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
817 | ],
818 | },
819 | // 交合模块
820 | {
821 | title: "交合",
822 | description: "按交合分类浏览影片",
823 | requiresWebView: false,
824 | functionName: "loadPage",
825 | params: [
826 | {
827 | name: "url",
828 | title: "选择交合",
829 | type: "enumeration",
830 | belongTo: {
831 | paramName: "sort_by",
832 | value: ["post_date","video_viewed","most_favourited"],
833 | },
834 | enumOptions: [
835 | {
836 | title: "颜射",
837 | value: "https://jable.tv/tags/facial/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
838 | },
839 | {
840 | title: "足交",
841 | value: "https://jable.tv/tags/footjob/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
842 | },
843 | {
844 | title: "痉挛",
845 | value: "https://jable.tv/tags/spasms/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
846 | },
847 | {
848 | title: "潮吹",
849 | value: "https://jable.tv/tags/squirting/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
850 | },
851 | {
852 | title: "深喉",
853 | value: "https://jable.tv/tags/deep-throat/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
854 | },
855 | {
856 | title: "接吻",
857 | value: "https://jable.tv/tags/kiss/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
858 | },
859 | {
860 | title: "口爆",
861 | value: "https://jable.tv/tags/cum-in-mouth/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
862 | },
863 | {
864 | title: "口交",
865 | value: "https://jable.tv/tags/blowjob/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
866 | },
867 | {
868 | title: "乳交",
869 | value: "https://jable.tv/tags/tit-wank/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
870 | },
871 | {
872 | title: "中出",
873 | value: "https://jable.tv/tags/creampie/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
874 | }
875 | ],
876 | value: "https://jable.tv/tags/facial/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
877 | },
878 | {
879 | name: "sort_by",
880 | title: "排序",
881 | type: "enumeration",
882 | description: "排序",
883 | enumOptions: [
884 | { title: "最近更新", value: "post_date" },
885 | { title: "最多观看", value: "video_viewed" },
886 | { title: "最多收藏", value: "most_favourited" },
887 | ],
888 | },
889 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
890 | ],
891 | },
892 | // 玩法模块
893 | {
894 | title: "玩法",
895 | description: "按玩法分类浏览影片",
896 | requiresWebView: false,
897 | functionName: "loadPage",
898 | params: [
899 | {
900 | name: "url",
901 | title: "选择玩法",
902 | type: "enumeration",
903 | belongTo: {
904 | paramName: "sort_by",
905 | value: ["post_date","video_viewed","most_favourited"],
906 | },
907 | enumOptions: [
908 | {
909 | title: "露出",
910 | value: "https://jable.tv/tags/outdoor/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
911 | },
912 | {
913 | title: "侵犯",
914 | value: "https://jable.tv/tags/intrusion/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
915 | },
916 | {
917 | title: "调教",
918 | value: "https://jable.tv/tags/tune/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
919 | },
920 | {
921 | title: "捆绑",
922 | value: "https://jable.tv/tags/bondage/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
923 | },
924 | {
925 | title: "痴汉",
926 | value: "https://jable.tv/tags/chikan/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
927 | },
928 | {
929 | title: "痴女",
930 | value: "https://jable.tv/tags/chizyo/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
931 | },
932 | {
933 | title: "男M",
934 | value: "https://jable.tv/tags/masochism-guy/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
935 | },
936 | {
937 | title: "泥醉",
938 | value: "https://jable.tv/tags/crapulence/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
939 | },
940 | {
941 | title: "泡姬",
942 | value: "https://jable.tv/tags/soapland/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
943 | },
944 | {
945 | title: "母乳",
946 | value: "https://jable.tv/tags/breast-milk/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
947 | },
948 | {
949 | title: "放尿",
950 | value: "https://jable.tv/tags/piss/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
951 | },
952 | {
953 | title: "按摩",
954 | value: "https://jable.tv/tags/massage/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
955 | },
956 | {
957 | title: "多P",
958 | value: "https://jable.tv/tags/breast-milk/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
959 | },
960 | {
961 | title: "瞬间插入",
962 | value: "https://jable.tv/tags/quickie/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
963 | },
964 | {
965 | title: "集团侵犯",
966 | value: "https://jable.tv/tags/gang-intrusion/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
967 | }
968 | ],
969 | value: "https://jable.tv/tags/outdoor/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
970 | },
971 | {
972 | name: "sort_by",
973 | title: "排序",
974 | type: "enumeration",
975 | description: "排序",
976 | enumOptions: [
977 | { title: "最近更新", value: "post_date" },
978 | { title: "最多观看", value: "video_viewed" },
979 | { title: "最多收藏", value: "most_favourited" },
980 | ],
981 | },
982 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
983 | ],
984 | },
985 | // 主题模块
986 | {
987 | title: "主题",
988 | description: "按主题分类浏览影片",
989 | requiresWebView: false,
990 | functionName: "loadPage",
991 | params: [
992 | {
993 | name: "url",
994 | title: "选择主题",
995 | type: "enumeration",
996 | belongTo: {
997 | paramName: "sort_by",
998 | value: ["post_date","video_viewed","most_favourited"],
999 | },
1000 | enumOptions: [
1001 | {
1002 | title: "角色剧情",
1003 | value: "https://jable.tv/categories/roleplay/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1004 | },
1005 | {
1006 | title: "制服诱惑",
1007 | value: "https://jable.tv/categories/uniform/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1008 | },
1009 | {
1010 | title: "直接开啪",
1011 | value: "https://jable.tv/categories/sex-only/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1012 | },
1013 | {
1014 | title: "丝袜美腿",
1015 | value: "https://jable.tv/categories/pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1016 | },
1017 | {
1018 | title: "主奴调教",
1019 | value: "https://jable.tv/categories/bdsm/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1020 | },
1021 | {
1022 | title: "多P群交",
1023 | value: "https://jable.tv/categories/groupsex/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1024 | },
1025 | {
1026 | title: "男友视角",
1027 | value: "https://jable.tv/categories/pov/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1028 | },
1029 | {
1030 | title: "凌辱快感",
1031 | value: "https://jable.tv/categories/insult/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1032 | },
1033 | {
1034 | title: "盗摄偷拍",
1035 | value: "https://jable.tv/categories/private-cam/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1036 | },
1037 | {
1038 | title: "无码解放",
1039 | value: "https://jable.tv/categories/uncensored/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1040 | },
1041 | {
1042 | title: "女同欢愉",
1043 | value: "https://jable.tv/categories/lesbian/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1044 | }
1045 | ],
1046 | value: "https://jable.tv/categories/roleplay/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
1047 | },
1048 | {
1049 | name: "sort_by",
1050 | title: "排序",
1051 | type: "enumeration",
1052 | description: "排序",
1053 | enumOptions: [
1054 | { title: "最近更新", value: "post_date" },
1055 | { title: "最多观看", value: "video_viewed" },
1056 | { title: "最多收藏", value: "most_favourited" },
1057 | ],
1058 | },
1059 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
1060 | ],
1061 | },
1062 | // 杂项模块
1063 | {
1064 | title: "杂项",
1065 | description: "按杂项分类浏览影片",
1066 | requiresWebView: false,
1067 | functionName: "loadPage",
1068 | params: [
1069 | {
1070 | name: "url",
1071 | title: "选择杂项",
1072 | type: "enumeration",
1073 | belongTo: {
1074 | paramName: "sort_by",
1075 | value: ["post_date","video_viewed","most_favourited"],
1076 | },
1077 | enumOptions: [
1078 | {
1079 | title: "录像",
1080 | value: "https://jable.tv/tags/video-recording/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1081 | },
1082 | {
1083 | title: "综艺",
1084 | value: "https://jable.tv/tags/variety-show/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1085 | },
1086 | {
1087 | title: "感谢祭",
1088 | value: "https://jable.tv/tags/thanksgiving/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1089 | },
1090 | {
1091 | title: "节日主题",
1092 | value: "https://jable.tv/tags/festival/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1093 | },
1094 | {
1095 | title: "四小时以上",
1096 | value: "https://jable.tv/tags/more-than-4-hours/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1097 | },
1098 | {
1099 | title: "处女作/隐退作",
1100 | value: "https://jable.tv/tags/debut-retires/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
1101 | }
1102 | ],
1103 | value: "https://jable.tv/tags/video-recording/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
1104 | },
1105 | {
1106 | name: "sort_by",
1107 | title: "排序",
1108 | type: "enumeration",
1109 | description: "排序",
1110 | enumOptions: [
1111 | { title: "最近更新", value: "post_date" },
1112 | { title: "最多观看", value: "video_viewed" },
1113 | { title: "最多收藏", value: "most_favourited" },
1114 | ],
1115 | },
1116 | { name: "from", title: "页码", type: "page", description: "页码", value: "1" },
1117 | ],
1118 | },
1119 | ],
1120 | };
1121 |
1122 |
1123 | async function search(params = {}) {
1124 | const url = `https://jable.tv/search/${params.keyword}/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=${params.keyword}`;
1125 | params.url = url;
1126 | return await loadPage(params);
1127 | }
1128 |
1129 | async function loadPage(params = {}) {
1130 | const sections = await loadPageSections(params);
1131 | const items = sections.flatMap((section) => section.childItems);
1132 | return items;
1133 | }
1134 |
1135 | async function loadPageSections(params = {}) {
1136 | try {
1137 | let url = params.url;
1138 | if (!url) {
1139 | throw new Error("地址不能为空");
1140 | }
1141 | if (params["sort_by"]) {
1142 | url += `&sort_by=${params.sort_by}`;
1143 | }
1144 | if (params["from"]) {
1145 | url += `&from=${params.from}`;
1146 | }
1147 | // 1. 获取HTML内容
1148 | console.log("=== 获取HTML内容 ===");
1149 | const response = await Widget.http.get(url, {
1150 | headers: {
1151 | "User-Agent":
1152 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
1153 | Accept:
1154 | "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
1155 | },
1156 | });
1157 |
1158 | if (!response || !response.data || typeof response.data !== "string") {
1159 | throw new Error("无法获取有效的HTML内容");
1160 | }
1161 |
1162 | const htmlContent = response.data;
1163 | console.log(`获取到HTML内容长度: ${htmlContent.length} 字符`);
1164 | console.log(htmlContent);
1165 |
1166 | return parseHtml(htmlContent);
1167 | } catch (error) {
1168 | console.error("测试过程出错:", error.message);
1169 | throw error;
1170 | }
1171 | }
1172 |
1173 | async function parseHtml(htmlContent) {
1174 | // 2. 解析HTML
1175 | console.log("\n=== 解析HTML ===");
1176 | const $ = Widget.html.load(htmlContent);
1177 | const sectionSelector = ".site-content .py-3,.pb-e-lg-40";
1178 | const itemSelector = ".video-img-box";
1179 | const coverSelector = "img";
1180 | const durationSelector = ".absolute-bottom-right .label";
1181 | const titleSelector = ".title a";
1182 |
1183 | let sections = [];
1184 | //use cheerio to parse html
1185 | const sectionElements = $(sectionSelector).toArray();
1186 | for (const sectionElement of sectionElements) {
1187 | const $sectionElement = $(sectionElement);
1188 | var items = [];
1189 | const sectionTitle = $sectionElement.find(".title-box .h3-md").first();
1190 | const sectionTitleText = sectionTitle.text();
1191 | console.log("sectionTitleText:", sectionTitleText);
1192 | const itemElements = $sectionElement.find(itemSelector).toArray();
1193 | console.log("itemElements:", itemElements);
1194 | if (itemElements && itemElements.length > 0) {
1195 | for (const itemElement of itemElements) {
1196 | const $itemElement = $(itemElement);
1197 | const titleId = $itemElement.find(titleSelector).first();
1198 | console.log("titleId:", titleId.length);
1199 | const url = titleId.attr("href") || "";
1200 | console.log("url:", url);
1201 | if (url && url.includes("jable.tv")) {
1202 | const durationId = $itemElement.find(durationSelector).first();
1203 | const coverId = $itemElement.find(coverSelector).first();
1204 | const cover = coverId.attr("data-src");
1205 | const video = coverId.attr("data-preview");
1206 | const title = titleId.text();
1207 | const duration = durationId.text();
1208 | const item = {
1209 | id: url,
1210 | type: "url",
1211 | title: title,
1212 | durationText: duration,
1213 | backdropPath: cover,
1214 | previewUrl: video,
1215 | link: url
1216 | };
1217 | console.log("item:", item);
1218 | items.push(item);
1219 | }
1220 | }
1221 |
1222 | sections.push({
1223 | id: sectionTitleText,
1224 | type: "web",
1225 | title: sectionTitleText,
1226 | childItems: items,
1227 | });
1228 | }
1229 | }
1230 | console.log("sections:", sections);
1231 | return sections;
1232 | }
1233 |
1234 | async function loadDetail(link) {
1235 | const response = await Widget.http.get(link, {
1236 | headers: {
1237 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
1238 | },
1239 | });
1240 | //get hls with regex var hlsUrl = 'https://hot-box-gen.mushroomtrack.com/hls/TJHqwWuFPCwYqa4hyv1cCg/1746892414/50000/50377/50377.m3u8';
1241 | const hlsUrl = response.data.match(/var hlsUrl = '(.*?)';/)[1];
1242 | if (!hlsUrl) {
1243 | throw new Error("无法获取有效的HLS URL");
1244 | }
1245 | console.log("hlsUrl:", hlsUrl);
1246 | const item = {
1247 | id: link,
1248 | type: "detail",
1249 | videoUrl: hlsUrl,
1250 | customHeaders: {
1251 | "Referer": link,
1252 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
1253 | },
1254 | };
1255 | const sections = await parseHtml(response.data);
1256 | const items = sections.flatMap((section) => section.childItems);
1257 | if (items.length > 0) {
1258 | item.childItems = items;
1259 | }
1260 | return item;
1261 | }
--------------------------------------------------------------------------------
/Widgets/jable_en.js:
--------------------------------------------------------------------------------
1 | WidgetMetadata = {
2 | id: "jable",
3 | title: "Jable Detailed Categories",
4 | description: "Fetch Jable category rankings",
5 | author: "nibiru",
6 | site: "https://github.com/quantumultxx/FW-Widgets",
7 | version: "1.0.2",
8 | requiredVersion: "0.0.1",
9 | modules: [
10 | // Popular Movies Module
11 | {
12 | title: "Popular Movies",
13 | description: "Popular movies ranking",
14 | requiresWebView: false,
15 | functionName: "loadPage",
16 | params: [
17 | {
18 | name: "url",
19 | title: "List Address",
20 | type: "constant",
21 | description: "List Address",
22 | value: "https://jable.tv/hot/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
23 | },
24 | {
25 | name: "sort_by",
26 | title: "Sort By",
27 | type: "enumeration",
28 | description: "Sort by",
29 | enumOptions: [
30 | { title: "All Time", value: "video_viewed" },
31 | { title: "This Month", value: "video_viewed_month" },
32 | { title: "This Week", value: "video_viewed_week" },
33 | { title: "Today", value: "video_viewed_today" },
34 | ],
35 | },
36 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
37 | ],
38 | },
39 | // New Releases Module
40 | {
41 | title: "New Releases",
42 | description: "Newly released movies",
43 | requiresWebView: false,
44 | functionName: "loadPage",
45 | params: [
46 | {
47 | name: "url",
48 | title: "List Address",
49 | type: "constant",
50 | description: "List Address",
51 | value: "https://jable.tv/new-release/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
52 | },
53 | {
54 | name: "sort_by",
55 | title: "Sort By",
56 | type: "enumeration",
57 | description: "Sort by",
58 | enumOptions: [
59 | { title: "Newest", value: "post_date" },
60 | { title: "Most Viewed", value: "video_viewed" },
61 | { title: "Most Favorited", value: "most_favourited" },
62 | ],
63 | },
64 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
65 | ],
66 | },
67 |
68 | // Chinese Subtitles Module
69 | {
70 | title: "Chinese Subtitles",
71 | description: "Movies with Chinese subtitles",
72 | requiresWebView: false,
73 | functionName: "loadPage",
74 | params: [
75 | {
76 | name: "url",
77 | title: "List Address",
78 | type: "constant",
79 | description: "List Address",
80 | value: "https://jable.tv/categories/chinese-subtitle/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
81 | },
82 | {
83 | name: "sort_by",
84 | title: "Sort By",
85 | type: "enumeration",
86 | description: "Sort by",
87 | enumOptions: [
88 | { title: "Newest", value: "post_date" },
89 | { title: "Most Viewed", value: "video_viewed" },
90 | { title: "Most Favorited", value: "most_favourited" },
91 | ],
92 | },
93 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
94 | ],
95 | },
96 | // Actress Selection Module (Names preserved)
97 | {
98 | title: "Actress Selection",
99 | description: "Browse movies by actress categories",
100 | requiresWebView: false,
101 | functionName: "loadPage",
102 | params: [
103 | {
104 | name: "url",
105 | title: "Actress Selection",
106 | type: "enumeration",
107 | enumOptions: [
108 | {
109 | title: "三上悠亚",
110 | value: "https://jable.tv/s1/models/yua-mikami/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
111 | },
112 | {
113 | title: "楪可怜",
114 | value: "https://jable.tv/models/86b2f23f95cc485af79fe847c5b9de8d/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
115 | },
116 | {
117 | title: "小野夕子",
118 | value: "https://jable.tv/models/2958338aa4f78c0afb071e2b8a6b5f1b/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
119 | },
120 | {
121 | title: "大槻响",
122 | value: "https://jable.tv/models/hibiki-otsuki/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
123 | },
124 | {
125 | title: "藤森里穗",
126 | value: "https://jable.tv/models/riho-fujimori/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
127 | },
128 | {
129 | title: "JULIA",
130 | value: "https://jable.tv/models/julia/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
131 | },
132 | {
133 | title: "明里䌷",
134 | value: "https://jable.tv/models/tsumugi-akari/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
135 | },
136 | {
137 | title: "桃乃木香奈",
138 | value: "https://jable.tv/models/momonogi-kana/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
139 | },
140 | {
141 | title: "水户香奈",
142 | value: "https://jable.tv/models/kana-mito/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
143 | },
144 | {
145 | title: "篠田ゆう",
146 | value: "https://jable.tv/s1/models/shinoda-yuu/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
147 | },
148 | {
149 | title: "枫可怜",
150 | value: "https://jable.tv/models/kaede-karen/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
151 | },
152 | {
153 | title: "吉沢明歩",
154 | value: "https://jable.tv/models/akiho-yoshizawa/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
155 | },
156 | {
157 | title: "羽月希",
158 | value: "https://jable.tv/models/21e145d3f4d7c8c818fc7eae19342a7a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
159 | },
160 | {
161 | title: "美谷朱里 ",
162 | value: "https://jable.tv/s1/models/mitani-akari/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
163 | },
164 | {
165 | title: "山岸逢花",
166 | value: "https://jable.tv/models/yamagishi-aika/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
167 | },
168 | {
169 | title: "佐佐木明希",
170 | value: "https://jable.tv/models/sasaki-aki/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
171 | },
172 | {
173 | title: "神木麗",
174 | value: "https://jable.tv/models/ef9b1ab9a21b58d6ee4d7d97ab883288/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
175 | },
176 | {
177 | title: "七泽美亚",
178 | value: "https://jable.tv/models/nanasawa-mia/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
179 | },
180 | {
181 | title: "瀬戸環奈",
182 | value: "https://jable.tv/models/1a71be5a068c6f9e00fac285b31019f9/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
183 | },
184 | {
185 | title: "瀧本雫葉",
186 | value: "https://jable.tv/models/7ffb432871f53eda0b4d80be34fff86a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
187 | },
188 | {
189 | title: "さくらわかな",
190 | value: "https://jable.tv/models/0b96db26c8b192b0a54e24d878380765/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
191 | },
192 | {
193 | title: "彩月七緒",
194 | value: "https://jable.tv/models/e82b22cd3275fd0e569147d82fa1999d/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
195 | },
196 | {
197 | title: "鈴乃ウト",
198 | value: "https://jable.tv/models/559904d22cbf03091f790258aa4e9b8c/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
199 | },
200 | {
201 | title: "三田真鈴",
202 | value: "https://jable.tv/models/7749dd641e0426f55342972d920513a7/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
203 | },
204 | {
205 | title: "七ツ森りり",
206 | value: "https://jable.tv/models/9ed214792a2144520430dd494c93f651/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
207 | },
208 | {
209 | title: "七嶋舞",
210 | value: "https://jable.tv/models/6ab2e738a33eafc3db27cab0b83cf5cd/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
211 | },
212 | {
213 | title: "八掛うみ",
214 | value: "https://jable.tv/models/83397477054d35cd07e2c48685335a86/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
215 | },
216 | {
217 | title: "八木奈々",
218 | value: "https://jable.tv/models/3610067a1d725dab8ee8cd3ffe828850/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
219 | },
220 | {
221 | title: "宮下玲奈",
222 | value: "https://jable.tv/models/b435825a4941964079157dd2fc0a8e5a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
223 | },
224 | {
225 | title: "小湊よつ葉",
226 | value: "https://jable.tv/models/ff8ce98f2419126e00a90bc1f3385824/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
227 | },
228 | {
229 | title: "小野六花",
230 | value: "https://jable.tv/models/0478c4db9858c4e6c60af7fbf828009a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
231 | },
232 | {
233 | title: "工藤ゆら",
234 | value: "https://jable.tv/models/e7ba849893aa7ce8afcc3003a4075c20/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
235 | },
236 | {
237 | title: "本庄鈴",
238 | value: "https://jable.tv/models/honjou-suzu/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
239 | },
240 | {
241 | title: "桜空もも",
242 | value: "https://jable.tv/models/sakura-momo/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
243 | },
244 | {
245 | title: "楓ふうあ",
246 | value: "https://jable.tv/models/f88e49c4c1adb0fd1bae71ac122d6b82/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
247 | },
248 | {
249 | title: "河北彩伽",
250 | value: "https://jable.tv/models/saika-kawakita2/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
251 | },
252 | {
253 | title: "矢埜愛茉",
254 | value: "https://jable.tv/models/0903b1921df6c616c29041be11c3d2e8/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
255 | },
256 | {
257 | title: "石川澪",
258 | value: "https://jable.tv/models/a855133fa44ca5e7679cac0a0ab7d1cb/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
259 | },
260 | {
261 | title: "美ノ嶋めぐり",
262 | value: "https://jable.tv/models/d1ebb3d61ee367652e6b1f35b469f2b6/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
263 | },
264 | {
265 | title: "野々浦暖",
266 | value: "https://jable.tv/models/6b0ce5c4944edce04ab48d4bb608fd4c/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
267 | },
268 | {
269 | title: "青空ひかり",
270 | value: "https://jable.tv/models/4c7a2cfa27b343e3e07659650400f61d/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
271 | },
272 | {
273 | title: "香澄りこ",
274 | value: "https://jable.tv/models/6c2e861e04b9327701a80ca77a088814/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
275 | },
276 | {
277 | title: "新ありな",
278 | value: "https://jable.tv/models/e763382dc86aa703456d964ca25d0e8b/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
279 | },
280 | {
281 | title: "未歩なな",
282 | value: "https://jable.tv/models/c9535c2f157202cd0e934d62ef582e2e/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
283 | },
284 | {
285 | title: "凪ひかる",
286 | value: "https://jable.tv/models/91fca8d824e07075d09de0282f6e9076/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
287 | },
288 | {
289 | title: "三宮つばき",
290 | value: "https://jable.tv/models/f0e279c00b2a7e1aca2ef4d31d611020/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
291 | },
292 | {
293 | title: "藍芽みずき",
294 | value: "https://jable.tv/models/679c69a5488daa35a5544749b75556c6/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
295 | },
296 | {
297 | title: "つばさ舞",
298 | value: "https://jable.tv/models/0d7709a62cc199f923107c120d30893b/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
299 | },
300 | {
301 | title: "朝日りお",
302 | value: "https://jable.tv/models/ad0935cfa1449ab126dde2b0c0929ad0/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
303 | },
304 | {
305 | title: "日下部加奈",
306 | value: "https://jable.tv/models/dfea76fd68bc52e0888a78e0fedce073/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
307 | },
308 | {
309 | title: "弓乃りむ",
310 | value: "https://jable.tv/models/06c22ca98d8ec82963046ad17e0fad4a/?mode=async&function=get_block&block_id=list_videos_common_videos_list"
311 | }
312 | ],
313 | value: "https://jable.tv/s1/models/yua-mikami/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
314 | },
315 | {
316 | name: "sort_by",
317 | title: "Sort By",
318 | type: "enumeration",
319 | description: "Sort by",
320 | enumOptions: [
321 | { title: "Newest", value: "post_date" },
322 | { title: "Most Viewed", value: "video_viewed" },
323 | { title: "Most Favorited", value: "most_favourited" },
324 | ],
325 | },
326 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
327 | ],
328 | },
329 |
330 | // Clothing Module
331 | {
332 | title: "Clothing Selection",
333 | description: "Browse movies by clothing categories",
334 | requiresWebView: false,
335 | functionName: "loadPage",
336 | params: [
337 | {
338 | name: "url",
339 | title: "Clothing Selection",
340 | type: "enumeration",
341 | enumOptions: [
342 | { title: "Black Pantyhose", value: "https://jable.tv/tags/black-pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
343 | { title: "Thigh-High Socks", value: "https://jable.tv/tags/knee-socks/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
344 | { title: "Sportswear", value: "https://jable.tv/tags/sportswear/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
345 | { title: "Flesh-Tone Pantyhose", value: "https://jable.tv/tags/flesh-toned-pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
346 | { title: "Pantyhose", value: "https://jable.tv/tags/pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
347 | { title: "Glasses", value: "https://jable.tv/tags/glasses/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
348 | { title: "Kemonomimi", value: "https://jable.tv/tags/kemonomimi/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
349 | { title: "Fishnets", value: "https://jable.tv/tags/fishnets/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
350 | { title: "Swimsuit", value: "https://jable.tv/tags/swimsuit/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
351 | { title: "School Uniform", value: "https://jable.tv/tags/school-uniform/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
352 | { title: "Cheongsam", value: "https://jable.tv/tags/cheongsam/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
353 | { title: "Wedding Dress", value: "https://jable.tv/tags/wedding-dress/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
354 | { title: "Maid", value: "https://jable.tv/tags/maid/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
355 | { title: "Kimono", value: "https://jable.tv/tags/kimono/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
356 | { title: "Bunny Girl", value: "https://jable.tv/tags/bunny-girl/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
357 | { title: "Cosplay", value: "https://jable.tv/tags/Cosplay/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
358 | ],
359 | value: "https://jable.tv/tags/black-pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
360 | },
361 | {
362 | name: "sort_by",
363 | title: "Sort By",
364 | type: "enumeration",
365 | description: "Sort by",
366 | enumOptions: [
367 | { title: "Newest", value: "post_date" },
368 | { title: "Most Viewed", value: "video_viewed" },
369 | { title: "Most Favorited", value: "most_favourited" },
370 | ],
371 | },
372 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
373 | ],
374 | },
375 |
376 | // Plot Module
377 | {
378 | title: "Plot Selection",
379 | description: "Browse movies by plot categories",
380 | requiresWebView: false,
381 | functionName: "loadPage",
382 | params: [
383 | {
384 | name: "url",
385 | title: "Plot Selection",
386 | type: "enumeration",
387 | enumOptions: [
388 | { title: "Affair", value: "https://jable.tv/tags/affair/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
389 | { title: "Ugly Man", value: "https://jable.tv/tags/ugly-man/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
390 | { title: "Kinship", value: "https://jable.tv/tags/kinship/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
391 | { title: "Virginity", value: "https://jable.tv/tags/virginity/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
392 | { title: "Revenge", value: "https://jable.tv/tags/avenge/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
393 | { title: "Giant", value: "https://jable.tv/tags/giant/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
394 | { title: "Love Potion", value: "https://jable.tv/tags/love-potion/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
395 | { title: "Hypnosis", value: "https://jable.tv/tags/hypnosis//?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
396 | { title: "Private Cam", value: "https://jable.tv/tags/private-cam/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
397 | { title: "NTR", value: "https://jable.tv/tags/ntr/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
398 | { title: "Age Difference", value: "https://jable.tv/tags/age-difference/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
399 | { title: "Rainy Day", value: "https://jable.tv/tags/rainy-day/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
400 | { title: "Time Stop", value: "https://jable.tv/tags/time-stop/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
401 | ],
402 | value: "https://jable.tv/tags/affair/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
403 | },
404 | {
405 | name: "sort_by",
406 | title: "Sort By",
407 | type: "enumeration",
408 | description: "Sort by",
409 | enumOptions: [
410 | { title: "Newest", value: "post_date" },
411 | { title: "Most Viewed", value: "video_viewed" },
412 | { title: "Most Favorited", value: "most_favourited" },
413 | ],
414 | },
415 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
416 | ],
417 | },
418 |
419 | // Location Module
420 | {
421 | title: "Location Selection",
422 | description: "Browse movies by location categories",
423 | requiresWebView: false,
424 | functionName: "loadPage",
425 | params: [
426 | {
427 | name: "url",
428 | title: "Location Selection",
429 | type: "enumeration",
430 | enumOptions: [
431 | { title: "Tram", value: "https://jable.tv/tags/tram/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
432 | { title: "First Night", value: "https://jable.tv/tags/first-night/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
433 | { title: "Prison", value: "https://jable.tv/tags/prison/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
434 | { title: "Hot Spring", value: "https://jable.tv/tags/hot-spring/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
435 | { title: "Swimming Pool", value: "https://jable.tv/tags/swimming-pool/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
436 | { title: "Car", value: "https://jable.tv/tags/car/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
437 | { title: "Toilet", value: "https://jable.tv/tags/toilet/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
438 | { title: "School", value: "https://jable.tv/tags/school/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
439 | { title: "Magic Mirror", value: "https://jable.tv/tags/magic-mirror/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
440 | { title: "Bathroom", value: "https://jable.tv/tags/bathing-place/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
441 | { title: "Library", value: "https://jable.tv/tags/library/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
442 | { title: "Gym Room", value: "https://jable.tv/tags/gym-room/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
443 | { title: "Store", value: "https://jable.tv/tags/store/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
444 | ],
445 | value: "https://jable.tv/tags/tram/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
446 | },
447 | {
448 | name: "sort_by",
449 | title: "Sort By",
450 | type: "enumeration",
451 | description: "Sort by",
452 | enumOptions: [
453 | { title: "Newest", value: "post_date" },
454 | { title: "Most Viewed", value: "video_viewed" },
455 | { title: "Most Favorited", value: "most_favourited" },
456 | ],
457 | },
458 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
459 | ],
460 | },
461 |
462 | // Body Type Module
463 | {
464 | title: "Body Type Selection",
465 | description: "Browse movies by body type categories",
466 | requiresWebView: false,
467 | functionName: "loadPage",
468 | params: [
469 | {
470 | name: "url",
471 | title: "Body Type Selection",
472 | type: "enumeration",
473 | enumOptions: [
474 | { title: "Tall", value: "https://jable.tv/tags/tall/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
475 | { title: "Flexible Body", value: "https://jable.tv/tags/flexible-body/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
476 | { title: "Small Tits", value: "https://jable.tv/tags/small-tits/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
477 | { title: "Beautiful Legs", value: "https://jable.tv/tags/beautiful-leg/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
478 | { title: "Beautiful Butt", value: "https://jable.tv/tags/beautiful-butt/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
479 | { title: "Tattoo", value: "https://jable.tv/tags/tattoo/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
480 | { title: "Short Hair", value: "https://jable.tv/tags/short-hair/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
481 | { title: "Hairy Pussy", value: "https://jable.tv/tags/hairless-pussy/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
482 | { title: "Mature Woman", value: "https://jable.tv/tags/mature-woman/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
483 | { title: "Big Tits", value: "https://jable.tv/tags/big-tits/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
484 | { title: "Girl", value: "https://jable.tv/tags/girl/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
485 | { title: "Petite", value: "https://jable.tv/tags/dainty/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
486 | ],
487 | value: "https://jable.tv/tags/tall/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
488 | },
489 | {
490 | name: "sort_by",
491 | title: "Sort By",
492 | type: "enumeration",
493 | description: "Sort by",
494 | enumOptions: [
495 | { title: "Newest", value: "post_date" },
496 | { title: "Most Viewed", value: "video_viewed" },
497 | { title: "Most Favorited", value: "most_favourited" },
498 | ],
499 | },
500 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
501 | ],
502 | },
503 |
504 | // Character Module
505 | {
506 | title: "Character Selection",
507 | description: "Browse movies by character categories",
508 | requiresWebView: false,
509 | functionName: "loadPage",
510 | params: [
511 | {
512 | name: "url",
513 | title: "Character Selection",
514 | type: "enumeration",
515 | enumOptions: [
516 | { title: "Wife", value: "https://jable.tv/tags/wife/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
517 | { title: "Doctor", value: "https://jable.tv/tags/doctor/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
518 | { title: "Nurse", value: "https://jable.tv/tags/nurse/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
519 | { title: "Teacher", value: "https://jable.tv/tags/teacher/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
520 | { title: "Flight Attendant", value: "https://jable.tv/tags/female-anchor/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
521 | { title: "Fugitive", value: "https://jable.tv/tags/fugitive/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
522 | { title: "Couple", value: "https://jable.tv/tags/couple/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
523 | { title: "Anchor", value: "https://jable.tv/tags/female-anchor/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
524 | { title: "Club Hostess", value: "https://jable.tv/tags/club-hostess-and-sex-worker/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
525 | { title: "Housewife", value: "https://jable.tv/tags/housewife/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
526 | { title: "Private Teacher", value: "https://jable.tv/tags/private-teacher/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
527 | { title: "Detective", value: "https://jable.tv/tags/detective/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
528 | { title: "Widow", value: "https://jable.tv/tags/widow/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
529 | { title: "Team Manager", value: "https://jable.tv/tags/team-manager/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
530 | ],
531 | value: "https://jable.tv/tags/wife/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
532 | },
533 | {
534 | name: "sort_by",
535 | title: "Sort By",
536 | type: "enumeration",
537 | description: "Sort by",
538 | enumOptions: [
539 | { title: "Newest", value: "post_date" },
540 | { title: "Most Viewed", value: "video_viewed" },
541 | { title: "Most Favorited", value: "most_favourited" },
542 | ],
543 | },
544 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
545 | ],
546 | },
547 |
548 | // Intimacy Module
549 | {
550 | title: "Intimacy Selection",
551 | description: "Browse movies by intimacy categories",
552 | requiresWebView: false,
553 | functionName: "loadPage",
554 | params: [
555 | {
556 | name: "url",
557 | title: "Intimacy Selection",
558 | type: "enumeration",
559 | enumOptions: [
560 | { title: "Facial", value: "https://jable.tv/tags/facial/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
561 | { title: "Footjob", value: "https://jable.tv/tags/footjob/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
562 | { title: "Spasms", value: "https://jable.tv/tags/spasms/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
563 | { title: "Squirting", value: "https://jable.tv/tags/squirting/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
564 | { title: "Deep Throat", value: "https://jable.tv/tags/deep-throat/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
565 | { title: "Kissing", value: "https://jable.tv/tags/kiss/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
566 | { title: "Cum in Mouth", value: "https://jable.tv/tags/cum-in-mouth/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
567 | { title: "Blowjob", value: "https://jable.tv/tags/blowjob/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
568 | { title: "Tit Wank", value: "https://jable.tv/tags/tit-wank/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
569 | { title: "Creampie", value: "https://jable.tv/tags/creampie/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
570 | ],
571 | value: "https://jable.tv/tags/facial/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
572 | },
573 | {
574 | name: "sort_by",
575 | title: "Sort By",
576 | type: "enumeration",
577 | description: "Sort by",
578 | enumOptions: [
579 | { title: "Newest", value: "post_date" },
580 | { title: "Most Viewed", value: "video_viewed" },
581 | { title: "Most Favorited", value: "most_favourited" },
582 | ],
583 | },
584 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
585 | ],
586 | },
587 |
588 | // Miscellaneous Module
589 | {
590 | title: "Miscellaneous Selection",
591 | description: "Browse movies by miscellaneous categories",
592 | requiresWebView: false,
593 | functionName: "loadPage",
594 | params: [
595 | {
596 | name: "url",
597 | title: "Miscellaneous Selection",
598 | type: "enumeration",
599 | enumOptions: [
600 | { title: "Video Recording", value: "https://jable.tv/tags/video-recording/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
601 | { title: "Variety Show", value: "https://jable.tv/tags/variety-show/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
602 | { title: "Thanksgiving", value: "https://jable.tv/tags/thanksgiving/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
603 | { title: "Festival Theme", value: "https://jable.tv/tags/festival/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
604 | { title: "Over 4 Hours", value: "https://jable.tv/tags/more-than-4-hours/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
605 | { title: "Debut/Retirement", value: "https://jable.tv/tags/debut-retires/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
606 | ],
607 | value: "https://jable.tv/tags/video-recording/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
608 | },
609 | {
610 | name: "sort_by",
611 | title: "Sort By",
612 | type: "enumeration",
613 | description: "Sort by",
614 | enumOptions: [
615 | { title: "Newest", value: "post_date" },
616 | { title: "Most Viewed", value: "video_viewed" },
617 | { title: "Most Favorited", value: "most_favourited" },
618 | ],
619 | },
620 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
621 | ],
622 | },
623 |
624 | // Theme Module
625 | {
626 | title: "Theme Selection",
627 | description: "Browse movies by theme categories",
628 | requiresWebView: false,
629 | functionName: "loadPage",
630 | params: [
631 | {
632 | name: "url",
633 | title: "Theme Selection",
634 | type: "enumeration",
635 | enumOptions: [
636 | { title: "Roleplay", value: "https://jable.tv/categories/roleplay/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
637 | { title: "Uniform Temptation", value: "https://jable.tv/categories/uniform/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
638 | { title: "Direct Fuck", value: "https://jable.tv/categories/sex-only/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
639 | { title: "Pantyhose Beauty", value: "https://jable.tv/categories/pantyhose/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
640 | { title: "Master-Slave", value: "https://jable.tv/categories/bdsm/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
641 | { title: "Group Sex", value: "https://jable.tv/categories/groupsex/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
642 | { title: "POV", value: "https://jable.tv/categories/pov/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
643 | { title: "Insult Pleasure", value: "https://jable.tv/categories/insult/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
644 | { title: "Private Cam", value: "https://jable.tv/categories/private-cam/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
645 | { title: "Uncensored", value: "https://jable.tv/categories/uncensored/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
646 | { title: "Lesbian", value: "https://jable.tv/categories/lesbian/?mode=async&function=get_block&block_id=list_videos_common_videos_list" },
647 | ],
648 | value: "https://jable.tv/categories/roleplay/?mode=async&function=get_block&block_id=list_videos_common_videos_list",
649 | },
650 | {
651 | name: "sort_by",
652 | title: "Sort By",
653 | type: "enumeration",
654 | description: "Sort by",
655 | enumOptions: [
656 | { title: "Newest", value: "post_date" },
657 | { title: "Most Viewed", value: "video_viewed" },
658 | { title: "Most Favorited", value: "most_favourited" },
659 | ],
660 | },
661 | { name: "from", title: "Page", type: "page", description: "Page number", value: "1" },
662 | ],
663 | },
664 | ],
665 | };
666 |
667 | async function search(params = {}) {
668 | const url = `https://jable.tv/search/${params.keyword}/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=${params.keyword}`;
669 | params.url = url;
670 | return await loadPage(params);
671 | }
672 |
673 | async function loadPage(params = {}) {
674 | const sections = await loadPageSections(params);
675 | const items = sections.flatMap((section) => section.childItems);
676 | return items;
677 | }
678 |
679 | async function loadPageSections(params = {}) {
680 | try {
681 | let url = params.url;
682 | if (!url) {
683 | throw new Error("The address cannot be empty");
684 | }
685 | if (params["sort_by"]) {
686 | url += `&sort_by=${params.sort_by}`;
687 | }
688 | if (params["from"]) {
689 | url += `&from=${params.from}`;
690 | }
691 | // 1. Fetch HTML content
692 | console.log("=== Fetch HTML content ===");
693 | const response = await Widget.http.get(url, {
694 | headers: {
695 | "User-Agent":
696 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
697 | Accept:
698 | "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
699 | },
700 | });
701 |
702 | if (!response || !response.data || typeof response.data !== "string") {
703 | throw new Error("Unable to fetch valid HTML content");
704 | }
705 |
706 | const htmlContent = response.data;
707 | console.log(`Fetched HTML content length: ${htmlContent.length} characters`);
708 | console.log(htmlContent);
709 |
710 | return parseHtml(htmlContent);
711 | } catch (error) {
712 | console.error("Error during test process:", error.message);
713 | throw error;
714 | }
715 | }
716 |
717 | async function parseHtml(htmlContent) {
718 | // 2. Parse HTML
719 | console.log("\n=== Parse HTML ===");
720 | const $ = Widget.html.load(htmlContent);
721 | const sectionSelector = ".site-content .py-3,.pb-e-lg-40";
722 | const itemSelector = ".video-img-box";
723 | const coverSelector = "img";
724 | const durationSelector = ".absolute-bottom-right .label";
725 | const titleSelector = ".title a";
726 |
727 | let sections = [];
728 | // Use cheerio to parse html
729 | const sectionElements = $(sectionSelector).toArray();
730 | for (const sectionElement of sectionElements) {
731 | const $sectionElement = $(sectionElement);
732 | var items = [];
733 | const sectionTitle = $sectionElement.find(".title-box .h3-md").first();
734 | const sectionTitleText = sectionTitle.text();
735 | console.log("sectionTitleText:", sectionTitleText);
736 | const itemElements = $sectionElement.find(itemSelector).toArray();
737 | console.log("itemElements:", itemElements);
738 | if (itemElements && itemElements.length > 0) {
739 | for (const itemElement of itemElements) {
740 | const $itemElement = $(itemElement);
741 | const titleId = $itemElement.find(titleSelector).first();
742 | console.log("titleId:", titleId.length);
743 | const url = titleId.attr("href") || "";
744 | console.log("url:", url);
745 | if (url && url.includes("jable.tv")) {
746 | const durationId = $itemElement.find(durationSelector).first();
747 | const coverId = $itemElement.find(coverSelector).first();
748 | const cover = coverId.attr("data-src");
749 | const video = coverId.attr("data-preview");
750 | const title = titleId.text();
751 | const duration = durationId.text();
752 | const item = {
753 | id: url,
754 | type: "url",
755 | title: title,
756 | durationText: duration,
757 | backdropPath: cover,
758 | previewUrl: video,
759 | link: url
760 | };
761 | console.log("item:", item);
762 | items.push(item);
763 | }
764 | }
765 |
766 | sections.push({
767 | id: sectionTitleText,
768 | type: "web",
769 | title: sectionTitleText,
770 | childItems: items,
771 | });
772 | }
773 | }
774 | console.log("sections:", sections);
775 | return sections;
776 | }
777 |
778 | async function loadDetail(link) {
779 | const response = await Widget.http.get(link, {
780 | headers: {
781 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
782 | },
783 | });
784 | // Get HLS URL using regex
785 | const hlsUrl = response.data.match(/var hlsUrl = '(.*?)';/)[1];
786 | if (!hlsUrl) {
787 | throw new Error("Unable to fetch valid HLS URL");
788 | }
789 | console.log("hlsUrl:", hlsUrl);
790 | const item = {
791 | id: link,
792 | type: "detail",
793 | videoUrl: hlsUrl,
794 | customHeaders: {
795 | "Referer": link,
796 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
797 | },
798 | };
799 | const sections = await parseHtml(response.data);
800 | const items = sections.flatMap((section) => section.childItems);
801 | if (items.length > 0) {
802 | item.childItems = items;
803 | }
804 | return item;
805 | }
806 |
--------------------------------------------------------------------------------
/icon/icon.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/quantumultxx/FW-Widgets/3a5592ff2dfe7a966726a969ca2719633cf98162/icon/icon.PNG
--------------------------------------------------------------------------------
/icon/icon1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/quantumultxx/FW-Widgets/3a5592ff2dfe7a966726a969ca2719633cf98162/icon/icon1.PNG
--------------------------------------------------------------------------------
/icon/icon2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/quantumultxx/FW-Widgets/3a5592ff2dfe7a966726a969ca2719633cf98162/icon/icon2.PNG
--------------------------------------------------------------------------------