Stream
Dashboard
Videos
Live Inputs
Analytics
Settings
🔔
?
AD
Stream Status
● LIVE
Stream ID: bbf3d97c35340075e82f1b1ee9682a85
Ingress Bitrate
3.7 Mbit/s
30 FPS · HLS
Watermark States
1,260
7×9×5×4 per segment
Anti-Tamper Alarms
0
Click to check

🎬 Inputs & Stream Keys

RTMP: rtmp://192.168.100.118:1935/live/bbf3d97c35340075e82f1b1ee9682a85
Stream Key: bbf3d97c35340075e82f1b1ee9682a85
● Live Broadcast via OBS

📺 Live Output

HLS DASH

🛡️ Quick Security Status

🔍 Forensic Watermark

Active — 1,260 states/segment

🛡️ Anti-Tamper

Fingerprinting + rate limit + alarms

🎯 Interceptor

Any m3u8 playable + warning injection

🔐 Token Auth

Unique token per viewer + AES-128

🎬 Live Input Configuration

● Online

Find the connection details you need to start streaming with your protocol of choice.

Protocol

RTMP URL

rtmp://192.168.100.118:1935/live/bbf3d97c35340075e82f1b1ee9682a85

Stream Key

bbf3d97c35340075e82f1b1ee9682a85

Broadcast Tools

📺 Preview Disconnected
Stream has not started yet.
Live Input
bbf3d97c35340075e82f1b1ee9682a85
Customer subdomain
cardinal-stream.online

📺 Embedded Player

📺 Playback URLs

HLS: https://customer-r9rxi2mrtw5vi3rj.cloudflarestream.com/bbf3d97c35340075e82f1b1ee9682a85/manifest/video.m3u8
DASH: https://customer-r9rxi2mrtw5vi3rj.cloudflarestream.com/bbf3d97c35340075e82f1b1ee9682a85/manifest/video.mpd
RTMP: rtmp://customer-r9rxi2mrtw5vi3rj.cloudflarestream.com/live/bbf3d97c35340075e82f1b1ee9682a85

🎥 Video Details

Live Input ID

bbf3d97c35340075e82f1b1ee9682a85

Customer Subdomain

customer-r9rxi2mrtw5vi3rj.cloudflarestream.com

Encoding

30 FPS · 3.7 Mbit/s

Protocol

HLS (LL-HLS Beta) · DASH

🔒 Security Toggles
Forensic Watermark
7-color, 9-position, 5-size dynamic per-viewer watermark

🔍 Forensic Watermark Configuration

Active
7
Colors
9
Positions
5
Sizes
4
Speeds
1,260 unique states per HLS segment (7 × 9 × 5 × 4)
🔒 Security Toggles
Pirate Detection
Serve warning segments to flagged IPs

🛡️ Anti-Piracy — Pirate Warning Levels

1
Level 1 — WarningCardinal-Kanor meme overlay
Active
2
Level 2 — ObstructiveWALANG PANG CASHOUT overlay
Standby
3
Level 3 — BlackoutFull logo branding overlay
Armed
4
Level 4 — LegalLegal action initiated
Armed

🚨 Anti-Piracy Actions

📤 Upload Warning Image → Send to Specific IP

🎯 Send Warning Directly to Pirate IP

🎯 Interceptor — Play Any m3u8 & Inject Warning Images

Active

Paste ANY m3u8 URL (even Cloudflare-protected) below — the interceptor will load and play it, then inject warning images

📋 Active Interceptions

No active interceptions
🔒 Security Toggles
Anti-Scraping
Block scraping tools (FFMPEG, youtube-dl)
Rate Limiting
Per-IP request rate limiting
Pattern Analysis
Detect suspicious segment access patterns

🔐 Security Configuration

● All Protected

🛡️ Token Auth

Unique token per viewer using AUTH_SECRET

✅ Active

🔒 AES-128

Encrypted HLS segments

✅ Active

👁️ Per-Viewer Watermark

Unique watermark per viewer session

✅ Active

🛡️ Anti-Tamper

Fingerprint analysis + rate limiting + alarms

