fyremael commited on
Commit
fbd5ed3
·
verified ·
1 Parent(s): 68bc7d5

Add 2 files

Browse files
Files changed (2) hide show
  1. README.md +7 -5
  2. index.html +897 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Botrad Io
3
- emoji: 🌍
4
- colorFrom: red
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: botrad-io
3
+ emoji: 🐳
4
+ colorFrom: blue
5
+ colorTo: blue
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,897 @@
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>BotRad.io AI Radio | Future of Radio</title>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
8
+ <style>
9
+ :root {
10
+ --primary: #00e0ff;
11
+ --secondary: #7b00ff;
12
+ --dark: #141414;
13
+ --darker: #0a0a0a;
14
+ --light: #f0f0f0;
15
+ --glass: rgba(20, 20, 20, 0.5);
16
+ }
17
+
18
+ * {
19
+ margin: 0;
20
+ padding: 0;
21
+ box-sizing: border-box;
22
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
23
+ }
24
+
25
+ body {
26
+ background: linear-gradient(to right bottom, var(--darker), var(--dark));
27
+ color: var(--light);
28
+ min-height: 100vh;
29
+ display: flex;
30
+ justify-content: center;
31
+ align-items: center;
32
+ overflow-x: hidden;
33
+ position: relative;
34
+ }
35
+
36
+ body::before {
37
+ content: '';
38
+ position: absolute;
39
+ top: 0;
40
+ left: 0;
41
+ width: 100%;
42
+ height: 100%;
43
+ background: radial-gradient(circle at 30% 50%, var(--secondary), transparent 70%);
44
+ opacity: 0.2;
45
+ z-index: -1;
46
+ }
47
+
48
+ body::after {
49
+ content: '';
50
+ position: absolute;
51
+ top: 0;
52
+ right: 0;
53
+ width: 100%;
54
+ height: 100%;
55
+ background: radial-gradient(circle at 70% 50%, var(--primary), transparent 70%);
56
+ opacity: 0.2;
57
+ z-index: -1;
58
+ }
59
+
60
+ .container {
61
+ width: 90%;
62
+ max-width: 1200px;
63
+ background: var(--glass);
64
+ backdrop-filter: blur(10px);
65
+ -webkit-backdrop-filter: blur(10px);
66
+ border-radius: 20px;
67
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
68
+ overflow: hidden;
69
+ border: 1px solid rgba(255, 255, 255, 0.1);
70
+ transition: all 0.3s ease;
71
+ }
72
+
73
+ .container:hover {
74
+ box-shadow: 0 35px 60px -10px rgba(0, 224, 255, 0.3);
75
+ }
76
+
77
+ .header {
78
+ background: linear-gradient(to right, var(--secondary), var(--primary));
79
+ padding: 1.5rem;
80
+ text-align: center;
81
+ position: relative;
82
+ overflow: hidden;
83
+ }
84
+
85
+ .header::after {
86
+ content: '';
87
+ position: absolute;
88
+ top: 0;
89
+ left: 0;
90
+ width: 100%;
91
+ height: 100%;
92
+ background: url("data:image/svg+xml,%3Csvg viewBox='0 0 100 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 20 L100 0 L100 20 Z' fill='rgba(0,0,0,0.1)' /%3E%3C/svg%3E");
93
+ opacity: 0.5;
94
+ }
95
+
96
+ .header h1 {
97
+ font-size: 2.5rem;
98
+ font-weight: 800;
99
+ margin-bottom: 0.5rem;
100
+ background: linear-gradient(to right, var(--light), #c8e8ff);
101
+ -webkit-background-clip: text;
102
+ background-clip: text;
103
+ color: transparent;
104
+ position: relative;
105
+ z-index: 1;
106
+ text-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
107
+ }
108
+
109
+ .header p {
110
+ font-size: 1rem;
111
+ opacity: 0.9;
112
+ color: var(--light);
113
+ position: relative;
114
+ z-index: 1;
115
+ font-weight: 300;
116
+ letter-spacing: 1px;
117
+ }
118
+
119
+ .player-container {
120
+ display: flex;
121
+ flex-direction: column;
122
+ padding: 2rem;
123
+ gap: 2rem;
124
+ }
125
+
126
+ .station-info {
127
+ display: flex;
128
+ flex-direction: column;
129
+ align-items: center;
130
+ text-align: center;
131
+ gap: 1rem;
132
+ }
133
+
134
+ .station-cover {
135
+ width: 200px;
136
+ height: 200px;
137
+ border-radius: 15px;
138
+ object-fit: cover;
139
+ border: 3px solid rgba(255, 255, 255, 0.1);
140
+ box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.5);
141
+ transition: transform 0.3s ease;
142
+ position: relative;
143
+ overflow: hidden;
144
+ }
145
+
146
+ .station-cover img {
147
+ width: 100%;
148
+ height: 100%;
149
+ object-fit: cover;
150
+ }
151
+
152
+ .station-cover::after {
153
+ content: '';
154
+ position: absolute;
155
+ top: 0;
156
+ left: 0;
157
+ width: 100%;
158
+ height: 100%;
159
+ background: radial-gradient(circle at center, transparent 30%, rgba(0, 0, 0, 0.5) 100%);
160
+ }
161
+
162
+ .station-cover:hover {
163
+ transform: scale(1.05);
164
+ }
165
+
166
+ .station-text {
167
+ display: flex;
168
+ flex-direction: column;
169
+ gap: 0.5rem;
170
+ }
171
+
172
+ .station-name {
173
+ font-size: 1.8rem;
174
+ font-weight: 600;
175
+ background: linear-gradient(to right, var(--primary), var(--secondary));
176
+ -webkit-background-clip: text;
177
+ background-clip: text;
178
+ color: transparent;
179
+ }
180
+
181
+ .station-desc {
182
+ font-size: 0.9rem;
183
+ opacity: 0.8;
184
+ font-weight: 300;
185
+ max-width: 500px;
186
+ }
187
+
188
+ .controls {
189
+ display: flex;
190
+ flex-direction: column;
191
+ gap: 1.5rem;
192
+ }
193
+
194
+ .main-controls {
195
+ display: flex;
196
+ justify-content: center;
197
+ align-items: center;
198
+ gap: 2rem;
199
+ }
200
+
201
+ .control-btn {
202
+ background: rgba(255, 255, 255, 0.1);
203
+ border: none;
204
+ width: 50px;
205
+ height: 50px;
206
+ border-radius: 50%;
207
+ color: var(--light);
208
+ font-size: 1.2rem;
209
+ cursor: pointer;
210
+ transition: all 0.3s ease;
211
+ display: flex;
212
+ justify-content: center;
213
+ align-items: center;
214
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
215
+ position: relative;
216
+ overflow: hidden;
217
+ }
218
+
219
+ .control-btn::after {
220
+ content: '';
221
+ position: absolute;
222
+ top: 0;
223
+ left: 0;
224
+ width: 100%;
225
+ height: 100%;
226
+ background: linear-gradient(to right, var(--primary), var(--secondary));
227
+ opacity: 0;
228
+ transition: opacity 0.3s ease;
229
+ z-index: -1;
230
+ }
231
+
232
+ .control-btn:hover {
233
+ transform: translateY(-5px);
234
+ color: white;
235
+ }
236
+
237
+ .control-btn:hover::after {
238
+ opacity: 1;
239
+ }
240
+
241
+ .play-btn {
242
+ width: 70px;
243
+ height: 70px;
244
+ font-size: 1.8rem;
245
+ background: linear-gradient(to right, var(--primary), var(--secondary));
246
+ color: white;
247
+ }
248
+
249
+ .play-btn:hover {
250
+ transform: scale(1.1);
251
+ }
252
+
253
+ .progress-container {
254
+ display: flex;
255
+ flex-direction: column;
256
+ gap: 0.5rem;
257
+ width: 100%;
258
+ }
259
+
260
+ .time-info {
261
+ display: flex;
262
+ justify-content: space-between;
263
+ font-size: 0.8rem;
264
+ opacity: 0.7;
265
+ }
266
+
267
+ .progress-bar {
268
+ height: 6px;
269
+ width: 100%;
270
+ background: rgba(255, 255, 255, 0.1);
271
+ border-radius: 3px;
272
+ cursor: pointer;
273
+ position: relative;
274
+ overflow: hidden;
275
+ }
276
+
277
+ .progress-bar::before {
278
+ content: '';
279
+ position: absolute;
280
+ top: 0;
281
+ left: 0;
282
+ height: 100%;
283
+ width: var(--progress, 0%);
284
+ background: linear-gradient(to right, var(--primary), var(--secondary));
285
+ border-radius: 3px;
286
+ transition: width 0.1s linear;
287
+ }
288
+
289
+ .volume-container {
290
+ display: flex;
291
+ justify-content: center;
292
+ align-items: center;
293
+ gap: 1rem;
294
+ }
295
+
296
+ .volume-icon {
297
+ color: var(--light);
298
+ opacity: 0.8;
299
+ }
300
+
301
+ .volume-slider {
302
+ width: 100px;
303
+ height: 4px;
304
+ background: rgba(255, 255, 255, 0.1);
305
+ border-radius: 2px;
306
+ appearance: none;
307
+ outline: none;
308
+ cursor: pointer;
309
+ }
310
+
311
+ .volume-slider::-webkit-slider-thumb {
312
+ appearance: none;
313
+ width: 12px;
314
+ height: 12px;
315
+ border-radius: 50%;
316
+ background: var(--primary);
317
+ cursor: pointer;
318
+ transition: all 0.2s ease;
319
+ }
320
+
321
+ .volume-slider::-webkit-slider-thumb:hover {
322
+ background: var(--secondary);
323
+ transform: scale(1.2);
324
+ }
325
+
326
+ .stations {
327
+ display: grid;
328
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
329
+ gap: 1rem;
330
+ margin-top: 1rem;
331
+ }
332
+
333
+ .station {
334
+ background: rgba(255, 255, 255, 0.05);
335
+ border-radius: 10px;
336
+ padding: 1rem;
337
+ display: flex;
338
+ flex-direction: column;
339
+ align-items: center;
340
+ gap: 0.5rem;
341
+ cursor: pointer;
342
+ transition: all 0.3s ease;
343
+ border: 1px solid rgba(255, 255, 255, 0.05);
344
+ }
345
+
346
+ .station:hover {
347
+ background: rgba(255, 255, 255, 0.1);
348
+ transform: translateY(-5px);
349
+ box-shadow: 0 10px 20px -10px rgba(0, 224, 255, 0.2);
350
+ }
351
+
352
+ .station.active {
353
+ background: rgba(0, 224, 255, 0.1);
354
+ border: 1px solid var(--primary);
355
+ position: relative;
356
+ }
357
+
358
+ .station.active::after {
359
+ content: '🔊';
360
+ position: absolute;
361
+ top: 5px;
362
+ right: 5px;
363
+ font-size: 0.8rem;
364
+ }
365
+
366
+ .station-avatar {
367
+ width: 50px;
368
+ height: 50px;
369
+ border-radius: 50%;
370
+ background: linear-gradient(to right, var(--primary), var(--secondary));
371
+ display: flex;
372
+ justify-content: center;
373
+ align-items: center;
374
+ font-size: 1.2rem;
375
+ }
376
+
377
+ .station-title {
378
+ font-size: 0.9rem;
379
+ text-align: center;
380
+ font-weight: 500;
381
+ }
382
+
383
+ .wave-animation {
384
+ display: flex;
385
+ justify-content: center;
386
+ align-items: center;
387
+ gap: 3px;
388
+ height: 30px;
389
+ margin-top: 0.5rem;
390
+ }
391
+
392
+ .wave-bar {
393
+ width: 3px;
394
+ height: 100%;
395
+ background: var(--primary);
396
+ border-radius: 3px;
397
+ animation: wave 1.5s ease-in-out infinite;
398
+ transform-origin: bottom;
399
+ }
400
+
401
+ .wave-bar:nth-child(1) {
402
+ animation-delay: 0.1s;
403
+ height: 60%;
404
+ }
405
+
406
+ .wave-bar:nth-child(2) {
407
+ animation-delay: 0.3s;
408
+ height: 100%;
409
+ }
410
+
411
+ .wave-bar:nth-child(3) {
412
+ animation-delay: 0.5s;
413
+ height: 80%;
414
+ }
415
+
416
+ .wave-bar:nth-child(4) {
417
+ animation-delay: 0.2s;
418
+ height: 70%;
419
+ }
420
+
421
+ .wave-bar:nth-child(5) {
422
+ animation-delay: 0.4s;
423
+ height: 90%;
424
+ }
425
+
426
+ @keyframes wave {
427
+ 0%, 100% {
428
+ transform: scaleY(0.8);
429
+ }
430
+ 50% {
431
+ transform: scaleY(1.5);
432
+ }
433
+ }
434
+
435
+ .footer {
436
+ padding: 1.5rem;
437
+ text-align: center;
438
+ background: rgba(0, 0, 0, 0.2);
439
+ font-size: 0.8rem;
440
+ opacity: 0.7;
441
+ }
442
+
443
+ /* Radio waves animation */
444
+ .radio-waves {
445
+ position: absolute;
446
+ width: 300px;
447
+ height: 300px;
448
+ border-radius: 50%;
449
+ pointer-events: none;
450
+ z-index: -1;
451
+ }
452
+
453
+ .wave {
454
+ position: absolute;
455
+ top: 50%;
456
+ left: 50%;
457
+ transform: translate(-50%, -50%);
458
+ border: 2px solid var(--primary);
459
+ border-radius: 50%;
460
+ opacity: 0;
461
+ animation: ripple 3s infinite;
462
+ }
463
+
464
+ .wave:nth-child(1) {
465
+ width: 10rem;
466
+ height: 10rem;
467
+ animation-delay: 0s;
468
+ }
469
+
470
+ .wave:nth-child(2) {
471
+ width: 15rem;
472
+ height: 15rem;
473
+ animation-delay: 1s;
474
+ }
475
+
476
+ .wave:nth-child(3) {
477
+ width: 20rem;
478
+ height: 20rem;
479
+ animation-delay: 2s;
480
+ }
481
+
482
+ @keyframes ripple {
483
+ 0% {
484
+ width: 10rem;
485
+ height: 10rem;
486
+ opacity: 0.4;
487
+ }
488
+ 100% {
489
+ width: 30rem;
490
+ height: 30rem;
491
+ opacity: 0;
492
+ }
493
+ }
494
+
495
+ /* Responsive design */
496
+ @media (max-width: 768px) {
497
+ .container {
498
+ width: 95%;
499
+ }
500
+
501
+ .header h1 {
502
+ font-size: 2rem;
503
+ }
504
+
505
+ .stations {
506
+ grid-template-columns: repeat(2, 1fr);
507
+ }
508
+
509
+ .station-cover {
510
+ width: 150px;
511
+ height: 150px;
512
+ }
513
+ }
514
+
515
+ @media (max-width: 480px) {
516
+ .player-container {
517
+ padding: 1.5rem;
518
+ }
519
+
520
+ .main-controls {
521
+ gap: 1rem;
522
+ }
523
+
524
+ .control-btn {
525
+ width: 40px;
526
+ height: 40px;
527
+ font-size: 1rem;
528
+ }
529
+
530
+ .play-btn {
531
+ width: 60px;
532
+ height: 60px;
533
+ font-size: 1.5rem;
534
+ }
535
+
536
+ .stations {
537
+ grid-template-columns: 1fr;
538
+ }
539
+ }
540
+
541
+ /* Now playing animation */
542
+ .now-playing {
543
+ display: flex;
544
+ justify-content: center;
545
+ align-items: center;
546
+ gap: 0.5rem;
547
+ margin-top: 0.5rem;
548
+ font-size: 0.8rem;
549
+ color: var(--primary);
550
+ opacity: 0.8;
551
+ text-transform: uppercase;
552
+ letter-spacing: 1px;
553
+ }
554
+
555
+ .now-playing span {
556
+ width: 8px;
557
+ height: 8px;
558
+ background: var(--primary);
559
+ border-radius: 50%;
560
+ display: inline-block;
561
+ animation: pulse 1.5s infinite;
562
+ }
563
+
564
+ .now-playing span:nth-child(1) {
565
+ animation-delay: 0s;
566
+ }
567
+
568
+ .now-playing span:nth-child(2) {
569
+ animation-delay: 0.3s;
570
+ }
571
+
572
+ .now-playing span:nth-child(3) {
573
+ animation-delay: 0.6s;
574
+ }
575
+
576
+ @keyframes pulse {
577
+ 0%, 100% {
578
+ transform: scale(0.8);
579
+ opacity: 0.5;
580
+ }
581
+ 50% {
582
+ transform: scale(1.2);
583
+ opacity: 1;
584
+ }
585
+ }
586
+ </style>
587
+ </head>
588
+ <body>
589
+ <div class="container">
590
+ <div class="header">
591
+ <h1>BotRad.io</h1>
592
+ <p>The Future of AI-Powered Radio Streaming</p>
593
+ </div>
594
+
595
+ <div class="player-container">
596
+ <div class="station-info">
597
+ <div class="station-cover">
598
+ <img src="https://source.unsplash.com/random/400x400/?music,technology" alt="Station Cover">
599
+ </div>
600
+ <div class="station-text">
601
+ <h2 class="station-name">Quantum Beats</h2>
602
+ <p class="station-desc">AI-generated electronic music with futuristic soundscapes</p>
603
+ <div class="now-playing">
604
+ <span></span>
605
+ <span></span>
606
+ <span></span>
607
+ &nbsp;Now Playing
608
+ </div>
609
+ </div>
610
+
611
+ <div class="wave-animation">
612
+ <div class="wave-bar"></div>
613
+ <div class="wave-bar"></div>
614
+ <div class="wave-bar"></div>
615
+ <div class="wave-bar"></div>
616
+ <div class="wave-bar"></div>
617
+ </div>
618
+ </div>
619
+
620
+ <div class="controls">
621
+ <div class="progress-container">
622
+ <div class="progress-bar" id="progressBar"></div>
623
+ <div class="time-info">
624
+ <span id="currentTime">0:00</span>
625
+ <span id="totalTime">3:42</span>
626
+ </div>
627
+ </div>
628
+
629
+ <div class="main-controls">
630
+ <button class="control-btn" id="prevBtn">
631
+ <i class="fas fa-step-backward"></i>
632
+ </button>
633
+ <button class="control-btn play-btn" id="playBtn">
634
+ <i class="fas fa-play" id="playIcon"></i>
635
+ </button>
636
+ <button class="control-btn" id="nextBtn">
637
+ <i class="fas fa-step-forward"></i>
638
+ </button>
639
+ </div>
640
+
641
+ <div class="volume-container">
642
+ <i class="fas fa-volume-up volume-icon"></i>
643
+ <input type="range" class="volume-slider" id="volumeSlider" min="0" max="100" value="80">
644
+ </div>
645
+ </div>
646
+
647
+ <h3 style="margin-top: 1rem; text-align: center; font-weight: 400;">AI Stations</h3>
648
+ <div class="stations">
649
+ <div class="station active" data-id="1">
650
+ <div class="station-avatar">
651
+ <i class="fas fa-atom"></i>
652
+ </div>
653
+ <h4 class="station-title">Quantum Beats</h4>
654
+ </div>
655
+ <div class="station" data-id="2">
656
+ <div class="station-avatar">
657
+ <i class="fas fa-brain"></i>
658
+ </div>
659
+ <h4 class="station-title">Neural Waves</h4>
660
+ </div>
661
+ <div class="station" data-id="3">
662
+ <div class="station-avatar">
663
+ <i class="fas fa-robot"></i>
664
+ </div>
665
+ <h4 class="station-title">Synthetic Soul</h4>
666
+ </div>
667
+ <div class="station" data-id="4">
668
+ <div class="station-avatar">
669
+ <i class="fas fa-code"></i>
670
+ </div>
671
+ <h4 class="station-title">Algorithm Jazz</h4>
672
+ </div>
673
+ <div class="station" data-id="5">
674
+ <div class="station-avatar">
675
+ <i class="fas fa-cloud-moon"></i>
676
+ </div>
677
+ <h4 class="station-title">Dream Generator</h4>
678
+ </div>
679
+ <div class="station" data-id="6">
680
+ <div class="station-avatar">
681
+ <i class="fas fa-meteor"></i>
682
+ </div>
683
+ <h4 class="station-title">Cosmic Vibes</h4>
684
+ </div>
685
+ </div>
686
+ </div>
687
+
688
+ <div class="footer">
689
+ © 2023 BotRad.io AI Radio | Made with <i class="fas fa-heart" style="color: #ff3366;"></i> by AI
690
+ </div>
691
+ </div>
692
+
693
+ <div class="radio-waves">
694
+ <div class="wave"></div>
695
+ <div class="wave"></div>
696
+ <div class="wave"></div>
697
+ </div>
698
+
699
+ <script>
700
+ document.addEventListener('DOMContentLoaded', function() {
701
+ // DOM Elements
702
+ const playBtn = document.getElementById('playBtn');
703
+ const playIcon = document.getElementById('playIcon');
704
+ const prevBtn = document.getElementById('prevBtn');
705
+ const nextBtn = document.getElementById('nextBtn');
706
+ const progressBar = document.getElementById('progressBar');
707
+ const currentTimeEl = document.getElementById('currentTime');
708
+ const totalTimeEl = document.getElementById('totalTime');
709
+ const volumeSlider = document.getElementById('volumeSlider');
710
+ const stations = document.querySelectorAll('.station');
711
+ const stationCover = document.querySelector('.station-cover img');
712
+ const stationName = document.querySelector('.station-name');
713
+ const stationDesc = document.querySelector('.station-desc');
714
+ const waveAnimation = document.querySelector('.wave-animation');
715
+
716
+ // Station data
717
+ const stationData = [
718
+ {
719
+ id: 1,
720
+ name: "Quantum Beats",
721
+ description: "AI-generated electronic music with futuristic soundscapes",
722
+ cover: "https://source.unsplash.com/random/400x400/?technology,future",
723
+ audio: "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
724
+ },
725
+ {
726
+ id: 2,
727
+ name: "Neural Waves",
728
+ description: "Brainwave synchronizing ambient for deep focus",
729
+ cover: "https://source.unsplash.com/random/400x400/?brain,science",
730
+ audio: "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
731
+ },
732
+ {
733
+ id: 3,
734
+ name: "Synthetic Soul",
735
+ description: "AI-composed emotional music that feels human",
736
+ cover: "https://source.unsplash.com/random/400x400/?robot,art",
737
+ audio: "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
738
+ },
739
+ {
740
+ id: 4,
741
+ name: "Algorithm Jazz",
742
+ description: "Machine learning jazz improvisation in real-time",
743
+ cover: "https://source.unsplash.com/random/400x400/?jazz,code",
744
+ audio: "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
745
+ },
746
+ {
747
+ id: 5,
748
+ name: "Dream Generator",
749
+ description: "Hypnotic soundscapes for lucid dreaming",
750
+ cover: "https://source.unsplash.com/random/400x400/?dream,space",
751
+ audio: "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
752
+ },
753
+ {
754
+ id: 6,
755
+ name: "Cosmic Vibes",
756
+ description: "Music generated from astronomical data patterns",
757
+ cover: "https://source.unsplash.com/random/400x400/?universe,stars",
758
+ audio: "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
759
+ }
760
+ ];
761
+
762
+ // Audio context
763
+ let audio = new Audio();
764
+ let isPlaying = false;
765
+ let currentStation = 1;
766
+ let updateTimeInterval;
767
+
768
+ // Load station
769
+ function loadStation(stationId) {
770
+ const station = stationData.find(s => s.id === stationId);
771
+ if (!station) return;
772
+
773
+ currentStation = stationId;
774
+ audio.src = station.audio;
775
+ stationCover.src = station.cover;
776
+ stationName.textContent = station.name;
777
+ stationDesc.textContent = station.description;
778
+
779
+ // Update active station
780
+ stations.forEach(s => {
781
+ if (parseInt(s.dataset.id) === stationId) {
782
+ s.classList.add('active');
783
+ } else {
784
+ s.classList.remove('active');
785
+ }
786
+ });
787
+
788
+ // Play if already playing
789
+ if (isPlaying) {
790
+ audio.play();
791
+ }
792
+ }
793
+
794
+ // Play/Pause
795
+ function togglePlay() {
796
+ if (isPlaying) {
797
+ audio.pause();
798
+ playIcon.classList.replace('fa-pause', 'fa-play');
799
+ waveAnimation.style.opacity = '0.5';
800
+ } else {
801
+ audio.play();
802
+ playIcon.classList.replace('fa-play', 'fa-pause');
803
+ waveAnimation.style.opacity = '1';
804
+ }
805
+ isPlaying = !isPlaying;
806
+ }
807
+
808
+ // Update progress bar
809
+ function updateProgress() {
810
+ const { currentTime, duration } = audio;
811
+ const progressPercent = (currentTime / duration) * 100;
812
+ progressBar.style.setProperty('--progress', `${progressPercent}%`);
813
+
814
+ // Format time
815
+ const formatTime = (time) => {
816
+ const minutes = Math.floor(time / 60);
817
+ const seconds = Math.floor(time % 60);
818
+ return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
819
+ };
820
+
821
+ currentTimeEl.textContent = formatTime(currentTime);
822
+
823
+ // Update total time if not set
824
+ if (!totalTimeEl.dataset.set || isNaN(duration)) {
825
+ totalTimeEl.textContent = formatTime(duration);
826
+ totalTimeEl.dataset.set = 'true';
827
+ }
828
+ }
829
+
830
+ // Set progress
831
+ function setProgress(e) {
832
+ const width = this.clientWidth;
833
+ const clickX = e.offsetX;
834
+ const duration = audio.duration;
835
+ audio.currentTime = (clickX / width) * duration;
836
+ }
837
+
838
+ // Change volume
839
+ function setVolume() {
840
+ audio.volume = this.value / 100;
841
+ }
842
+
843
+ // Change station
844
+ function changeStation(stationId) {
845
+ loadStation(stationId);
846
+ if (isPlaying) {
847
+ togglePlay();
848
+ setTimeout(togglePlay, 100);
849
+ }
850
+ }
851
+
852
+ // Previous station
853
+ function prevStation() {
854
+ let newStation = currentStation - 1;
855
+ if (newStation < 1) newStation = stationData.length;
856
+ changeStation(newStation);
857
+ }
858
+
859
+ // Next station
860
+ function nextStation() {
861
+ let newStation = currentStation + 1;
862
+ if (newStation > stationData.length) newStation = 1;
863
+ changeStation(newStation);
864
+ }
865
+
866
+ // Event Listeners
867
+ playBtn.addEventListener('click', togglePlay);
868
+ prevBtn.addEventListener('click', prevStation);
869
+ nextBtn.addEventListener('click', nextStation);
870
+ progressBar.addEventListener('click', setProgress);
871
+ volumeSlider.addEventListener('input', setVolume);
872
+
873
+ stations.forEach(station => {
874
+ station.addEventListener('click', function() {
875
+ const stationId = parseInt(this.dataset.id);
876
+ changeStation(stationId);
877
+ });
878
+ });
879
+
880
+ audio.addEventListener('timeupdate', updateProgress);
881
+ audio.addEventListener('ended', nextStation);
882
+ audio.addEventListener('canplay', function() {
883
+ if (isPlaying) {
884
+ audio.play();
885
+ }
886
+ });
887
+
888
+ // Initialize
889
+ loadStation(currentStation);
890
+ audio.volume = volumeSlider.value / 100;
891
+
892
+ // Fake metadata for demo (since we can't read from audio files)
893
+ totalTimeEl.textContent = "3:42";
894
+ });
895
+ </script>
896
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: absolute; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">This website has been generated by <a href="https://enzostvs-deepsite.hf.space" style="color: #fff;" target="_blank" >DeepSite</a> <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;"></p></body>
897
+ </html>