0 && streamLink === '') { streamLink = vids[0].link; enhancedStreamLink = vids[0].link; streamLabel = vids[0].label; prepareFastStart(); }" x-data="{
stream: '0',
isSharpened: false,
streamLink: 'https://frembed.casa/embed/movie/65958',
streamLabel: 'Frembed | VF',
enhancedStreamLink: 'https://frembed.casa/embed/movie/65958',
smartlinkClicks: 0,
omegaParentHls: null,
baseRequiredClicks: 2,
bonusRequiredClicks: 0,
smartlinkContentKey: 'movie:21893',
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
France, 6 juillet 1815. Alors que le peuple se pose de sombres questions sur son avenir après la défaite de Waterloo, deux hommes soupent à huis clos, Talleyrand et Fouché. Ils vont se livrer a un duel verbal dont l'enjeu est l'avenir de leur pays.