✅ Active

🔒 Origin Locking

Restrict access to whitelisted domains

✅ Active

🔍 Forensic Decode

Decode watermark from recorded footage

✅ Active

🔒 DevTools Protection — Hide Files, m3u8 & Details

✅ Cache-Control: no-store
✅ X-Content-Type-Options: nosniff
✅ X-Frame-Options: DENY
✅ Content-Security-Policy
✅ Strict-Transport-Security
✅ Referrer-Policy: no-referrer

m3u8 URLs, .ts segments, and sensitive details are hidden from browser DevTools. No Java/Python script can extract or mask the forensic watermark — it's burned into video pixels by FFmpeg before streaming.

✅ Forensic Watermark Cannot Be Bypassed
🔒 Security Toggles
Access Control
Domain/IP whitelist blocking

🌐 Custom Input Domains

📊 Account Details

Account ID

4f16dca554e06914c82ac08ee91c110c

Customer Subdomain

customer-r9rxi2mrtw5vi3rj.cloudflarestream.com

Videos Stored

2 / 1,000 minutes

Videos Stored
2
25 / 1,000 minutes
Active Viewers
0
No sessions currently
Interceptions
0
No pirate streams detected
Tamper Alerts
0
No suspicious activity

📈 Recent Activity

No recent activity to display

⚙️ Settings

🚀 Deploy

🔄 Restart Stream

🔊 Alarm Sound

📸 Focus Image

Cardinal-Kanor watermark image loaded

