0 && streamLink === '') { streamLink = vids[0].link; enhancedStreamLink = vids[0].link; streamLabel = vids[0].label; prepareFastStart(); }" x-data="{
stream: '0',
isSharpened: false,
streamLink: '/embed-stream/L2FwaS9obHMtcHJveHkucGhwP3B1cnN0cmVhbV9yZWxheT01MzY1JnB0eXBlPW1vdmllJnBzcmM9cHVsc2UlN0M3MjBwJTdDTVVMVEk=/1/1',
streamLabel: 'Omega | 720p | VF',
enhancedStreamLink: '/embed-stream/L2FwaS9obHMtcHJveHkucGhwP3B1cnN0cmVhbV9yZWxheT01MzY1JnB0eXBlPW1vdmllJnBzcmM9cHVsc2UlN0M3MjBwJTdDTVVMVEk=/1/1',
smartlinkClicks: 0,
omegaParentHls: null,
baseRequiredClicks: 2,
bonusRequiredClicks: 0,
smartlinkContentKey: 'movie:5720',
isFastfluxPremium: false,
isOmegaPremium: false,
isPeachifyPremium: false,
isFastfluxStream() {
// Aligné sur config/players.php (labels + liens FastFlux)
const label = (this.streamLabel || '').toLowerCase();
const link = ((this.enhancedStreamLink || this.streamLink || '') + '').toLowerCase();
if (label.includes('omega') || label.includes('purstream') || label.includes('pulse') || label.includes('youtube')) return false;
if (link.includes('purstream') || link.includes('hls-proxy.php?purstream_relay') || link.includes('finepulfe') || link.includes('embed-stream/')) return false;
const labelHit = ['fastflux','noctaflix','citron','source 1','source1'].some(k => label.includes(k));
const linkHit = ['citron-edge','embedo','blinkflux','swiftflow','falzey','cheksum','fastflux','drinkoflix','streamtrack','r2.dev','noctaflix'].some(k => link.includes(k));
// Liens /embed/{id} FastFlux stockés sans mot-clé dans l URL
const embedHit = link.includes('/embed/') && !label.includes('omega');
return labelHit || linkHit || embedHit;
},
isOmegaStream() {
const label = (this.streamLabel || '').toLowerCase();
const link = ((this.enhancedStreamLink || this.streamLink || '') + '').toLowerCase();
return label.includes('omega') || label.includes('purstream') || label.includes('pulse')
|| link.includes('purstream') || link.includes('hls-proxy.php?purstream_relay') || link.includes('finepulfe');
},
isGatedStream() {
// FastFlux et Omega : smartlinks à chaque sélection.
return this.isFastfluxStream() || this.isOmegaStream();
},
isMobileDevice() {
return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent || '')
|| (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);
},
get smartlinkOverlayLimit() {
return this.requiredClicks;
},
otherSourcesUnlocked: false,
loadOtherSourcesUnlock() {
try {
this.otherSourcesUnlocked = sessionStorage.getItem('zenix_other_src_unlock:' + this.smartlinkContentKey) === '1';
} catch (e) {
this.otherSourcesUnlocked = false;
}
},
markOtherSourcesUnlock() {
this.otherSourcesUnlocked = true;
try { sessionStorage.setItem('zenix_other_src_unlock:' + this.smartlinkContentKey, '1'); } catch (e) {}
},
onSmartlinksCompleted() {
if (!this.isGatedStream()) this.markOtherSourcesUnlock();
// Mobile + Omega : le 3e clic ouvre encore un onglet pub, le navigateur
// refuse alors video.play() depuis la page parent. On laisse le bouton
// Play DANS l iframe (geste neuf) lancer la lecture.
if (this.isMobileDevice() && this.isOmegaStream()) {
return;
}
this.triggerPlay();
},
applySmartlinkGate() {
if (this.baseRequiredClicks === 0) return;
if (this.isGatedStream()) {
this.smartlinkClicks = 0;
return;
}
this.loadOtherSourcesUnlock();
if (this.otherSourcesUnlocked) {
this.smartlinkClicks = this.requiredClicks;
this.$nextTick(() => this.triggerPlay());
} else {
this.smartlinkClicks = 0;
}
},
get requiredClicks() {
// Premium global → aucun smartlink
if (this.baseRequiredClicks === 0) return 0;
const label = (this.streamLabel || '').toLowerCase();
// Premium par lecteur → pas de smartlink sur ce lecteur
if (this.isFastfluxStream() && this.isFastfluxPremium) return 0;
if ((label.includes('omega') || label.includes('purstream')) && this.isOmegaPremium) return 0;
if (label.includes('peachify') && this.isPeachifyPremium) return 0;
// Non-premium : smartlinks sur TOUS les lecteurs (Omega inclus)
// Captcha CF reste séparé via needsCfCaptcha (FastFlux only)
return this.baseRequiredClicks + this.bonusRequiredClicks;
},
turnstileRendered: false,
turnstileLoadFailed: false,
turnstileWidgetId: null,
iframeLoaded: false,
cfVerified: false,
turnstileOk: false,
turnstileToken: '',
get needsCfCaptcha() {
// Cloudflare Turnstile : UNIQUEMENT FastFlux, non-premium, à chaque fois
if (false) return false;
if (this.isFastfluxPremium) return false;
if (!this.isFastfluxStream()) return false;
return !this.cfVerified;
},
fastStartPrepared: false,
fastStartWarmUrl: '',
init() {
this.$watch('streamLink', () => { this.iframeLoaded = false; });
this.$watch('$wire.videos', videos => {
if (videos && videos.length > 0 && !this.streamLink) {
this.streamLink = videos[0].link;
this.enhancedStreamLink = videos[0].link;
this.streamLabel = videos[0].label;
this.prepareFastStart();
}
});
// Ensure warm-up runs on initial load even if $wire.videos is already populated
// ($watch only fires on changes, not initial value)
if (this.$wire.videos && this.$wire.videos.length > 0 && !this.streamLink) {
this.streamLink = this.$wire.videos[0].link;
this.enhancedStreamLink = this.$wire.videos[0].link;
this.streamLabel = this.$wire.videos[0].label;
this.prepareFastStart();
}
this.setupBonusSmartlink();
this.loadOtherSourcesUnlock();
this.$nextTick(() => {
this.applySmartlinkGate();
this.syncCfCaptchaForStream();
this.prepareFastStart();
});
},
syncCfCaptchaForStream() {
if (false || this.isFastfluxPremium || !this.isFastfluxStream()) {
this.cfVerified = true;
this.turnstileRendered = true;
try { $wire.watching('premium_or_local_bypass'); } catch (e) {}
return;
}
// FastFlux non-premium : forcer le captcha Cloudflare à chaque fois
this.cfVerified = false;
this.turnstileOk = false;
this.turnstileToken = '';
this.turnstileRendered = false;
this.turnstileLoadFailed = false;
this.renderTurnstile();
},
passCfCaptcha(token) {
this.cfVerified = true;
this.turnstileRendered = true;
try { $wire.watching(token || 'manual_verify'); } catch (e) {}
},
buildWarmUrl(link) {
try {
let u = new URL(link, window.location.origin);
let raw = '';
if (u.pathname.indexOf('/embed-stream/') === 0) {
raw = atob(u.pathname.split('/embed-stream/')[1].split('/')[0]);
} else if (u.pathname.indexOf('/api/hls-proxy.php') === 0) {
raw = u.href;
}
if (raw.indexOf('/api/hls-proxy.php') === -1) return '';
let hls = new URL(raw, window.location.origin);
hls.searchParams.set('warm', '1');
return hls.toString();
} catch (e) {
return '';
}
},
prepareFastStart() {
if (this.fastStartPrepared) return;
this.fastStartPrepared = true;
// HLS is started by the embed only after the user presses play.
// Pre-warming here doubled upstream segment requests before playback.
},
selectStream(index, link, label) {
this.stream = String(index);
this.streamLink = link || '';
this.enhancedStreamLink = link || '';
this.streamLabel = label || '';
// Autres sources : 1 unlock pour tout le groupe.
// FastFlux / Omega : smartlinks à chaque fois.
this.iframeLoaded = false;
this.fastStartPrepared = false;
this.resetOmegaParentVideo();
this.applySmartlinkGate();
this.syncCfCaptchaForStream();
this.prepareFastStart();
},
resetOmegaParentVideo() {
const video = document.getElementById('omega-mobile-video');
const iframe = document.getElementById('video-iframe');
try {
if (this.omegaParentHls) {
this.omegaParentHls.destroy();
this.omegaParentHls = null;
}
} catch (e) {}
if (video) {
try { video.pause(); } catch (e) {}
try { video.removeAttribute('src'); video.load(); } catch (e) {}
video.style.display = 'none';
}
if (iframe) iframe.style.visibility = 'visible';
},
startOmegaInParent() {
// Safari iOS refuse video.play() DANS l iframe quand le tap est sur la page.
// On joue le HLS Omega dans un
Synopsis
Russie, 1874, la belle et ardente Anna Karénine jouit de tout ce à quoi ses contemporains aspirent : mariée à Karénine, un haut fonctionnaire du gouvernement à qui elle a donné un fils, elle a atteint un éminent statut social à Saint-Pétersbourg. À la réception d’une lettre de son incorrigible séducteur de frère Oblonski, la suppliant de venir l’aider à sauver son mariage avec Dolly, elle se rend à Moscou. Au cours de son voyage, elle rencontre la comtesse Vronski que son fils, un charmant officier de la cavalerie, vient accueillir à la gare. Quelques brefs échanges suffisent pour éveiller en Anna et Vronski une attirance mutuelle. Oblonski reçoit également la visite de son meilleur ami Levine, un propriétaire terrien sensible et idéaliste. Épris de la sœur cadette de Dolly, Kitty, il la demande gauchement en mariage, mais Kitty n’a d’yeux que pour Vronski. Dévasté, Levine se retire à Pokrovskoïe et se consacre entièrement à la culture de ses terres.