cloudflare
tcp/443 tcp/80 tcp/8443
The following URL (usually /.git/config) is publicly accessible and is leaking source code and repository configuration.
Severity: medium
Fingerprint: 2580fa947178c88602b1737db148c044b81b03713d63bb82370a652240e5b3e5
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = https://github.com/kailawn-ai/zostream_web.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main
Open service 104.26.1.178:443 · web.zostream.in
2026-01-23 17:00
HTTP/1.1 200 OK
Date: Fri, 23 Jan 2026 17:00:07 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=3,cfOrigin;dur=260
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=J3mV9weqNUNqvh%2B4wm%2Fl1FJu%2FM%2BikD5x9pfaQ0VUw%2BI9v2ljDfXkEYtD3g%2FnyNjW2%2FXgxNMb0hgoHSK%2BcmJFDg8ALf3izO%2BAF6Oesum9"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9c28d8736810f473-BLR
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 104.26.1.178:8443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 522 <none> Date: Thu, 22 Jan 2026 08:04:22 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19245,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c1d89d20f4fc469-BLR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:20::681a:b2:80 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 301 Moved Permanently
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Length: 0
Connection: close
Location: https://web.zostream.in/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=DjcY8Qycz9l8CnCsNKT6Xs%2FAZ3o97%2Fv%2Bi%2F9PZSsoWxj2PhrJgsMoVXPqpWvNvp5tObHnE3hUCPqlCciuAJMqpZ5Kzmo9FI1h%2BXk5m61iuVVb6t3jV9BupC9K"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=14,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c1d89cbe8a1fa9a-SJC
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:20::ac43:4885:80 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 301 Moved Permanently
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Length: 0
Connection: close
Location: https://web.zostream.in/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=GApK3oRFEEOll9ugZ63hzIizP7DSsYU4kSWB%2BS9vOSlb8pC2u4xAOp8WvbKaqKvPu0p3%2BmUZkO6xJO3SQQaqTN1fqwGvvwu89t8KY7niYwejSTcS5LMz%2FnvW"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=6,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c1d89cbea5dfdbe-SIN
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:20::681a:1b2:443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 200 OK
Date: Thu, 22 Jan 2026 08:04:03 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=3,cfOrigin;dur=161
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=c3GDZ6%2Ffy85M5CbUqqppo31HLLPHQtc%2F%2Bo4uOChk6M0KLAFnmatmL%2FyWjIi7%2FDltHtl8M30R5YC9jf9EhnXHrTkNHF%2FlNzmxnRy6K%2B3wpQwM286dpeU%2Br00q"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9c1d89cebb80e084-BLR
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 2606:4700:20::681a:b2:8443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 522 <none> Date: Thu, 22 Jan 2026 08:04:23 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19478,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c1d89d21858327e-SJC alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 104.26.0.178:8443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 522 <none> Date: Thu, 22 Jan 2026 08:04:23 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19525,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c1d89d1e9aca450-YYZ alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:20::681a:1b2:8443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 522 <none> Date: Thu, 22 Jan 2026 08:04:22 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19280,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c1d89d1d8bb741b-BLR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:20::ac43:4885:8443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 522 <none> Date: Thu, 22 Jan 2026 08:04:23 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19644,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c1d89d1d9bbaff6-EWR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:20::ac43:4885:443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 200 OK
Date: Thu, 22 Jan 2026 08:04:03 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=12,cfOrigin;dur=279
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=P7mQJSufo0IsJpRQqumASPVF%2FI7qb3%2FqY92PQRpzTyb9I0H2Izk8yT3GwW8BSclEL9vt2T13BenzCnxvd7bHEHb3orlWoSkDu7AfspXoMURS%2B1DdfXXYslqJ"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9c1d89cd7905420a-EWR
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 172.67.72.133:8443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 522 <none> Date: Thu, 22 Jan 2026 08:04:22 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19371,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c1d89d1ed159e08-EWR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 104.26.1.178:80 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 301 Moved Permanently
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Length: 0
Connection: close
Location: https://web.zostream.in/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=w4VI0OohdvbuxDiOGz2cuAT9ZXP3lN5oMnSBjp%2BUeL7rYTn3xjOqO0Phv1zm%2FvN1aiv0BFv00CQL6VuueDJqSDu8WJc5Ocaz4CmrRTlf"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=12,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c1d89cc7b81d21e-FRA
alt-svc: h3=":443"; ma=86400
Open service 172.67.72.133:80 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 301 Moved Permanently
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Length: 0
Connection: close
Location: https://web.zostream.in/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=iwHQsUs6lqZxi%2FxQVcKICe6Th5ZD3AZ%2BL8xId7uHkAg%2FeaWjAsPzzCLmRy%2BkGJNN%2FxU3b18ja2CdQPrlSRqq2lFS%2B7aXC3pY3Q9U%2BfY5"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=8,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c1d89cb7e3bdacf-LHR
alt-svc: h3=":443"; ma=86400
Open service 104.26.0.178:80 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 301 Moved Permanently
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Length: 0
Connection: close
Location: https://web.zostream.in/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=4IJL8Lz16VpelZB6Tnn%2BiXftmISFnUEzkiXKq5MwRfZtva1s0dcAuySvhtRZHAorZ3X7DJrCa87B17SNlFaxYoI5qbmS1TPYtiP46wFs"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=10,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c1d89cb8f027796-LHR
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:20::681a:1b2:80 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 301 Moved Permanently
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Length: 0
Connection: close
Location: https://web.zostream.in/
Speculation-Rules: "/cdn-cgi/speculation"
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=uyrBKc%2FcJ5iohw3nPxA5kRMODwRDn4x9%2FSzh61NORry%2B7M1vbFRPsx0%2Bb0m%2BdZ2TYZWqAufN5uRDWshxVM1wSmWd0KLLXO6fJemjZeRHAAG%2FPNQuHIIBLeXf"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=3,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c1d89cb89dcd87f-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:20::681a:b2:443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 200 OK
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=13,cfOrigin;dur=48
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=bPjh%2B3dot4N9lmEWaJVOY4FQ9%2FoVR4Xrafz3fD0lpLJQ3GMt6JAY%2BnXz6R%2FxhIIcgleh5tqrKMFRYqcv9x7tjsmOr9E%2FNdza6uUF58x8uEirLkEAlFxuo56v"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9c1d89cbcdd177b4-LHR
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 104.26.1.178:443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 200 OK
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=7,cfOrigin;dur=29
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=j6edYNO2tyaO6qk8859BbDjdBKHEfFDgr9a4xt3m7%2BvPEtH4Z08LMSSjLyYNjUBFY%2FF5ENk56WdpJS35fTNRaqcuQFBfGT8k60qxIXG1"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9c1d89cbefd4ca10-LHR
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 172.67.72.133:443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 200 OK
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=6,cfOrigin;dur=52
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=mSC%2FHJDOexZWqV2NKQ4ofiCHnEYeb%2BbHYrVFRzJIdbmXSaz%2FFUEjKniE4TZcY8umZJlugsDqjY6mtXDdWh9FL29WZkRsRkVHrTudT6PZ"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9c1d89cbcb51d28a-FRA
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 104.26.0.178:443 · web.zostream.in
2026-01-22 08:04
HTTP/1.1 200 OK
Date: Thu, 22 Jan 2026 08:04:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=16,cfOrigin;dur=74
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=KW5uqFMgxtJAfnNFi6VTzWy7JRqiC7Q0WSkvgYPzkuFMEJ7Sy7p5e1PuerPC8WlTf19qCpMLY6Jt8W82KilY34QkkC7o6toOp%2Fwr8HpL"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9c1d89cbfd1f914a-FRA
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 104.26.1.178:443 · web.zostream.in
2026-01-09 23:39
HTTP/1.1 200 OK
Date: Fri, 09 Jan 2026 23:39:53 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=7,cfOrigin;dur=14
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=jf2t2f6%2Ft%2Bi2OEhUJzFKltTj6M%2FOjjKFtTIVoAkLN2yrwJp7Cu6Vm%2FsvbNX%2B%2F1KiPtnZbVTlzLUAixbsnvQd4OJIG%2FnptFTnwXCmT7RE"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9bb7c6ce4e40aa76-AMS
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 104.26.1.178:443 · web.zostream.in
2026-01-02 21:52
HTTP/1.1 200 OK
Date: Fri, 02 Jan 2026 21:52:36 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=13,cfOrigin;dur=14
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Ar5Wry0BdDd1q36wMuF4njOLxbIo3YIpYKD%2B8wsYs%2BVGhJriF%2FsgThFBu8mDLsuNCw3ryjHk58nNY9Ns03dtpUvG6uB22nAwygiUQJxX"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9b7d7c0528bc0bad-AMS
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co
Open service 104.26.1.178:443 · web.zostream.in
2025-12-22 20:31
HTTP/1.1 200 OK
Date: Mon, 22 Dec 2025 20:31:43 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Wed, 08 Oct 2025 10:19:21 GMT
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=13,cfOrigin;dur=333
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=6ncmzUqbFuJSHcUJico8adJl%2FmTb6fGTbdafHvxBAGU6TfilfOwZzSsfOVP4xbt9g4bGHqvBYTr804j78C6KXL68yl9Ngcy7%2FWFwqHZL"}]}
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Speculation-Rules: "/cdn-cgi/speculation"
CF-RAY: 9b22626569de39ea-YYZ
alt-svc: h3=":443"; ma=86400
Page title: ZoStreamTV - Home
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ZoStreamTV - Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/pages/home.css">
<link rel="stylesheet" href="css/pages/nav.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Sidebar Navigation (unchanged) -->
<aside class="sidebar">
<div class="logo">
<img class="logo_img" src="logo.jpg" alt="ZoStreamTV Logo" />
<h2>ZoStreamTV</h2>
</div>
<ul class="nav-menu">
<li class="nav-item"><a href="home.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">home</i><span>Home</span></a></li>
<li class="nav-item"><a href="search.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">search</i><span>Search</span></a></li>
<li class="nav-item"><a href="category.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">movie</i><span>Category</span></a></li>
<li class="nav-item"><a href="profile.html" class="nav-link focusable" tabindex="-1"><i class="material-icons">person</i><span>Profile</span></a></li>
</ul>
</aside>
<!-- Main Content -->
<main class="main-content">
<div id="hero-slider-container"></div>
<div id="movies-container">
<div class="loading">Loading content...</div>
</div>
</main>
<script type="module">
import { initializeRemoteControl } from './js/utils/uniRemote.js';
import { apiClient } from './js/service/apiClient.js';
import { protectPage } from './js/service/authGuard.js';
import { toast } from './js/utils/toastify.js';
import useAgeRestriction from './js/utils/useAgeRestriction.js';
let heroTrack, heroSlides, heroDots, currentHeroIndex = 1; // Start at 1 (the first REAL slide)
let isTransitioning = false;
const ageRestricted = useAgeRestriction.value;
document.addEventListener('DOMContentLoaded', async () => {
document.querySelectorAll('.nav-link').forEach(link => {
if (link.href === window.location.href) link.classList.add('active');
});
try {
await protectPage();
await loadContent();
setupNavigation();
} catch (error) {
showError('Authentication required. Redirecting...');
setTimeout(() => window.location.href = './login.html', 2000);
}
});
async function loadContent() {
// ... (This function is unchanged) ...
const moviesContainer = document.getElementById('movies-container');
try {
moviesContainer.innerHTML = '<div class="loading">Loading content...</div>';
const response = await apiClient.get(`/movies?age_restriction=${ageRestricted}`);
if (!response || Object.keys(response).length === 0) {
moviesContainer.innerHTML = '<div class="loading">No content available</div>';
return;
}
moviesContainer.innerHTML = '';
let regularCatIndex = 0;
Object.entries(response).forEach(([category, items]) => {
if (!items || items.length === 0) return;
if (category === 'Latest Update') {
createHeroSlider(items);
} else {
const section = document.createElement('div');
section.className = 'category-section';
section.innerHTML = `<h2 class="category-title">${category}</h2><div class="movies-scroller"><div class="movies-row" id="category-${regularCatIndex}"></div></div>`;
const row = section.querySelector('.movies-row');
items.forEach(item => row.appendChild(createMediaCard(item)));
moviesContainer.appendChild(section);
regularCatIndex++;
}
});
} catch (error) {
showError('Failed to load content. Please try again.');
}
}
function createHeroSlider(items) {
const sliderContainer = document.getElementById('hero-slider-container');
if (!sliderContainer || items.length === 0) return;
co