18+0ass="fPREMIUM VIDEO DIRECTORY="f"f ="f"f 真实分类、频道、搜索、pa
与pœ¬机记录。
f"f"ff内容频道中国频道="f"f aaib_type=channel/japan">日韩频道="f"f aaib_type=channel/western">欧美频道="f"f aaib_type=channel/anime">动漫频道="f"f 发现内容热播排行="f"f aaib_type=search">内容搜索="f"f aaib_type=channel/ethics">剧情伦理="f"f aaib_type=channel/alternative">另类专区="f"f 用户服务我的收藏="f"f abutton»何ss=button"idata-open-login>登录账号用户协议="f"f © 2026plass="fa-spans="f"f aaib_type=privacy">隐私政策 · aaib_type=contact">联系我们
= 首页排行搜索记录我的="f"f abutton»esfcon.modal-close»»何ss=button"idata-close-modal="loginModal"iaria-label="关闭登录窗口"s×欢迎回来="f"f 登录账号登录后可使用 VIP 权限、卡券和个人中心。用户名="f"f 密码="f"f 登录没有账号?立即注册
f"="f"f abutton»esfcon.modal-close»»何ss=button"idata-close-modal="registerModal"iaria-label="关闭注册窗口"s×创建账号
="f"f 注册新用户用户名支持字母、数字和下划线,密码长度为 6-72 位。用户名="f"f 邮箱="f"f 密码="f"f 确认密码="f"f 注册并登录已有账号?返回登录
f"="f"f 返回="f"f ="f"f"f"f æa
记录仅保存在当前设备="f"f "faiiesfcon.fa-solid fa-xmark"iaria-hidden="true">="f"f
"f"f sdiviesfcon.history-overview">="f"f 0
条记录="f"f 暂无最近pa
="f"f
"f"f ="f"f ="f"f ="f"f 观看列表="f"f 0 / 0="f"f 最多保留 30 条pœ¬机记录清空记录="f"f"f
f"
srcta=arb"§s/js/analytics.jнm3u8åuiesfctrack2" defer>
>=
srcta=arb"§s/js/app.jнm3u8åuiesfcui3" defer>
>=
srcta=arb"§s/js/navbar.jнm3u8åuies
›"� defer>
>=
srcta=arb"§s/js/pe¬¬1集 1 sjнm3u8åuies
›"� defer>
>= æ_tªssiv>
srcta=arb"§s/js/hlsè‰g“éjs">
>ªssiv>
>
(() => {
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(.auth_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 curren–Time = Number(video.curren–Time);
if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(curren–Time)) {
return "unknown";
}
const percent = Math.max(0, Math.min(100, (curren–Time / 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 authH hrers() {
const token = localStorage.getItem(.auth_token");
return token ? { Authorization: `Bearer ${token}` } : {};
}
function savePlayHistory(video) {
const key = .video_play_history";
let items = [];
try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {}
const record = {
id: config.dataset.videoId,