├── 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 --------------------------------------------------------------------------------