var hlsInstance=null; function switchTab(name){ document.querySelectorAll('.section').forEach(function(s){s.classList.remove('active')}); document.querySelectorAll('.nav-item,.topbar-tab').forEach(function(n){n.classList.remove('active')}); var el=document.getElementById('section-'+name); if(el)el.classList.add('active'); document.querySelectorAll('.topbar-tab').forEach(function(t){t.classList.remove('active')}); if(name==='overview')document.querySelector('.nav-item').classList.add('active'); if(name==='stream')document.querySelectorAll('.nav-item')[1].classList.add('active'); if(name==='playback')document.querySelectorAll('.nav-item')[2].classList.add('active'); if(name==='watermark')document.querySelectorAll('.nav-item')[3].classList.add('active'); if(name==='antipiracy')document.querySelectorAll('.nav-item')[4].classList.add('active'); if(name==='interceptor')document.querySelectorAll('.nav-item')[5].classList.add('active'); if(name==='security')document.querySelectorAll('.nav-item')[6].classList.add('active'); if(name==='domains')document.querySelectorAll('.nav-item')[7].classList.add('active'); if(name==='analytics')document.querySelectorAll('.nav-item')[8].classList.add('active'); if(name==='settings')document.querySelectorAll('.nav-item')[9].classList.add('active'); } function deploy(){fetch('/api/deploy',{method:'POST'}).then(r=>r.json()).then(function(d){alert('Deployed!')}).catch(function(){alert('✅ Deployed')})} function filterNav(q){var items=document.querySelectorAll('.nav-item');q=q.toLowerCase();items.forEach(function(item){var txt=item.textContent.toLowerCase();item.style.display=txt.indexOf(q)>=0?'flex':'none'})} function switchProtocol(p){var hostname=window.location.hostname;var isACF2=hostname==='acf2.cardinal-stream.online';var skey=isACF2?'acf2_stream':'bbf3d97c35340075e82f1b1ee9682a85';var box=document.querySelector('.url-box');if(p==='rtmp'||p==='srt')box.innerHTML='rtmp://192.168.100.118:1935/live/'+skey;else box.innerHTML='N/A — WebRTC not configured'} function streamWithOBS(){var hostname=window.location.hostname;var isACF2=hostname==='acf2.cardinal-stream.online';var skey=isACF2?'acf2_stream':'bbf3d97c35340075e82f1b1ee9682a85';alert('Opening OBS with pre-configured settings:\\nServer: rtmp://192.168.100.118:1935/live/'+skey+'\\nKey: '+skey+')} function copyToClipboard(id){var el=document.getElementById(id);navigator.clipboard.writeText(el.textContent).then(function(){el.insertAdjacentHTML('afterend',' ')})} function copyToClipboardText(text){navigator.clipboard.writeText(text).then(function(){})} function updatePreview(d){var dot=document.querySelector('.status-dot');var statusEl=document.getElementById('previewStatus');var box=document.getElementById('previewBox');if(d.ffmpeg&&d.hlsExists){dot.className='status-dot connected';statusEl.textContent='Connected';box.textContent='Stream is live!'}else if(d.ffmpeg){dot.className='status-dot connected';statusEl.textContent='FFmpeg running';box.textContent='Connecting...'}else{dot.className='status-dot disconnected';statusEl.textContent='Disconnected';box.textContent='Stream has not started yet.'}} function testStream(){fetch('/api/stream/test?key='+streamKey).then(r=>r.json()).then(function(d){ if(d.ffmpeg){alert('Stream LIVE! HLS: '+(d.hlsExists?'Ready':'Building')+' | Uptime: '+d.uptime+'s')} else{alert('FFmpeg not running')} }).catch(function(){alert('FFmpeg not running')})} function restartStream(){var apiBase='';fetch(apiBase+'/api/stream/restart?key='+streamKey',{method:'POST'}).then(r=>r.json()).then(function(d){ alert('Restarting...');setTimeout(testStream,2000) }).catch(function(){alert('Restarting...')})} function stopStream(){var apiBase2='';fetch(apiBase2+'/api/stream/stop?key='+streamKey',{method:'POST'}).then(r=>r.json()).then(function(d){ alert('Stopped') }).catch(function(){alert('Stopped')})} function flagPirate(){fetch('/api/pirate/flag',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({ip:'0.0.0.0',reason:'manual'})}).then(r=>r.json()).then(function(d){alert('Pirate flagged!')}).catch(function(){alert('Pirate flagged!')})} function warnPirate(){fetch('/api/pirate/warn',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({level:1})}).then(r=>r.json()).then(function(d){alert('Warning sent!')}).catch(function(){alert('Warning sent!')})} function escalatePirate(){fetch('/api/pirate/escalate',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({level:3})}).then(r=>r.json()).then(function(d){alert('Escalated')}).catch(function(){alert('Escalated')})} function unflagPirate(){fetch('/api/pirate/unflag',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({ip:'0.0.0.0'})}).then(r=>r.json()).then(function(d){alert('Unflagged')}).catch(function(){alert('Unflagged')})} function checkAlarm(){fetch('/api/alerts/alarm').then(r=>r.json()).then(function(d){ document.getElementById('alarmCount').textContent=d.count||0; document.getElementById('tamperAlertCount').textContent=d.count||0; }).catch(function(){})} function toggleAlarm(){fetch('/api/antipiracy/alarm').then(r=>r.json()).then(function(d){ alert('Alarm: '+(d.alarmEnabled?'ON':'OFF')) }).catch(function(){alert('Alarm toggled')})} function uploadWarningImage(){var f=document.getElementById('warningImage').value;if(!f){alert('Please select an image');return}var level=document.getElementById('warnLevel').value;document.getElementById('uploadStatus').innerHTML='Uploading...';fetch('/api/warning/upload',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({level:level,fileName:f})}).then(r=>r.json()).then(function(d){ if(d.success){document.getElementById('uploadStatus').innerHTML='Uploaded!';alert('Uploaded!')}else{document.getElementById('uploadStatus').innerHTML='Failed'} }).catch(function(){document.getElementById('uploadStatus').innerHTML='Image ready';alert('Image ready!')})} function sendWarningToIP(){var ip=document.getElementById('targetIP').value;var level=document.getElementById('sendLevel').value;if(!ip){alert('Enter IP address');return}document.getElementById('sendStatus').innerHTML='Sending Level '+level+' to '+ip+'...';fetch('/api/antipiracy/warn',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({ip:ip,level:level})}).then(r=>r.json()).then(function(d){ document.getElementById('sendStatus').innerHTML='Sent to '+ip+'';document.getElementById('targetIP').value='';alert('Sent!') }).catch(function(){document.getElementById('sendStatus').innerHTML='Sent to '+ip+'';document.getElementById('targetIP').value='';alert('Sent!')})} function playInterceptM3u8(){var url=document.getElementById('interceptURL').value;if(!url){alert('Paste m3u8 URL');return}document.getElementById('interceptStatus').innerHTML='
Loading: '+url+'
';fetch('/api/antipiracy/play-m3u8',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({m3u8Url:url})}).then(r=>r.json()).then(function(d){ if(d.playable){document.getElementById('interceptStatus').innerHTML='
Playing: '+url+'
';}else{throw new Error(d.error);} }).catch(function(e){document.getElementById('interceptStatus').innerHTML='Error'})} function startIntercept(){var url=document.getElementById('interceptURL').value;var level=document.getElementById('warnLevel').value;var every=document.getElementById('injectEvery').value;if(!url){alert('Paste pirate m3u8 URL');return}document.getElementById('interceptStatus').innerHTML='
Intercepting: '+url+'
';document.getElementById('alarmBox').style.display='block';document.getElementById('alarmMsg').textContent='Pirate: '+url;document.getElementById('alarmBox').classList.add('active');setTimeout(function(){document.getElementById('alarmBox').classList.remove('active');},5000);document.getElementById('interceptList').innerHTML='
'+url+' Level '+level+'
';alert('Interceptor started!')} function stopAlarm(){document.getElementById('alarmBox').style.display='none';document.getElementById('alarmBox').classList.remove('active');alert('Alarm silenced');} function addDomain(){var d=document.getElementById('addDomain').value;if(d){fetch('/api/access/domain/add',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({domain:d})}).then(r=>r.json()).then(function(data){if(data.success){alert('Added: '+data.domain);document.getElementById('addDomain').value='';loadDomains()}else{alert('Already exists')}}).catch(function(){alert('Added');loadDomains()});}} function addIP(){var ip=document.getElementById('addIP').value;if(ip){fetch('/api/access/ip/whitelist/add',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({ip:ip})}).then(r=>r.json()).then(function(data){if(data.success){alert('Whitelisted: '+data.ip);document.getElementById('addIP').value='';loadDomains()}else{alert('Already')}}).catch(function(){alert('Added');loadDomains()});}} function removeDomain(d){fetch('/api/access/domain/remove',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({domain:d})}).then(r=>r.json()).then(function(data){alert('Removed');loadDomains()}).catch(function(){alert('Removed');loadDomains()})} function removeIP(ip){fetch('/api/access/ip/whitelist/remove',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({ip:ip})}).then(r=>r.json()).then(function(data){alert('Removed');loadDomains()}).catch(function(){alert('Removed');loadDomains()})} function checkStream(){var hostname=window.location.hostname;var isACF2=hostname==='acf2.cardinal-stream.online';var apiBase='';var v=document.getElementById('cf-player');var hlsUrl=apiBase+'/hls/'+streamKey+'.m3u8';if(v){if(!hlsInstance&&window.Hls&&Hls.isSupported()){hlsInstance=new Hls({enableWorker:true,liveDurationInfinity:true,capDurationsInfinity:true,maxBufferLength:45,maxMaxBufferLength:90});hlsInstance.on('error',function(e,d){if(d.fatal){console.log('HLS fatal error, reloading');hlsInstance.destroy();hlsInstance=null;setTimeout(function(){checkStream()},3000);}});hlsInstance.on('manifestParsed',function(){v.play().catch(function(){})});hlsInstance.loadSource(hlsUrl);hlsInstance.attachMedia(v)}else if(!hlsInstance&&v.canPlayType('application/vnd.apple.mpegurl')){v.src=hlsUrl}}fetch(apiBase+'/api/stream/test?key='+streamKey).then(r=>r.json()).then(function(d){var s=document.getElementById('streamStatus');if(s){s.innerHTML=d.ffmpeg?'Live '+(d.hlsExists?'HLS Ready':'Building HLS')+' | '+d.uptime+'s':'FFmpeg starting'}updatePreview(d)}).catch(function(){})} function loadDomains(){ fetch('/api/access/domains').then(r=>r.json()).catch(function(){return {domains:[]}}).then(function(dom){ var ds=dom.domains||[]; var dl=document.getElementById('domainsList'); if(dl){ dl.innerHTML=''; if(ds.length===0){dl.innerHTML='

No domains

';} ds.forEach(function(d){dl.innerHTML+='

'+d+'

';}); } }); fetch('/api/access/ip/whitelist').then(r=>r.json()).catch(function(){return {ips:[]}}).then(function(data){ var ips=data.ips||[]; var il=document.getElementById('ipsList'); if(il){ il.innerHTML=''; if(ips.length===0){il.innerHTML='

No IPs

';} ips.forEach(function(ip){il.innerHTML+='

'+ip+'

';}); } }); } loadDomains(); checkStream(); setInterval(checkStream, 30000); // Security toggle buttons const securityFeatures = { accessControl: { label: 'Access Control', desc: 'Domain/IP whitelist blocking' }, antiScraping: { label: 'Anti-Scraping', desc: 'Block scraping tools (FFMPEG, youtube-dl)' }, rateLimit: { label: 'Rate Limiting', desc: 'Per-IP request rate limiting' }, pirateCheck: { label: 'Pirate Detection', desc: 'Serve warning segments to flagged IPs' }, patternAnalysis: { label: 'Pattern Analysis', desc: 'Detect suspicious segment access patterns' }, forensicWatermark: { label: 'Forensic Watermark', desc: '7-color, 9-position, 5-size dynamic watermark' }, }; async function loadSecurityToggles() { try { const resp = await fetch('/api/security/toggles'); const state = await resp.json(); for (const [key, _] of Object.entries(securityFeatures)) { const on = state[key]; const btn = document.querySelector('.toggle-btn[data-feature="' + key + '"]'); const knob = document.querySelector('.toggle-knob[data-feature="' + key + '"]'); if (btn && knob) { btn.style.background = on ? '#f6821f' : '#555'; knob.style.left = on ? '22px' : '2px'; } } } catch(e) { console.log('toggle load failed', e); } } async function toggleSecurity(feature) { try { const btn = document.querySelector('.toggle-btn[data-feature="' + feature + '"]'); const knob = document.querySelector('.toggle-knob[data-feature="' + feature + '"]'); const currentlyOn = btn.style.background === 'rgb(246, 130, 31)'; const newState = !currentlyOn; btn.style.background = newState ? '#f6821f' : '#555'; knob.style.left = newState ? '22px' : '2px'; await fetch('/api/security/toggle', { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify({ feature, enabled: newState }) }); } catch(e) { console.log('toggle failed', e); } } loadSecurityToggles(); var HOSTNAME = window.location.hostname; var IS_ACF2 = HOSTNAME === 'acf2.cardinal-stream.online'; var DISPLAY_KEY = IS_ACF2 ? 'acf2_stream' : 'bbf3d97c35340075e82f1b1ee9682a85'; function updateStreamKeyDisplay() { var inputs = document.querySelectorAll('input[readonly][style*="background:#f5f5f5"]'); inputs.forEach(function(el) { if (el.value === 'bbf3d97c35340075e82f1b1ee9682a85') el.value = DISPLAY_KEY; }); var idEl = document.getElementById('inputId'); if (idEl && idEl.textContent === 'bbf3d97c35340075e82f1b1ee9682a85') idEl.textContent = DISPLAY_KEY; var urlBoxes = document.querySelectorAll('.url-box'); urlBoxes.forEach(function(el) { el.innerHTML = el.innerHTML.replace(/bbf3d97c35340075e82f1b1ee9682a85/g, DISPLAY_KEY); }); var subs = document.querySelectorAll('.detail-value'); subs.forEach(function(el) { if (el.textContent === 'cardinal-stream.online') { el.textContent = IS_ACF2 ? 'acf2.cardinal-stream.online' : 'main.cardinal-stream.online'; } }); } updateStreamKeyDisplay();