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/1101333',
streamLabel: 'Frembed | VF',
enhancedStreamLink: 'https://frembed.casa/embed/movie/1101333',
smartlinkClicks: 0,
omegaParentHls: null,
baseRequiredClicks: 2,
bonusRequiredClicks: 0,
smartlinkContentKey: 'movie:21891',
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
Adorés, critiqués, enviés, montrés du doigt, visibles mais bien cachés, les municipaux sont devenus des vedettes grâce aux Chevaliers du Fiel. Dans ce tout nouvel épisode, les municipaux prennent leur destin en main pour devenir ce que personne n'aurait pu imaginer... Amour, réunions syndicales, apéros mortels, surprises, suspense et énorme fou rire... C'est royal, phénoménal, donc municipal !