51短剧
https://blind.nxnmihyk.cc
分享者: nuo-an (15232)发布时间: 11/06 21:09
「登录」换源:官方发布页 https://51dj31.com/ 海外永久 https://51hub.com //2026.10.28
{
"articleStyle": 4,
"cacheFirst": false,
"customOrder": -2,
"enableJs": true,
"enabled": true,
"enabledCookieJar": false,
"header": "{\"User-Agent\":\"Mozilla\/5.0 (Linux; Android 13) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Mobile Safari\/537.36\"}",
"injectJs": "(function(){\n'use strict';\nvar C={LP:500,FR:3,SS:1,TH:24};\nif(window.__GESTURE_CFG)Object.assign(C,window.__GESTURE_CFG);\nfunction full(){return document.fullscreenElement||document.webkitFullscreenElement}\nfunction isLS(v){return v&&v.videoWidth&&v.videoHeight?v.videoWidth>=v.videoHeight:false}\nfunction fs(){var v=document.querySelector('video'),ok=full()&&isLS(v);try{ok?screen.orientation.lock('landscape').catch(function(){}):screen.orientation.unlock()}catch(e){}}\ndocument.addEventListener('fullscreenchange',fs);document.addEventListener('webkitfullscreenchange',fs);if(full())fs();\nfunction tip(css){var e=document.createElement('div');e.style.cssText=css+'display:none;opacity:0;transition:opacity .15s';document.body.appendChild(e);return e}\nfunction set(e,t){if(!e)return;if(t==null){e.style.opacity=0;e.__h&&clearTimeout(e.__h);e.__h=setTimeout(function(){e.style.display='none'},160)}else{e.textContent=t;e.style.display='block';e.__h&&clearTimeout(e.__h);e.style.opacity=1}}\nvar TC='position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,.30);color:#fff;padding:10px 20px;border-radius:8px;font-size:16px;font-weight:bold;z-index:99999;pointer-events:none;font-family:-apple-system,sans-serif;white-space:nowrap;';\nfunction fmt(t){t=Math.max(0,Math.floor(t||0));var h=Math.floor(t\/3600),m=Math.floor(t%3600\/60),s=t%60,p=function(n){return n<10?'0'+n:''+n};return(h?h+':'+p(m):m)+':'+p(s)}\nvar TE=null;\nfunction bind(v){\nif(v.__gb)return;v.__gb=true;\nvar G={sx:0,lp:null,ff:false,wp:false,or:1,pt:0,tm:null,sp:false};\nfunction stopL(){if(G.lp){clearTimeout(G.lp);G.lp=null}}\nfunction startL(){G.lp=null;G.ff=true;G.or=v.playbackRate||1;G.wp=v.paused;v.playbackRate=C.FR;if(G.wp){var p=v.play();if(p&&p.catch)p.catch(function(){})}TE=TE||tip(TC);set(TE,'▶▶ '+v.playbackRate+'x')}\nfunction resetFF(){if(!G.ff)return;v.playbackRate=G.or;G.ff=false;set(TE,null);if(G.wp)v.pause()}\nfunction flush(){if(G.sp){G.sp=false;if(isFinite(G.pt))v.currentTime=G.pt}if(G.tm){clearTimeout(G.tm);G.tm=null}}\nfunction onS(e){if(e.touches.length!==1){stopL();return}var t=e.touches[0];G.sx=t.clientX;G.st=v.currentTime||0;G.wp=v.paused;G.or=v.playbackRate||1;stopL();G.lp=setTimeout(startL,C.LP)}\nfunction onM(e){if(e.touches.length!==1)return;stopL();var dx=e.touches[0].clientX-G.sx;if(Math.abs(dx)<=15)return;resetFF();e.preventDefault();var d=v.duration;if(!isFinite(d)||d<=0)return;var nt=Math.max(0,Math.min(d,G.st+dx\/(window.innerWidth*C.SS)*d));G.pt=nt;TE=TE||tip(TC);set(TE,fmt(nt)+' \/ '+fmt(d));if(!G.sp){G.sp=true;G.tm=setTimeout(function(){G.sp=false;if(isFinite(G.pt))v.currentTime=G.pt},C.TH)}}\nfunction onE(){stopL();if(G.ff){resetFF();return}flush();set(TE,null)}\nv.addEventListener('touchstart',onS,{passive:true});v.addEventListener('touchmove',onM,{passive:false});v.addEventListener('touchend',onE);v.addEventListener('touchcancel',onE);\n}\nvar BV=new WeakSet();\nfunction bindAll(){var vs=document.querySelectorAll('video');for(var i=0;i<vs.length;i++){if(!BV.has(vs[i])){BV.add(vs[i]);bind(vs[i])}}}\nbindAll();new MutationObserver(bindAll).observe(document.documentElement,{childList:true,subtree:true});\nconsole.log('[注入] 已启用');\n})();",
"lastUpdateTime": 1793885817302,
"loadWithBaseUrl": true,
"loginUi": "[\n {\n \"name\": \"发布页地址\",\n \"type\": \"text\",\n \"key\": \"pub\",\n \"default\": \"https:\/\/51dj31.com\",\n \"hint\": \"官方发布页,一般不用改\",\n \"style\": {\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"点这里获取线路(官方发布页 + 海外永久地址)\",\n \"type\": \"button\",\n \"action\": \"FQ_djGet()\",\n \"style\": {\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"地址结果 · 点一下切换线路,返回分类刷新生效\",\n \"type\": \"label\",\n \"style\": {\n \"layout_flexBasisPercent\": 1\n }\n },\n {\n \"name\": \"线路1\",\n \"type\": \"button\",\n \"viewName\": \"FQ_djName(0)\",\n \"action\": \"FQ_djPick(0)\",\n \"style\": {\n \"layout_flexBasisPercent\": 0.47\n }\n },\n {\n \"name\": \"线路2\",\n \"type\": \"button\",\n \"viewName\": \"FQ_djName(1)\",\n \"action\": \"FQ_djPick(1)\",\n \"style\": {\n \"layout_flexBasisPercent\": 0.47\n }\n },\n {\n \"name\": \"当前地址\",\n \"type\": \"button\",\n \"action\": \"FQ_djCur()\",\n \"style\": {\n \"layout_flexBasisPercent\": 0.29\n }\n },\n {\n \"name\": \"检查线路\",\n \"type\": \"button\",\n \"action\": \"FQ_djChk()\",\n \"style\": {\n \"layout_flexBasisPercent\": 0.29\n }\n },\n {\n \"name\": \"恢复默认\",\n \"type\": \"button\",\n \"action\": \"FQ_djRst()\",\n \"style\": {\n \"layout_flexBasisPercent\": 0.29\n }\n }\n]",
"loginUrl": "function djST(s) { return String(s == null ? '' : s).replace(\/\\\/+$\/, '') }\nfunction djHost(u) { var s = djST(u).replace(\/^https?:\\\/\\\/\/, ''); var i = s.indexOf('\/'); return i > 0 ? s.substring(0, i) : s }\nfunction djGet(u, ms) { try { return String(java.ajax(djST(u) + '\/', ms || 6000) || '') } catch (e) { return '' } }\nfunction djB64(s) { try { return String(java.base64Decode(String(s)) || '') } catch (e) { return '' } }\nfunction djGV(k, d) { var v = ''; try { v = String(source.get(k) || '') } catch (e) { } if (!v || v == 'null' || v == 'undefined') v = d || ''; return v }\nfunction djSV(k, v) { try { source.put(k, String(v)) } catch (e) { } }\nfunction djT(t) { try { java.longToast(t) } catch (e) { } }\nfunction djNL() { return String.fromCharCode(10) }\n\nfunction djPub() {\n var v = '';\n try { v = String(result['发布页地址'] || '') } catch (e) { }\n if (!v) v = djGV('dj_pub', '');\n if (!v) v = 'https:\/\/51dj31.com';\n return djST(v);\n}\n\nfunction djFetch() {\n var h = djGet(djPub(), 6000);\n if (h.length < 3000) {\n var m = h.match(\/href\\s*=\\s*[\"'](https?:\\\/\\\/[^\"']+)[\"']\/i);\n if (m) { var h2 = djGet(m[1], 6000); if (h2) h = h2 }\n }\n if (!h) return '';\n var b = h.match(\/Base64\\.decode\\(\\s*[\"']([A-Za-z0-9\\+\\\/=]{40,})[\"']\\s*\\)\/);\n if (b) { var d = djB64(b[1]); if (d && d.length > 500) h = h + djNL() + d }\n return h;\n}\n\nfunction djSuffix(h) {\n var o = [], s = {}, m;\n var re = \/['\"]\\.([a-z0-9][a-z0-9-]{2,}\\.(?:cc|com|net|xyz|top|vip|site|club|live|app))['\"]\/gi;\n while ((m = re.exec(String(h))) != null) {\n var x = m[1].toLowerCase();\n if (s[x]) continue;\n if (x.indexOf('51') > -1 || x.indexOf('hub') > -1 || x.indexOf('shipin') > -1 || x.indexOf('gmail') > -1) continue;\n s[x] = 1; o.push(x);\n }\n return o;\n}\n\nvar DJ_N = 2;\nvar DJ_W = ['carrier', 'adult', 'belong', 'against', 'buyer', 'beach', 'cabin', 'camera', 'cancer', 'cap', 'carbon', 'card'];\n\nfunction djBuild() {\n var suf = djSuffix(djFetch());\n var cached = !suf.length;\n if (cached) suf = ['henoceapn.cc', 'siaefmykb.cc'];\n var n = Math.max(1, Math.min(6, parseInt(DJ_N, 10) || 4));\n var main = suf[1] ? Math.ceil(n \/ 2) : n;\n var ls = [], i;\n for (i = 0; i < main; i++) ls.push('https:\/\/' + DJ_W[i] + '.' + suf[0]);\n for (i = 0; ls.length < n && suf[1]; i++) ls.push('https:\/\/' + DJ_W[6 + i] + '.' + suf[1]);\n return { list: ls, suf: suf, cached: cached };\n}\n\nfunction djProbe(u) {\n var h = djGet(u, 5000);\n if (!h) return '连不上';\n return h.indexOf('\/play\/') > -1 ? '可用' : '不是本站';\n}\n\nfunction djSites() {\n var r = djGV('dj_sites', ''), a = [];\n if (r) { try { a = JSON.parse(r) } catch (e) { a = [] } }\n if (!a || !a.length) a = [djGV('dj_line', 'https:\/\/blind.nxnmihyk.cc')];\n return a;\n}\nfunction djName(i) {\n var a = djSites();\n if (i >= a.length) return '线路' + (i + 1);\n return djHost(a[i]) + (a[i] === djGV('dj_line', '') ? ' ✓' : '');\n}\n\nfunction FQ_djGet() {\n try {\n var r = djBuild(), ls = r.list;\n djSV('dj_pub', djPub());\n djSV('dj_sites', JSON.stringify(ls));\n djSV('dj_line', ls[0]);\n djT('已获取 ' + ls.length + ' 条线路' + djNL() + '当前:' + djHost(ls[0]) + djNL() + '后缀:' + r.suf.join(' \/ ') + (r.cached ? '(发布页没读到,用内置兜底)' : ''));\n try { java.reLoginView() } catch (e) { }\n } catch (e) { djT('获取失败:' + e) }\n}\nfunction FQ_djPick(i) {\n try {\n var a = djSites();\n if (!a[i]) { djT('先点「获取线路」'); return }\n djSV('dj_line', a[i]);\n djT('已切换:' + a[i] + djNL() + '回分类重进一次生效');\n try { java.reLoginView() } catch (e) { }\n } catch (e) { djT('切换失败:' + e) }\n}\nfunction FQ_djCur() { try { djT('当前地址:' + djGV('dj_line', 'https:\/\/blind.nxnmihyk.cc')) } catch (e) { } }\nfunction FQ_djChk() { try { var u = djGV('dj_line', ''); djT(djHost(u) + ' → ' + djProbe(u)) } catch (e) { djT('检查失败') } }\nfunction FQ_djRst() {\n try {\n djSV('dj_line', 'https:\/\/blind.nxnmihyk.cc');\n djSV('dj_sites', JSON.stringify([]));\n djT('已恢复默认');\n try { java.reLoginView() } catch (e) { }\n } catch (e) { }\n}\nfunction FQ_djName(i) { try { return djName(i) } catch (e) { return '线路' + (i + 1) } }\nfunction login() { return '' }\n",
"preload": false,
"preloadJs": "window.java=java;",
"ruleArticles": "<js>\n(function () {\n var html = String(result || '');\n var HOST = 'https:\/\/blind.nxnmihyk.cc';\n var arr = null;\n try {\n var p = html.indexOf('__NUXT_DATA__');\n if (p > -1) {\n var b = html.indexOf('>', p);\n var e = html.indexOf('<\/script', b);\n if (b > -1 && e > b) arr = JSON.parse(html.substring(b + 1, e));\n }\n } catch (e0) { arr = null; }\n\n function rv(v) {\n if (typeof v === 'number') {\n return (arr && v >= 0 && v < arr.length) ? arr[v] : '';\n }\n return v;\n }\n\n var cover = {};\n if (arr) {\n for (var k = 0; k < arr.length; k++) {\n var o = arr[k];\n if (!o || typeof o !== 'object' || typeof o.length === 'number') continue;\n if (o.cover === undefined) continue;\n var vid = rv(o.video_id !== undefined ? o.video_id : o.playlet_id);\n var cv = String(rv(o.cover) || '');\n if (vid && cv.indexOf('http') === 0) cover[String(vid)] = cv;\n }\n }\n\n \/\/ 图片直连是 binary\/octet-stream,WebView 不肯渲染,走站点自带的 \/_img\/<base64> 代理\n function b64(s) {\n var t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n s = String(s);\n var o = '', i = 0;\n for (; i + 2 < s.length; i += 3) {\n var n = (s.charCodeAt(i) << 16) | (s.charCodeAt(i + 1) << 8) | s.charCodeAt(i + 2);\n o += t.charAt((n >> 18) & 63) + t.charAt((n >> 12) & 63) + t.charAt((n >> 6) & 63) + t.charAt(n & 63);\n }\n var r = s.length - i;\n if (r === 1) {\n var n1 = s.charCodeAt(i) << 16;\n o += t.charAt((n1 >> 18) & 63) + t.charAt((n1 >> 12) & 63) + '==';\n } else if (r === 2) {\n var n2 = (s.charCodeAt(i) << 16) | (s.charCodeAt(i + 1) << 8);\n o += t.charAt((n2 >> 18) & 63) + t.charAt((n2 >> 12) & 63) + t.charAt((n2 >> 6) & 63) + '=';\n }\n return o;\n }\n \/\/ 输出相对地址:rssArticle.image 会用 sourceUrl 补全,换镜像域名不用改规则\n function img(u) {\n u = String(u || '');\n if (!u) return '';\n if (u.indexOf('\/_img\/') === 0) return u;\n return '\/_img\/' + b64(u);\n }\n\n function esc(s) {\n return String(s === null || s === undefined ? '' : s)\n .replace(\/&\/g, '&')\n .replace(\/<\/g, '<')\n .replace(\/>\/g, '>')\n .replace(\/\"\/g, '"');\n }\n\n var doc = Packages.org.jsoup.Jsoup.parse(html);\n var cards = doc.select('div[data-xpch=drama-card],article[data-xpch=card]');\n var out = [];\n var seen = {};\n for (var c = 0; c < cards.size(); c++) {\n var a = cards.get(c).select('a[aria-label][href*=play]').first();\n if (!a) continue;\n var href = String(a.attr('href') || '');\n var m = href.match(\/\\\/play\\\/(\\d+)\\\/\/);\n if (!m) continue;\n var id = m[1];\n if (seen[id]) continue;\n var name = String(a.attr('aria-label') || '').replace(\/\\s+\/g, ' ').replace(\/^\\s+|\\s+$\/g, '');\n if (!name || name === '立即播放') continue;\n seen[id] = 1;\n \/\/ payload 里没有就用卡片 img 的 src(webView 渲染后的 DOM 里是真实地址)\n var cv = cover[id] || '';\n if (!cv) {\n var im = cards.get(c).select('img').first();\n if (im) {\n var s0 = String(im.attr('src') || im.attr('data-src') || '');\n if (s0.indexOf('data:') !== 0 && s0.length > 12) cv = s0;\n }\n }\n \/\/ 卡片上的标签(仙侠\/穿越\/逆袭…),最多取 4 个,塞进 data-g 给 rulePubDate 用\n var tags = [];\n var tagEls = cards.get(c).select('a[data-xpch=tag]');\n for (var q = 0; q < tagEls.size() && tags.length < 4; q++) {\n var tv = String(tagEls.get(q).text() || '').replace(\/\\s+\/g, '');\n if (tv && tv !== name && tags.join('|').indexOf(tv) < 0) tags.push(tv);\n }\n var tg = tags.length ? ('\\uD83D\\uDD16 ' + tags.join(' · ')) : '';\n out.push('<div class=\"xc\" data-c=\"' + esc(img(cv)) + '\" data-g=\"' + esc(tg) + '\"><a href=\"' + esc(href) + '\">' + esc(name) + '<\/a><\/div>');\n }\n return out.join('');\n})()\n<\/js>\n.xc",
"ruleContent": "@js:\n(function () {\n var html = '';\n try { html = String(result || ''); } catch (e0) { html = ''; }\n if (html.length < 2000 || html.indexOf('__NUXT_DATA__') < 0) {\n try { html = String(java.ajax(baseUrl) || ''); } catch (e1) { }\n }\n\n var ORIGIN = 'https:\/\/blind.nxnmihyk.cc';\n try { var sLine = String(source.get('dj_line') || ''); if (sLine) ORIGIN = sLine.replace(\/\\\/+$\/, ''); } catch (eLine) { }\n try {\n var om = String(baseUrl).match(\/^https?:\\\/\\\/[^\\\/]+\/);\n if (om) ORIGIN = om[0];\n } catch (e2) { }\n\n var arr = null;\n try {\n var p = html.indexOf('__NUXT_DATA__');\n if (p > -1) {\n var b = html.indexOf('>', p);\n var e = html.indexOf('<\/script', b);\n if (b > -1 && e > b) arr = JSON.parse(html.substring(b + 1, e));\n }\n } catch (e3) { arr = null; }\n\n function rv(v) {\n if (typeof v === 'number') {\n return (arr && v >= 0 && v < arr.length) ? arr[v] : '';\n }\n return v;\n }\n function txt(v) {\n var s = String(rv(v) === null || rv(v) === undefined ? '' : rv(v));\n return s.replace(\/\\r\/g, '').replace(\/[ \\t]+\\n\/g, '\\n').replace(\/^\\s+|\\s+$\/g, '');\n }\n function b64(s) {\n var t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/';\n s = String(s);\n var o = '', i = 0;\n for (; i + 2 < s.length; i += 3) {\n var n = (s.charCodeAt(i) << 16) | (s.charCodeAt(i + 1) << 8) | s.charCodeAt(i + 2);\n o += t.charAt((n >> 18) & 63) + t.charAt((n >> 12) & 63) + t.charAt((n >> 6) & 63) + t.charAt(n & 63);\n }\n var r = s.length - i;\n if (r === 1) {\n var n1 = s.charCodeAt(i) << 16;\n o += t.charAt((n1 >> 18) & 63) + t.charAt((n1 >> 12) & 63) + '==';\n } else if (r === 2) {\n var n2 = (s.charCodeAt(i) << 16) | (s.charCodeAt(i + 1) << 8);\n o += t.charAt((n2 >> 18) & 63) + t.charAt((n2 >> 12) & 63) + t.charAt((n2 >> 6) & 63) + '=';\n }\n return o;\n }\n function img(u) {\n u = String(u || '');\n if (!u) return '';\n if (u.indexOf('\/_img\/') > -1) return u;\n return ORIGIN + '\/_img\/' + b64(u);\n }\n\n function esc(s) {\n return String(s === null || s === undefined ? '' : s)\n .split('&').join('&amp;')\n .split('<').join('&lt;')\n .split('>').join('&gt;')\n .split('\"').join('&quot;');\n }\n function au(s) {\n return String(s === null || s === undefined ? '' : s)\n .split('\"').join('')\n .split('<').join('')\n .split('>').join('')\n .replace(\/^\\s+|\\s+$\/g, '');\n }\n function q(s) {\n s = String(s === null || s === undefined ? '' : s);\n var o = '';\n for (var i = 0; i < s.length; i++) {\n var c = s.charAt(i);\n if (c === '\\\\') o += '\\\\\\\\';\n else if (c === '\"') o += '\\\\\"';\n else if (c === '\\n') o += '\\\\n';\n else if (c === '\\r') o += '\\\\r';\n else if (c === '<') o += '\\\\u003c';\n else if (c === '>') o += '\\\\u003e';\n else o += c;\n }\n return '\"' + o + '\"';\n }\n\n var dv = null;\n if (arr) {\n for (var i = 0; i < arr.length; i++) {\n var o = arr[i];\n if (o && typeof o === 'object' && typeof o.length !== 'number' && o.episodeAll !== undefined) {\n dv = o;\n break;\n }\n }\n }\n\n var name = dv ? txt(dv.video_title) : '';\n var cover = dv ? img(txt(dv.cover_img)) : '';\n var state = dv ? txt(dv.update_status) : '';\n var total = dv ? txt(dv.total_serial) : '';\n var desc = dv ? txt(dv.description) : '';\n var pid = dv ? txt(dv.playlet_id) : '';\n var curNo = dv ? txt(dv.current_episode_no) : '1';\n\n var startSort = curNo || '1';\n try {\n var pm = String(baseUrl).match(\/\\\/play\\\/(\\d+)\\\/(\\d+)\/);\n if (pm) {\n if (!pid) pid = pm[1];\n startSort = pm[2];\n } else {\n var pm2 = String(baseUrl).match(\/\\\/play\\\/(\\d+)\/);\n if (pm2 && !pid) pid = pm2[1];\n }\n } catch (e4) { }\n if (!pid) pid = '';\n\n if (!name) {\n var h1 = null;\n try { h1 = Packages.org.jsoup.Jsoup.parse(html).select('h1').first(); } catch (e5) { h1 = null; }\n if (h1) name = String(h1.text());\n }\n\n var items = [];\n if (dv && dv.episodeAll !== undefined) {\n var raw = rv(dv.episodeAll);\n if (raw && typeof raw.length === 'number') {\n for (var j = 0; j < raw.length; j++) {\n var ep = rv(raw[j]);\n if (!ep || typeof ep !== 'object') continue;\n if (rv(ep.is_adv) === true) continue;\n var sn = txt(ep.sort);\n if (!sn || isNaN(parseInt(sn, 10))) continue;\n var snN = String(parseInt(sn, 10));\n var t = '第' + snN + '集';\n var locked = 0;\n if (!txt(ep.video_url)) locked = 1;\n if (txt(ep.state) === 'locked' || txt(ep.access_reason) === 'locked') locked = 1;\n items.push({ s: snN, t: t, l: locked });\n }\n }\n }\n\n if (!items.length) {\n return '<div style=\"padding:20px 16px;font-size:15px;line-height:1.8\">没有解析到选集数据,可能站点改版了。'\n + '<br><a href=\"' + esc(baseUrl) + '\" style=\"color:#2f7cf6\">点这里打开原网页<\/a><\/div>';\n }\n\n items.sort(function (a, b) { return parseInt(a.s, 10) - parseInt(b.s, 10); });\n\n var metaJson = JSON.stringify({\n pid: pid,\n origin: ORIGIN,\n start: String(startSort),\n eps: items\n }).replace(\/<\/g, '\\\\u003c');\n\n var sub = state;\n if (total && (!state || String(state).indexOf('集') < 0)) sub = (sub ? sub + ' · ' : '') + '共' + total + '集';\n\n var CL = [\n 'var M = window.META || {};var D = M.eps || [];var ORIGIN = M.origin || \"\";var PID = M.pid || \"\";var v = document.getElementById(\"v\");var tip = document.getElementById(\"tip\");var boxE = document.getElementById(\"eps\");var idxE = document.getElementById(\"idx\");var bPrev = document.getElementById(\"prev\");var bNext = document.getElementById(\"next\");var bAuto = document.getElementById(\"auto\");var cur = -1, hls = null, busy = false, timer = null, blocked = 0, autoMuted = 0;var cache = {}, fixed = {};\/\/ 选集一律只显示「第N集」,防止个别剧的标题串进来',\n 'for (var zi = 0; zi < D.length; zi++) { D[zi].t = \"第\" + D[zi].s + \"集\"; }var auto = true;try { auto = localStorage.getItem(\"dj_auto\") !== \"0\"; } catch (e0) { }function say(t) { if (tip) tip.textContent = (t == null ? \"\" : String(t)); }function idxOf(s) { for (var i = 0; i < D.length; i++) { if (String(D[i].s) === String(s)) return i; } return -1; }function expOf(u) { var m = String(u || \"\").match(\/auth_key=(\\\\d{9,11})\/); return m ? parseInt(m[1], 10) : 0; }\/\/ auth_key 会过期,剩余不足 90 秒就当失效,重新取一次',\n 'function stale(u) {if (!u) return true;var e = expOf(u);if (!e) return false;return (e - Math.floor(new Date().getTime() \/ 1000)) < 90;}function pick(html, sort) {try {var s = String(html || \"\");var p = s.indexOf(\"__NUXT_DATA__\");if (p < 0) return \"\";var b = s.indexOf(\">\", p);var e = s.indexOf(\"<\" + \"\/script\", b);if (b < 0 || e < b) return \"\";var arr = JSON.parse(s.substring(b + 1, e));var rv = function (x) {if (typeof x === \"number\") return (x >= 0 && x < arr.length) ? arr[x] : \"\";return x;};var dv = null;for (var i = 0; i < arr.length; i++) {var o = arr[i];if (o && typeof o === \"object\" && typeof o.length !== \"number\" && o.episodeAll !== undefined) { dv = o; break; }}if (dv) {var raw = rv(dv.episodeAll);if (raw && typeof raw.length === \"number\") {for (var j = 0; j < raw.length; j++) {var ep = rv(raw[j]);if (!ep || typeof ep !== \"object\") continue;if (String(rv(ep.sort)) === String(sort)) {var u = String(rv(ep.video_url) || \"\");if (u) return u;}}}if (String(rv(dv.current_episode_no)) === String(sort)) {var u2 = String(rv(dv.video_url) || \"\");if (u2) return u2;}}return \"\";} catch (err) { return \"\"; }}\/\/ 通道1:Legado 注入的 java 对象(preloadJs 已执行时可用,不受 CORS 限制)',\n 'function nativeTxt(url) {try {var J = (typeof java !== \"undefined\" && java) ? java : (window.java || null);if (J && typeof J.ajax === \"function\") { var t = J.ajax(url); if (t) return String(t); }} catch (e) { }return \"\";}\/\/ 通道2:页面内同源请求',\n 'function httpTxt(url, cb) {var done = false;var fin = function (t) {if (done) return;done = true;try { cb(String(t || \"\")); } catch (e) { say(\"播放器出错:\" + e); }};setTimeout(function () { fin(\"\"); }, 8000);if (window.fetch) {try {fetch(url, { cache: \"no-store\", credentials: \"omit\" })',\n '.then(function (r) { return r && r.ok ? r.text() : \"\"; })',\n '.then(function (t) { fin(t && t.indexOf(\"__NUXT_DATA__\") > -1 ? t : \"\"); })',\n '.catch(function () { fin(\"\"); });return;} catch (e) { }}try {var x = new XMLHttpRequest();x.open(\"GET\", url, true);x.onreadystatechange = function () {if (x.readyState !== 4) return;fin(x.status === 200 && x.responseText && x.responseText.indexOf(\"__NUXT_DATA__\") > -1 ? x.responseText : \"\");};x.send();} catch (e2) { fin(\"\"); }}\/\/ 播放时才取地址:先试当前集页面,再试剧集首页(任何一集页面都带全部选集数据)',\n 'var staleOnly = false;var nativeUsed = 0;function txtOf(url, cb) {httpTxt(url, function (t) {if (t) { cb(t); return; }if (nativeUsed >= 2) { cb(\"\"); return; }nativeUsed++;cb(nativeTxt(url));});}function fresh(sort, cb) {var n = new Date().getTime();var urls = [',\n 'ORIGIN + \"\/play\/\" + PID + \"\/\" + sort + \"\/?_=\" + n,ORIGIN + \"\/play\/\" + PID + \"\/1\/?_=\" + n',\n '];var fb = \"\", i = 0;var next = function () {if (i >= urls.length) { if (fb) staleOnly = true; cb(fb); return; }var url = urls[i++];txtOf(url, function (h) {var b = pick(h, sort);if (b && (staleOnly || !stale(b))) { cb(b); return; }if (b && !fb) fb = b;next();});};next();}var CDNS = [',\n '\"https:\/\/cdn.jsdelivr.net\/npm\/hls.js@1.5.17\/dist\/hls.min.js\",\"https:\/\/fastly.jsdelivr.net\/npm\/hls.js@1.5.17\/dist\/hls.min.js\",\"https:\/\/cdn.bootcdn.net\/ajax\/libs\/hls.js\/1.5.17\/hls.min.js\",\"https:\/\/lib.baomitu.com\/hls.js\/1.5.17\/hls.min.js\",\"https:\/\/unpkg.com\/hls.js@1.5.17\/dist\/hls.min.js\",\"https:\/\/cdn.staticfile.org\/hls.js\/1.5.17\/hls.min.js\"',\n '];var ci = 0;function loadHls(cb) {if (window.Hls) { cb(); return; }if (ci >= CDNS.length) { cb(); return; }var s = document.createElement(\"script\");s.src = CDNS[ci++];s.onload = function () { if (window.Hls) cb(); else loadHls(cb); };s.onerror = function () { loadHls(cb); };document.head.appendChild(s);}function killHls() { if (hls) { try { hls.destroy(); } catch (e) { } hls = null; } }\/\/ 自动播放常被 WebView 拦,拦了就提示点画面;点一下画面能续播',\n 'function tryPlay() {var p = null;try { p = v.play(); } catch (e) { }if (p && p.catch) p.catch(function () {try {v.muted = true; autoMuted = 1;var q = v.play();if (q && q.catch) q.catch(function () { blocked = 1; say(\"点一下画面开始播放\"); });} catch (e2) { blocked = 1; say(\"点一下画面开始播放\"); }});}function isHls(u) { return \/\\\\.m3u8(\\\\?|$)\/i.test(u); }\/\/ WebView 内核不会解 m3u8,一律交给 hls.js;hls.js 也拉不到时再退回原生',\n 'function playUrl(u, label) {if (!u) return;if (u.indexOf(\"\/\/\") === 0) u = \"https:\" + u;if (!isHls(u)) {killHls();v.src = u;try { v.load(); } catch (e) { }tryPlay();say(label);return;}loadHls(function () {if (!window.Hls || !Hls.isSupported()) {killHls();v.src = u;try { v.load(); } catch (e) { }tryPlay();say(label + \"(直连模式)\");return;}killHls();hls = new Hls({ enableWorker: false, maxBufferLength: 30, manifestLoadingMaxRetry: 2, fragLoadingMaxRetry: 3 });hls.on(Hls.Events.MANIFEST_PARSED, function () { tryPlay(); });hls.on(Hls.Events.ERROR, function (evt, data) {if (!data || !data.fatal) return;if (data.type === Hls.ErrorTypes.MEDIA_ERROR) {try { hls.recoverMediaError(); return; } catch (e5) { }}var d = data.details || data.type || \"\";killHls();hlsFailed(cur, d);});hls.loadSource(u);hls.attachMedia(v);say(label);});}\/\/ 失败阶梯(每集独立计数,避免一直\"重新取地址\"转圈):',\n 'var stage = {};function hlsFailed(i, detail) {if (i < 0 || i >= D.length) return;var s = D[i].s, st = stage[s] || 0;var why = detail ? \"(\" + detail + \")\" : \"\";if (st === 0) { stage[s] = 1; refresh(i, \"线路不稳,重新取地址…\" + why); return; }if (st === 1) {stage[s] = 2;var u = cache[s];if (u) {killHls();v.src = u;try { v.load(); } catch (e) { }tryPlay();say(\"改用直连播放…\" + why);return;}}stage[s] = 3;say(\"这一集播不了\" + why + \",换一集或点下一集\");}function refresh(i, msg) {if (i < 0 || i >= D.length) return;var s0 = D[i].s;if (fixed[s0]) { say(\"这一集播不了,换一集试试\"); return; }fixed[s0] = 1;delete cache[s0];say(msg || \"地址可能过期,正在重新获取…\");fresh(s0, function (u) {if (!u) { say(\"这一集暂时取不到播放地址\"); return; }cache[s0] = u;if (i === cur) playUrl(u, \"▶ \" + D[i].t);});}function render() {if (idxE) {idxE.textContent = \"共 \" + D.length + \" 集\" + (auto ? \" · 自动连播已开\" : \" · 自动连播已关\");}if (!boxE) return;while (boxE.firstChild) boxE.removeChild(boxE.firstChild);for (var i = 0; i < D.length; i++) {var s = document.createElement(\"span\");s.className = \"ep\" + (i === cur ? \" on\" : \"\") + (D[i].l && i !== cur ? \" lock\" : \"\");s.setAttribute(\"data-e\", String(i));s.textContent = D[i].t;boxE.appendChild(s);}if (bPrev) bPrev.disabled = !(cur > 0);if (bNext) bNext.disabled = !(cur >= 0 && cur + 1 < D.length);if (boxE.children && boxE.children[cur] && boxE.children[cur].scrollIntoView) {try { boxE.children[cur].scrollIntoView({ block: \"nearest\" }); } catch (e) { }}}function stopTimer() { if (timer) { clearInterval(timer); timer = null; } }function play(i) {if (i < 0 || i >= D.length) return;stopTimer();cur = i;stage[D[i].s] = 0;fixed[D[i].s] = 0;render();var ep = D[i];var label = \"▶ \" + ep.t;var u = cache[ep.s];if (u && !stale(u)) { playUrl(u, label); return; }if (busy) return;busy = true;say(\"正在获取 \" + ep.t + \" 的播放地址…\");fresh(ep.s, function (u2) {busy = false;if (!u2) {say(ep.l ? \"这一集需要会员,换一集试试\" : \"这一集暂时取不到播放地址,稍后再试\");return;}cache[ep.s] = u2;if (i === cur) playUrl(u2, label);});}function nextPlayable(i) {for (var k = i + 1; k < D.length; k++) {if (!D[k].l) return k;}return -1;}\/\/ 自动连播:播完倒数 3 秒接着放下一集,点一下视频可取消',\n 'function autoNext() {if (!auto) { say(\"播放结束(自动连播已关)\"); return; }var n = nextPlayable(cur);if (n < 0) { say(\"已经是最后一集了\"); return; }stopTimer();var left = 3;say(left + \" 秒后自动播放 \" + D[n].t + \"(点一下画面取消)\");timer = setInterval(function () {left--;if (left > 0) { say(left + \" 秒后自动播放 \" + D[n].t + \"(点一下画面取消)\"); return; }stopTimer();play(n);}, 1000);}v.addEventListener(\"ended\", autoNext, false);v.addEventListener(\"playing\", function () { if (autoMuted) { autoMuted = 0; try { v.muted = false } catch (e) { } } }, false);v.addEventListener(\"click\", function () {if (timer) { stopTimer(); say(\"已取消连播\"); return; }if (blocked && v.paused) { tryPlay(); }}, false);v.addEventListener(\"error\", function () {var err = v.error;if (!v.src) return;if (err && err.code === 1) return;if (hls) return;hlsFailed(cur, err ? \"code \" + err.code : \"\");}, false);if (boxE) {boxE.onclick = function (ev) {var t = ev.target;while (t && t !== boxE && !(t.getAttribute && t.getAttribute(\"data-e\") != null)) { t = t.parentNode; }if (!t || !t.getAttribute) return;var i = parseInt(t.getAttribute(\"data-e\"), 10);if (!isNaN(i)) play(i);};}if (bPrev) bPrev.onclick = function () { if (cur > 0) play(cur - 1); };if (bNext) bNext.onclick = function () { var n = nextPlayable(cur); if (n > 0) play(n); };if (bAuto) {var paint = function () { bAuto.textContent = auto ? \"连播:开\" : \"连播:关\"; bAuto.className = auto ? \"on\" : \"\"; };paint();bAuto.onclick = function () {auto = !auto;try { localStorage.setItem(\"dj_auto\", auto ? \"1\" : \"0\"); } catch (e) { }paint();render();say(auto ? \"已开启自动连播\" : \"已关闭自动连播\");};}var s0 = idxOf(M.start);if (s0 < 0) s0 = 0;play(s0);',\n ].join('\\n');\n\n var out = [];\n out.push('<html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">');\n out.push('<meta name=\"referrer\" content=\"no-referrer\">');\n out.push('<style>');\n out.push('html,body{margin:0;padding:0;background:transparent;overflow-x:hidden}');\n out.push('*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}');\n out.push('.yh{padding:10px 12px 30px;font-size:15px;line-height:1.6;color:inherit}.yh-hd{display:flex;align-items:center;margin:2px 0 10px}.yh-hd>div{min-width:0;flex:1}.yh-hd img{width:52px;height:70px;object-fit:cover;border-radius:6px;background:rgba(128,128,128,.18);margin-right:10px;flex:0 0 auto}.yh-name{font-size:16px;font-weight:600;line-height:1.35;word-break:break-word;overflow-wrap:break-word}.yh-sub{font-size:12px;opacity:.6;margin-top:3px}.stage{background:#000;border-radius:8px;overflow:hidden}.box{position:relative;width:100%;padding-top:56.25%;background:#000}.box video{position:absolute;left:0;top:0;display:block;width:100%!important;height:100%!important;object-fit:contain;background:#000}.tip{margin:7px 2px 0;font-size:12px;line-height:1.5;opacity:.72;min-height:17px;word-break:break-all}.bar{display:flex;gap:8px;margin-top:9px}.bar button{flex:1;padding:9px 4px;border:1px solid rgba(128,128,128,.35);border-radius:7px;background:rgba(128,128,128,.08);color:inherit;font-size:13px}.bar button.on{background:#2f7cf6;border-color:#2f7cf6;color:#fff}.bar button:disabled{opacity:.35}.eps{display:grid;grid-template-columns:repeat(auto-fill,minmax(78px,1fr));grid-gap:8px;max-height:44vh;overflow:auto;-webkit-overflow-scrolling:touch;padding:2px 0 4px;margin-top:10px}.ep{padding:8px 4px;font-size:13px;text-align:center;border-radius:6px;border:1px solid rgba(128,128,128,.35);background:rgba(128,128,128,.08);color:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ep.on{background:#2f7cf6;border-color:#2f7cf6;color:#fff}.ep.lock{opacity:.45}.ep:active{opacity:.65}.idx{font-size:12px;opacity:.55;margin:8px 2px 0}.intro{margin-top:14px;font-size:13px;line-height:1.75;opacity:.78;word-break:break-word;overflow-wrap:break-word;white-space:pre-wrap}.intro b{display:block;margin-bottom:4px;font-size:13px;opacity:.9}');\n out.push('<\/style><\/head><body>');\n out.push('<div class=\"yh\">');\n out.push('<div class=\"yh-hd\">');\n if (cover) out.push('<img src=\"' + au(cover) + '\" onerror=\"this.remove()\">');\n out.push('<div><div class=\"yh-name\">' + esc(name || '未知剧名') + '<\/div>');\n if (sub) out.push('<div class=\"yh-sub\">' + esc(sub) + '<\/div>');\n out.push('<\/div><\/div>');\n out.push('<div class=\"stage\"><div class=\"box\"><video id=\"v\" controls playsinline webkit-playsinline x5-playsinline preload=\"none\"'\n + (cover ? ' poster=\"' + au(cover) + '\"' : '') + '><\/video><\/div><\/div>');\n out.push('<div class=\"tip\" id=\"tip\">正在准备播放…<\/div>');\n out.push('<div class=\"bar\"><button id=\"prev\">上一集<\/button><button id=\"auto\" class=\"on\">连播:开<\/button><button id=\"next\">下一集<\/button><\/div>');\n out.push('<div class=\"eps\" id=\"eps\"><\/div>');\n out.push('<div class=\"idx\" id=\"idx\"><\/div>');\n if (desc) out.push('<div class=\"intro\"><b>简介<\/b>' + esc(desc) + '<\/div>');\n out.push('<\/div>');\n out.push('<script>window.META=' + metaJson + ';' + CL + '<\/' + 'script>');\n out.push('<\/body><\/html>');\n return out.join('');\n})()",
"ruleImage": "@data-c",
"ruleLink": "a@href",
"ruleNextPage": "a[rel=next]@href",
"rulePubDate": "@data-g",
"ruleTitle": "a@text",
"searchUrl": "@js:String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc') + '\/search\/' + encodeURIComponent(key) + '\/,' + JSON.stringify({headers:{Connection:'close'},retry:1})",
"showWebLog": false,
"singleUrl": false,
"sortUrl": "推荐::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/\n排行::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/rank\/\n原创::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/drama\/OSD\/\n新剧::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-0-0-0-1\/\n最热::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-0-0-0-2\/\n男频::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-0-1-0-0\/\n女频::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-0-2-0-0\/\n少妇::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-73-0-0-0-0\/\n淫妻::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-74-0-0-0-0\/\n后宫::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-77-0-0-0-0\/\n女主::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-1-0-0-0-0\/\n男主::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-2-0-0-0-0\/\n重生::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-27-0-0-0-0\/\n穿越::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-28-0-0-0-0\/\n系统::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-29-0-0-0-0\/\n霸总::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-34-0-0-0-0\/\n伦理::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-92-0-0-0-0\/\n出轨::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-98-0-0-0-0\/\n萝莉::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-88-0-0-0-0\/\n御姐::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-89-0-0-0-0\/\n校园::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-54-0-0-0\/\n架空::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-53-0-0-0\/\n民国::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-52-0-0-0\/\n职场::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-45-0-0-0\/\n现代::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-40-0-0-0\/\n都市::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-41-0-0-0\/\n古代::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-42-0-0-0\/\n乡村::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/0-0-43-0-0-0\/\n全部::{{String(source.get('dj_line')||'https:\/\/blind.nxnmihyk.cc')}}\/new-theater-category\/",
"sourceComment": "「登录」换源:官方发布页 https:\/\/51dj31.com\/ \n海外永久 https:\/\/51hub.com \/\/2026.10.28",
"sourceGroup": "🔞 福利",
"sourceIcon": "https:\/\/blind.nxnmihyk.cc\/images\/shared\/logo.png",
"sourceName": "51短剧",
"sourceUrl": "https:\/\/blind.nxnmihyk.cc",
"type": 0
}