Meneman commited on
Commit
7a521d9
·
verified ·
1 Parent(s): 9e5c920

undefined - Initial Deployment

Browse files
Files changed (2) hide show
  1. README.md +6 -4
  2. index.html +322 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Livedance
3
- emoji: 🚀
4
  colorFrom: gray
5
- colorTo: gray
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: livedance
3
+ emoji: 🐳
4
  colorFrom: gray
5
+ colorTo: green
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,322 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Belly Dance 24/7</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <style>
9
+ body {
10
+ background: linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%);
11
+ min-height: 100vh;
12
+ color: #f8f8f8;
13
+ font-family: 'Arial', sans-serif;
14
+ transition: all 0.5s ease;
15
+ }
16
+
17
+ .video-container.horizontal {
18
+ aspect-ratio: 16/9;
19
+ width: 100%;
20
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
21
+ border: 1px solid rgba(255, 215, 0, 0.2);
22
+ transition: all 0.3s ease;
23
+ }
24
+
25
+ .video-container.vertical {
26
+ aspect-ratio: 9/16;
27
+ max-width: 500px;
28
+ margin: 0 auto;
29
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
30
+ border: 1px solid rgba(255, 215, 0, 0.2);
31
+ transition: all 0.3s ease;
32
+ }
33
+
34
+ .video-container:hover {
35
+ transform: scale(1.01);
36
+ box-shadow: 0 35px 60px -12px rgba(0, 0, 0, 0.6);
37
+ }
38
+
39
+ #schedule-times > div.bg-yellow-500 {
40
+ transition: all 0.3s ease;
41
+ }
42
+
43
+ .user-time-display {
44
+ position: absolute;
45
+ bottom: 10px;
46
+ right: 10px;
47
+ color: white;
48
+ background-color: rgba(0, 0, 0, 0.5);
49
+ padding: 5px 10px;
50
+ border-radius: 4px;
51
+ font-size: 14px;
52
+ font-family: monospace;
53
+ }
54
+
55
+ /* Hide controls except volume and fullscreen */
56
+ video::-webkit-media-controls-panel {
57
+ display: flex !important;
58
+ }
59
+ video::-webkit-media-controls-play-button {
60
+ display: none !important;
61
+ }
62
+ video::-webkit-media-controls-timeline {
63
+ display: none !important;
64
+ }
65
+ video::-webkit-media-controls-current-time-display {
66
+ display: none !important;
67
+ }
68
+ video::-webkit-media-controls-time-remaining-display {
69
+ display: none !important;
70
+ }
71
+ video::-webkit-media-controls-mute-button {
72
+ display: flex !important;
73
+ }
74
+ video::-webkit-media-controls-volume-slider {
75
+ display: flex !important;
76
+ }
77
+ video::-webkit-media-controls-fullscreen-button {
78
+ display: flex !important;
79
+ }
80
+ </style>
81
+ </head>
82
+ <body class="flex flex-col min-h-screen">
83
+ <header class="py-8 px-4 text-center">
84
+ <h1 class="text-4xl md:text-5xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-yellow-300 to-yellow-500">
85
+ Belly Dance 24/7
86
+ </h1>
87
+ <p class="text-lg text-yellow-300 opacity-90 tracking-wider">
88
+ Continuous streaming of beautiful performances
89
+ </p>
90
+ <div id="header-time-display" class="text-sm text-yellow-400 opacity-80 mt-2"></div>
91
+ <div class="mt-4 h-1 w-24 mx-auto bg-gradient-to-r from-purple-500 to-yellow-500 rounded-full"></div>
92
+ </header>
93
+
94
+ <main class="flex-grow px-4 pb-8">
95
+ <div id="video-wrapper" class="mx-auto">
96
+ <div id="video-container" class="video-container bg-black rounded-lg overflow-hidden shadow-xl relative">
97
+ <video id="bellydance-video" class="w-full h-full" autoplay muted playsinline>
98
+ <div id="user-time-display" class="user-time-display"></div>
99
+ Your browser does not support the video tag.
100
+ </video>
101
+ </div>
102
+ <div id="video-info" class="mt-6 text-center">
103
+ <h2 id="video-title" class="text-2xl md:text-3xl font-medium mb-2 bg-clip-text text-transparent bg-gradient-to-r from-yellow-300 to-yellow-400"></h2>
104
+ <p id="video-time" class="text-sm text-yellow-300 opacity-90 tracking-wider"></p>
105
+ <div class="mt-3 h-1 w-16 mx-auto bg-gradient-to-r from-purple-400 to-yellow-400 rounded-full opacity-70"></div>
106
+ </div>
107
+ <div id="schedule" class="mt-8 max-w-md mx-auto bg-black bg-opacity-30 p-6 rounded-lg">
108
+ <h3 class="text-xl font-bold mb-4 text-yellow-300 tracking-wider">✨ Today's Schedule ✨</h3>
109
+ <div id="schedule-times" class="text-sm space-y-3">
110
+ <div class="flex items-start">
111
+ <div class="w-24 font-mono text-yellow-400">21:00 – 23:35</div>
112
+ <div class="flex-1">
113
+ <div class="font-medium">Dance in Front of the Library of Alexandria</div>
114
+ <div class="text-yellow-300 opacity-80 text-xs">Duration: 02:35</div>
115
+ </div>
116
+ </div>
117
+ <div class="h-px bg-gradient-to-r from-transparent via-yellow-500/30 to-transparent"></div>
118
+ <div class="flex items-start">
119
+ <div class="w-24 font-mono text-yellow-400">23:35 – 01:28</div>
120
+ <div class="flex-1">
121
+ <div class="font-medium">✨ Belly Dance ✨ - Sensual Dance</div>
122
+ <div class="text-yellow-300 opacity-80 text-xs">Duration: 01:53</div>
123
+ </div>
124
+ </div>
125
+ <div class="h-px bg-gradient-to-r from-transparent via-yellow-500/30 to-transparent"></div>
126
+ <div class="flex items-start">
127
+ <div class="w-24 font-mono text-yellow-400">01:28 – 06:09</div>
128
+ <div class="flex-1">
129
+ <div class="font-medium">✨ Belly Dance ✨ Let My Dance and My Magic Work on You</div>
130
+ <div class="text-yellow-300 opacity-80 text-xs">Duration: 04:41</div>
131
+ </div>
132
+ </div>
133
+ <div class="h-px bg-gradient-to-r from-transparent via-yellow-500/30 to-transparent"></div>
134
+ <div class="flex items-start">
135
+ <div class="w-24 font-mono text-yellow-400">06:09 – 21:00</div>
136
+ <div class="flex-1">
137
+ <div class="font-medium">Feast of Hathor</div>
138
+ <div class="text-yellow-300 opacity-80 text-xs">Duration: 03:28</div>
139
+ </div>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ </main>
145
+
146
+ <footer class="py-6 px-4 text-center">
147
+ <p class="text-sm text-yellow-300 opacity-70 tracking-wider">
148
+ Pre-recorded performances looped 24/7
149
+ </p>
150
+ <div class="mt-3 h-px w-32 mx-auto bg-gradient-to-r from-transparent via-yellow-500 to-transparent opacity-30"></div>
151
+ </footer>
152
+
153
+ <script>
154
+ document.addEventListener('DOMContentLoaded', function() {
155
+ const videoElement = document.getElementById('bellydance-video');
156
+ const videoContainer = document.getElementById('video-container');
157
+ const videoTitle = document.getElementById('video-title');
158
+ const videoTime = document.getElementById('video-time');
159
+
160
+ let videos = [
161
+ {
162
+ id: 1,
163
+ url: "https://www.dropbox.com/scl/fi/cdla6akuljge32vgy07ym/A-dance-in-front-of-the-Library-of-Alexandria.mp4?rlkey=qklfnixme2cnc271hyueedgz4&st=uatux3wm&dl=1",
164
+ title: "Dance in Front of the Library of Alexandria",
165
+ duration: 155, // 2:35 in seconds
166
+ orientation: "horizontal",
167
+ startHour: 21, // 21:00 UTC
168
+ endHour: 23.5833 // 23:35 UTC (35/60 = 0.5833)
169
+ },
170
+ {
171
+ id: 2,
172
+ url: "https://www.dropbox.com/scl/fi/5y9pie14fgq9h87lqcfgb/Belly-dance-sensual-dance.mp4?rlkey=t0hlldemyzqlvp3lzqugh5w5i&st=o3r4pvp6&dl=1",
173
+ title: "✨ Belly Dance ✨ - Sensual Dance",
174
+ duration: 113, // 1:53 in seconds
175
+ orientation: "horizontal",
176
+ startHour: 23.5833, // 23:35 UTC
177
+ endHour: 1.4667 // 01:28 UTC (28/60 = 0.4667)
178
+ },
179
+ {
180
+ id: 3,
181
+ url: "https://www.dropbox.com/scl/fi/guaawrmicatbah76ot22m/Belly-dance-Let-my-dance-and-my-magic-work-on-you.mp4?rlkey=9av0btbgbk6kws8ge1u37s6ab&st=8yyh9c3f&dl=1",
182
+ title: "✨ Belly Dance ✨ Let My Dance and My Magic Work on You",
183
+ duration: 281, // 4:41 in seconds
184
+ orientation: "horizontal",
185
+ startHour: 1.4667, // 01:28 UTC
186
+ endHour: 6.15 // 06:09 UTC (9/60 = 0.15)
187
+ },
188
+ {
189
+ id: 4,
190
+ url: "https://www.dropbox.com/scl/fi/re9c5joysr8vhvqvhll4p/Feast-of-Hathor.mp4?rlkey=a0k48nt64q3o6nggrqivbw06r&st=4me6n4ka&dl=1",
191
+ title: "Feast of Hathor",
192
+ duration: 208, // 3:28 in seconds
193
+ orientation: "horizontal",
194
+ startHour: 6.15, // 06:09 UTC
195
+ endHour: 21 // 21:00 UTC
196
+ }
197
+ ];
198
+ let currentVideoIndex = 0;
199
+ let currentUserTime = new Date(); // Variable to store current time
200
+
201
+ // Play initial video
202
+ playScheduledVideo();
203
+
204
+ // Update time display continuously
205
+ function updateTimeDisplay() {
206
+ currentUserTime = new Date();
207
+ const utcTimeString = currentUserTime.toUTCString().split(' ')[4];
208
+ const localTimeString = currentUserTime.toLocaleTimeString();
209
+ const dateString = currentUserTime.toDateString();
210
+ document.getElementById('header-time-display').textContent = `${dateString} | Local: ${localTimeString} | UTC: ${utcTimeString}`;
211
+ document.getElementById('user-time-display').textContent = `Local: ${localTimeString}`;
212
+ }
213
+
214
+ // Update time every second
215
+ setInterval(updateTimeDisplay, 1000);
216
+ updateTimeDisplay(); // Initial call
217
+
218
+ // Highlight current schedule item
219
+ function highlightCurrentScheduleItem(index) {
220
+ const scheduleItems = document.querySelectorAll('#schedule-times > div');
221
+ scheduleItems.forEach((item, i) => {
222
+ if (i === index * 2) { // Each video is every second div (0, 2, 4...)
223
+ item.classList.add('bg-yellow-500', 'bg-opacity-10', 'rounded-lg');
224
+ item.classList.remove('bg-transparent');
225
+ } else {
226
+ item.classList.remove('bg-yellow-500', 'bg-opacity-10', 'rounded-lg');
227
+ }
228
+ });
229
+ }
230
+
231
+ // Play video based on UTC time (same for everyone worldwide)
232
+ function playScheduledVideo() {
233
+ const now = new Date();
234
+ const currentHour = now.getUTCHours() + now.getUTCMinutes() / 60;
235
+
236
+ // Find which video should be playing now based on hour
237
+ let videoIndex = 0;
238
+ for (let i = 0; i < videos.length; i++) {
239
+ if (currentHour >= videos[i].startHour && currentHour < videos[i].endHour) {
240
+ videoIndex = i;
241
+ break;
242
+ }
243
+ }
244
+
245
+ currentVideoIndex = videoIndex;
246
+ const video = videos[currentVideoIndex];
247
+
248
+ // Calculate time elapsed in current time slot
249
+ const timeElapsedInSlot = (currentHour - video.startHour) * 3600;
250
+ const loopsCompleted = Math.floor(timeElapsedInSlot / video.duration);
251
+ const videoCurrentPosition = timeElapsedInSlot % video.duration;
252
+
253
+ // Set video source and metadata
254
+ videoElement.src = video.url;
255
+ videoElement.load();
256
+
257
+ // Set orientation class
258
+ videoContainer.className = `video-container ${video.orientation} bg-black rounded-lg overflow-hidden shadow-xl`;
259
+
260
+ // Set video info
261
+ videoTitle.textContent = video.title;
262
+
263
+ // Format duration
264
+ const durationMinutes = Math.floor(video.duration / 60);
265
+ const durationSeconds = video.duration % 60;
266
+ videoTime.textContent = `Duration: ${durationMinutes}:${durationSeconds.toString().padStart(2, '0')}`;
267
+
268
+ // Highlight current schedule item
269
+ highlightCurrentScheduleItem(videoIndex);
270
+
271
+ // Play video from calculated position
272
+ videoElement.currentTime = videoCurrentPosition;
273
+ videoElement.loop = true;
274
+ videoElement.play().catch(e => {
275
+ console.log('Auto-play prevented:', e);
276
+ // Fallback: mute and try again
277
+ videoElement.muted = true;
278
+ videoElement.play();
279
+ });
280
+
281
+ // Calculate time until next video should start
282
+ const timeUntilNextVideo = (video.endHour - currentHour) * 3600 * 1000;
283
+ setTimeout(playScheduledVideo, timeUntilNextVideo);
284
+ }
285
+
286
+ // Handle video end (shouldn't be needed with loop=true, but just in case)
287
+ videoElement.addEventListener('ended', function() {
288
+ const now = new Date();
289
+ const currentHour = now.getUTCHours() + now.getUTCMinutes() / 60;
290
+ const currentVideo = videos[currentVideoIndex];
291
+
292
+ // If still within current video's time slot, restart it
293
+ if (currentHour >= currentVideo.startHour && currentHour < currentVideo.endHour) {
294
+ videoElement.currentTime = 0;
295
+ videoElement.play();
296
+ } else {
297
+ // Otherwise switch to scheduled video
298
+ playScheduledVideo();
299
+ }
300
+ });
301
+
302
+ // Preload all videos for smoother transitions
303
+ function preloadVideos() {
304
+ videos.forEach(video => {
305
+ const preload = document.createElement('video');
306
+ preload.src = video.url;
307
+ preload.preload = 'auto';
308
+ });
309
+ }
310
+ preloadVideos();
311
+
312
+ // Initial volume setup (muted by default for autoplay)
313
+ videoElement.muted = true;
314
+
315
+ // Toggle mute when clicking the video
316
+ videoElement.addEventListener('click', function() {
317
+ videoElement.muted = !videoElement.muted;
318
+ });
319
+ });
320
+ </script>
321
+ <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>
322
+ </html>