<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>临江仙 · 在线播放 (1080zyk)</title>
<script src="https://cdn.jsdelivr.net/npm/hls.js@1/dist/hls.min.js"></script>
<style>
:root{
--bg:#0d1017; --panel:#151a24; --panel2:#1b2230; --line:#26304200;
--txt:#e8edf5; --dim:#8b96ab; --acc:#ff5c7a; --acc2:#7aa2ff;
--ok:#3dd68c; --bad:#ff5c5c; --unk:#f0b34e;
}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--txt);font-family:"Microsoft YaHei","PingFang SC",system-ui,sans-serif;font-size:14px}
a{color:var(--acc2);text-decoration:none}
.wrap{max-width:1280px;margin:0 auto;padding:16px}
header.hero{display:flex;flex-direction:column;align-items:center;text-align:center;background:linear-gradient(135deg,#1a2130,#12161f);border:1px solid #232c3d;border-radius:14px;padding:18px;margin-bottom:16px}
.hero h1{font-size:22px;display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap}
.badge{font-size:12px;background:var(--acc);color:#fff;border-radius:6px;padding:2px 8px;font-weight:normal}
.badge.blue{background:var(--acc2)}
.meta{margin-top:8px;color:var(--dim);line-height:1.8;font-size:13px}
.meta b{color:var(--txt);font-weight:normal}
.layout{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:16px}
@media(max-width:960px){.layout{grid-template-columns:1fr}}
.card{background:var(--panel);border:1px solid #232c3d;border-radius:14px;overflow:hidden}
.player-box{position:relative;background:#000}
video{width:100%;aspect-ratio:16/9;display:block;background:#000}
.ctrlbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;padding:10px 12px;border-top:1px solid #232c3d;background:var(--panel)}
button{background:var(--panel2);color:var(--txt);border:1px solid #2b3547;border-radius:8px;padding:7px 14px;cursor:pointer;font-size:13px;transition:.15s}
button:hover{border-color:var(--acc2);color:#fff}
button.primary{background:var(--acc);border-color:var(--acc);color:#fff}
button.primary:hover{filter:brightness(1.1);color:#fff}
button:disabled{opacity:.45;cursor:not-allowed}
.spacer{flex:1}
.now{padding:10px 12px;color:var(--dim);font-size:13px;border-top:1px dashed #232c3d}
.now b{color:var(--acc2)}
.list-head{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:12px;border-bottom:1px solid #232c3d}
.list-head h2{font-size:15px;margin-right:auto}
select,input[type=text]{background:var(--panel2);border:1px solid #2b3547;color:var(--txt);border-radius:8px;padding:6px 10px;font-size:13px}
.stats{padding:0 12px 10px;color:var(--dim);font-size:12px;display:flex;gap:12px;flex-wrap:wrap}
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px;vertical-align:middle}
.d-ok{background:var(--ok)} .d-bad{background:var(--bad)} .d-unk{background:var(--unk)} .d-none{background:#3a465c}
.eps{max-height:640px;overflow-y:auto;padding:10px;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}
.eps::-webkit-scrollbar{width:8px}.eps::-webkit-scrollbar-thumb{background:#2b3547;border-radius:8px}
.ep{position:relative;background:var(--panel2);border:1px solid #2b3547;border-radius:10px;padding:9px 10px;cursor:pointer;transition:.15s;overflow:hidden}
.ep:hover{border-color:var(--acc2)}
.ep.active{border-color:var(--acc);background:#2a1c26}
.ep .t{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ep .s{font-size:11px;color:var(--dim);margin-top:4px;display:flex;align-items:center;gap:4px}
.ep .acts{position:absolute;top:6px;right:6px;display:flex;gap:4px;opacity:0;transition:.15s}
.ep:hover .acts{opacity:1}
.ep .acts button{padding:2px 7px;font-size:11px;border-radius:6px;line-height:1.5}
.prog{height:3px;background:#0d1017;border-radius:2px;margin-top:6px;overflow:hidden}
.prog i{display:block;height:100%;background:var(--acc2);width:0}
details.syn{margin-top:16px;background:var(--panel);border:1px solid #232c3d;border-radius:14px;padding:14px 18px}
details.syn summary{cursor:pointer;font-weight:bold}
details.syn p{margin-top:10px;color:#b9c2d4;line-height:1.9}
.toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%);background:#000c;color:#fff;padding:9px 18px;border-radius:20px;font-size:13px;z-index:99;display:none}
.overlay{position:absolute;inset:0;display:none;align-items:center;justify-content:center;flex-direction:column;gap:12px;background:#000a;z-index:5;text-align:center;padding:20px}
.overlay.show{display:flex}
label.chk{display:flex;align-items:center;gap:5px;cursor:pointer;user-select:none}
</style>
</head>
<body>
<div class="wrap">
<header class="hero">
<div style="flex:1;min-width:0">
<h1>临江仙 <span class="badge">全32集</span> <span class="badge blue">1080zyk 源</span> <span class="badge" style="background:#3a465c">评分 6.2</span></h1>
<div class="meta">
别名:<b>衡门有狐/衡门有狐:临江仙</b> | 类型:<b>国产剧·爱情·古装</b> | 地区:<b>大陆</b> | 语言:<b>国语</b> | 年份:<b>2025</b><br>
导演:<b>智磊,国浩</b><br>
主演:<b>白鹿,曾舜晞,何瑞贤,陈鑫海,赵弈钦,周洁琼,梁永棋,郑凯,赵昭仪,洪尧,孙晶晶,董春辉,潘宥诚,孙政,胡耘豪,张籽沐,金绪泽,罗泽楷,弭金,张垒,袁大宝,王亭文,于荣光,黄奕,连凯,张百乔,陈鹤一,赵晴,陈德容,左小青,信,林依轮,安悦溪,于朦胧,陈宥维,黄日莹,李倩,闻雨,李千逸,汪汐潮,杨谨睿,吴海龙,姚弛,张天启,郭昊钧 等</b>
</div>
</div>
</header>
<div class="layout">
<section class="card">
<div class="player-box">
<video id="video" controls playsinline></video>
<div class="overlay" id="ovl">
<div id="ovlMsg" style="color:#ffd7de;font-size:15px"></div>
<div style="display:flex;gap:10px">
<button class="primary" onclick="retryCur()">重试本集</button>
<button onclick="playIdx(cur+1)">播放下一集</button>
</div>
</div>
</div>
<div class="ctrlbar">
<button class="primary" onclick="playIdx(cur-1)">◀ 上一集</button>
<button class="primary" onclick="playIdx(cur+1)">下一集 ▶</button>
<span id="epLabel" style="color:var(--dim)">未播放</span>
<div class="spacer"></div>
<label class="chk"><input type="checkbox" id="autoNext" checked>连播</label>
<label class="chk"><input type="checkbox" id="skipDead">优先可用</label>
<button onclick="copyUrl()">复制当前地址</button>
</div>
<div class="now">正在播放:<b id="nowTxt">-</b></div>
</section>
<aside class="card">
<div class="list-head">
<h2>剧集列表</h2>
<button class="primary" id="btnAll" onclick="checkAll()">一键检测全部</button>
<button onclick="clearChecks()">清除结果</button>
</div>
<div class="list-head" style="border-bottom:none;padding-bottom:0">
<select id="filter" onchange="renderList()">
<option value="all">全部集数</option>
<option value="ok">仅可用</option>
<option value="dead">仅失效</option>
<option value="unknown">仅异常</option>
<option value="none">仅未检测</option>
</select>
<input type="text" id="kw" placeholder="搜索集数…" style="width:110px" oninput="renderList()">
</div>
<div class="stats">
<span><i class="dot d-none"></i>未检 <b id="stNone">32</b></span>
<span><i class="dot d-ok"></i>可用 <b id="stOk">0</b></span>
<span><i class="dot d-bad"></i>失效 <b id="stBad">0</b></span>
<span><i class="dot d-unk"></i>异常 <b id="stUnk">0</b></span>
</div>
<div class="eps" id="eps"></div>
</aside>
</div>
<details class="syn">
<summary>剧情介绍</summary>
<p>讲述了四灵仙尊李青月与大成尊者白九思相爱相杀,最终解开误会,共度劫难拯救苍生的绝美仙侠爱情故事。</p>
</details>
</div>
<div class="toast" id="toast"></div>
<script>
const EPISODES=[
"https://vvip.high26-playback.com/20250606/10233_edf959e1/index.m3u8",
"https://vvip.high26-playback.com/20250606/10234_8eb4b4c0/index.m3u8",
"https://vvip.high26-playback.com/20250606/10235_d87d3902/index.m3u8",
"https://cdn.yzzy27-play.com/20250606/5589_5291822d/index.m3u8",
"https://cdn.yzzy27-play.com/20250606/5590_b0490b85/index.m3u8",
"https://cdn.yzzy27-play.com/20250606/5591_217b4c71/index.m3u8",
"https://cdn.yzzy28-play.com/20250607/2758_7f141cf8/index.m3u8",
"https://cdn.yzzy28-play.com/20250607/2759_35c5a2cb/index.m3u8",
"https://cdn.yzzy27-play.com/20250609/5853_36769206/index.m3u8",
"https://cdn.yzzy27-play.com/20250609/5854_624ec1c8/index.m3u8",
"https://vvip.high26-playback.com/20250610/10601_1aa4de65/index.m3u8",
"https://vvip.high26-playback.com/20250610/10602_e92b755e/index.m3u8",
"https://cdn.yzzy28-play.com/20250610/3580_630b7d8d/index.m3u8",
"https://cdn.yzzy28-play.com/20250610/3581_67606d48/index.m3u8",
"https://cdn.yzzy28-play.com/20250611/3775_f2b93ce0/index.m3u8",
"https://cdn.yzzy28-play.com/20250611/3776_2119b8d4/index.m3u8",
"https://cdn.yzzy28-play.com/20250612/3953_b928fec5/index.m3u8",
"https://cdn.yzzy28-play.com/20250612/3954_6e2d5d50/index.m3u8",
"https://cdn.yzzy28-play.com/20250613/4027_ac4e7a4f/index.m3u8",
"https://cdn.yzzy28-play.com/20250613/4028_a09e75c5/index.m3u8",
"https://cdn.yzzy28-play.com/20250614/4179_91f5738a/index.m3u8",
"https://cdn.yzzy28-play.com/20250614/4180_96b250a9/index.m3u8",
"https://vvip.high26-playback.com/20250616/11013_99f6a934/index.m3u8",
"https://vvip.high26-playback.com/20250616/11012_b6358755/index.m3u8",
"https://cdn.yzzy28-play.com/20250617/4448_53e19f3d/index.m3u8",
"https://vvip.high26-playback.com/20250619/11428_7314d504/index.m3u8",
"https://cdn.yzzy28-play.com/20250619/5534_de6b1cf3/index.m3u8",
"https://cdn.yzzy28-play.com/20250620/5587_492114f6/index.m3u8",
"https://vvip.high26-playback.com/20250622/11864_3a901648/index.m3u8",
"https://cdn.yzzy27-play.com/20250622/7574_c2ae5cb2/index.m3u8",
"https://cdn.yzzy27-play.com/20250622/7573_68521755/index.m3u8",
"https://cdn.yzzy28-play.com/20250621/5697_cd3109c6/index.m3u8"
].map((url,i)=>({n:i+1,url}));
const LS_STATUS='ljx_status',LS_PROG='ljx_prog',LS_LAST='ljx_last';
let statuses={},progress={};
try{statuses=JSON.parse(localStorage.getItem(LS_STATUS))||{}}catch(e){}
try{progress=JSON.parse(localStorage.getItem(LS_PROG))||{}}catch(e){}
let cur=-1,hls=null,checking=false;
const $=id=>document.getElementById(id);
const video=$('video');
function toast(msg,ms=2200){const t=$('toast');t.textContent=msg;t.style.display='block';clearTimeout(t._tm);t._tm=setTimeout(()=>t.style.display='none',ms)}
function saveStatuses(){try{localStorage.setItem(LS_STATUS,JSON.stringify(statuses))}catch(e){}}
function saveProg(){try{localStorage.setItem(LS_PROG,JSON.stringify(progress))}catch(e){}}
function stOf(ep){return statuses[ep.url]&&statuses[ep.url].s||'none'}
function renderStats(){
let ok=0,bad=0,unk=0,none=0;
EPISODES.forEach(ep=>{const s=stOf(ep);if(s==='ok')ok++;else if(s==='dead')bad++;else if(s==='unknown')unk++;else none++});
$('stOk').textContent=ok;$('stBad').textContent=bad;$('stUnk').textContent=unk;$('stNone').textContent=none;
}
function renderList(){
const f=$('filter').value,kw=$('kw').value.trim();
const box=$('eps');box.innerHTML='';
EPISODES.forEach((ep,i)=>{
const s=stOf(ep);
if(f!=='all'&&f!==s)return;
if(kw&&!String(ep.n).includes(kw))return;
const cls=s==='ok'?'d-ok':s==='dead'?'d-bad':s==='unknown'?'d-unk':'d-none';
const label={ok:'可用',dead:'失效',unknown:'异常',none:'未检'}[s];
const p=Math.floor(progress[i]||0);
const el=document.createElement('div');
el.className='ep'+(i===cur?' active':'');
el.innerHTML=`<div class="t">第${String(ep.n).padStart(2,'0')}集</div>
<div class="s"><i class="dot ${cls}"></i>${label}</div>
${p>10?`<div class="prog"><i style="width:${Math.min(p/45*100,100)}%"></i></div>`:''}
<div class="acts">
<button title="重新检测" onclick="event.stopPropagation();checkOne(${i},true)">↻</button>
<button title="复制地址" onclick="event.stopPropagation();copyText('${ep.url}')">⧉</button>
</div>`;
el.onclick=()=>playIdx(i);
box.appendChild(el);
});
}
async function probe(url){
const target=url;
const ctrl=new AbortController();
const tm=setTimeout(()=>ctrl.abort(),12000);
try{
const res=await fetch(target,{signal:ctrl.signal,redirect:'follow'});
clearTimeout(tm);
if(!res.ok)return 'dead';
const txt=(await res.text()).slice(0,512);
return txt.includes('#EXTM3U')?'ok':'dead';
}catch(e){clearTimeout(tm);return 'unknown'}
}
async function checkOne(i,manual=false){
const ep=EPISODES[i];
statuses[ep.url]={s:'checking'};
renderList();renderStats();
const r=await probe(ep.url);
statuses[ep.url]={s:r,t:Date.now()};
saveStatuses();renderList();renderStats();
if(manual)toast(`第${ep.n}集检测结果:${{ok:'✅ 可用',dead:'❌ 已失效',unknown:'⚠️ 无法确认(可能跨域限制)'}[r]}`);
return r;
}
let stopFlag=false;
async function checkAll(){
if(checking){stopFlag=true;return}
checking=true;stopFlag=false;
$('btnAll').textContent='停止检测';
const queue=[...EPISODES.keys()];
let done=0;
const worker=async()=>{
while(queue.length&&!stopFlag){
const i=queue.shift();
await checkOne(i);
done++;
}
};
await Promise.all(Array.from({length:6},worker));
checking=false;$('btnAll').textContent='一键检测全部';
if(stopFlag)toast('已停止检测');
else{
let ok=0;EPISODES.forEach(e=>{if(stOf(e)==='ok')ok++});
toast(`检测完成:${ok}/${EPISODES.length} 集可用`);
}
}
function clearChecks(){statuses={};saveStatuses();renderList();renderStats();toast('已清除检测结果')}
function destroyHls(){if(hls){hls.destroy();hls=null}}
function playIdx(i){
if(i<0||i>=EPISODES.length)return;
cur=i;destroyHls();$('ovl').classList.remove('show');
const ep=EPISODES[i];
localStorage.setItem(LS_LAST,i);
const src=ep.url;
if(window.Hls&&Hls.isSupported()){
hls=new Hls({maxBufferLength:30,maxMaxBufferLength:60});
hls.loadSource(src);hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED,()=>{onCanStart()});
hls.on(Hls.Events.ERROR,(evt,data)=>{
if(data.fatal){
if(data.type===Hls.ErrorTypes.NETWORK_ERROR&&data.details==='manifestLoadError'){
statuses[ep.url]={s:'unknown',t:Date.now()};saveStatuses();renderList();renderStats();
showError('本集加载失败(网络或跨域限制),请稍后重试');
}else if(data.type===Hls.ErrorTypes.NETWORK_ERROR){hls.startLoad()}
else if(data.type===Hls.ErrorTypes.MEDIA_ERROR){hls.recoverMediaError()}
else{showError('播放出错:'+data.details)}
}
});
}else if(video.canPlayType('application/vnd.apple.mpegurl')){
video.src=src;onCanStart();
}else{showError('当前浏览器不支持HLS播放')}
function onCanStart(){
video.play().catch(()=>toast('浏览器阻止了自动播放,请点击播放按钮'));
const saved=progress[i];
if(saved&&saved>5){video.currentTime=saved;toast('已恢复上次进度')}
updateLabels();
}
function showError(msg){$('ovlMsg').textContent=`第${ep.n}集 · `+msg;$('ovl').classList.add('show')}
updateLabels();renderList();
}
function retryCur(){if(cur>=0)playIdx(cur)}
function updateLabels(){
if(cur<0)return;
const t=`第${String(EPISODES[cur].n).padStart(2,'0')}集`;
$('epLabel').textContent=t;$('nowTxt').textContent='临江仙 '+t;
}
function pickPlayable(from,dir){
let i=from;
while(i>=0&&i<EPISODES.length){
if(stOf(EPISODES[i])==='ok')return i;
i+=dir;
}
return from;
}
function copyText(txt){
if(navigator.clipboard&&window.isSecureContext!==false){
navigator.clipboard.writeText(txt).then(()=>toast('已复制')).catch(()=>fallback());
}else fallback();
function fallback(){
const ta=document.createElement('textarea');ta.value=txt;document.body.appendChild(ta);
ta.select();try{document.execCommand('copy');toast('已复制')}catch(e){toast('复制失败,请手动复制')}
document.body.removeChild(ta);
}
}
function copyUrl(){if(cur>=0)copyText(EPISODES[cur].url);else toast('请先选择一集')}
let lastSave=0;
video.addEventListener('timeupdate',()=>{
if(cur<0)return;
const now=Date.now();
if(now-lastSave>4000){lastSave=now;progress[cur]=Math.floor(video.currentTime);saveProg()}
});
video.addEventListener('ended',()=>{
delete progress[cur];saveProg();
if($('autoNext').checked&&cur+1<EPISODES.length){
let nx=cur+1;
if($('skipDead').checked)nx=pickPlayable(nx,1);
playIdx(nx);
}
});
document.addEventListener('keydown',e=>{
if(/INPUT|TEXTAREA|SELECT/.test(document.activeElement.tagName))return;
if(e.code==='Space'){e.preventDefault();video.paused?video.play():video.pause()}
else if(e.code==='ArrowRight')video.currentTime+=10;
else if(e.code==='ArrowLeft')video.currentTime-=10;
else if(e.key==='n'||e.key==='N')playIdx(cur+1);
else if(e.key==='p'||e.key==='P')playIdx(cur-1);
});
renderStats();renderList();
toast('3秒后自动播放第1集…');
setTimeout(()=>playIdx(0),3000);
</script>
</body>
</html>