// 劇迷 Gimy TV (gimyai.tw) — 从 剧迷.py 转换的 drpy JS 版 // 站点: MacCMS v10 改版, Cloudflare Managed Challenge 全站防护 // ==================================================================== // 【必读】CF Cookie 说明 // 本站所有页面都在 Cloudflare 挑战后, cf_clearance cookie 过期后所有列表会变空。 // 更新 cookie 方法(在电视盒子同一路由器网络下的电脑上操作): // 1. 用 Edge 浏览器打开 https://gimyai.tw/ 等页面自动通过验证 // 2. F12 -> 应用 -> Cookie -> 复制 cf_clearance 的值 // 3. 替换下面 headers 里的 'cf_clearance=...' (整行替换, 保留 cf_clearance= 前缀) // 注意: cookie 绑定 IP+UA, 必须在电视盒子同一网络下获取; User-Agent 必须与本文件 // headers 里的完全一致(Edge 默认 UA), 不要改动 UA 字符串。 // ==================================================================== var GIMY_HOST = 'https://gimyai.tw'; var GIMY_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0'; // 2026-08-29 在本机 Edge 通过 CF 挑战后获取的 cookie, 过期后按上面说明更换 var GIMY_CK = 'cf_clearance=8DUlAonukhQH8_l34oxsR_BNjnA2.QO.mrApP0JP548-1788000983-1.2.1.1-hE6cJ_L2eknrGR7q9gNhZJH6BJSIa4ilIduyKxd34s9.3Ji79YtHTUaiLogQguWGJeB03lSzqB.yHBsiXja9khj3Acm.QvGjj._lfXsU1vu..fO.EGxJNbHMOauo5nfBG8m0VJFt3SxxEyMPKnTcF9b9.eAc5Gx2arNOJ.Bm4M8Sb_roXQZEJ5pbco1Wv5e_PiNGyLNas6NlErEsvX..6kj.5suDOA0hnTDHAKRmTgV6ock124QX2Pqlv7Iyag75zSAbpw3sN3GJh27fRgKXfQoGb.eQJR.8qZ6JCxHg.H4l5YOWPYdskftfJVRCvxX8dJ.S_3nvhryJ2MVRMrEV3qCXt6qz3UlV5acLNmqWpiDS9LA8gGu.4I0Jez74z36a02K.dPE45Q1IFZqM3qUX2tFg2UrAFDglpILgLB2nXCX3ko5DZ9vwtIGBEBj2bTZ5NOH8G0CCUS7EOCy74xrAH9Z871cccAf1E_GzgTinpIAktoY9RYgudw3_6DgZjGCBuYQPKtTXSwfipTgPxfJ5nA'; // 筛选: 地区/年份 (与 explore 页 12 段 URL 的第2段/第12段对应) var AREA_VALS = [ { n: '全部', v: '' }, { n: '大陸', v: '大陸' }, { n: '中國大陸', v: '中國大陸' }, { n: '韓國', v: '韓國' }, { n: '日本', v: '日本' }, { n: '台灣', v: '台灣' }, { n: '香港', v: '香港' }, { n: '美國', v: '美國' }, { n: '歐美', v: '歐美' }, { n: '泰國', v: '泰國' }, { n: '英國', v: '英國' }, { n: '法國', v: '法國' }, { n: '新加坡', v: '新加坡' }, { n: '其他', v: '其他' } ]; var YEAR_VALS = [ { n: '全部', v: '' }, { n: '2026', v: '2026' }, { n: '2025', v: '2025' }, { n: '2024', v: '2024' }, { n: '2023', v: '2023' }, { n: '2022', v: '2022' }, { n: '2021', v: '2021' }, { n: '2020', v: '2020' }, { n: '2019', v: '2019' }, { n: '2018', v: '2018' }, { n: '2017', v: '2017' } ]; var GIMY_FILTER = {}; var _cats = '2&13&20&15&14&21&31&4&29&34&38&22'.split('&'); for (var _i = 0; _i < _cats.length; _i++) { GIMY_FILTER[_cats[_i]] = [ { key: 'area', name: '地區', value: AREA_VALS }, { key: 'year', name: '年份', value: YEAR_VALS } ]; } var rule = { title: '劇迷', host: 'https://gimyai.tw', url: '/explore/fyclass-----------.html', searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&limit=20&page=fypage', searchable: 1, quickSearch: 1, filterable: 1, class_name: '電視劇&陸劇&韓劇&日劇&台劇&港劇&海外劇&動漫&綜藝&短劇&AI漫劇&紀錄片', class_url: '2&13&20&15&14&21&31&4&29&34&38&22', filter: GIMY_FILTER, headers: { 'User-Agent': GIMY_UA, 'Cookie': GIMY_CK, 'Referer': 'https://gimyai.tw/' }, timeout: 8000, play_parse: true, double: false, limit: 6, // 首页推荐: 解析 gimyai.tw 首页海报卡 推荐: `js: var d = []; try { var html = request('https://gimyai.tw/') || ''; if (html.indexOf('Just a moment') === -1) { var reg = /]*class="poster"[^>]*href="\\/detail\\/(\\d+)\\.html"[^>]*>([\\s\\S]*?)<\\/a>/g; var r; while ((r = reg.exec(html)) !== null) { var c = r[2]; var mt = c.match(/alt="([^"]*)"/); var mp = c.match(/src="([^"]*)"/); var ms = c.match(/class="poster__status"[^>]*>([^<]*)<\\/span>/); d.push({ vod_id: 'https://gimyai.tw/detail/' + r[1] + '.html', vod_name: mt ? mt[1] : r[1], vod_pic: mp ? mp[1] : '', vod_remarks: ms ? ms[1] : '' }); if (d.length >= 30) { break; } } } } catch (e) {} VODS = d; `, // 分类列表: explore 页(12段URL: tid-地区-8空-年份), ?page=N 翻页, 每页36条 一级: `js: var d = []; try { var tid = MY_CATE; if (!tid) { var tm = (input || '').match(/\\/explore\\/(\\d+)/); tid = tm ? tm[1] : '2'; } var area = '', year = ''; try { if (MY_FL && MY_FL.area) { area = MY_FL.area; } if (MY_FL && MY_FL.year) { year = MY_FL.year; } } catch (e0) {} var pg = 1; try { pg = parseInt(MY_PAGE, 10) || 1; } catch (e0) {} var u = 'https://gimyai.tw/explore/' + tid + '-' + encodeURIComponent(area) + '----------' + year + '.html?page=' + pg; var html = request(u) || ''; if (html.indexOf('Just a moment') === -1) { var reg = /]*class="poster"[^>]*href="\\/detail\\/(\\d+)\\.html"[^>]*>([\\s\\S]*?)<\\/a>/g; var r; while ((r = reg.exec(html)) !== null) { var c = r[2]; var mt = c.match(/alt="([^"]*)"/); var mp = c.match(/src="([^"]*)"/); var ms = c.match(/class="poster__status"[^>]*>([^<]*)<\\/span>/); d.push({ vod_id: 'https://gimyai.tw/detail/' + r[1] + '.html', vod_name: mt ? mt[1] : r[1], vod_pic: mp ? mp[1] : '', vod_remarks: ms ? ms[1] : '' }); } } } catch (e) {} VODS = d; `, // 详情: og标签取标题/封面/简介, span.k 取元数据, route-title+eps 取多线路选集 二级: `js: var vod = { vod_id: input, vod_name: '劇迷', vod_pic: '', type_name: '', vod_year: '', vod_area: '', vod_remarks: '', vod_actor: '', vod_director: '', vod_content: '', vod_play_from: '', vod_play_url: '' }; try { var html = request(input) || ''; if (html.indexOf('Just a moment') > -1) { vod.vod_name = 'CF验证过期,请更换cf_clearance'; VOD = vod; } else { var m; m = html.match(/property="og:title" content="([^"]*)"/); if (m) { vod.vod_name = m[1].replace(/\\s*線上看\\s*[-–]\\s*Gimy.*$/, '').trim() || m[1]; } m = html.match(/]*>([\\s\\S]*?)<\\/h1>/); if (!vod.vod_name || vod.vod_name === '劇迷') { vod.vod_name = m ? m[1].replace(/<[^>]+>/g, '').trim() : vod.vod_name; } m = html.match(/property="og:image" content="([^"]*)"/); if (m) { vod.vod_pic = m[1]; } m = html.match(/property="og:description" content="([^"]*)"/); if (m) { vod.vod_content = m[1]; } // 元数据 标签:值 var mreg = /\\s*(演員|演员|主演|導演|导演|地區|地区|年份|類別|类别|狀態|状态|更新)\\s*[::]\\s*<\\/span>\\s*([\\s\\S]*?)<\\/div>/g; var mm; while ((mm = mreg.exec(html)) !== null) { var val = mm[2].replace(/<[^>]+>/g, '').replace(/&/g, '&').trim(); var lab = mm[1]; if (lab === '演員' || lab === '演员' || lab === '主演') { vod.vod_actor = val; } else if (lab === '導演' || lab === '导演') { vod.vod_director = val; } else if (lab === '地區' || lab === '地区') { vod.vod_area = val; } else if (lab === '年份') { vod.vod_year = val; } else if (lab === '類別' || lab === '类别') { vod.type_name = val.replace(/\\s*·\\s*\\d{4}.*$/, '').trim(); if (!vod.vod_year) { var ym = val.match(/(\\d{4})/); if (ym) { vod.vod_year = ym[1]; } } } else if (lab === '狀態' || lab === '状态' || lab === '更新') { if (!vod.vod_remarks) { vod.vod_remarks = val; } } } if (!vod.vod_year && vod.vod_remarks) { var ym2 = vod.vod_remarks.match(/(\\d{4})/); if (ym2) { vod.vod_year = ym2[1]; } } // 播放线路: route-title + eps(data-route-sid) var playFrom = []; var playUrl = []; var rreg = /class="route-title">([\\s\\S]*?)<\\/div>\\s*
]*data-route-sid="(\\d+)"[^>]*>([\\s\\S]*?)<\\/div>/g; var rr; while ((rr = rreg.exec(html)) !== null) { var rname = rr[1].replace(/<[^>]+>/g, '').replace(/\\s+/g, ' ').trim() || ('线路' + rr[2]); var eplist = []; var ereg = /]*class="ep"[^>]*href="\\/play\\/(\\d+)-(\\d+)-(\\d+)\\.html"[^>]*>([\\s\\S]*?)<\\/a>/g; var ee; while ((ee = ereg.exec(rr[3])) !== null) { var ename = ee[4].replace(/<[^>]+>/g, '').trim() || ('第' + ee[3] + '集'); eplist.push(ename + '$https://gimyai.tw/play/' + ee[1] + '-' + ee[2] + '-' + ee[3] + '.html'); } if (eplist.length > 0) { playFrom.push(rname); playUrl.push(eplist.join('#')); } } vod.vod_play_from = playFrom.join('$$$'); vod.vod_play_url = playUrl.join('$$$'); VOD = vod; } } catch (e) { VOD = vod; } `, // 搜索: index.php/ajax/suggest JSON 接口, 支持 fypage 分页 搜索: `js: var d = []; try { var kw = KEY || ''; var pg = MY_PAGE || 1; var u = 'https://gimyai.tw/index.php/ajax/suggest?mid=1&wd=' + encodeURIComponent(kw) + '&limit=20&page=' + pg; var txt = request(u) || ''; if (txt.indexOf('Just a moment') === -1 && txt.charAt(0) === '{') { var data = null; try { data = JSON.parse(txt); } catch (e1) { data = null; } if (data && data.code === 1 && data.list) { for (var i = 0; i < data.list.length; i++) { var it = data.list[i]; d.push({ vod_id: 'https://gimyai.tw/detail/' + it.id + '.html', vod_name: it.name || ('' + it.id), vod_pic: it.pic || '', vod_remarks: '' }); } } } } catch (e) {} VODS = d; `, // 播放: play 页 player_data JSON, encrypt 1=urldecode 2=base64+urldecode // 直链(m3u8/mp4)直接输出裸链接; 非直链走 attzy 解析器 lazy: `js: try { var url = input; if (url.indexOf('http') !== 0) { url = 'https://gimyai.tw' + url; } var html = request(url) || ''; var m = html.match(/var\\s+player_data\\s*=\\s*(\\{[\\s\\S]+?\\})\\s*;?\\s*<\\/script>/); if (!m) { m = html.match(/player_data\\s*=\\s*(\\{[\\s\\S]+?\\})/); } if (m) { var pd = null; try { pd = JSON.parse(m[1]); } catch (e1) { var um = m[1].match(/"url"\\s*:\\s*"(https?:\\/\\/[^"]+)"/); if (um) { pd = { url: um[1], encrypt: 0, from: '' }; } } if (pd) { var pu = pd.url || ''; var enc = pd.encrypt || 0; if (enc === 1) { try { pu = decodeURIComponent(pu); } catch (e2) {} } else if (enc === 2) { try { pu = decodeURIComponent(atob(pu)); } catch (e3) {} } var pul = (pu || '').toLowerCase(); if (pul.indexOf('.m3u8') > -1 || pul.indexOf('.mp4') > -1) { input = pu; } else if (pu) { var from = pd.from || ''; var ap = 'lb'; if (from === 'qsvip') { ap = 'qs'; } else if (from === 'JD4K') { ap = 'jd'; } input = 'https://v.attzy.com/ap/' + ap + '/?url=' + encodeURIComponent(pu); } } } else { var dm = html.match(/(https?:\\/\\/[^"'\\s<>]+\\.m3u8[^"'\\s<>]*)/); if (dm) { input = dm[1]; } } } catch (e) {} ` };