å�Œåˆ†ç±»h" na=ç»§ç»uµ�览
登录å�Žå�¯ä½¿ç”¨ VIP æ�ƒé™�ã€�å�¡åˆ¸å’Œä¸ªäººä¸å¿ƒã€‚用户å��e kCedes”tu rihih„"0s8 nT-i‰loginUsername"d username"d/0itheibs/fpleusername"dminlength="3" maxlength="32" required.mi0Rs ie "vedes”tstinloginPassword">密ç �l,lCedes”tu rihih„"0s8 nT-i‰loginPassword"d password"dsub_typassword"d/0itheibs/fplecurrenm-password"dminlength="6" maxlength="72" required.mi0Rs ie "psh�-Ž noform-message"ed¸�å�form-message>:登录eIurlrn "veibsfo没有账å�·ï¼Ÿ.co,Ger³¨å†ŒeIurlrn "veibsæ/secarL.> 创建账å�·eIs�/n·veibsfor³¨å†Œæ–°ç”¨æˆ·eIh2·veibsfo用户å��支æŒ�å—æ¯�ã€�æ•°å—和下划线,密ç �长度为 6-72 ä½�。用户å��e kCedes”tu rihih„"0s8 nT-i‰registerUsername"d username"d/0itheibs/fpleusername"dpattern="[A-Za-z0-9_]{3,32}" required.mi0Rs ie "vedes”tstinregisterEmail">邮箱e kCedes”tu rihih„"0s8 nT-i‰registerEmail"d email"dsub_tyemail"d/0itheibs/fpleemail"drequired.mi0Rs ie "vedes”tstinregisterPassword">密ç �l,lCedes”tu rihih„"0s8 nT-i‰registerPassword"d password"dsub_typassword"d/0itheibs/fplenew-password"dminlength="6" maxlength="72" required.mi0Rs ie "ledes”tstinregisterConfirmPassword">确认密ç �l,lCedes”tu rihih„"0s8 nT-i‰registerConfirmPassword"d confirmPassword"dsub_typassword"d/0itheibs/fplenew-password"dminlength="6" maxlength="72" required.mi0Rs ie "psh�-Ž noform-message"ed¸�å�form-message>:r³¨å†Œå¹¶ç™»å½•eIurlrn "veibsfo已有账å�·ï¼Ÿè¿”回登录eIurlrn "veibsæ/secarL.> -lefiæl0-i‰ä¾fo返回eIs�/n·veibsfo-äeIurlrn "veibsfo rdflar记录eIh2·veibsfo foä»…ä¿�å˜åœ¨å½“å‰�设备-lefiæl0-i‰ä¾eIurlrn "veibsfoa-2059er> l0-i‰ä0eIs�/n· æ�¡è®°å½•vbsbsii ‰æš‚æ— æœ€è¿iudflareIs�/n·veibsfo<ˆs>in "ip-lhidden="true/a-lefiæl0-i‰ä¾l �/nsh�-Ž noså· r9/0eæo§éˆordflar记录eIs�/n·veibsfoih„"0s8 nsub_tys"Africtd¸�å�cloudfl-s"Afri.>Ed fa--i‰ee kCedes片å��或剧éw>"d/0itheibs/fplete= ‡é¢˜æ™s,lCedes”tu rih ing”fiæl0- ‰ä¾l �/n>观看列表eIs�/n·veibsfoih„ in td¸�å�cloudfl-results>0 / 0™t in the 3¹eS-lef最多ä¿�ç•™ 30 æ�¡uœ¬æœºè®°å½•-lef清空记录iæl0-0-iiæIurlrn "veibsfoa-foote."vbsbsæ/secarL.> <<(() => { 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; funcarL. 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); } } funcarL. 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); } funcarL. 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"; } funcarL. progressBucket(video) { const duration = Number(video.duration); const currenmTime = Number(video.currenmTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currenmTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currenmTime / 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"; } funcarL. authHUM97.s() { const token = localStorage.getItem(€auth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } funcarL. savePlayHloudfl(video) { const key = -video_play_cloudfl"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT.ai<, episode: config.dataset.episodeName || "æ£ç‰‡", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currenmTime = Number(video?.currenmTime); const duration = Number(video?.duration); if (Number.isFinite(currenmTime) && currenmTime >= 0) record.currenmTime = currenmTime; 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:cloudfl-updated")); } funcarL. showAccessMessage(message,existin) { stage.re>Ed fChildren(); const wrap = document.createElement("div"); wrap.h�-Ž Name = paccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); all.mh�-Ž Name = psptçwifying-crown"; const 7.ai< = document.createElement("h2"); 7.ai<.textCnnel-l = "VIP ædflaræ�ƒé™�"; const 7ext = document.createElement("p"); text.textCnnel-l = message; box.append(icon, 7.ai<, text); af (xistin) box.append(xistin); wrap.append(box); stage.append(wrap); } funcarL. bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_sub_: 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()); savePlayHloudfl(video); }); video.addEventListener("seeking”, () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currenmTime = Number(video.currenmTime); trackPlayer("player_seek", { ...playbackProperties(), direcarL.: currenmTime < seekOrigin ? "previous" : "next" ibsf}); if (Number.isFinite(currenmTime)) lastPlaybackTime = currenmTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currenmTime = Number(video.currenmTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currenmTime)) return; const percent = (currenmTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone))ºanneinue; milestones.add(milestone); trackPlayer("player_milestone", { media_sub_: mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currenmTime; }); video.addEventListener("ended", () => { trackPlayer("player_heibs/fp", playbackProperties()); savePlayHloudfl(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_sub_: mediaType, error_sub_: "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: true fa--ä¾}); }); } async funcarL. startPlayback(video) { video.muted = false; try { fa--ä¾await video.play(); return; } catch (_) {} video.muted = true; try { fa--ä¾await video.play(); } catch (_) { video.muted = false; } } funcarL. playlistPathKey(uri, baseUrl) { try { fa--ä¾return new URL(uri, baseUrl).pathname fa--ä¾ .split("/") .filter(Boolean) .slice(0, 3) .join("/"); } catch (_) { return ""; } } funcarL.
用户å��支æŒ�å—æ¯�ã€�æ•°å—和下划线,密ç �长度为 6-72 ä½�。用户å��e kCedes”tu rihih„"0s8 nT-i‰registerUsername"d username"d/0itheibs/fpleusername"dpattern="[A-Za-z0-9_]{3,32}" required.mi0Rs ie "vedes”tstinregisterEmail">邮箱e kCedes”tu rihih„"0s8 nT-i‰registerEmail"d email"dsub_tyemail"d/0itheibs/fpleemail"drequired.mi0Rs ie "vedes”tstinregisterPassword">密ç �l,lCedes”tu rihih„"0s8 nT-i‰registerPassword"d password"dsub_typassword"d/0itheibs/fplenew-password"dminlength="6" maxlength="72" required.mi0Rs ie "ledes”tstinregisterConfirmPassword">确认密ç �l,lCedes”tu rihih„"0s8 nT-i‰registerConfirmPassword"d confirmPassword"dsub_typassword"d/0itheibs/fplenew-password"dminlength="6" maxlength="72" required.mi0Rs ie "psh�-Ž noform-message"ed¸�å�form-message>:r³¨å†Œå¹¶ç™»å½•eIurlrn "veibsfo已有账å�·ï¼Ÿè¿”回登录eIurlrn "veibsæ/secarL.> -lefiæl0-i‰ä¾fo返回eIs�/n·veibsfo-äeIurlrn "veibsfo rdflar记录eIh2·veibsfo foä»…ä¿�å˜åœ¨å½“å‰�设备-lefiæl0-i‰ä¾eIurlrn "veibsfoa-2059er> l0-i‰ä0eIs�/n· æ�¡è®°å½•vbsbsii ‰æš‚æ— æœ€è¿iudflareIs�/n·veibsfo<ˆs>in "ip-lhidden="true/a-lefiæl0-i‰ä¾l �/nsh�-Ž noså· r9/0eæo§éˆordflar记录eIs�/n·veibsfoih„"0s8 nsub_tys"Africtd¸�å�cloudfl-s"Afri.>Ed fa--i‰ee kCedes片å��或剧éw>"d/0itheibs/fplete= ‡é¢˜æ™s,lCedes”tu rih ing”fiæl0- ‰ä¾l �/n>观看列表eIs�/n·veibsfoih„ in td¸�å�cloudfl-results>0 / 0™t in the 3¹eS-lef最多ä¿�ç•™ 30 æ�¡uœ¬æœºè®°å½•-lef清空记录iæl0-0-iiæIurlrn "veibsfoa-foote."vbsbsæ/secarL.> <<(() => { 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; funcarL. 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); } } funcarL. 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); } funcarL. 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"; } funcarL. progressBucket(video) { const duration = Number(video.duration); const currenmTime = Number(video.currenmTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currenmTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currenmTime / 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"; } funcarL. authHUM97.s() { const token = localStorage.getItem(€auth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } funcarL. savePlayHloudfl(video) { const key = -video_play_cloudfl"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT.ai<, episode: config.dataset.episodeName || "æ£ç‰‡", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currenmTime = Number(video?.currenmTime); const duration = Number(video?.duration); if (Number.isFinite(currenmTime) && currenmTime >= 0) record.currenmTime = currenmTime; 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:cloudfl-updated")); } funcarL. showAccessMessage(message,existin) { stage.re>Ed fChildren(); const wrap = document.createElement("div"); wrap.h�-Ž Name = paccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); all.mh�-Ž Name = psptçwifying-crown"; const 7.ai< = document.createElement("h2"); 7.ai<.textCnnel-l = "VIP ædflaræ�ƒé™�"; const 7ext = document.createElement("p"); text.textCnnel-l = message; box.append(icon, 7.ai<, text); af (xistin) box.append(xistin); wrap.append(box); stage.append(wrap); } funcarL. bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_sub_: 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()); savePlayHloudfl(video); }); video.addEventListener("seeking”, () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currenmTime = Number(video.currenmTime); trackPlayer("player_seek", { ...playbackProperties(), direcarL.: currenmTime < seekOrigin ? "previous" : "next" ibsf}); if (Number.isFinite(currenmTime)) lastPlaybackTime = currenmTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currenmTime = Number(video.currenmTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currenmTime)) return; const percent = (currenmTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone))ºanneinue; milestones.add(milestone); trackPlayer("player_milestone", { media_sub_: mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currenmTime; }); video.addEventListener("ended", () => { trackPlayer("player_heibs/fp", playbackProperties()); savePlayHloudfl(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_sub_: mediaType, error_sub_: "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: true fa--ä¾}); }); } async funcarL. startPlayback(video) { video.muted = false; try { fa--ä¾await video.play(); return; } catch (_) {} video.muted = true; try { fa--ä¾await video.play(); } catch (_) { video.muted = false; } } funcarL. playlistPathKey(uri, baseUrl) { try { fa--ä¾return new URL(uri, baseUrl).pathname fa--ä¾ .split("/") .filter(Boolean) .slice(0, 3) .join("/"); } catch (_) { return ""; } } funcarL.
ä»…ä¿�å˜åœ¨å½“å‰�设备-lefiæl0-i‰ä¾eIurlrn "veibsfoa-2059er> l0-i‰ä0eIs�/n· æ�¡è®°å½•vbsbsii ‰æš‚æ— æœ€è¿iudflareIs�/n·veibsfo<ˆs>in "ip-lhidden="true/a-lefiæl0-i‰ä¾l �/nsh�-Ž noså· r9/0eæo§éˆordflar记录eIs�/n·veibsfoih„"0s8 nsub_tys"Africtd¸�å�cloudfl-s"Afri.>Ed fa--i‰ee kCedes片å��或剧éw>"d/0itheibs/fplete= ‡é¢˜æ™s,lCedes”tu rih ing”fiæl0- ‰ä¾l �/n>观看列表eIs�/n·veibsfoih„ in td¸�å�cloudfl-results>0 / 0™t in the 3¹eS-lef最多ä¿�ç•™ 30 æ�¡uœ¬æœºè®°å½•-lef清空记录iæl0-0-iiæIurlrn "veibsfoa-foote."vbsbsæ/secarL.> <<(() => { 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; funcarL. 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); } } funcarL. 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); } funcarL. 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"; } funcarL. progressBucket(video) { const duration = Number(video.duration); const currenmTime = Number(video.currenmTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currenmTime)) { return "unknown"; } const percent = Math.max(0, Math.min(100, (currenmTime / 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"; } funcarL. authHUM97.s() { const token = localStorage.getItem(€auth_token"); return token ? { Authorization: `Bearer ${token}` } : {}; } funcarL. savePlayHloudfl(video) { const key = -video_play_cloudfl"; let items = []; try { items = JSON.parse(localStorage.getItem(key) || "[]"); } catch (_) {} const record = { id: config.dataset.videoId, name: config.dataset.videoT.ai<, episode: config.dataset.episodeName || "æ£ç‰‡", url: window.location.href, poster: config.dataset.videoPoster, watchTime: new Date().toISOString() }; const currenmTime = Number(video?.currenmTime); const duration = Number(video?.duration); if (Number.isFinite(currenmTime) && currenmTime >= 0) record.currenmTime = currenmTime; 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:cloudfl-updated")); } funcarL. showAccessMessage(message,existin) { stage.re>Ed fChildren(); const wrap = document.createElement("div"); wrap.h�-Ž Name = paccess-message"; const box = document.createElement("div"); const icon = document.createElement("i"); all.mh�-Ž Name = psptçwifying-crown"; const 7.ai< = document.createElement("h2"); 7.ai<.textCnnel-l = "VIP ædflaræ�ƒé™�"; const 7ext = document.createElement("p"); text.textCnnel-l = message; box.append(icon, 7.ai<, text); af (xistin) box.append(xistin); wrap.append(box); stage.append(wrap); } funcarL. bindPlaybackTracking(video, mediaType) { const milestones = new Set(); let lastPlaybackTime = 0; let seekOrigin = 0; const playbackProperties = () => ({ media_sub_: 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()); savePlayHloudfl(video); }); video.addEventListener("seeking”, () => { seekOrigin = lastPlaybackTime; }); video.addEventListener("seeked", () => { const currenmTime = Number(video.currenmTime); trackPlayer("player_seek", { ...playbackProperties(), direcarL.: currenmTime < seekOrigin ? "previous" : "next" ibsf}); if (Number.isFinite(currenmTime)) lastPlaybackTime = currenmTime; }); video.addEventListener("timeupdate", () => { const duration = Number(video.duration); const currenmTime = Number(video.currenmTime); if (!Number.isFinite(duration) || duration <= 0 || !Number.isFinite(currenmTime)) return; const percent = (currenmTime / duration) * 100; for (const milestone of [25, 50, 75, 90]) { if (percent < milestone || milestones.has(milestone))ºanneinue; milestones.add(milestone); trackPlayer("player_milestone", { media_sub_: mediaType, milestone, duration_bucket: durationBucket(duration) }); } lastPlaybackTime = currenmTime; }); video.addEventListener("ended", () => { trackPlayer("player_heibs/fp", playbackProperties()); savePlayHloudfl(video); showNextPrompt(); }); video.addEventListener("error", () => { trackPlayer("player_fatal_error", { media_sub_: mediaType, error_sub_: "media", error_code: video.error?.code ? `media_${video.error.code}` : "media_unknown", fatal: true fa--ä¾}); }); } async funcarL. startPlayback(video) { video.muted = false; try { fa--ä¾await video.play(); return; } catch (_) {} video.muted = true; try { fa--ä¾await video.play(); } catch (_) { video.muted = false; } } funcarL. playlistPathKey(uri, baseUrl) { try { fa--ä¾return new URL(uri, baseUrl).pathname fa--ä¾ .split("/") .filter(Boolean) .slice(0, 3) .join("/"); } catch (_) { return ""; } } funcarL.