े m/地址和 VIP 权限由站点接口实时验证。n>>><àompss="asecondary-button m class-detail/6a52349b54c89c6b9865ecb7"–返回详情en> aer> e en>n> divompss="aaccess-message"oid="playerLo ing">en>n>n> div>en>n>n> en>n> 正在验证े m/权限en>n> 验证完成后自动载入े m/器。n>n>>> e n>en>>> 上一 stn>en>>>当前े m/:ç2"> stn>en>>>下一 st n>en>en>n> pompss="adata-note">े m/记录、收藏和点赞仅写入当前൏览器;VIP 状态由服务器返回。n>n> n> ompss="alocal-action"en>n> otli"> button"en>n> odata-video-favoriteen>n> odata-video-id="6a52349b54c89c6b9865ecb7" > odata-video-=¢œOœ s> ¦amh-words’”资源全æånne¸es age/svg+x全æåR" > odata-video-posterp-linklP//sbzytpimg5.com:3519/upload/vod/ 403-1/1a8b6b3c35cb6c85be47b55fda3c5432.jpg" > odata-video-urlp--detail/6a52349b54c89c6b9865ecb7"– > oàœ¬机收藏n> n> button"odata-video-likeodata-video-id="6a52349b54c89c6b9865ecb7"– > oàœ¬机点赞n> n> button"odata-share-=¢œOœ s> ¦amh-words’”资源全æånne¸es age/svg+x全æåR"– > o分享 > n>n>n> े m/源与剧éstn> VaHso=·=52"> sten>n> en>n>n>n> ompss="asource-tab" > otli"> button" > orole="tab" > odata-source-index="0" aria-selected="true" aria-controls="playerSourcePanel0dden>n> > VaHso n> n>en>>>en>>>n> n> >>en>>>n> n> >> m class-play/6a52349b54c89c6b9865ecb7/0-0" odata-source-index="0" odata-play-index="0" mpss="aactive" aria-currend="pagedden>n> çlisefien>n> >>en>n> >>en>>>n>n>n> >>n><-detailsdee ee n> div>语言未知n>类型国产丝袜n>地区未知n>年份未知n> divompss="asection dden>n> 相关推荐同分类e¸es12继续൏览n> en> n>en> n> en>n> n> ào ेखdetail/6ae05e163237f1729dcda965"– > o > o > o > o 2026n> > n>>>>>>>情侣自拍漂亮s’”资> 美女吃鸡啪啪_大奶子粉鲍鱼_.紫薇假鸡吧插逼诱惑满满_被男友无套输出_çœ ¦¤¹鼻尖表情舒坦_内射n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6ae05e163237f1729dcda9aa"– > o > o > o > o 2026n> > n>>>>>>>轻熟女姐妹组合露脸激情4P伺候年轻小哥哥让小哥吃.奶子口交大鸡巴s’”资情趣互动抽插浪叫呻吟不止好刺激n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6ae05e163237f1729dcda9d2"– > o > o > o > o 2026n> > n>>>>>>>酒店偷拍20230312极品学妹s’”资诱惑俊男同性.相交非常辣眼n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6adf0bc48b95c908cc495226"– > o > o > o > o 2026n> > n>>>>>>>酒店摄像头学院风格s’”资美女和胖男友开房打炮_穿着.s’”资袜扛腿啪啪猛操_貌似内射t/2n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6adf0bc48b95c908cc495252"– > o > o > o > o 2026n> > n>>>>>>>酒店摄像头雪花透明蕾资情趣装小妹妹活好水多逼六九.互口口的淫水直流妹妹开始主动上位n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6adf0bc48b95c908cc49526a"– > o > o > o > o 2026n> > n>>>>>>>双飞小少妇1蹲下卖力口交深喉s’”资长腿女上位啪啪拍.摄角度好n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n>n>en> e > > n> >><àompss="abrand footpl brandn> ेख" aria-label="/–�—/us 首页dden>n> 18+n> n> /–�—/userbden>n> PREMIUM VIDEO DIRECTORYen>n> n> >en>n> 真实分类、频道、搜索、े m/与àœ¬机记录。n>n> > >n> e¸es12频道erbden>n> ào ेखchannel/china">中国频道en>n> ào ेखchannel/japan">日韩频道en>n> ào ेखchannel/western">欧美频道en>n> ào ेखchannel/anime">动漫频道en>n> >n> e�‘现e¸es1233bden>n> ào ेखranking">热播排行en>n> ào ेखsearch">e¸es12搜索en>n> ào ेखchannel/ethics">剧情伦理en>n> ào ेखchannel/alternative">另类专区en>n> >n> 用户服务33bden>n> buttonotli"> button"odata-open-historydे m/记录n> ào ेखuser/profile">我的收藏en>n> buttonotli"> button"odata-open-login>登录账号n> ào ेखterms">用户协议en>n> n>n> © 2026–�—/userspanden>n> ào ेखprivacy">隐私政策 · ào ेखcontact">联系我们n>n> ào ेख">首页排行搜索 button"odata-open-historyd记录n><ào ेखuser/profile">我的n>n>n> buttonompss="amodal-close mtli"> button"odata-close-modal="loginModal"earia-label="关闭登录窗口dd×n> 欢迎回来n> 登录账号n> 登录后可使用 VIP 权限、卡券和个人中心。n>n>n> 用户名n> username"pautocomplete="username"pminlength="3" maxlength="32" required>en>n> 密码n> password"ptli"> password"pautocomplete="currend-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="registerModal">没有账号?立即注册n> > n>n>n> buttonompss="amodal-close mtli"> button"odata-close-modal="registerModal"earia-label="关闭注册窗口dd×n> 创建账号n> 注册新用户n> 用户名支持字母、数字和下划线,密码长度为 6-72 位。n>n>n> 用户名n> username"pautocomplete="username"ppattern="[A-Za-z0-9_]{3,32}" required>en>n> 邮箱n> email"ptli"> email"pautocomplete="email"prequired>en>n> 密码n> password"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> 确认密码n> confirmPassword"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">注册并登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="loginModal">已有账号?返回登录n> > n> button" data-close-historyearia-label="关闭楇 m/记录">n>n>èa7b3seplden>n>èan> button" data-close-historyearia-label="返回上一 ¡µdden>n> en>n> 返回n> n> n>en>n> n> 楇 m/记录n> n> 仅保存在当前设备n>n> /divden>n> an> button"odata-close-historyearia-label="关闭楇 m/记录">en>n> n> en>n> n> aer> n>n> divompss="ahistory-overview">en>n> n>0en>n> 暂无最近े m/n> n> an> a en>n> 搜索楇 m/记录n> search"odata-history-search placeholder="搜索片名或剧ést"pautocomplete="offdden>n> n> divompss="ahistory-list ing">en>n> 观看列表n> 0 / 0en>n> n> an> n> a 最多保留 30 条àœ¬机记录n>n> buttonompss="ahistory-clear"o/li"> button" data-clear-historyden>n>n> 清空记录en>n>n> n> footplden>n> > e e e e a script srcp- ub"/usejs/hlsn-r5ijs"> script> (() => { const config = document.getElementById("playerConfig"); const stage = document.getElementById("playerStage"); const nextLink = document.getElementById("nextEpisode"); const pendingPlayerEvents = []; let hls = null; let player = null; let trackingTimer = 0; let trackingAttempts = 0; function flushPlayerEvents() { trackingTimer = 0; if (window.FlowTrack?.track) { while (pendingPlayerEvents.length) { const event = pendingPlayerEvents.shift(); window.FlowTrack.track(event.name, event.properties); } return; } trackingAttempts += 1; if (pendingPlayerEvents.length && trackingAttempts < 100) { trackingTimer = window.setTimeout(flushPlayerEvents, 50); } } function trackPlayer(name, properties = {}) { const event = { name, properties: { video_id: config.dataset.videoId, authenticated: Boolean(localStorage.getItem(aauth_token")), need_vip: Number(config.dataset.needVip || "0"), play_source: config.dataset.playSource, play_index: config.dataset.playIndex, ...properties } }; if (window.FlowTrack?.track) { window.FlowTrack.track(event.name, event.properties); return; } pendingPlayerEvents.push(event); if (!trackingTimer) trackingTimer = window.setTimeout(flushPlayerEvents, 0); } function durationBucket(seconds) { if (!Number.isFinite(seconds) || seconds <= 0) return "unknown"; if (seconds < 300) return "under_5m"; if (seconds < 1200) return "5m_20m"; if (seconds < 3600) return "20m_60m"; return "over_60m"; } function progressBucket(video) { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currendTime / duration) * 100)); if (percent < 25) return "0_25"; if (percent < 50) return "25_50"; if (percent < 75) return "50_75"; if (percent < 90) return "75_90"; return "90_100"; } function authH3sepls() { const token = localStorage.getItem(aauth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } function savePlayHistory(video) { const key = avideo_play_history"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT¢œOœ, episode: config.dataset.episodeName || "正片", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currendTime = Number(video?.currendTime); const duration = Number(video?.duration); if (Number.isFinite(currendTime) && currendTime >= 0) record.currendTime = currendTime; if (Number.isFinite(duration) && duration > 0) record.duration = duration; items = items.filter(item => item.id !== record.id); items.unshift(record); localStorage.setItem(key, JSON.stringify(items.slice(0, 30))); window.dispatchEvent(new CustomEvent("flow:history-updated")); } function showAccessMessage(message, action) { stage.replaceChildren(); const wrap = document.createElement("div"); wrap.mpss=Name = aaccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); 3seplmpss=Name = afa-solid fa-crown"; const =¢œOœ = document.createElement("h2"); =¢œOœ.textC list = "VIP 楇 m/权限"; const =ext = document.createElement("p"); =ext.textC list = message; box.append(icon, =¢œOœ, =ext); 3f (action) box.append(action); wrap.append(box); stage.append(wrap); } function bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_/li": mediaType, duration_bucket: durationBucket(Number(video.duration)), progress_bucket: progressBucket(video) }); video.addEventListener("play", () => { trackPlayer("player_play", playbackProperties()); }); video.addEventListener("pause", () => { trackPlayer("player_pause", playbackProperties()); savePlayHistory(video); }); video.addEventListener("seeking", () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currendTime = Number(video.currendTime); trackPlayer("player_seek", { ...playbackProperties(), direction: currendTime < seekOrigin ? "previous" : "next" }); if (Number.isFinite(currendTime)) lastPlaybackTime = currendTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) return; const percent = (currendTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone)) –àinue; milestones.add(milestone); trackPlayer("player_milestone", { media_/li": mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currendTime; }); video.addEventListener("ended", () => { trackPlayer("player_complete", playbackProperties()); savePlayHistory(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_/li": mediaType, error_/li": "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: trueen>n> }); }); } async function startPlayback(video) { video.muted = false; try {
验证完成后自动载入े m/器。n>n>>> e n>en>>> 上一 stn>en>>>当前े m/:ç2"> stn>en>>>下一 st n>en>en>n> pompss="adata-note">े m/记录、收藏和点赞仅写入当前൏览器;VIP 状态由服务器返回。n>n> n> ompss="alocal-action"en>n> otli"> button"en>n> odata-video-favoriteen>n> odata-video-id="6a52349b54c89c6b9865ecb7" > odata-video-=¢œOœ s> ¦amh-words’”资源全æånne¸es age/svg+x全æåR" > odata-video-posterp-linklP//sbzytpimg5.com:3519/upload/vod/ 403-1/1a8b6b3c35cb6c85be47b55fda3c5432.jpg" > odata-video-urlp--detail/6a52349b54c89c6b9865ecb7"– > oàœ¬机收藏n> n> button"odata-video-likeodata-video-id="6a52349b54c89c6b9865ecb7"– > oàœ¬机点赞n> n> button"odata-share-=¢œOœ s> ¦amh-words’”资源全æånne¸es age/svg+x全æåR"– > o分享 > n>n>n> े m/源与剧éstn> VaHso=·=52"> sten>n> en>n>n>n> ompss="asource-tab" > otli"> button" > orole="tab" > odata-source-index="0" aria-selected="true" aria-controls="playerSourcePanel0dden>n> > VaHso n> n>en>>>en>>>n> n> >>en>>>n> n> >> m class-play/6a52349b54c89c6b9865ecb7/0-0" odata-source-index="0" odata-play-index="0" mpss="aactive" aria-currend="pagedden>n> çlisefien>n> >>en>n> >>en>>>n>n>n> >>n><-detailsdee ee n> div>语言未知n>类型国产丝袜n>地区未知n>年份未知n> divompss="asection dden>n> 相关推荐同分类e¸es12继续൏览n> en> n>en> n> en>n> n> ào ेखdetail/6ae05e163237f1729dcda965"– > o > o > o > o 2026n> > n>>>>>>>情侣自拍漂亮s’”资> 美女吃鸡啪啪_大奶子粉鲍鱼_.紫薇假鸡吧插逼诱惑满满_被男友无套输出_çœ ¦¤¹鼻尖表情舒坦_内射n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6ae05e163237f1729dcda9aa"– > o > o > o > o 2026n> > n>>>>>>>轻熟女姐妹组合露脸激情4P伺候年轻小哥哥让小哥吃.奶子口交大鸡巴s’”资情趣互动抽插浪叫呻吟不止好刺激n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6ae05e163237f1729dcda9d2"– > o > o > o > o 2026n> > n>>>>>>>酒店偷拍20230312极品学妹s’”资诱惑俊男同性.相交非常辣眼n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6adf0bc48b95c908cc495226"– > o > o > o > o 2026n> > n>>>>>>>酒店摄像头学院风格s’”资美女和胖男友开房打炮_穿着.s’”资袜扛腿啪啪猛操_貌似内射t/2n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6adf0bc48b95c908cc495252"– > o > o > o > o 2026n> > n>>>>>>>酒店摄像头雪花透明蕾资情趣装小妹妹活好水多逼六九.互口口的淫水直流妹妹开始主动上位n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n> n> ào ेखdetail/6adf0bc48b95c908cc49526a"– > o > o > o > o 2026n> > n>>>>>>>双飞小少妇1蹲下卖力口交深喉s’”资长腿女上位啪啪拍.摄角度好n>>>>>>> > o 国产丝袜en>n> àŒ�续更新n> > n>>>>>en>n> en>n> en>n>n>en> e > > n> >><àompss="abrand footpl brandn> ेख" aria-label="/–�—/us 首页dden>n> 18+n> n> /–�—/userbden>n> PREMIUM VIDEO DIRECTORYen>n> n> >en>n> 真实分类、频道、搜索、े m/与àœ¬机记录。n>n> > >n> e¸es12频道erbden>n> ào ेखchannel/china">中国频道en>n> ào ेखchannel/japan">日韩频道en>n> ào ेखchannel/western">欧美频道en>n> ào ेखchannel/anime">动漫频道en>n> >n> e�‘现e¸es1233bden>n> ào ेखranking">热播排行en>n> ào ेखsearch">e¸es12搜索en>n> ào ेखchannel/ethics">剧情伦理en>n> ào ेखchannel/alternative">另类专区en>n> >n> 用户服务33bden>n> buttonotli"> button"odata-open-historydे m/记录n> ào ेखuser/profile">我的收藏en>n> buttonotli"> button"odata-open-login>登录账号n> ào ेखterms">用户协议en>n> n>n> © 2026–�—/userspanden>n> ào ेखprivacy">隐私政策 · ào ेखcontact">联系我们n>n> ào ेख">首页排行搜索 button"odata-open-historyd记录n><ào ेखuser/profile">我的n>n>n> buttonompss="amodal-close mtli"> button"odata-close-modal="loginModal"earia-label="关闭登录窗口dd×n> 欢迎回来n> 登录账号n> 登录后可使用 VIP 权限、卡券和个人中心。n>n>n> 用户名n> username"pautocomplete="username"pminlength="3" maxlength="32" required>en>n> 密码n> password"ptli"> password"pautocomplete="currend-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="registerModal">没有账号?立即注册n> > n>n>n> buttonompss="amodal-close mtli"> button"odata-close-modal="registerModal"earia-label="关闭注册窗口dd×n> 创建账号n> 注册新用户n> 用户名支持字母、数字和下划线,密码长度为 6-72 位。n>n>n> 用户名n> username"pautocomplete="username"ppattern="[A-Za-z0-9_]{3,32}" required>en>n> 邮箱n> email"ptli"> email"pautocomplete="email"prequired>en>n> 密码n> password"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> 确认密码n> confirmPassword"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">注册并登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="loginModal">已有账号?返回登录n> > n> button" data-close-historyearia-label="关闭楇 m/记录">n>n>èa7b3seplden>n>èan> button" data-close-historyearia-label="返回上一 ¡µdden>n> en>n> 返回n> n> n>en>n> n> 楇 m/记录n> n> 仅保存在当前设备n>n> /divden>n> an> button"odata-close-historyearia-label="关闭楇 m/记录">en>n> n> en>n> n> aer> n>n> divompss="ahistory-overview">en>n> n>0en>n> 暂无最近े m/n> n> an> a en>n> 搜索楇 m/记录n> search"odata-history-search placeholder="搜索片名或剧ést"pautocomplete="offdden>n> n> divompss="ahistory-list ing">en>n> 观看列表n> 0 / 0en>n> n> an> n> a 最多保留 30 条àœ¬机记录n>n> buttonompss="ahistory-clear"o/li"> button" data-clear-historyden>n>n> 清空记录en>n>n> n> footplden>n> > e e e e a script srcp- ub"/usejs/hlsn-r5ijs"> script> (() => { const config = document.getElementById("playerConfig"); const stage = document.getElementById("playerStage"); const nextLink = document.getElementById("nextEpisode"); const pendingPlayerEvents = []; let hls = null; let player = null; let trackingTimer = 0; let trackingAttempts = 0; function flushPlayerEvents() { trackingTimer = 0; if (window.FlowTrack?.track) { while (pendingPlayerEvents.length) { const event = pendingPlayerEvents.shift(); window.FlowTrack.track(event.name, event.properties); } return; } trackingAttempts += 1; if (pendingPlayerEvents.length && trackingAttempts < 100) { trackingTimer = window.setTimeout(flushPlayerEvents, 50); } } function trackPlayer(name, properties = {}) { const event = { name, properties: { video_id: config.dataset.videoId, authenticated: Boolean(localStorage.getItem(aauth_token")), need_vip: Number(config.dataset.needVip || "0"), play_source: config.dataset.playSource, play_index: config.dataset.playIndex, ...properties } }; if (window.FlowTrack?.track) { window.FlowTrack.track(event.name, event.properties); return; } pendingPlayerEvents.push(event); if (!trackingTimer) trackingTimer = window.setTimeout(flushPlayerEvents, 0); } function durationBucket(seconds) { if (!Number.isFinite(seconds) || seconds <= 0) return "unknown"; if (seconds < 300) return "under_5m"; if (seconds < 1200) return "5m_20m"; if (seconds < 3600) return "20m_60m"; return "over_60m"; } function progressBucket(video) { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currendTime / duration) * 100)); if (percent < 25) return "0_25"; if (percent < 50) return "25_50"; if (percent < 75) return "50_75"; if (percent < 90) return "75_90"; return "90_100"; } function authH3sepls() { const token = localStorage.getItem(aauth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } function savePlayHistory(video) { const key = avideo_play_history"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT¢œOœ, episode: config.dataset.episodeName || "正片", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currendTime = Number(video?.currendTime); const duration = Number(video?.duration); if (Number.isFinite(currendTime) && currendTime >= 0) record.currendTime = currendTime; if (Number.isFinite(duration) && duration > 0) record.duration = duration; items = items.filter(item => item.id !== record.id); items.unshift(record); localStorage.setItem(key, JSON.stringify(items.slice(0, 30))); window.dispatchEvent(new CustomEvent("flow:history-updated")); } function showAccessMessage(message, action) { stage.replaceChildren(); const wrap = document.createElement("div"); wrap.mpss=Name = aaccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); 3seplmpss=Name = afa-solid fa-crown"; const =¢œOœ = document.createElement("h2"); =¢œOœ.textC list = "VIP 楇 m/权限"; const =ext = document.createElement("p"); =ext.textC list = message; box.append(icon, =¢œOœ, =ext); 3f (action) box.append(action); wrap.append(box); stage.append(wrap); } function bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_/li": mediaType, duration_bucket: durationBucket(Number(video.duration)), progress_bucket: progressBucket(video) }); video.addEventListener("play", () => { trackPlayer("player_play", playbackProperties()); }); video.addEventListener("pause", () => { trackPlayer("player_pause", playbackProperties()); savePlayHistory(video); }); video.addEventListener("seeking", () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currendTime = Number(video.currendTime); trackPlayer("player_seek", { ...playbackProperties(), direction: currendTime < seekOrigin ? "previous" : "next" }); if (Number.isFinite(currendTime)) lastPlaybackTime = currendTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) return; const percent = (currendTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone)) –àinue; milestones.add(milestone); trackPlayer("player_milestone", { media_/li": mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currendTime; }); video.addEventListener("ended", () => { trackPlayer("player_complete", playbackProperties()); savePlayHistory(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_/li": mediaType, error_/li": "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: trueen>n> }); }); } async function startPlayback(video) { video.muted = false; try {
同分类e¸es12继续൏览
真实分类、频道、搜索、े m/与àœ¬机记录。n>n> > >n> e¸es12频道erbden>n> ào ेखchannel/china">中国频道en>n> ào ेखchannel/japan">日韩频道en>n> ào ेखchannel/western">欧美频道en>n> ào ेखchannel/anime">动漫频道en>n> >n> e�‘现e¸es1233bden>n> ào ेखranking">热播排行en>n> ào ेखsearch">e¸es12搜索en>n> ào ेखchannel/ethics">剧情伦理en>n> ào ेखchannel/alternative">另类专区en>n> >n> 用户服务33bden>n> buttonotli"> button"odata-open-historydे m/记录n> ào ेखuser/profile">我的收藏en>n> buttonotli"> button"odata-open-login>登录账号n> ào ेखterms">用户协议en>n> n>n> © 2026–�—/userspanden>n> ào ेखprivacy">隐私政策 · ào ेखcontact">联系我们n>n> ào ेख">首页排行搜索 button"odata-open-historyd记录n><ào ेखuser/profile">我的n>n>n> buttonompss="amodal-close mtli"> button"odata-close-modal="loginModal"earia-label="关闭登录窗口dd×n> 欢迎回来n> 登录账号n> 登录后可使用 VIP 权限、卡券和个人中心。n>n>n> 用户名n> username"pautocomplete="username"pminlength="3" maxlength="32" required>en>n> 密码n> password"ptli"> password"pautocomplete="currend-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="registerModal">没有账号?立即注册n> > n>n>n> buttonompss="amodal-close mtli"> button"odata-close-modal="registerModal"earia-label="关闭注册窗口dd×n> 创建账号n> 注册新用户n> 用户名支持字母、数字和下划线,密码长度为 6-72 位。n>n>n> 用户名n> username"pautocomplete="username"ppattern="[A-Za-z0-9_]{3,32}" required>en>n> 邮箱n> email"ptli"> email"pautocomplete="email"prequired>en>n> 密码n> password"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> 确认密码n> confirmPassword"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">注册并登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="loginModal">已有账号?返回登录n> > n> button" data-close-historyearia-label="关闭楇 m/记录">n>n>èa7b3seplden>n>èan> button" data-close-historyearia-label="返回上一 ¡µdden>n> en>n> 返回n> n> n>en>n> n> 楇 m/记录n> n> 仅保存在当前设备n>n> /divden>n> an> button"odata-close-historyearia-label="关闭楇 m/记录">en>n> n> en>n> n> aer> n>n> divompss="ahistory-overview">en>n> n>0en>n> 暂无最近े m/n> n> an> a en>n> 搜索楇 m/记录n> search"odata-history-search placeholder="搜索片名或剧ést"pautocomplete="offdden>n> n> divompss="ahistory-list ing">en>n> 观看列表n> 0 / 0en>n> n> an> n> a 最多保留 30 条àœ¬机记录n>n> buttonompss="ahistory-clear"o/li"> button" data-clear-historyden>n>n> 清空记录en>n>n> n> footplden>n> > e e e e a script srcp- ub"/usejs/hlsn-r5ijs"> script> (() => { const config = document.getElementById("playerConfig"); const stage = document.getElementById("playerStage"); const nextLink = document.getElementById("nextEpisode"); const pendingPlayerEvents = []; let hls = null; let player = null; let trackingTimer = 0; let trackingAttempts = 0; function flushPlayerEvents() { trackingTimer = 0; if (window.FlowTrack?.track) { while (pendingPlayerEvents.length) { const event = pendingPlayerEvents.shift(); window.FlowTrack.track(event.name, event.properties); } return; } trackingAttempts += 1; if (pendingPlayerEvents.length && trackingAttempts < 100) { trackingTimer = window.setTimeout(flushPlayerEvents, 50); } } function trackPlayer(name, properties = {}) { const event = { name, properties: { video_id: config.dataset.videoId, authenticated: Boolean(localStorage.getItem(aauth_token")), need_vip: Number(config.dataset.needVip || "0"), play_source: config.dataset.playSource, play_index: config.dataset.playIndex, ...properties } }; if (window.FlowTrack?.track) { window.FlowTrack.track(event.name, event.properties); return; } pendingPlayerEvents.push(event); if (!trackingTimer) trackingTimer = window.setTimeout(flushPlayerEvents, 0); } function durationBucket(seconds) { if (!Number.isFinite(seconds) || seconds <= 0) return "unknown"; if (seconds < 300) return "under_5m"; if (seconds < 1200) return "5m_20m"; if (seconds < 3600) return "20m_60m"; return "over_60m"; } function progressBucket(video) { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currendTime / duration) * 100)); if (percent < 25) return "0_25"; if (percent < 50) return "25_50"; if (percent < 75) return "50_75"; if (percent < 90) return "75_90"; return "90_100"; } function authH3sepls() { const token = localStorage.getItem(aauth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } function savePlayHistory(video) { const key = avideo_play_history"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT¢œOœ, episode: config.dataset.episodeName || "正片", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currendTime = Number(video?.currendTime); const duration = Number(video?.duration); if (Number.isFinite(currendTime) && currendTime >= 0) record.currendTime = currendTime; if (Number.isFinite(duration) && duration > 0) record.duration = duration; items = items.filter(item => item.id !== record.id); items.unshift(record); localStorage.setItem(key, JSON.stringify(items.slice(0, 30))); window.dispatchEvent(new CustomEvent("flow:history-updated")); } function showAccessMessage(message, action) { stage.replaceChildren(); const wrap = document.createElement("div"); wrap.mpss=Name = aaccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); 3seplmpss=Name = afa-solid fa-crown"; const =¢œOœ = document.createElement("h2"); =¢œOœ.textC list = "VIP 楇 m/权限"; const =ext = document.createElement("p"); =ext.textC list = message; box.append(icon, =¢œOœ, =ext); 3f (action) box.append(action); wrap.append(box); stage.append(wrap); } function bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_/li": mediaType, duration_bucket: durationBucket(Number(video.duration)), progress_bucket: progressBucket(video) }); video.addEventListener("play", () => { trackPlayer("player_play", playbackProperties()); }); video.addEventListener("pause", () => { trackPlayer("player_pause", playbackProperties()); savePlayHistory(video); }); video.addEventListener("seeking", () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currendTime = Number(video.currendTime); trackPlayer("player_seek", { ...playbackProperties(), direction: currendTime < seekOrigin ? "previous" : "next" }); if (Number.isFinite(currendTime)) lastPlaybackTime = currendTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) return; const percent = (currendTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone)) –àinue; milestones.add(milestone); trackPlayer("player_milestone", { media_/li": mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currendTime; }); video.addEventListener("ended", () => { trackPlayer("player_complete", playbackProperties()); savePlayHistory(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_/li": mediaType, error_/li": "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: trueen>n> }); }); } async function startPlayback(video) { video.muted = false; try {
登录后可使用 VIP 权限、卡券和个人中心。n>n>n> 用户名n> username"pautocomplete="username"pminlength="3" maxlength="32" required>en>n> 密码n> password"ptli"> password"pautocomplete="currend-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="registerModal">没有账号?立即注册n> > n>n>n> buttonompss="amodal-close mtli"> button"odata-close-modal="registerModal"earia-label="关闭注册窗口dd×n> 创建账号n> 注册新用户n> 用户名支持字母、数字和下划线,密码长度为 6-72 位。n>n>n> 用户名n> username"pautocomplete="username"ppattern="[A-Za-z0-9_]{3,32}" required>en>n> 邮箱n> email"ptli"> email"pautocomplete="email"prequired>en>n> 密码n> password"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> 确认密码n> confirmPassword"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">注册并登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="loginModal">已有账号?返回登录n> > n> button" data-close-historyearia-label="关闭楇 m/记录">n>n>èa7b3seplden>n>èan> button" data-close-historyearia-label="返回上一 ¡µdden>n> en>n> 返回n> n> n>en>n> n> 楇 m/记录n> n> 仅保存在当前设备n>n> /divden>n> an> button"odata-close-historyearia-label="关闭楇 m/记录">en>n> n> en>n> n> aer> n>n> divompss="ahistory-overview">en>n> n>0en>n> 暂无最近े m/n> n> an> a en>n> 搜索楇 m/记录n> search"odata-history-search placeholder="搜索片名或剧ést"pautocomplete="offdden>n> n> divompss="ahistory-list ing">en>n> 观看列表n> 0 / 0en>n> n> an> n> a 最多保留 30 条àœ¬机记录n>n> buttonompss="ahistory-clear"o/li"> button" data-clear-historyden>n>n> 清空记录en>n>n> n> footplden>n> > e e e e a script srcp- ub"/usejs/hlsn-r5ijs"> script> (() => { const config = document.getElementById("playerConfig"); const stage = document.getElementById("playerStage"); const nextLink = document.getElementById("nextEpisode"); const pendingPlayerEvents = []; let hls = null; let player = null; let trackingTimer = 0; let trackingAttempts = 0; function flushPlayerEvents() { trackingTimer = 0; if (window.FlowTrack?.track) { while (pendingPlayerEvents.length) { const event = pendingPlayerEvents.shift(); window.FlowTrack.track(event.name, event.properties); } return; } trackingAttempts += 1; if (pendingPlayerEvents.length && trackingAttempts < 100) { trackingTimer = window.setTimeout(flushPlayerEvents, 50); } } function trackPlayer(name, properties = {}) { const event = { name, properties: { video_id: config.dataset.videoId, authenticated: Boolean(localStorage.getItem(aauth_token")), need_vip: Number(config.dataset.needVip || "0"), play_source: config.dataset.playSource, play_index: config.dataset.playIndex, ...properties } }; if (window.FlowTrack?.track) { window.FlowTrack.track(event.name, event.properties); return; } pendingPlayerEvents.push(event); if (!trackingTimer) trackingTimer = window.setTimeout(flushPlayerEvents, 0); } function durationBucket(seconds) { if (!Number.isFinite(seconds) || seconds <= 0) return "unknown"; if (seconds < 300) return "under_5m"; if (seconds < 1200) return "5m_20m"; if (seconds < 3600) return "20m_60m"; return "over_60m"; } function progressBucket(video) { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currendTime / duration) * 100)); if (percent < 25) return "0_25"; if (percent < 50) return "25_50"; if (percent < 75) return "50_75"; if (percent < 90) return "75_90"; return "90_100"; } function authH3sepls() { const token = localStorage.getItem(aauth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } function savePlayHistory(video) { const key = avideo_play_history"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT¢œOœ, episode: config.dataset.episodeName || "正片", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currendTime = Number(video?.currendTime); const duration = Number(video?.duration); if (Number.isFinite(currendTime) && currendTime >= 0) record.currendTime = currendTime; if (Number.isFinite(duration) && duration > 0) record.duration = duration; items = items.filter(item => item.id !== record.id); items.unshift(record); localStorage.setItem(key, JSON.stringify(items.slice(0, 30))); window.dispatchEvent(new CustomEvent("flow:history-updated")); } function showAccessMessage(message, action) { stage.replaceChildren(); const wrap = document.createElement("div"); wrap.mpss=Name = aaccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); 3seplmpss=Name = afa-solid fa-crown"; const =¢œOœ = document.createElement("h2"); =¢œOœ.textC list = "VIP 楇 m/权限"; const =ext = document.createElement("p"); =ext.textC list = message; box.append(icon, =¢œOœ, =ext); 3f (action) box.append(action); wrap.append(box); stage.append(wrap); } function bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_/li": mediaType, duration_bucket: durationBucket(Number(video.duration)), progress_bucket: progressBucket(video) }); video.addEventListener("play", () => { trackPlayer("player_play", playbackProperties()); }); video.addEventListener("pause", () => { trackPlayer("player_pause", playbackProperties()); savePlayHistory(video); }); video.addEventListener("seeking", () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currendTime = Number(video.currendTime); trackPlayer("player_seek", { ...playbackProperties(), direction: currendTime < seekOrigin ? "previous" : "next" }); if (Number.isFinite(currendTime)) lastPlaybackTime = currendTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) return; const percent = (currendTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone)) –àinue; milestones.add(milestone); trackPlayer("player_milestone", { media_/li": mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currendTime; }); video.addEventListener("ended", () => { trackPlayer("player_complete", playbackProperties()); savePlayHistory(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_/li": mediaType, error_/li": "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: trueen>n> }); }); } async function startPlayback(video) { video.muted = false; try {
用户名支持字母、数字和下划线,密码长度为 6-72 位。n>n>n> 用户名n> username"pautocomplete="username"ppattern="[A-Za-z0-9_]{3,32}" required>en>n> 邮箱n> email"ptli"> email"pautocomplete="email"prequired>en>n> 密码n> password"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> 确认密码n> confirmPassword"ptli"> password"pautocomplete="new-password"pminlength="6" maxlength="72" required>en>n> n>n> buttonompss="aprimary-button mtli"> submit">注册并登录n> n> buttonompss="atext-button m/li"> button" data-switch-modal="loginModal">已有账号?返回登录n> > n> button" data-close-historyearia-label="关闭楇 m/记录">n>n>èa7b3seplden>n>èan> button" data-close-historyearia-label="返回上一 ¡µdden>n> en>n> 返回n> n> n>en>n> n> 楇 m/记录n> n> 仅保存在当前设备n>n> /divden>n> an> button"odata-close-historyearia-label="关闭楇 m/记录">en>n> n> en>n> n> aer> n>n> divompss="ahistory-overview">en>n> n>0en>n> 暂无最近े m/n> n> an> a en>n> 搜索楇 m/记录n> search"odata-history-search placeholder="搜索片名或剧ést"pautocomplete="offdden>n> n> divompss="ahistory-list ing">en>n> 观看列表n> 0 / 0en>n> n> an> n> a 最多保留 30 条àœ¬机记录n>n> buttonompss="ahistory-clear"o/li"> button" data-clear-historyden>n>n> 清空记录en>n>n> n> footplden>n> > e e e e a script srcp- ub"/usejs/hlsn-r5ijs"> script> (() => { const config = document.getElementById("playerConfig"); const stage = document.getElementById("playerStage"); const nextLink = document.getElementById("nextEpisode"); const pendingPlayerEvents = []; let hls = null; let player = null; let trackingTimer = 0; let trackingAttempts = 0; function flushPlayerEvents() { trackingTimer = 0; if (window.FlowTrack?.track) { while (pendingPlayerEvents.length) { const event = pendingPlayerEvents.shift(); window.FlowTrack.track(event.name, event.properties); } return; } trackingAttempts += 1; if (pendingPlayerEvents.length && trackingAttempts < 100) { trackingTimer = window.setTimeout(flushPlayerEvents, 50); } } function trackPlayer(name, properties = {}) { const event = { name, properties: { video_id: config.dataset.videoId, authenticated: Boolean(localStorage.getItem(aauth_token")), need_vip: Number(config.dataset.needVip || "0"), play_source: config.dataset.playSource, play_index: config.dataset.playIndex, ...properties } }; if (window.FlowTrack?.track) { window.FlowTrack.track(event.name, event.properties); return; } pendingPlayerEvents.push(event); if (!trackingTimer) trackingTimer = window.setTimeout(flushPlayerEvents, 0); } function durationBucket(seconds) { if (!Number.isFinite(seconds) || seconds <= 0) return "unknown"; if (seconds < 300) return "under_5m"; if (seconds < 1200) return "5m_20m"; if (seconds < 3600) return "20m_60m"; return "over_60m"; } function progressBucket(video) { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currendTime / duration) * 100)); if (percent < 25) return "0_25"; if (percent < 50) return "25_50"; if (percent < 75) return "50_75"; if (percent < 90) return "75_90"; return "90_100"; } function authH3sepls() { const token = localStorage.getItem(aauth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } function savePlayHistory(video) { const key = avideo_play_history"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT¢œOœ, episode: config.dataset.episodeName || "正片", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currendTime = Number(video?.currendTime); const duration = Number(video?.duration); if (Number.isFinite(currendTime) && currendTime >= 0) record.currendTime = currendTime; if (Number.isFinite(duration) && duration > 0) record.duration = duration; items = items.filter(item => item.id !== record.id); items.unshift(record); localStorage.setItem(key, JSON.stringify(items.slice(0, 30))); window.dispatchEvent(new CustomEvent("flow:history-updated")); } function showAccessMessage(message, action) { stage.replaceChildren(); const wrap = document.createElement("div"); wrap.mpss=Name = aaccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); 3seplmpss=Name = afa-solid fa-crown"; const =¢œOœ = document.createElement("h2"); =¢œOœ.textC list = "VIP 楇 m/权限"; const =ext = document.createElement("p"); =ext.textC list = message; box.append(icon, =¢œOœ, =ext); 3f (action) box.append(action); wrap.append(box); stage.append(wrap); } function bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_/li": mediaType, duration_bucket: durationBucket(Number(video.duration)), progress_bucket: progressBucket(video) }); video.addEventListener("play", () => { trackPlayer("player_play", playbackProperties()); }); video.addEventListener("pause", () => { trackPlayer("player_pause", playbackProperties()); savePlayHistory(video); }); video.addEventListener("seeking", () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currendTime = Number(video.currendTime); trackPlayer("player_seek", { ...playbackProperties(), direction: currendTime < seekOrigin ? "previous" : "next" }); if (Number.isFinite(currendTime)) lastPlaybackTime = currendTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) return; const percent = (currendTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone)) –àinue; milestones.add(milestone); trackPlayer("player_milestone", { media_/li": mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currendTime; }); video.addEventListener("ended", () => { trackPlayer("player_complete", playbackProperties()); savePlayHistory(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_/li": mediaType, error_/li": "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: trueen>n> }); }); } async function startPlayback(video) { video.muted = false; try {
仅保存在当前设备n>n> /divden>n> an> button"odata-close-historyearia-label="关闭楇 m/记录">en>n> n> en>n> n> aer> n>n> divompss="ahistory-overview">en>n> n>0en>n> 暂无最近े m/n> n> an> a en>n> 搜索楇 m/记录n> search"odata-history-search placeholder="搜索片名或剧ést"pautocomplete="offdden>n> n> divompss="ahistory-list ing">en>n> 观看列表n> 0 / 0en>n> n> an> n> a 最多保留 30 条àœ¬机记录n>n> buttonompss="ahistory-clear"o/li"> button" data-clear-historyden>n>n> 清空记录en>n>n> n> footplden>n> > e e e e a script srcp- ub"/usejs/hlsn-r5ijs"> script> (() => { const config = document.getElementById("playerConfig"); const stage = document.getElementById("playerStage"); const nextLink = document.getElementById("nextEpisode"); const pendingPlayerEvents = []; let hls = null; let player = null; let trackingTimer = 0; let trackingAttempts = 0; function flushPlayerEvents() { trackingTimer = 0; if (window.FlowTrack?.track) { while (pendingPlayerEvents.length) { const event = pendingPlayerEvents.shift(); window.FlowTrack.track(event.name, event.properties); } return; } trackingAttempts += 1; if (pendingPlayerEvents.length && trackingAttempts < 100) { trackingTimer = window.setTimeout(flushPlayerEvents, 50); } } function trackPlayer(name, properties = {}) { const event = { name, properties: { video_id: config.dataset.videoId, authenticated: Boolean(localStorage.getItem(aauth_token")), need_vip: Number(config.dataset.needVip || "0"), play_source: config.dataset.playSource, play_index: config.dataset.playIndex, ...properties } }; if (window.FlowTrack?.track) { window.FlowTrack.track(event.name, event.properties); return; } pendingPlayerEvents.push(event); if (!trackingTimer) trackingTimer = window.setTimeout(flushPlayerEvents, 0); } function durationBucket(seconds) { if (!Number.isFinite(seconds) || seconds <= 0) return "unknown"; if (seconds < 300) return "under_5m"; if (seconds < 1200) return "5m_20m"; if (seconds < 3600) return "20m_60m"; return "over_60m"; } function progressBucket(video) { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currendTime / duration) * 100)); if (percent < 25) return "0_25"; if (percent < 50) return "25_50"; if (percent < 75) return "50_75"; if (percent < 90) return "75_90"; return "90_100"; } function authH3sepls() { const token = localStorage.getItem(aauth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } function savePlayHistory(video) { const key = avideo_play_history"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT¢œOœ, episode: config.dataset.episodeName || "正片", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currendTime = Number(video?.currendTime); const duration = Number(video?.duration); if (Number.isFinite(currendTime) && currendTime >= 0) record.currendTime = currendTime; if (Number.isFinite(duration) && duration > 0) record.duration = duration; items = items.filter(item => item.id !== record.id); items.unshift(record); localStorage.setItem(key, JSON.stringify(items.slice(0, 30))); window.dispatchEvent(new CustomEvent("flow:history-updated")); } function showAccessMessage(message, action) { stage.replaceChildren(); const wrap = document.createElement("div"); wrap.mpss=Name = aaccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); 3seplmpss=Name = afa-solid fa-crown"; const =¢œOœ = document.createElement("h2"); =¢œOœ.textC list = "VIP 楇 m/权限"; const =ext = document.createElement("p"); =ext.textC list = message; box.append(icon, =¢œOœ, =ext); 3f (action) box.append(action); wrap.append(box); stage.append(wrap); } function bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_/li": mediaType, duration_bucket: durationBucket(Number(video.duration)), progress_bucket: progressBucket(video) }); video.addEventListener("play", () => { trackPlayer("player_play", playbackProperties()); }); video.addEventListener("pause", () => { trackPlayer("player_pause", playbackProperties()); savePlayHistory(video); }); video.addEventListener("seeking", () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currendTime = Number(video.currendTime); trackPlayer("player_seek", { ...playbackProperties(), direction: currendTime < seekOrigin ? "previous" : "next" }); if (Number.isFinite(currendTime)) lastPlaybackTime = currendTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) return; const percent = (currendTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone)) –àinue; milestones.add(milestone); trackPlayer("player_milestone", { media_/li": mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currendTime; }); video.addEventListener("ended", () => { trackPlayer("player_complete", playbackProperties()); savePlayHistory(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_/li": mediaType, error_/li": "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: trueen>n> }); }); } async function startPlayback(video) { video.muted = false; try {
最多保留 30 条àœ¬机记录n>n> buttonompss="ahistory-clear"o/li"> button" data-clear-historyden>n>n> 清空记录en>n>n> n> footplden>n> > e e e e a script srcp- ub"/usejs/hlsn-r5ijs"> script> (() => { const config = document.getElementById("playerConfig"); const stage = document.getElementById("playerStage"); const nextLink = document.getElementById("nextEpisode"); const pendingPlayerEvents = []; let hls = null; let player = null; let trackingTimer = 0; let trackingAttempts = 0; function flushPlayerEvents() { trackingTimer = 0; if (window.FlowTrack?.track) { while (pendingPlayerEvents.length) { const event = pendingPlayerEvents.shift(); window.FlowTrack.track(event.name, event.properties); } return; } trackingAttempts += 1; if (pendingPlayerEvents.length && trackingAttempts < 100) { trackingTimer = window.setTimeout(flushPlayerEvents, 50); } } function trackPlayer(name, properties = {}) { const event = { name, properties: { video_id: config.dataset.videoId, authenticated: Boolean(localStorage.getItem(aauth_token")), need_vip: Number(config.dataset.needVip || "0"), play_source: config.dataset.playSource, play_index: config.dataset.playIndex, ...properties } }; if (window.FlowTrack?.track) { window.FlowTrack.track(event.name, event.properties); return; } pendingPlayerEvents.push(event); if (!trackingTimer) trackingTimer = window.setTimeout(flushPlayerEvents, 0); } function durationBucket(seconds) { if (!Number.isFinite(seconds) || seconds <= 0) return "unknown"; if (seconds < 300) return "under_5m"; if (seconds < 1200) return "5m_20m"; if (seconds < 3600) return "20m_60m"; return "over_60m"; } function progressBucket(video) { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currendTime / duration) * 100)); if (percent < 25) return "0_25"; if (percent < 50) return "25_50"; if (percent < 75) return "50_75"; if (percent < 90) return "75_90"; return "90_100"; } function authH3sepls() { const token = localStorage.getItem(aauth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } function savePlayHistory(video) { const key = avideo_play_history"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT¢œOœ, episode: config.dataset.episodeName || "正片", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currendTime = Number(video?.currendTime); const duration = Number(video?.duration); if (Number.isFinite(currendTime) && currendTime >= 0) record.currendTime = currendTime; if (Number.isFinite(duration) && duration > 0) record.duration = duration; items = items.filter(item => item.id !== record.id); items.unshift(record); localStorage.setItem(key, JSON.stringify(items.slice(0, 30))); window.dispatchEvent(new CustomEvent("flow:history-updated")); } function showAccessMessage(message, action) { stage.replaceChildren(); const wrap = document.createElement("div"); wrap.mpss=Name = aaccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); 3seplmpss=Name = afa-solid fa-crown"; const =¢œOœ = document.createElement("h2"); =¢œOœ.textC list = "VIP 楇 m/权限"; const =ext = document.createElement("p"); =ext.textC list = message; box.append(icon, =¢œOœ, =ext); 3f (action) box.append(action); wrap.append(box); stage.append(wrap); } function bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_/li": mediaType, duration_bucket: durationBucket(Number(video.duration)), progress_bucket: progressBucket(video) }); video.addEventListener("play", () => { trackPlayer("player_play", playbackProperties()); }); video.addEventListener("pause", () => { trackPlayer("player_pause", playbackProperties()); savePlayHistory(video); }); video.addEventListener("seeking", () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currendTime = Number(video.currendTime); trackPlayer("player_seek", { ...playbackProperties(), direction: currendTime < seekOrigin ? "previous" : "next" }); if (Number.isFinite(currendTime)) lastPlaybackTime = currendTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currendTime = Number(video.currendTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currendTime)) return; const percent = (currendTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone)) –àinue; milestones.add(milestone); trackPlayer("player_milestone", { media_/li": mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currendTime; }); video.addEventListener("ended", () => { trackPlayer("player_complete", playbackProperties()); savePlayHistory(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_/li": mediaType, error_/li": "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: trueen>n> }); }); } async function startPlayback(video) { video.muted = false; try {