Meneman commited on
Commit
bb3723c
·
verified ·
1 Parent(s): 44aa6a5

undefined - Follow Up Deployment

Browse files
Files changed (1) hide show
  1. index.html +107 -310
index.html CHANGED
@@ -5,324 +5,121 @@
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
  <title>Belly Dance 24/7 (Global UTC)</title>
7
  <style>
8
- :root{
9
- --bg1:#1a1a2e; --bg2:#16213e; --bg3:#0f3460;
10
- --gold:#f5d76e; --gold-weak:rgba(245,215,110,.8);
11
- --panel:rgba(255,255,255,.06); --panel-brd:rgba(255,255,255,.15);
12
- --shadow:0 8px 40px rgba(0,0,0,.5);
13
- }
14
- /* Base */
15
- html,body{height:100%}
16
- body{
17
- margin:0; color:#f8f8f8; font-family:system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
18
- background: radial-gradient(circle at 15% 10%, var(--bg1), var(--bg2) 40%, var(--bg3) 100%);
19
- overflow-x:hidden; position:relative;
20
- }
21
- .wrap{max-width:1080px; margin:0 auto; padding:24px 16px 48px}
22
-
23
- /* Header */
24
- header{text-align:center; padding:24px 0 8px}
25
- .title{
26
- font-size: clamp(28px, 6vw, 48px);
27
- font-weight: 900;
28
- background: linear-gradient(90deg, #ffe08a, #ffd166);
29
- -webkit-background-clip:text; background-clip:text; color:transparent;
30
- margin:0;
31
- }
32
- .subtitle{margin:6px 0 8px; color:rgba(255,255,255,.85)}
33
- .divider{height:4px; width:120px; margin:14px auto 0;
34
- background:linear-gradient(90deg, #a78bfa, #facc15); border-radius:999px; opacity:.8}
35
-
36
- /* Video panel */
37
- .panel{
38
- position:relative; margin:20px auto 0; max-width:960px; aspect-ratio:16/9;
39
- background:var(--panel); border:1px solid var(--panel-brd);
40
- border-radius:20px; box-shadow:var(--shadow); backdrop-filter: blur(12px) saturate(120%);
41
- overflow:hidden; transition:transform .3s ease;
42
- }
43
- .panel:hover{transform:scale(1.01)}
44
- video{display:block; width:100%; height:100%; object-fit:cover; background:#000}
45
- .chip-time{
46
- position:absolute; bottom:12px; right:12px; padding:6px 10px; border-radius:6px;
47
- background:rgba(0,0,0,.6); font:12px/1.2 monospace; color:#fff
48
- }
49
-
50
- /* Info */
51
- .info{text-align:center; margin-top:16px}
52
- .v-title{
53
- font-size: clamp(18px, 3.5vw, 28px); margin:0;
54
- background: linear-gradient(90deg, #fff1a8, #ffd166);
55
- -webkit-background-clip:text; background-clip:text; color:transparent;
56
- font-weight:700;
57
- }
58
- .v-meta{margin:6px 0 0; color:rgba(255,255,255,.8); font-size:14px}
59
-
60
- /* Schedule */
61
- .schedule{
62
- max-width:640px; margin:22px auto 0; background:rgba(0,0,0,.35);
63
- border:1px solid rgba(255,255,255,.08); border-radius:16px; padding:18px; backdrop-filter: blur(6px);
64
- box-shadow:0 6px 24px rgba(0,0,0,.35)
65
- }
66
- .schedule h3{margin:0 0 12px; font-size:18px; color:var(--gold)}
67
- .row{display:flex; gap:12px; align-items:flex-start; padding:8px 10px; border-radius:10px; transition:all .25s}
68
- .row .time{width:110px; color:#ffd166; font:14px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace}
69
- .row .name{flex:1}
70
- .row.active{
71
- background: linear-gradient(90deg, rgba(255,215,0,.16), rgba(255,255,255,.06));
72
- border-left:4px solid #facc15;
73
- }
74
-
75
- /* Footer */
76
- footer{color:rgba(255,255,255,.7); text-align:center; font-size:13px; padding:20px 0}
77
-
78
  /* Live badge */
79
- .live-badge{
80
- position:fixed; top:12px; right:12px; z-index:9999;
81
- display:inline-flex; align-items:center; gap:8px; padding:8px 12px; border-radius:999px;
82
- background: linear-gradient(135deg, rgba(20,0,35,.75), rgba(75,0,110,.75));
83
- border:1px solid rgba(255,215,0,.35); color:var(--gold);
84
- font-weight:600; font-size:14px; letter-spacing:.2px; opacity:.8; backdrop-filter: blur(6px);
85
- transition:opacity .2s, box-shadow .2s, transform .2s;
86
- }
87
- .live-badge:hover{opacity:1; box-shadow:0 0 18px rgba(250,204,21,.45), inset 0 0 10px rgba(250,204,21,.15); transform:translateY(-1px)}
88
- .dot{width:8px; height:8px; border-radius:50%; background:#ff3b3b; box-shadow:0 0 10px rgba(255,59,59,.8)}
89
-
90
  /* Bubbles */
91
- #bubbles{position:fixed; inset:0; overflow:hidden; z-index:0; pointer-events:none}
92
- .bubble{
93
- position:absolute; bottom:-100px; border-radius:50%; background:rgba(255,255,255,.08);
94
- animation:rise linear infinite;
95
- }
96
- @keyframes rise{
97
- 0% {transform:translateY(0) scale(1); opacity:.4}
98
- 50%{opacity:.7}
99
- 100%{transform:translateY(-110vh) scale(1.2); opacity:0}
100
- }
101
-
102
- /* Utility */
103
- .muted{color:rgba(255,255,255,.8); font-size:12px; margin-top:6px}
104
  </style>
105
  </head>
106
  <body>
107
- <!-- LIVE viewers badge -->
108
- <div class="live-badge" aria-live="polite" title="Live viewers (simüle)">
109
- <span class="dot" aria-hidden="true"></span>
110
- <span>LIVE:</span>
111
- <strong id="live-count" style="margin:0 4px;">—</strong>
112
- <span>Watching</span>
113
- </div>
114
-
115
- <!-- Background bubbles -->
116
- <div id="bubbles" aria-hidden="true"></div>
117
-
118
- <div class="wrap">
119
- <header>
120
- <h1 class="title">Belly Dance 24/7</h1>
121
- <div class="subtitle">Global synchronized performances</div>
122
- <div id="header-time" class="muted">—</div>
123
- <div class="divider"></div>
124
- </header>
125
-
126
- <main>
127
- <section class="panel">
128
- <video id="player" autoplay muted playsinline></video>
129
- <div id="chip-time" class="chip-time"></div>
130
- </section>
131
-
132
- <section class="info">
133
- <h2 id="v-title" class="v-title"></h2>
134
- <p id="v-meta" class="v-meta"></p>
135
- </section>
136
-
137
- <section class="schedule" aria-label="Global Schedule (UTC)">
138
- <h3>✨ Global Schedule (UTC) ✨</h3>
139
- <div id="rows">
140
- <div class="row"><div class="time">21:00 – 23:35</div><div class="name">Dance in Front of the Library of Alexandria</div></div>
141
- <div class="row"><div class="time">23:35 01:28</div><div class="name">✨ Belly Dance ✨ - Sensual Dance</div></div>
142
- <div class="row"><div class="time">01:28 – 06:09</div><div class="name">✨ Belly Dance ✨ Let My Dance and My Magic Work on You</div></div>
143
- <div class="row"><div class="time">06:09 – 21:00</div><div class="name">Feast of Hathor</div></div>
144
- </div>
145
- </section>
146
- </main>
147
-
148
- <footer>Pre-recorded performances looped 24/7 (Global UTC)</footer>
149
- </div>
150
 
151
  <script>
152
- /* =========================
153
- AYARLAR (UTC sabit)
154
- ========================= */
155
- const USE_UTC = true; // Global senkron için true
156
- // Videolar (tek dosyada gömülü). videos.json kullanıyorsan fetch ile de doldurabilirsin.
157
- const VIDEOS = [
158
- {
159
- title: "Dance in Front of the Library of Alexandria",
160
- url: "https://www.dropbox.com/scl/fi/cdla6akuljge32vgy07ym/A-dance-in-front-of-the-Library-of-Alexandria.mp4?dl=1",
161
- duration: 155, // 2:35
162
- start: 21, end: 23.5833 // 23:35
163
- },
164
- {
165
- title: "✨ Belly Dance ✨ - Sensual Dance",
166
- url: "https://www.dropbox.com/scl/fi/5y9pie14fgq9h87lqcfgb/Belly-dance-sensual-dance.mp4?dl=1",
167
- duration: 113, // 1:53
168
- start: 23.5833, end: 1.4667 // 01:28
169
- },
170
- {
171
- title: "✨ Belly Dance ✨ Let My Dance and My Magic Work on You",
172
- url: "https://www.dropbox.com/scl/fi/guaawrmicatbah76ot22m/Belly-dance-Let-my-dance-and-my-magic-work-on-you.mp4?dl=1",
173
- duration: 281, // 4:41
174
- start: 1.4667, end: 6.15 // 06:09
175
- },
176
- {
177
- title: "Feast of Hathor",
178
- url: "https://www.dropbox.com/scl/fi/re9c5joysr8vhvqvhll4p/Feast-of-Hathor.mp4?dl=1",
179
- duration: 208, // 3:28
180
- start: 6.15, end: 21 // 21:00
181
- }
182
  ];
183
-
184
- /* =========================
185
- ZAMAN & SEÇİM YARDIMCILARI
186
- ========================= */
187
- function nowHour(){ // float saat
188
- const n=new Date();
189
- return USE_UTC ? n.getUTCHours()+n.getUTCMinutes()/60 : n.getHours()+n.getMinutes()/60;
190
- }
191
- function fmtClockUTC(){
192
- const n=new Date();
193
- const utc = n.toUTCString().split(' ')[4];
194
- return {local:n.toLocaleTimeString(), utc};
195
- }
196
- function inRangeWrap(h, start, end){
197
- // start<end normal; start>end geceyi aşar
198
- if (start<end) return h>=start && h<end;
199
- return (h>=start || h<end);
200
- }
201
- function currentVideo(){
202
- const h=nowHour();
203
- for(const v of VIDEOS){ if(inRangeWrap(h, v.start, v.end)) return v; }
204
- return VIDEOS[0];
205
- }
206
- function secToMinSec(s){const m=Math.floor(s/60), r=s%60; return `${m}:${String(r).padStart(2,'0')}`}
207
-
208
- /* =========================
209
- OYNATICI & ÇİZELGE
210
- ========================= */
211
- const $player = document.getElementById('player');
212
- const $vtitle = document.getElementById('v-title');
213
- const $vmeta = document.getElementById('v-meta');
214
- const $chip = document.getElementById('chip-time');
215
- const $rows = document.querySelectorAll('.schedule .row');
216
- const $headerTime = document.getElementById('header-time');
217
-
218
- function updateHeaderTimes(){
219
- const t = fmtClockUTC();
220
- $headerTime.textContent = `Local: ${t.local} | UTC: ${t.utc}`;
221
- document.getElementById('chip-time').textContent = `Local: ${t.local}`;
222
- }
223
- setInterval(updateHeaderTimes, 1000); updateHeaderTimes();
224
-
225
- function highlightRow(activeIndex){
226
- $rows.forEach((el,i)=>{
227
- if(i===activeIndex) el.classList.add('active'); else el.classList.remove('active');
228
- });
229
- }
230
-
231
- function indexOfVideo(v){
232
- return VIDEOS.findIndex(x=>x.title===v.title && x.start===v.start && x.end===v.end);
233
- }
234
-
235
- function playScheduled(){
236
- const h=nowHour();
237
- const v=currentVideo();
238
- const idx=indexOfVideo(v);
239
-
240
- // geçen süre -> videonun kaldığı yeri bul
241
- const elapsedSec = ((h - v.start + 24) % 24) * 3600;
242
- const position = Math.floor(elapsedSec % v.duration);
243
-
244
- // kaynak ve bilgiler
245
- if ($player.src !== v.url) $player.src = v.url;
246
- $player.load();
247
- $player.currentTime = position;
248
- $player.loop = true;
249
- $player.play().catch(()=>{ $player.muted=true; $player.play(); });
250
-
251
- $vtitle.textContent = v.title;
252
- $vmeta.textContent = `Duration: ${secToMinSec(v.duration)}`;
253
- highlightRow(idx);
254
-
255
- // sıradaki geçiş zamanı
256
- const msToNext = ((v.end - h + 24) % 24) * 3600 * 1000;
257
- setTimeout(playScheduled, msToNext);
258
- }
259
- playScheduled();
260
-
261
- /* =========================
262
- BALONCUK ARKA PLAN
263
- ========================= */
264
- const $bubbles = document.getElementById('bubbles');
265
- function createBubble(){
266
- const b=document.createElement('div');
267
- const size = 20 + Math.random()*60; // 20..80
268
- b.className='bubble';
269
- b.style.width=`${size}px`; b.style.height=`${size}px`;
270
- b.style.left=`${Math.random()*100}vw`;
271
- b.style.animationDuration = `${15 + Math.random()*20}s`;
272
- $bubbles.appendChild(b);
273
- setTimeout(()=>b.remove(), 40000);
274
- }
275
- setInterval(createBubble, 1000);
276
-
277
- /* =========================
278
- SAHTE İZLEYİCİ SAYACI (UTC)
279
- ========================= */
280
- // Saat dilimi aralıkları ve min-max izleyici
281
- const BUCKETS = [
282
- { start:0, end:6, min: 500, max:1500 }, // Gece
283
- { start:6, end:12, min:1000, max:2500 }, // Sabah
284
- { start:12,end:18, min:2000, max:4000 }, // Öğlen
285
- { start:18,end:24, min:3000, max:5000 } // Akşam
286
- ];
287
- const $count = document.getElementById('live-count');
288
- const nf = new Intl.NumberFormat(navigator.language || 'en-US');
289
- function bucketFor(h){
290
- for(const b of BUCKETS){ if(h>=b.start && h<b.end) return b; }
291
- return BUCKETS[0];
292
- }
293
- function clamp(n,min,max){return Math.max(min, Math.min(max,n));}
294
- function randStep(){ // ±10..50
295
- const mag = 10 + Math.floor(Math.random()*41);
296
- return (Math.random()<.5?-1:1)*mag;
297
- }
298
- function nextDelay(){ return (5 + Math.random()*5)*1000; }
299
-
300
- let liveCount=null, liveBucket=null, liveTimer=null;
301
- function initLive(){
302
- const h=nowHour(); // UTC çünkü USE_UTC=true
303
- liveBucket = bucketFor(h);
304
- const span = liveBucket.max - liveBucket.min;
305
- liveCount = liveBucket.min + Math.floor(span * (0.30 + Math.random()*0.40)); // %30..%70
306
- $count.textContent = nf.format(liveCount);
307
- }
308
- function tickLive(){
309
- const h=nowHour();
310
- const b=bucketFor(h);
311
- if(b!==liveBucket){
312
- liveBucket=b;
313
- liveCount = clamp(liveCount + randStep(), b.min, b.max);
314
- }else{
315
- liveCount = clamp(liveCount + randStep(), b.min, b.max);
316
- }
317
- $count.textContent = nf.format(liveCount);
318
- liveTimer = setTimeout(tickLive, nextDelay());
319
- }
320
- // Sekme görünürlüğü
321
- document.addEventListener('visibilitychange', ()=>{
322
- if(document.hidden){ if(liveTimer){clearTimeout(liveTimer); liveTimer=null;} }
323
- else { if(!liveTimer){ liveTimer=setTimeout(tickLive, nextDelay()); } }
324
- });
325
- initLive(); liveTimer=setTimeout(tickLive, nextDelay());
326
  </script>
327
  <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Meneman/livedance" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
328
  </html>
 
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
  <title>Belly Dance 24/7 (Global UTC)</title>
7
  <style>
8
+ :root{--bg1:#1a1a2e;--bg2:#16213e;--bg3:#0f3460;--gold:#f5d76e}
9
+ body{margin:0;color:#f8f8f8;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;
10
+ background:radial-gradient(circle at 15% 10%,var(--bg1),var(--bg2) 40%,var(--bg3) 100%);
11
+ overflow-x:hidden;position:relative;min-height:100vh}
12
+ header{text-align:center;padding:24px 0 8px}
13
+ h1{font-size:clamp(28px,6vw,48px);font-weight:900;
14
+ background:linear-gradient(90deg,#ffe08a,#ffd166);
15
+ -webkit-background-clip:text;background-clip:text;color:transparent;margin:0}
16
+ .divider{height:4px;width:120px;margin:14px auto;background:linear-gradient(90deg,#a78bfa,#facc15);border-radius:999px;opacity:.8}
17
+ .panel{position:relative;margin:20px auto 0;max-width:960px;aspect-ratio:16/9;
18
+ background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.15);
19
+ border-radius:20px;box-shadow:0 8px 40px rgba(0,0,0,.5);overflow:hidden}
20
+ video{width:100%;height:100%;object-fit:cover;background:#000}
21
+ .chip{position:absolute;bottom:12px;right:12px;padding:6px 10px;border-radius:6px;
22
+ background:rgba(0,0,0,.6);font:12px/1.2 monospace;color:#fff}
23
+ .info{text-align:center;margin-top:16px}
24
+ .info h2{font-size:clamp(18px,3.5vw,28px);margin:0;
25
+ background:linear-gradient(90deg,#fff1a8,#ffd166);
26
+ -webkit-background-clip:text;background-clip:text;color:transparent;font-weight:700}
27
+ .info p{margin:6px 0 0;color:rgba(255,255,255,.8);font-size:14px}
28
+ .schedule{max-width:640px;margin:22px auto;background:rgba(0,0,0,.35);
29
+ border-radius:16px;padding:18px}
30
+ .schedule h3{margin:0 0 12px;font-size:18px;color:var(--gold)}
31
+ .row{display:flex;gap:12px;align-items:flex-start;padding:8px 10px;border-radius:10px}
32
+ .row .time{width:110px;color:#ffd166;font:14px/1.3 monospace}
33
+ .row.active{background:linear-gradient(90deg,rgba(255,215,0,.16),rgba(255,255,255,.06));
34
+ border-left:4px solid #facc15}
35
+ footer{text-align:center;color:rgba(255,255,255,.7);font-size:13px;padding:20px}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  /* Live badge */
37
+ .live-badge{position:fixed;top:12px;right:12px;z-index:9999;display:inline-flex;align-items:center;gap:8px;
38
+ padding:8px 12px;border-radius:999px;background:linear-gradient(135deg,rgba(20,0,35,.75),rgba(75,0,110,.75));
39
+ border:1px solid rgba(255,215,0,.35);color:var(--gold);font-weight:600;font-size:14px;opacity:.8}
40
+ .live-badge:hover{opacity:1;box-shadow:0 0 18px rgba(250,204,21,.45),inset 0 0 10px rgba(250,204,21,.15)}
41
+ .dot{width:8px;height:8px;border-radius:50%;background:#ff3b3b;box-shadow:0 0 10px rgba(255,59,59,.8)}
 
 
 
 
 
 
42
  /* Bubbles */
43
+ #bubbles{position:fixed;inset:0;overflow:hidden;z-index:0;pointer-events:none}
44
+ .bubble{position:absolute;bottom:-100px;border-radius:50%;background:rgba(255,255,255,.08);animation:rise linear infinite}
45
+ @keyframes rise{0%{transform:translateY(0) scale(1);opacity:.4}50%{opacity:.7}100%{transform:translateY(-110vh) scale(1.2);opacity:0}}
 
 
 
 
 
 
 
 
 
 
46
  </style>
47
  </head>
48
  <body>
49
+ <div class="live-badge"><span class="dot"></span><span>LIVE:</span><strong id="live-count">—</strong><span>Watching</span></div>
50
+ <div id="bubbles"></div>
51
+
52
+ <header>
53
+ <h1>Belly Dance 24/7</h1>
54
+ <div id="header-time" style="font-size:13px;color:rgba(255,255,255,.8)"></div>
55
+ <div class="divider"></div>
56
+ </header>
57
+
58
+ <main>
59
+ <section class="panel">
60
+ <video id="player" autoplay muted playsinline></video>
61
+ <div id="chip" class="chip"></div>
62
+ </section>
63
+ <section class="info">
64
+ <h2 id="vtitle"></h2>
65
+ <p id="vmeta"></p>
66
+ </section>
67
+ <section class="schedule">
68
+ <h3>✨ Global Schedule (UTC) ✨</h3>
69
+ <div id="rows">
70
+ <div class="row"><div class="time">00:00 02:40</div><div>Dance in Front of the Library of Alexandria</div></div>
71
+ <div class="row"><div class="time">02:40 – 05:20</div><div>✨ Belly dance ✨ - sensual dance</div></div>
72
+ <div class="row"><div class="time">05:20 – 08:00</div><div>✨Belly dance ✨ Let my dance and my magic work on you</div></div>
73
+ <div class="row"><div class="time">08:00 – 10:40</div><div>Feast of Hathor</div></div>
74
+ <div class="row"><div class="time">10:40 – 13:20</div><div>Belly dance - classic dance</div></div>
75
+ <div class="row"><div class="time">13:20 – 16:00</div><div>Belly dance - christmas gift</div></div>
76
+ <div class="row"><div class="time">16:00 – 18:40</div><div>Freestyle bellydancing by Lisa Walser</div></div>
77
+ <div class="row"><div class="time">18:40 – 21:20</div><div>Belly dance - belly waves</div></div>
78
+ <div class="row"><div class="time">21:20 – 24:00</div><div>Belly dance - calm dance</div></div>
79
+ </div>
80
+ </section>
81
+ </main>
82
+
83
+ <footer>Pre-recorded performances looped 24/7 (Global UTC)</footer>
 
 
 
 
 
 
 
 
84
 
85
  <script>
86
+ const USE_UTC=true;
87
+ const VIDEOS=[
88
+ {title:"Dance in Front of the Library of Alexandria",url:"https://ik.imagekit.io/plerqlkuh/A%20dance%20in%20front%20of%20the%20Library%20of%20Alexandria.mp4",duration:155,start:0,end:2.667},
89
+ {title:"✨ Belly dance - sensual dance",url:"https://ik.imagekit.io/plerqlkuh/%E2%9C%A8%20Belly%20dance%20%E2%9C%A8%20-%20sensual%20dance.mp4",duration:113,start:2.667,end:5.333},
90
+ {title:"✨Belly dance Let my dance and my magic work on you",url:"https://ik.imagekit.io/plerqlkuh/%E2%9C%A8Belly%20dance%20%E2%9C%A8%20Let%20my%20dance%20and%20my%20magic%20work%20on%20you.mp4",duration:281,start:5.333,end:8},
91
+ {title:"Feast of Hathor",url:"https://ik.imagekit.io/hml9etthq/Feast%20of%20Hathor.mp4",duration:208,start:8,end:10.667},
92
+ {title:"Belly dance - classic dance",url:"https://ik.imagekit.io/vncybr8i6/Belly%20dance%20-%20classic%20dance.mp4?updatedAt=1755894993600",duration:252,start:10.667,end:13.333},
93
+ {title:"Belly dance - christmas gift",url:"https://ia600904.us.archive.org/28/items/belly-dance-christmas-gift/Belly%20dance%20-%20christmas%20gift.mp4",duration:399,start:13.333,end:16},
94
+ {title:"Freestyle bellydancing by Lisa Walser",url:"https://ik.imagekit.io/vncybr8i6/Freestyle%20bellydancing%20by%20Lisa%20Walser.mp4",duration:399,start:16,end:18.667},
95
+ {title:"Belly dance - belly waves",url:"https://ik.imagekit.io/vncybr8i6/Belly%20dance%20-%20belly%20waves.mp4",duration:60,start:18.667,end:21.333},
96
+ {title:"Belly dance - calm dance",url:"https://ik.imagekit.io/vncybr8i6/Belly%20dance%20-%20calm%20dance.mp4",duration:166,start:21.333,end:24}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  ];
98
+ function nowHour(){const n=new Date();return USE_UTC?n.getUTCHours()+n.getUTCMinutes()/60:n.getHours()+n.getMinutes()/60;}
99
+ function inRange(h,s,e){return h>=s&&h<e;}
100
+ function curVid(){const h=nowHour();for(const v of VIDEOS){if(inRange(h,v.start,v.end))return v;}return VIDEOS[0];}
101
+ function secFmt(s){return `${Math.floor(s/60)}:${String(s%60).padStart(2,"0")}`}
102
+ const $p=document.getElementById("player"),$t=document.getElementById("vtitle"),$m=document.getElementById("vmeta"),$chip=document.getElementById("chip"),$rows=document.querySelectorAll(".row"),$ht=document.getElementById("header-time");
103
+ function updateTimes(){const n=new Date();$ht.textContent=`Local: ${n.toLocaleTimeString()} | UTC: ${n.toUTCString().split(" ")[4]}`;$chip.textContent=`Local: ${n.toLocaleTimeString()}`;}
104
+ setInterval(updateTimes,1000);updateTimes();
105
+ function playVid(){const h=nowHour(),v=curVid();const i=VIDEOS.indexOf(v);const elapsed=((h-v.start+24)%24)*3600;const pos=Math.floor(elapsed%v.duration);
106
+ if($p.src!==v.url){$p.src=v.url;$p.load();}
107
+ $p.currentTime=pos;$p.loop=true;$p.play().catch(()=>{$p.muted=true;$p.play();});$t.textContent=v.title;$m.textContent="Duration: "+secFmt(v.duration);
108
+ $rows.forEach((r,j)=>{r.classList.toggle("active",j===i)});const ms=((v.end-h+24)%24)*3600*1000;setTimeout(playVid,ms);}
109
+ playVid();
110
+ // bubbles
111
+ function bubble(){const b=document.createElement("div");const s=20+Math.random()*60;b.className="bubble";b.style.width=`${s}px`;b.style.height=`${s}px`;b.style.left=`${Math.random()*100}vw`;b.style.animationDuration=`${15+Math.random()*20}s`;document.getElementById("bubbles").appendChild(b);setTimeout(()=>b.remove(),40000);}
112
+ setInterval(bubble,1000);
113
+ // fake viewers
114
+ const $c=document.getElementById("live-count");const BUCKETS=[{start:0,end:6,min:500,max:1500},{start:6,end:12,min:1000,max:2500},{start:12,end:18,min:2000,max:4000},{start:18,end:24,min:3000,max:5000}];
115
+ function bucket(h){return BUCKETS.find(b=>h>=b.start&&h<b.end)||BUCKETS[0];}
116
+ function clamp(n,min,max){return Math.max(min,Math.min(max,n));}
117
+ function randStep(){return(Math.random()<.5?-1:1)*(10+Math.floor(Math.random()*41));}
118
+ function delay(){return(5+Math.random()*5)*1000;}
119
+ let lc,lb,timer;function initCount(){const h=nowHour();lb=bucket(h);lc=lb.min+Math.floor((lb.max-lb.min)*(0.3+Math.random()*0.4));$c.textContent=lc.toLocaleString();}
120
+ function tick(){const h=nowHour(),b=bucket(h);if(b!==lb){lb=b;lc=clamp(lc+randStep(),b.min,b.max);}else{lc=clamp(lc+randStep(),b.min,b.max);} $c.textContent=lc.toLocaleString();timer=setTimeout(tick,delay());}
121
+ document.addEventListener("visibilitychange",()=>{if(document.hidden){if(timer)clearTimeout(timer);}else{if(!timer)timer=setTimeout(tick,delay());}});
122
+ initCount();timer=setTimeout(tick,delay());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  </script>
124
  <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Meneman/livedance" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
125
  </html>