Multimedix commited on
Commit
8fe09c4
·
verified ·
1 Parent(s): 630a10b

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +1102 -912
index.html CHANGED
@@ -1,941 +1,1131 @@
1
  <!DOCTYPE html>
2
  <html lang="de">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Radio Player Deutschland</title>
7
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
8
- <style>
9
- * {
10
- margin: 0;
11
- padding: 0;
12
- box-sizing: border-box;
13
- }
14
-
15
- :root {
16
- --primary-color: #1e3c72;
17
- --secondary-color: #2a5298;
18
- --accent-color: #ff6b6b;
19
- --text-light: #ffffff;
20
- --text-dark: #333333;
21
- --bg-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
22
- --card-bg: rgba(255, 255, 255, 0.1);
23
- --glass-bg: rgba(255, 255, 255, 0.1);
24
- --glass-border: rgba(255, 255, 255, 0.2);
25
- }
26
-
27
- body {
28
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
29
- background: var(--bg-gradient);
30
- min-height: 100vh;
31
- color: var(--text-light);
32
- overflow-x: hidden;
33
- position: relative;
34
- }
35
-
36
- /* Animated Background */
37
- .bg-animation {
38
- position: fixed;
39
- width: 100%;
40
- height: 100%;
41
- top: 0;
42
- left: 0;
43
- z-index: -1;
44
- opacity: 0.3;
45
- }
46
-
47
- .bg-animation span {
48
- position: absolute;
49
- display: block;
50
- width: 20px;
51
- height: 20px;
52
- background: rgba(255, 255, 255, 0.2);
53
- animation: move 25s linear infinite;
54
- bottom: -150px;
55
- }
56
-
57
- .bg-animation span:nth-child(1) {
58
- left: 25%;
59
- width: 80px;
60
- height: 80px;
61
- animation-delay: 0s;
62
- }
63
-
64
- .bg-animation span:nth-child(2) {
65
- left: 10%;
66
- width: 20px;
67
- height: 20px;
68
- animation-delay: 2s;
69
- animation-duration: 12s;
70
- }
71
 
72
- .bg-animation span:nth-child(3) {
73
- left: 70%;
74
- width: 20px;
75
- height: 20px;
76
- animation-delay: 4s;
77
- }
78
-
79
- .bg-animation span:nth-child(4) {
80
- left: 40%;
81
- width: 60px;
82
- height: 60px;
83
- animation-delay: 0s;
84
- animation-duration: 18s;
85
- }
86
-
87
- .bg-animation span:nth-child(5) {
88
- left: 65%;
89
- width: 20px;
90
- height: 20px;
91
- animation-delay: 0s;
92
- }
93
-
94
- .bg-animation span:nth-child(6) {
95
- left: 75%;
96
- width: 110px;
97
- height: 110px;
98
- animation-delay: 3s;
99
- }
100
-
101
- .bg-animation span:nth-child(7) {
102
- left: 35%;
103
- width: 150px;
104
- height: 150px;
105
- animation-delay: 7s;
106
- }
107
-
108
- .bg-animation span:nth-child(8) {
109
- left: 50%;
110
- width: 25px;
111
- height: 25px;
112
- animation-delay: 15s;
113
- animation-duration: 45s;
114
- }
115
-
116
- .bg-animation span:nth-child(9) {
117
- left: 20%;
118
- width: 15px;
119
- height: 15px;
120
- animation-delay: 2s;
121
- animation-duration: 35s;
122
- }
123
-
124
- .bg-animation span:nth-child(10) {
125
- left: 85%;
126
- width: 150px;
127
- height: 150px;
128
- animation-delay: 0s;
129
- animation-duration: 11s;
130
- }
131
-
132
- @keyframes move {
133
- 0% {
134
- transform: translateY(0) rotate(0deg);
135
- opacity: 1;
136
- border-radius: 0;
137
- }
138
- 100% {
139
- transform: translateY(-1000px) rotate(720deg);
140
- opacity: 0;
141
- border-radius: 50%;
142
- }
143
- }
144
-
145
- /* Header */
146
- header {
147
- background: var(--glass-bg);
148
- backdrop-filter: blur(10px);
149
- border-bottom: 1px solid var(--glass-border);
150
- padding: 1rem 0;
151
- position: sticky;
152
- top: 0;
153
- z-index: 100;
154
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
155
- }
156
-
157
- .header-content {
158
- max-width: 1200px;
159
- margin: 0 auto;
160
- padding: 0 2rem;
161
- display: flex;
162
- justify-content: space-between;
163
- align-items: center;
164
- }
165
-
166
- .logo {
167
- display: flex;
168
- align-items: center;
169
- gap: 1rem;
170
- font-size: 1.5rem;
171
- font-weight: bold;
172
- }
173
-
174
- .logo i {
175
- font-size: 2rem;
176
- color: var(--accent-color);
177
- animation: pulse 2s infinite;
178
- }
179
-
180
- @keyframes pulse {
181
- 0%, 100% {
182
- transform: scale(1);
183
- }
184
- 50% {
185
- transform: scale(1.1);
186
- }
187
- }
188
-
189
- .header-links a {
190
- color: var(--text-light);
191
- text-decoration: none;
192
- margin-left: 2rem;
193
- transition: color 0.3s;
194
- }
195
-
196
- .header-links a:hover {
197
- color: var(--accent-color);
198
- }
199
-
200
- /* Main Container */
201
- .container {
202
- max-width: 1200px;
203
- margin: 2rem auto;
204
- padding: 0 2rem;
205
- }
206
-
207
- /* Main Player */
208
- .main-player {
209
- background: var(--glass-bg);
210
- backdrop-filter: blur(10px);
211
- border-radius: 20px;
212
- padding: 2rem;
213
- margin-bottom: 2rem;
214
- border: 1px solid var(--glass-border);
215
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
216
- }
217
-
218
- .player-header {
219
- text-align: center;
220
- margin-bottom: 2rem;
221
- }
222
-
223
- .station-info {
224
- display: flex;
225
- align-items: center;
226
- justify-content: center;
227
- gap: 1rem;
228
- margin-bottom: 1rem;
229
- }
230
-
231
- .station-logo {
232
- width: 80px;
233
- height: 80px;
234
- border-radius: 50%;
235
- background: linear-gradient(135deg, #667eea, #764ba2);
236
- display: flex;
237
- align-items: center;
238
- justify-content: center;
239
- font-size: 2rem;
240
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
241
- }
242
-
243
- .station-details h2 {
244
- font-size: 1.8rem;
245
- margin-bottom: 0.5rem;
246
- }
247
-
248
- .station-details p {
249
- opacity: 0.8;
250
- }
251
-
252
- /* Visualizer */
253
- .visualizer {
254
- height: 100px;
255
- display: flex;
256
- align-items: flex-end;
257
- justify-content: center;
258
- gap: 4px;
259
- margin: 2rem 0;
260
- }
261
-
262
- .bar {
263
- width: 4px;
264
- background: linear-gradient(to top, var(--accent-color), #feca57);
265
- border-radius: 2px;
266
- animation: dance 0.6s ease-in-out infinite;
267
- }
268
-
269
- .bar:nth-child(1) { animation-delay: 0s; height: 20px; }
270
- .bar:nth-child(2) { animation-delay: 0.1s; height: 30px; }
271
- .bar:nth-child(3) { animation-delay: 0.2s; height: 25px; }
272
- .bar:nth-child(4) { animation-delay: 0.3s; height: 40px; }
273
- .bar:nth-child(5) { animation-delay: 0.4s; height: 35px; }
274
- .bar:nth-child(6) { animation-delay: 0.5s; height: 45px; }
275
- .bar:nth-child(7) { animation-delay: 0.6s; height: 30px; }
276
- .bar:nth-child(8) { animation-delay: 0.7s; height: 25px; }
277
- .bar:nth-child(9) { animation-delay: 0.8s; height: 35px; }
278
- .bar:nth-child(10) { animation-delay: 0.9s; height: 40px; }
279
- .bar:nth-child(11) { animation-delay: 1s; height: 30px; }
280
- .bar:nth-child(12) { animation-delay: 1.1s; height: 25px; }
281
-
282
- .visualizer.paused .bar {
283
- animation-play-state: paused;
284
- opacity: 0.3;
285
- }
286
-
287
- @keyframes dance {
288
- 0%, 100% {
289
- transform: scaleY(1);
290
- }
291
- 50% {
292
- transform: scaleY(1.5);
293
- }
294
- }
295
-
296
- /* Controls */
297
- .controls {
298
- display: flex;
299
- justify-content: center;
300
- align-items: center;
301
- gap: 2rem;
302
- margin: 2rem 0;
303
- }
304
-
305
- .control-btn {
306
- background: rgba(255, 255, 255, 0.1);
307
- border: 2px solid var(--glass-border);
308
- color: var(--text-light);
309
- width: 60px;
310
- height: 60px;
311
- border-radius: 50%;
312
- display: flex;
313
- align-items: center;
314
- justify-content: center;
315
- cursor: pointer;
316
- transition: all 0.3s;
317
- font-size: 1.2rem;
318
- }
319
-
320
- .control-btn:hover {
321
- background: rgba(255, 255, 255, 0.2);
322
- transform: scale(1.1);
323
- }
324
-
325
- .control-btn.play-pause {
326
- width: 80px;
327
- height: 80px;
328
- background: var(--accent-color);
329
- border-color: var(--accent-color);
330
- font-size: 1.5rem;
331
- }
332
-
333
- .control-btn.play-pause:hover {
334
- background: #ff5252;
335
- border-color: #ff5252;
336
- }
337
-
338
- /* Volume Control */
339
- .volume-control {
340
- display: flex;
341
- align-items: center;
342
- gap: 1rem;
343
- justify-content: center;
344
- margin-top: 1rem;
345
- }
346
-
347
- .volume-slider {
348
- width: 200px;
349
- height: 6px;
350
- background: rgba(255, 255, 255, 0.2);
351
- border-radius: 3px;
352
- outline: none;
353
- -webkit-appearance: none;
354
- }
355
-
356
- .volume-slider::-webkit-slider-thumb {
357
- -webkit-appearance: none;
358
- width: 20px;
359
- height: 20px;
360
- background: var(--accent-color);
361
- border-radius: 50%;
362
- cursor: pointer;
363
- }
364
-
365
- .volume-slider::-moz-range-thumb {
366
- width: 20px;
367
- height: 20px;
368
- background: var(--accent-color);
369
- border-radius: 50%;
370
- cursor: pointer;
371
- border: none;
372
- }
373
-
374
- /* Station Grid */
375
- .stations-grid {
376
- display: grid;
377
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
378
- gap: 1.5rem;
379
- margin-bottom: 2rem;
380
- }
381
-
382
- .station-card {
383
- background: var(--glass-bg);
384
- backdrop-filter: blur(10px);
385
- border: 1px solid var(--glass-border);
386
- border-radius: 15px;
387
- padding: 1.5rem;
388
- cursor: pointer;
389
- transition: all 0.3s;
390
- position: relative;
391
- overflow: hidden;
392
- }
393
-
394
- .station-card::before {
395
- content: '';
396
- position: absolute;
397
- top: 0;
398
- left: -100%;
399
- width: 100%;
400
- height: 100%;
401
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
402
- transition: left 0.5s;
403
- }
404
-
405
- .station-card:hover::before {
406
- left: 100%;
407
- }
408
-
409
- .station-card:hover {
410
- transform: translateY(-5px);
411
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
412
- background: rgba(255, 255, 255, 0.15);
413
- }
414
-
415
- .station-card.active {
416
- background: rgba(255, 107, 107, 0.2);
417
- border-color: var(--accent-color);
418
- }
419
-
420
- .station-card-header {
421
- display: flex;
422
- align-items: center;
423
- gap: 1rem;
424
- margin-bottom: 1rem;
425
- }
426
-
427
- .station-card-logo {
428
- width: 50px;
429
- height: 50px;
430
- border-radius: 10px;
431
- background: linear-gradient(135deg, #667eea, #764ba2);
432
- display: flex;
433
- align-items: center;
434
- justify-content: center;
435
- font-size: 1.5rem;
436
- }
437
-
438
- .station-card-info h3 {
439
- font-size: 1.2rem;
440
- margin-bottom: 0.25rem;
441
- }
442
-
443
- .station-card-info p {
444
- font-size: 0.9rem;
445
- opacity: 0.8;
446
- }
447
-
448
- .station-genre {
449
- display: inline-block;
450
- background: rgba(255, 255, 255, 0.1);
451
- padding: 0.25rem 0.75rem;
452
- border-radius: 20px;
453
- font-size: 0.85rem;
454
- margin-top: 0.5rem;
455
- }
456
-
457
- /* Categories */
458
- .categories {
459
- display: flex;
460
- gap: 1rem;
461
- margin-bottom: 2rem;
462
- flex-wrap: wrap;
463
- }
464
-
465
- .category-btn {
466
- background: var(--glass-bg);
467
- backdrop-filter: blur(10px);
468
- border: 1px solid var(--glass-border);
469
- color: var(--text-light);
470
- padding: 0.75rem 1.5rem;
471
- border-radius: 25px;
472
- cursor: pointer;
473
- transition: all 0.3s;
474
- font-size: 0.95rem;
475
- }
476
-
477
- .category-btn:hover {
478
- background: rgba(255, 255, 255, 0.2);
479
- transform: translateY(-2px);
480
- }
481
-
482
- .category-btn.active {
483
- background: var(--accent-color);
484
- border-color: var(--accent-color);
485
- }
486
-
487
- /* Footer */
488
- footer {
489
- background: var(--glass-bg);
490
- backdrop-filter: blur(10px);
491
- border-top: 1px solid var(--glass-border);
492
- padding: 2rem 0;
493
- margin-top: 3rem;
494
- text-align: center;
495
- }
496
-
497
- .footer-content {
498
- max-width: 1200px;
499
- margin: 0 auto;
500
- padding: 0 2rem;
501
- }
502
-
503
- .social-links {
504
- display: flex;
505
- justify-content: center;
506
- gap: 1.5rem;
507
- margin-top: 1rem;
508
- }
509
-
510
- .social-links a {
511
- color: var(--text-light);
512
- font-size: 1.5rem;
513
- transition: color 0.3s, transform 0.3s;
514
- }
515
-
516
- .social-links a:hover {
517
- color: var(--accent-color);
518
- transform: translateY(-3px);
519
- }
520
-
521
- /* Responsive Design */
522
- @media (max-width: 768px) {
523
- .header-content {
524
- flex-direction: column;
525
- gap: 1rem;
526
- }
527
-
528
- .header-links {
529
- display: none;
530
- }
531
-
532
- .stations-grid {
533
- grid-template-columns: 1fr;
534
- }
535
-
536
- .controls {
537
- gap: 1rem;
538
- }
539
-
540
- .control-btn {
541
- width: 50px;
542
- height: 50px;
543
- }
544
-
545
- .control-btn.play-pause {
546
- width: 70px;
547
- height: 70px;
548
- }
549
-
550
- .volume-slider {
551
- width: 150px;
552
- }
553
- }
554
-
555
- /* Loading Animation */
556
- .loading {
557
- display: inline-block;
558
- width: 20px;
559
- height: 20px;
560
- border: 3px solid rgba(255, 255, 255, 0.3);
561
- border-radius: 50%;
562
- border-top-color: var(--accent-color);
563
- animation: spin 1s ease-in-out infinite;
564
- }
565
-
566
- @keyframes spin {
567
- to { transform: rotate(360deg); }
568
- }
569
-
570
- /* Toast Notification */
571
- .toast {
572
- position: fixed;
573
- bottom: 2rem;
574
- right: 2rem;
575
- background: rgba(0, 0, 0, 0.8);
576
- color: white;
577
- padding: 1rem 1.5rem;
578
- border-radius: 10px;
579
- transform: translateX(400px);
580
- transition: transform 0.3s;
581
- z-index: 1000;
582
- }
583
-
584
- .toast.show {
585
- transform: translateX(0);
586
- }
587
- </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
588
  </head>
 
589
  <body>
590
- <!-- Animated Background -->
591
- <div class="bg-animation">
592
- <span></span>
593
- <span></span>
594
- <span></span>
595
- <span></span>
596
- <span></span>
597
- <span></span>
598
- <span></span>
599
- <span></span>
600
- <span></span>
601
- <span></span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
602
  </div>
603
-
604
- <!-- Header -->
605
- <header>
606
- <div class="header-content">
607
- <div class="logo">
608
- <i class="fas fa-radio"></i>
609
- <span>Radio Player Deutschland</span>
610
- </div>
611
- <div class="header-links">
612
- <a href="#" onclick="showToast('Startseite'); return false;">Start</a>
613
- <a href="#" onclick="showToast('Beliebte Sender'); return false;">Beliebt</a>
614
- <a href="#" onclick="showToast('Neue Sender'); return false;">Neu</a>
615
- <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank">Built with anycoder</a>
 
 
 
 
616
  </div>
 
617
  </div>
618
- </header>
619
-
620
- <!-- Main Container -->
621
- <div class="container">
622
- <!-- Main Player -->
623
- <div class="main-player">
624
- <div class="player-header">
625
- <div class="station-info">
626
- <div class="station-logo">
627
- <i class="fas fa-broadcast-tower"></i>
628
- </div>
629
- <div class="station-details">
630
- <h2 id="currentStation">Wähle einen Sender</h2>
631
- <p id="currentGenre">Genre</p>
632
- </div>
633
- </div>
634
- </div>
635
-
636
- <!-- Visualizer -->
637
- <div class="visualizer paused" id="visualizer">
638
- <div class="bar"></div>
639
- <div class="bar"></div>
640
- <div class="bar"></div>
641
- <div class="bar"></div>
642
- <div class="bar"></div>
643
- <div class="bar"></div>
644
- <div class="bar"></div>
645
- <div class="bar"></div>
646
- <div class="bar"></div>
647
- <div class="bar"></div>
648
- <div class="bar"></div>
649
- <div class="bar"></div>
650
- </div>
651
-
652
- <!-- Controls -->
653
- <div class="controls">
654
- <button class="control-btn" onclick="previousStation()">
655
  <i class="fas fa-backward"></i>
656
  </button>
657
- <button class="control-btn" onclick="toggleMute()">
658
  <i class="fas fa-volume-down"></i>
659
  </button>
660
- <button class="control-btn play-pause" id="playPauseBtn" onclick="togglePlayPause()">
661
  <i class="fas fa-play"></i>
662
  </button>
663
- <button class="control-btn" onclick="toggleMute()">
664
  <i class="fas fa-volume-up"></i>
665
  </button>
666
- <button class="control-btn" onclick="nextStation()">
667
  <i class="fas fa-forward"></i>
668
  </button>
669
- </div>
670
-
671
- <!-- Volume Control -->
672
- <div class="volume-control">
673
- <i class="fas fa-volume-down"></i>
674
- <input type="range" class="volume-slider" id="volumeSlider" min="0" max="100" value="70">
675
- <i class="fas fa-volume-up"></i>
676
- <span style="margin-left: 1rem;" id="volumeValue">70%</span>
677
- </div>
678
- </div>
679
-
680
- <!-- Categories -->
681
- <div class="categories">
682
- <button class="category-btn active" onclick="filterStations('all')">Alle</button>
683
- <button class="category-btn" onclick="filterStations('pop')">Pop</button>
684
- <button class="category-btn" onclick="filterStations('rock')">Rock</button>
685
- <button class="category-btn" onclick="filterStations('jazz')">Jazz</button>
686
- <button class="category-btn" onclick="filterStations('klassik')">Klassik</button>
687
- <button class="category-btn" onclick="filterStations('news')">Nachrichten</button>
688
- </div>
689
 
690
- <!-- Stations Grid -->
691
- <div class="stations-grid" id="stationsGrid">
692
- <!-- Stations will be dynamically added here -->
693
- </div>
 
 
 
 
694
  </div>
695
 
696
- <!-- Footer -->
697
- <footer>
698
- <div class="footer-content">
699
- <p>&copy; 2024 Radio Player Deutschland. Alle Rechte vorbehalten.</p>
700
- <div class="social-links">
701
- <a href="#" onclick="showToast('Facebook'); return false;"><i class="fab fa-facebook"></i></a>
702
- <a href="#" onclick="showToast('Twitter'); return false;"><i class="fab fa-twitter"></i></a>
703
- <a href="#" onclick="showToast('Instagram'); return false;"><i class="fab fa-instagram"></i></a>
704
- <a href="#" onclick="showToast('YouTube'); return false;"><i class="fab fa-youtube"></i></a>
705
- </div>
706
- </div>
707
- </footer>
708
-
709
- <!-- Toast Notification -->
710
- <div class="toast" id="toast"></div>
711
-
712
- <!-- Audio Element -->
713
- <audio id="audioPlayer"></audio>
714
-
715
- <script>
716
- // Radio Stations Data
717
- const stations = [
718
- { id: 1, name: 'Deutschlandfunk', genre: 'Nachrichten', url: 'https://st01.dlf.de/dlf/01/128/mp3/stream.mp3', category: 'news', icon: '📻' },
719
- { id: 2, name: 'Bayern 3', genre: 'Pop', url: 'https://br-br3-live.cast.addradio.de/br/br3/live/mp3/128/stream.mp3', category: 'pop', icon: '🎵' },
720
- { id: 3, name: 'WDR 4', genre: 'Schlager', url: 'https://wdr-4-live.icecast.wdr.de/wdr/wdr4/live/mp3/128/stream.mp3', category: 'pop', icon: '🎶' },
721
- { id: 4, name: 'NDR 2', genre: 'Pop/Rock', url: 'https://ndr-ndr2-niedersachsen.cast.addradio.de/ndr/ndr2/niedersachsen/mp3/128/stream.mp3', category: 'rock', icon: '🎸' },
722
- { id: 5, name: 'SWR3', genre: 'Pop', url: 'https://swr-swr3-live.cast.addradio.de/swr/swr3/live/mp3/128/stream.mp3', category: 'pop', icon: '🎼' },
723
- { id: 6, name: 'HR3', genre: 'Pop', url: 'https://hr-hr3-live.cast.addradio.de/hr/hr3/live/mp3/128/stream.mp3', category: 'pop', icon: '🎤' },
724
- { id: 7, name: 'MDR Jump', genre: 'Rock/Pop', url: 'https://mdr-jump-live.cast.addradio.de/mdr/mdr-jump/live/mp3/128/stream.mp3', category: 'rock', icon: '🎧' },
725
- { id: 8, name: 'RPR1', genre: 'Pop', url: 'https://streams.rpr1.de/rpr-mp3-128', category: 'pop', icon: '🎹' },
726
- { id: 9, name: 'Radio Bremen', genre: 'Nachrichten', url: 'https://rb-media.rb-radio.de/rb/bremen/live/mp3/128/stream.mp3', category: 'news', icon: '📰' },
727
- { id: 10, name: 'SR 1', genre: 'Pop', url: 'https://sr-sr1-live.cast.addradio.de/sr/sr1/live/mp3/128/stream.mp3', category: 'pop', icon: '🎺' },
728
- { id: 11, name: 'JazzRadio', genre: 'Jazz', url: 'http://stream.jazzradio.de/jazzradio/mp3-192', category: 'jazz', icon: '🎷' },
729
- { id: 12, name: 'BR-Klassik', genre: 'Klassik', url: 'https://br-brklassik-live.cast.addradio.de/br/brklassik/live/mp3/128/stream.mp3', category: 'klassik', icon: '🎻' },
730
- { id: 13, name: 'DLF Kultur', genre: 'Kultur', url: 'https://st02.dlf.de/dlf/02/128/mp3/stream.mp3', category: 'news', icon: '🎭' },
731
- { id: 14, name: 'Antenne Bayern', genre: 'Pop', url: 'https://mp3channels.webradio.antenne.de/antenne-bayern', category: 'pop', icon: '📡' },
732
- { id: 15, name: 'Radio Hamburg', genre: 'Pop', url: 'https://stream.radiohamburg.de/rhh-live/mp3-128', category: 'pop', icon: '⚓' },
733
- { id: 16, name: 'FFH', genre: 'Pop', url: 'https://mp3.ffh.de/radioffh/hqlivestream.mp3', category: 'pop', icon: '🎪' }
734
- ];
735
-
736
- let currentStationIndex = -1;
737
- let isPlaying = false;
738
- let currentCategory = 'all';
739
-
740
- // Initialize
741
- document.addEventListener('DOMContentLoaded', function() {
742
- renderStations();
743
- setupVolumeControl();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
744
  });
745
-
746
- // Render Stations
747
- function renderStations() {
748
- const grid = document.getElementById('stationsGrid');
749
- grid.innerHTML = '';
750
-
751
- const filteredStations = currentCategory === 'all'
752
- ? stations
753
- : stations.filter(s => s.category === currentCategory);
754
-
755
- filteredStations.forEach((station, index) => {
756
- const card = document.createElement('div');
757
- card.className = 'station-card';
758
- card.innerHTML = `
759
- <div class="station-card-header">
760
- <div class="station-card-logo">${station.icon}</div>
761
- <div class="station-card-info">
762
- <h3>${station.name}</h3>
763
- <p>${station.genre}</p>
764
- </div>
765
- </div>
766
- <span class="station-genre">${station.category}</span>
767
- `;
768
- card.onclick = () => selectStation(station);
769
- grid.appendChild(card);
770
- });
771
- }
772
-
773
- // Select Station
774
- function selectStation(station) {
775
- const audioPlayer = document.getElementById('audioPlayer');
776
- const playPauseBtn = document.getElementById('playPauseBtn');
777
-
778
- // Update UI
779
- document.getElementById('currentStation').textContent = station.name;
780
- document.getElementById('currentGenre').textContent = station.genre;
781
-
782
- // Update active card
783
- document.querySelectorAll('.station-card').forEach(card => {
784
- card.classList.remove('active');
785
- if (card.querySelector('h3').textContent === station.name) {
786
- card.classList.add('active');
787
- }
788
- });
789
-
790
- // Set audio source
791
- audioPlayer.src = station.url;
792
- currentStationIndex = stations.findIndex(s => s.id === station.id);
793
-
794
- // Auto play
795
- if (!isPlaying) {
796
- togglePlayPause();
797
- }
798
-
799
- showToast(`Sender gewechselt: ${station.name}`);
800
- }
801
-
802
- // Toggle Play/Pause
803
- function togglePlayPause() {
804
- const audioPlayer = document.getElementById('audioPlayer');
805
- const playPauseBtn = document.getElementById('playPauseBtn');
806
- const visualizer = document.getElementById('visualizer');
807
-
808
- if (currentStationIndex === -1) {
809
- showToast('Bitte wähle zuerst einen Sender aus');
810
- return;
811
- }
812
-
813
  if (isPlaying) {
814
- audioPlayer.pause();
815
- playPauseBtn.innerHTML = '<i class="fas fa-play"></i>';
816
- visualizer.classList.add('paused');
817
- showToast('Pausiert');
818
- } else {
819
- audioPlayer.play().catch(e => {
820
- showToast('Fehler beim Abspielen');
821
- console.error(e);
822
- });
823
- playPauseBtn.innerHTML = '<i class="fas fa-pause"></i>';
824
- visualizer.classList.remove('paused');
825
- showToast('Wiedergabe gestartet');
826
  }
827
-
828
- isPlaying = !isPlaying;
829
- }
830
-
831
- // Previous Station
832
- function previousStation() {
833
- if (currentStationIndex > 0) {
834
- selectStation(stations[currentStationIndex - 1]);
835
- } else if (currentStationIndex === 0) {
836
- selectStation(stations[stations.length - 1]);
837
- }
838
- }
839
-
840
- // Next Station
841
- function nextStation() {
842
- if (currentStationIndex < stations.length - 1) {
843
- selectStation(stations[currentStationIndex + 1]);
844
- } else if (currentStationIndex === stations.length - 1) {
845
- selectStation(stations[0]);
846
  }
847
  }
848
-
849
- // Volume Control
850
- function setupVolumeControl() {
851
- const volumeSlider = document.getElementById('volumeSlider');
852
- const volumeValue = document.getElementById('volumeValue');
853
- const audioPlayer = document.getElementById('audioPlayer');
854
-
855
- volumeSlider.addEventListener('input', function() {
856
- const volume = this.value / 100;
857
- audioPlayer.volume = volume;
858
- volumeValue.textContent = this.value + '%';
859
- });
860
-
861
- // Set initial volume
862
- audioPlayer.volume = 0.7;
863
- }
864
-
865
- // Toggle Mute
866
- function toggleMute() {
867
- const audioPlayer = document.getElementById('audioPlayer');
868
- audioPlayer.muted = !audioPlayer.muted;
869
- showToast(audioPlayer.muted ? 'Stumm geschaltet' : 'Stumm aufgehoben');
870
- }
871
-
872
- // Filter Stations
873
- function filterStations(category) {
874
- currentCategory = category;
875
-
876
- // Update active button
877
- document.querySelectorAll('.category-btn').forEach(btn => {
878
- btn.classList.remove('active');
879
- if (btn.textContent.toLowerCase().includes(category) ||
880
- (category === 'all' && btn.textContent === 'Alle')) {
881
- btn.classList.add('active');
882
- }
883
- });
884
-
885
- renderStations();
886
- }
887
-
888
- // Toast Notification
889
- function showToast(message) {
890
- const toast = document.getElementById('toast');
891
- toast.textContent = message;
892
- toast.classList.add('show');
893
-
894
- setTimeout(() => {
895
- toast.classList.remove('show');
896
- }, 3000);
897
- }
898
-
899
- // Keyboard Controls
900
- document.addEventListener('keydown', function(e) {
901
- switch(e.key) {
902
- case ' ':
903
- e.preventDefault();
904
- togglePlayPause();
905
- break;
906
- case 'ArrowRight':
907
- nextStation();
908
- break;
909
- case 'ArrowLeft':
910
- previousStation();
911
- break;
912
- case 'ArrowUp':
913
- const volumeSlider = document.getElementById('volumeSlider');
914
- volumeSlider.value = Math.min(100, parseInt(volumeSlider.value) + 5);
915
- volumeSlider.dispatchEvent(new Event('input'));
916
- break;
917
- case 'ArrowDown':
918
- const volumeSliderDown = document.getElementById('volumeSlider');
919
- volumeSliderDown.value = Math.max(0, parseInt(volumeSliderDown.value) - 5);
920
- volumeSliderDown.dispatchEvent(new Event('input'));
921
- break;
922
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
923
  });
 
924
 
925
- // Handle audio errors
926
- document.getElementById('audioPlayer').addEventListener('error', function() {
927
- showToast('Fehler beim Laden des Streams');
928
- isPlaying = false;
929
- document.getElementById('playPauseBtn').innerHTML = '<i class="fas fa-play"></i>';
930
- document.getElementById('visualizer').classList.add('paused');
931
- });
932
-
933
- // Handle audio ended
934
- document.getElementById('audioPlayer').addEventListener('ended', function() {
935
- isPlaying = false;
936
- document.getElementById('playPauseBtn').innerHTML = '<i class="fas fa-play"></i>';
937
- document.getElementById('visualizer').classList.add('paused');
938
- });
939
- </script>
940
- </body>
941
- </html>
 
1
  <!DOCTYPE html>
2
  <html lang="de">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Radio Player Deutschland</title>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <style>
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ :root {
17
+ --primary-color: #1e3c72;
18
+ --secondary-color: #2a5298;
19
+ --accent-color: #ff6b6b;
20
+ --text-light: #ffffff;
21
+ --text-dark: #333333;
22
+ --bg-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
23
+ --card-bg: rgba(255, 255, 255, 0.1);
24
+ --glass-bg: rgba(255, 255, 255, 0.1);
25
+ --glass-border: rgba(255, 255, 255, 0.2);
26
+ --success-color: #4caf50;
27
+ --error-color: #f44336;
28
+ }
29
+
30
+ body {
31
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
32
+ background: var(--bg-gradient);
33
+ min-height: 100vh;
34
+ color: var(--text-light);
35
+ overflow-x: hidden;
36
+ position: relative;
37
+ }
38
+
39
+ /* Animated Background */
40
+ .bg-animation {
41
+ position: fixed;
42
+ width: 100%;
43
+ height: 100%;
44
+ top: 0;
45
+ left: 0;
46
+ z-index: -1;
47
+ opacity: 0.3;
48
+ }
49
+
50
+ .bg-animation span {
51
+ position: absolute;
52
+ display: block;
53
+ width: 20px;
54
+ height: 20px;
55
+ background: rgba(255, 255, 255, 0.2);
56
+ animation: move 25s linear infinite;
57
+ bottom: -150px;
58
+ }
59
+
60
+ .bg-animation span:nth-child(1) {
61
+ left: 25%;
62
+ width: 80px;
63
+ height: 80px;
64
+ animation-delay: 0s;
65
+ }
66
+
67
+ .bg-animation span:nth-child(2) {
68
+ left: 10%;
69
+ width: 20px;
70
+ height: 20px;
71
+ animation-delay: 2s;
72
+ animation-duration: 12s;
73
+ }
74
+
75
+ .bg-animation span:nth-child(3) {
76
+ left: 70%;
77
+ width: 20px;
78
+ height: 20px;
79
+ animation-delay: 4s;
80
+ }
81
+
82
+ .bg-animation span:nth-child(4) {
83
+ left: 40%;
84
+ width: 60px;
85
+ height: 60px;
86
+ animation-delay: 0s;
87
+ animation-duration: 18s;
88
+ }
89
+
90
+ .bg-animation span:nth-child(5) {
91
+ left: 65%;
92
+ width: 20px;
93
+ height: 20px;
94
+ animation-delay: 0s;
95
+ }
96
+
97
+ .bg-animation span:nth-child(6) {
98
+ left: 75%;
99
+ width: 110px;
100
+ height: 110px;
101
+ animation-delay: 3s;
102
+ }
103
+
104
+ .bg-animation span:nth-child(7) {
105
+ left: 35%;
106
+ width: 150px;
107
+ height: 150px;
108
+ animation-delay: 7s;
109
+ }
110
+
111
+ .bg-animation span:nth-child(8) {
112
+ left: 50%;
113
+ width: 25px;
114
+ height: 25px;
115
+ animation-delay: 15s;
116
+ animation-duration: 45s;
117
+ }
118
+
119
+ .bg-animation span:nth-child(9) {
120
+ left: 20%;
121
+ width: 15px;
122
+ height: 15px;
123
+ animation-delay: 2s;
124
+ animation-duration: 35s;
125
+ }
126
+
127
+ .bg-animation span:nth-child(10) {
128
+ left: 85%;
129
+ width: 150px;
130
+ height: 150px;
131
+ animation-delay: 0s;
132
+ animation-duration: 11s;
133
+ }
134
+
135
+ @keyframes move {
136
+ 0% {
137
+ transform: translateY(0) rotate(0deg);
138
+ opacity: 1;
139
+ border-radius: 0;
140
+ }
141
+
142
+ 100% {
143
+ transform: translateY(-1000px) rotate(720deg);
144
+ opacity: 0;
145
+ border-radius: 50%;
146
+ }
147
+ }
148
+
149
+ /* Header */
150
+ header {
151
+ background: var(--glass-bg);
152
+ backdrop-filter: blur(10px);
153
+ border-bottom: 1px solid var(--glass-border);
154
+ padding: 1rem 0;
155
+ position: sticky;
156
+ top: 0;
157
+ z-index: 100;
158
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
159
+ }
160
+
161
+ .header-content {
162
+ max-width: 1200px;
163
+ margin: 0 auto;
164
+ padding: 0 2rem;
165
+ display: flex;
166
+ justify-content: space-between;
167
+ align-items: center;
168
+ }
169
+
170
+ .logo {
171
+ display: flex;
172
+ align-items: center;
173
+ gap: 1rem;
174
+ font-size: 1.5rem;
175
+ font-weight: bold;
176
+ }
177
+
178
+ .logo i {
179
+ font-size: 2rem;
180
+ color: var(--accent-color);
181
+ animation: pulse 2s infinite;
182
+ }
183
+
184
+ @keyframes pulse {
185
+
186
+ 0%,
187
+ 100% {
188
+ transform: scale(1);
189
+ }
190
+
191
+ 50% {
192
+ transform: scale(1.1);
193
+ }
194
+ }
195
+
196
+ .header-links a {
197
+ color: var(--text-light);
198
+ text-decoration: none;
199
+ margin-left: 2rem;
200
+ transition: color 0.3s;
201
+ }
202
+
203
+ .header-links a:hover {
204
+ color: var(--accent-color);
205
+ }
206
+
207
+ /* Main Container */
208
+ .container {
209
+ max-width: 1200px;
210
+ margin: 2rem auto;
211
+ padding: 0 2rem;
212
+ }
213
+
214
+ /* Main Player */
215
+ .main-player {
216
+ background: var(--glass-bg);
217
+ backdrop-filter: blur(10px);
218
+ border-radius: 20px;
219
+ padding: 2rem;
220
+ margin-bottom: 2rem;
221
+ border: 1px solid var(--glass-border);
222
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
223
+ }
224
+
225
+ .player-header {
226
+ text-align: center;
227
+ margin-bottom: 2rem;
228
+ }
229
+
230
+ .station-info {
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: center;
234
+ gap: 1rem;
235
+ margin-bottom: 1rem;
236
+ }
237
+
238
+ .station-logo {
239
+ width: 80px;
240
+ height: 80px;
241
+ border-radius: 50%;
242
+ background: linear-gradient(135deg, #667eea, #764ba2);
243
+ display: flex;
244
+ align-items: center;
245
+ justify-content: center;
246
+ font-size: 2rem;
247
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
248
+ }
249
+
250
+ .station-details h2 {
251
+ font-size: 1.8rem;
252
+ margin-bottom: 0.5rem;
253
+ }
254
+
255
+ .station-details p {
256
+ opacity: 0.8;
257
+ }
258
+
259
+ /* Connection Status */
260
+ .connection-status {
261
+ display: inline-flex;
262
+ align-items: center;
263
+ gap: 0.5rem;
264
+ padding: 0.5rem 1rem;
265
+ border-radius: 20px;
266
+ font-size: 0.9rem;
267
+ margin-top: 0.5rem;
268
+ background: rgba(255, 255, 255, 0.1);
269
+ }
270
+
271
+ .connection-status.connected {
272
+ background: rgba(76, 175, 80, 0.2);
273
+ color: var(--success-color);
274
+ }
275
+
276
+ .connection-status.connecting {
277
+ background: rgba(255, 193, 7, 0.2);
278
+ color: #ffc107;
279
+ }
280
+
281
+ .connection-status.error {
282
+ background: rgba(244, 67, 54, 0.2);
283
+ color: var(--error-color);
284
+ }
285
+
286
+ .status-dot {
287
+ width: 8px;
288
+ height: 8px;
289
+ border-radius: 50%;
290
+ background: currentColor;
291
+ animation: blink 1.5s infinite;
292
+ }
293
+
294
+ @keyframes blink {
295
+ 0%, 100% { opacity: 1; }
296
+ 50% { opacity: 0.3; }
297
+ }
298
+
299
+ /* Visualizer */
300
+ .visualizer {
301
+ height: 100px;
302
+ display: flex;
303
+ align-items: flex-end;
304
+ justify-content: center;
305
+ gap: 4px;
306
+ margin: 2rem 0;
307
+ }
308
+
309
+ .bar {
310
+ width: 4px;
311
+ background: linear-gradient(to top, var(--accent-color), #feca57);
312
+ border-radius: 2px;
313
+ animation: dance 0.6s ease-in-out infinite;
314
+ }
315
+
316
+ .bar:nth-child(1) {
317
+ animation-delay: 0s;
318
+ height: 20px;
319
+ }
320
+
321
+ .bar:nth-child(2) {
322
+ animation-delay: 0.1s;
323
+ height: 30px;
324
+ }
325
+
326
+ .bar:nth-child(3) {
327
+ animation-delay: 0.2s;
328
+ height: 25px;
329
+ }
330
+
331
+ .bar:nth-child(4) {
332
+ animation-delay: 0.3s;
333
+ height: 40px;
334
+ }
335
+
336
+ .bar:nth-child(5) {
337
+ animation-delay: 0.4s;
338
+ height: 35px;
339
+ }
340
+
341
+ .bar:nth-child(6) {
342
+ animation-delay: 0.5s;
343
+ height: 45px;
344
+ }
345
+
346
+ .bar:nth-child(7) {
347
+ animation-delay: 0.6s;
348
+ height: 30px;
349
+ }
350
+
351
+ .bar:nth-child(8) {
352
+ animation-delay: 0.7s;
353
+ height: 25px;
354
+ }
355
+
356
+ .bar:nth-child(9) {
357
+ animation-delay: 0.8s;
358
+ height: 35px;
359
+ }
360
+
361
+ .bar:nth-child(10) {
362
+ animation-delay: 0.9s;
363
+ height: 40px;
364
+ }
365
+
366
+ .bar:nth-child(11) {
367
+ animation-delay: 1s;
368
+ height: 30px;
369
+ }
370
+
371
+ .bar:nth-child(12) {
372
+ animation-delay: 1.1s;
373
+ height: 25px;
374
+ }
375
+
376
+ .visualizer.paused .bar {
377
+ animation-play-state: paused;
378
+ opacity: 0.3;
379
+ }
380
+
381
+ @keyframes dance {
382
+
383
+ 0%,
384
+ 100% {
385
+ transform: scaleY(1);
386
+ }
387
+
388
+ 50% {
389
+ transform: scaleY(1.5);
390
+ }
391
+ }
392
+
393
+ /* Controls */
394
+ .controls {
395
+ display: flex;
396
+ justify-content: center;
397
+ align-items: center;
398
+ gap: 2rem;
399
+ margin: 2rem 0;
400
+ }
401
+
402
+ .control-btn {
403
+ background: rgba(255, 255, 255, 0.1);
404
+ border: 2px solid var(--glass-border);
405
+ color: var(--text-light);
406
+ width: 60px;
407
+ height: 60px;
408
+ border-radius: 50%;
409
+ display: flex;
410
+ align-items: center;
411
+ justify-content: center;
412
+ cursor: pointer;
413
+ transition: all 0.3s;
414
+ font-size: 1.2rem;
415
+ position: relative;
416
+ }
417
+
418
+ .control-btn:hover {
419
+ background: rgba(255, 255, 255, 0.2);
420
+ transform: scale(1.1);
421
+ }
422
+
423
+ .control-btn.play-pause {
424
+ width: 80px;
425
+ height: 80px;
426
+ background: var(--accent-color);
427
+ border-color: var(--accent-color);
428
+ font-size: 1.5rem;
429
+ }
430
+
431
+ .control-btn.play-pause:hover {
432
+ background: #ff5252;
433
+ border-color: #ff5252;
434
+ }
435
+
436
+ .control-btn.loading {
437
+ pointer-events: none;
438
+ opacity: 0.7;
439
+ }
440
+
441
+ .control-btn.loading::after {
442
+ content: '';
443
+ position: absolute;
444
+ width: 20px;
445
+ height: 20px;
446
+ border: 2px solid transparent;
447
+ border-top-color: white;
448
+ border-radius: 50%;
449
+ animation: spin 1s linear infinite;
450
+ }
451
+
452
+ @keyframes spin {
453
+ to { transform: rotate(360deg); }
454
+ }
455
+
456
+ /* Volume Control */
457
+ .volume-control {
458
+ display: flex;
459
+ align-items: center;
460
+ gap: 1rem;
461
+ justify-content: center;
462
+ margin-top: 1rem;
463
+ }
464
+
465
+ .volume-slider {
466
+ width: 200px;
467
+ height: 6px;
468
+ background: rgba(255, 255, 255, 0.2);
469
+ border-radius: 3px;
470
+ outline: none;
471
+ -webkit-appearance: none;
472
+ }
473
+
474
+ .volume-slider::-webkit-slider-thumb {
475
+ -webkit-appearance: none;
476
+ width: 20px;
477
+ height: 20px;
478
+ background: var(--accent-color);
479
+ border-radius: 50%;
480
+ cursor: pointer;
481
+ }
482
+
483
+ .volume-slider::-moz-range-thumb {
484
+ width: 20px;
485
+ height: 20px;
486
+ background: var(--accent-color);
487
+ border-radius: 50%;
488
+ cursor: pointer;
489
+ border: none;
490
+ }
491
+
492
+ /* Station Grid */
493
+ .stations-grid {
494
+ display: grid;
495
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
496
+ gap: 1.5rem;
497
+ margin-bottom: 2rem;
498
+ }
499
+
500
+ .station-card {
501
+ background: var(--glass-bg);
502
+ backdrop-filter: blur(10px);
503
+ border: 1px solid var(--glass-border);
504
+ border-radius: 15px;
505
+ padding: 1.5rem;
506
+ cursor: pointer;
507
+ transition: all 0.3s;
508
+ position: relative;
509
+ overflow: hidden;
510
+ }
511
+
512
+ .station-card::before {
513
+ content: '';
514
+ position: absolute;
515
+ top: 0;
516
+ left: -100%;
517
+ width: 100%;
518
+ height: 100%;
519
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
520
+ transition: left 0.5s;
521
+ }
522
+
523
+ .station-card:hover::before {
524
+ left: 100%;
525
+ }
526
+
527
+ .station-card:hover {
528
+ transform: translateY(-5px);
529
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
530
+ background: rgba(255, 255, 255, 0.15);
531
+ }
532
+
533
+ .station-card.active {
534
+ background: rgba(255, 107, 107, 0.2);
535
+ border-color: var(--accent-color);
536
+ }
537
+
538
+ .station-card.error {
539
+ border-color: var(--error-color);
540
+ background: rgba(244, 67, 54, 0.1);
541
+ }
542
+
543
+ .station-card-header {
544
+ display: flex;
545
+ align-items: center;
546
+ gap: 1rem;
547
+ margin-bottom: 1rem;
548
+ }
549
+
550
+ .station-card-logo {
551
+ width: 50px;
552
+ height: 50px;
553
+ border-radius: 10px;
554
+ background: linear-gradient(135deg, #667eea, #764ba2);
555
+ display: flex;
556
+ align-items: center;
557
+ justify-content: center;
558
+ font-size: 1.5rem;
559
+ }
560
+
561
+ .station-card-info h3 {
562
+ font-size: 1.2rem;
563
+ margin-bottom: 0.25rem;
564
+ }
565
+
566
+ .station-card-info p {
567
+ font-size: 0.9rem;
568
+ opacity: 0.8;
569
+ }
570
+
571
+ .station-genre {
572
+ display: inline-block;
573
+ background: rgba(255, 255, 255, 0.1);
574
+ padding: 0.25rem 0.75rem;
575
+ border-radius: 20px;
576
+ font-size: 0.85rem;
577
+ margin-top: 0.5rem;
578
+ }
579
+
580
+ .station-status {
581
+ position: absolute;
582
+ top: 10px;
583
+ right: 10px;
584
+ width: 8px;
585
+ height: 8px;
586
+ border-radius: 50%;
587
+ background: #4caf50;
588
+ }
589
+
590
+ .station-status.error {
591
+ background: var(--error-color);
592
+ }
593
+
594
+ /* Categories */
595
+ .categories {
596
+ display: flex;
597
+ gap: 1rem;
598
+ margin-bottom: 2rem;
599
+ flex-wrap: wrap;
600
+ }
601
+
602
+ .category-btn {
603
+ background: var(--glass-bg);
604
+ backdrop-filter: blur(10px);
605
+ border: 1px solid var(--glass-border);
606
+ color: var(--text-light);
607
+ padding: 0.75rem 1.5rem;
608
+ border-radius: 25px;
609
+ cursor: pointer;
610
+ transition: all 0.3s;
611
+ font-size: 0.95rem;
612
+ }
613
+
614
+ .category-btn:hover {
615
+ background: rgba(255, 255, 255, 0.2);
616
+ transform: translateY(-2px);
617
+ }
618
+
619
+ .category-btn.active {
620
+ background: var(--accent-color);
621
+ border-color: var(--accent-color);
622
+ }
623
+
624
+ /* Footer */
625
+ footer {
626
+ background: var(--glass-bg);
627
+ backdrop-filter: blur(10px);
628
+ border-top: 1px solid var(--glass-border);
629
+ padding: 2rem 0;
630
+ margin-top: 3rem;
631
+ text-align: center;
632
+ }
633
+
634
+ .footer-content {
635
+ max-width: 1200px;
636
+ margin: 0 auto;
637
+ padding: 0 2rem;
638
+ }
639
+
640
+ .social-links {
641
+ display: flex;
642
+ justify-content: center;
643
+ gap: 1.5rem;
644
+ margin-top: 1rem;
645
+ }
646
+
647
+ .social-links a {
648
+ color: var(--text-light);
649
+ font-size: 1.5rem;
650
+ transition: color 0.3s, transform 0.3s;
651
+ }
652
+
653
+ .social-links a:hover {
654
+ color: var(--accent-color);
655
+ transform: translateY(-3px);
656
+ }
657
+
658
+ /* Responsive Design */
659
+ @media (max-width: 768px) {
660
+ .header-content {
661
+ flex-direction: column;
662
+ gap: 1rem;
663
+ }
664
+
665
+ .header-links {
666
+ display: none;
667
+ }
668
+
669
+ .stations-grid {
670
+ grid-template-columns: 1fr;
671
+ }
672
+
673
+ .controls {
674
+ gap: 1rem;
675
+ }
676
+
677
+ .control-btn {
678
+ width: 50px;
679
+ height: 50px;
680
+ }
681
+
682
+ .control-btn.play-pause {
683
+ width: 70px;
684
+ height: 70px;
685
+ }
686
+
687
+ .volume-slider {
688
+ width: 150px;
689
+ }
690
+ }
691
+
692
+ /* Toast Notification */
693
+ .toast {
694
+ position: fixed;
695
+ bottom: 2rem;
696
+ right: 2rem;
697
+ background: rgba(0, 0, 0, 0.8);
698
+ color: white;
699
+ padding: 1rem 1.5rem;
700
+ border-radius: 10px;
701
+ transform: translateX(400px);
702
+ transition: transform 0.3s;
703
+ z-index: 1000;
704
+ max-width: 300px;
705
+ }
706
+
707
+ .toast.show {
708
+ transform: translateX(0);
709
+ }
710
+
711
+ .toast.error {
712
+ background: var(--error-color);
713
+ }
714
+
715
+ .toast.success {
716
+ background: var(--success-color);
717
+ }
718
+
719
+ /* Fallback Player Info */
720
+ .fallback-info {
721
+ background: rgba(255, 193, 7, 0.1);
722
+ border: 1px solid rgba(255, 193, 7, 0.3);
723
+ border-radius: 10px;
724
+ padding: 1rem;
725
+ margin-top: 1rem;
726
+ text-align: center;
727
+ font-size: 0.9rem;
728
+ }
729
+ </style>
730
  </head>
731
+
732
  <body>
733
+ <!-- Animated Background -->
734
+ <div class="bg-animation">
735
+ <span></span>
736
+ <span></span>
737
+ <span></span>
738
+ <span></span>
739
+ <span></span>
740
+ <span></span>
741
+ <span></span>
742
+ <span></span>
743
+ <span></span>
744
+ <span></span>
745
+ </div>
746
+
747
+ <!-- Header -->
748
+ <header>
749
+ <div class="header-content">
750
+ <div class="logo">
751
+ <i class="fas fa-radio"></i>
752
+ <span>Radio Player Deutschland</span>
753
+ </div>
754
+ <div class="header-links">
755
+ <a href="#" onclick="showToast('Startseite', 'success'); return false;">Start</a>
756
+ <a href="#" onclick="showToast('Beliebte Sender', 'success'); return false;">Beliebt</a>
757
+ <a href="#" onclick="showToast('Neue Sender', 'success'); return false;">Neu</a>
758
+ <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank">Built with anycoder</a>
759
+ </div>
760
  </div>
761
+ </header>
762
+
763
+ <!-- Main Container -->
764
+ <div class="container">
765
+ <!-- Main Player -->
766
+ <div class="main-player">
767
+ <div class="player-header">
768
+ <div class="station-info">
769
+ <div class="station-logo">
770
+ <i class="fas fa-broadcast-tower"></i>
771
+ </div>
772
+ <div class="station-details">
773
+ <h2 id="currentStation">Wähle einen Sender</h2>
774
+ <p id="currentGenre">Genre</p>
775
+ <div class="connection-status" id="connectionStatus">
776
+ <span class="status-dot"></span>
777
+ <span id="statusText">Bereit</span>
778
  </div>
779
+ </div>
780
  </div>
781
+ </div>
782
+
783
+ <!-- Visualizer -->
784
+ <div class="visualizer paused" id="visualizer">
785
+ <div class="bar"></div>
786
+ <div class="bar"></div>
787
+ <div class="bar"></div>
788
+ <div class="bar"></div>
789
+ <div class="bar"></div>
790
+ <div class="bar"></div>
791
+ <div class="bar"></div>
792
+ <div class="bar"></div>
793
+ <div class="bar"></div>
794
+ <div class="bar"></div>
795
+ <div class="bar"></div>
796
+ <div class="bar"></div>
797
+ </div>
798
+
799
+ <!-- Controls -->
800
+ <div class="controls">
801
+ <button class="control-btn" onclick="previousStation()">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
802
  <i class="fas fa-backward"></i>
803
  </button>
804
+ <button class="control-btn" onclick="toggleMute()">
805
  <i class="fas fa-volume-down"></i>
806
  </button>
807
+ <button class="control-btn play-pause" id="playPauseBtn" onclick="togglePlayPause()">
808
  <i class="fas fa-play"></i>
809
  </button>
810
+ <button class="control-btn" onclick="toggleMute()">
811
  <i class="fas fa-volume-up"></i>
812
  </button>
813
+ <button class="control-btn" onclick="nextStation()">
814
  <i class="fas fa-forward"></i>
815
  </button>
816
+ </div>
817
+
818
+ <!-- Volume Control -->
819
+ <div class="volume-control">
820
+ <i class="fas fa-volume-down"></i>
821
+ <input type="range" class="volume-slider" id="volumeSlider" min="0" max="100" value="70">
822
+ <i class="fas fa-volume-up"></i>
823
+ <span style="margin-left: 1rem;" id="volumeValue">70%</span>
824
+ </div>
825
+
826
+ <div class="fallback-info" id="fallbackInfo" style="display: none;">
827
+ <i class="fas fa-info-circle"></i> Simulierter Modus - Die Radio-Streams werden simuliert
828
+ </div>
829
+ </div>
 
 
 
 
 
 
830
 
831
+ <!-- Categories -->
832
+ <div class="categories">
833
+ <button class="category-btn active" onclick="filterStations('all')">Alle</button>
834
+ <button class="category-btn" onclick="filterStations('pop')">Pop</button>
835
+ <button class="category-btn" onclick="filterStations('rock')">Rock</button>
836
+ <button class="category-btn" onclick="filterStations('jazz')">Jazz</button>
837
+ <button class="category-btn" onclick="filterStations('klassik')">Klassik</button>
838
+ <button class="category-btn" onclick="filterStations('news')">Nachrichten</button>
839
  </div>
840
 
841
+ <!-- Stations Grid -->
842
+ <div class="stations-grid" id="stationsGrid">
843
+ <!-- Stations will be dynamically added here -->
844
+ </div>
845
+ </div>
846
+
847
+ <!-- Footer -->
848
+ <footer>
849
+ <div class="footer-content">
850
+ <p>&copy; 2024 Radio Player Deutschland. Alle Rechte vorbehalten.</p>
851
+ <div class="social-links">
852
+ <a href="#" onclick="showToast('Facebook', 'success'); return false;"><i class="fab fa-facebook"></i></a>
853
+ <a href="#" onclick="showToast('Twitter', 'success'); return false;"><i class="fab fa-twitter"></i></a>
854
+ <a href="#" onclick="showToast('Instagram', 'success'); return false;"><i class="fab fa-instagram"></i></a>
855
+ <a href="#" onclick="showToast('YouTube', 'success'); return false;"><i class="fab fa-youtube"></i></a>
856
+ </div>
857
+ </div>
858
+ </footer>
859
+
860
+ <!-- Toast Notification -->
861
+ <div class="toast" id="toast"></div>
862
+
863
+ <!-- Audio Element -->
864
+ <audio id="audioPlayer" crossorigin="anonymous"></audio>
865
+
866
+ <script>
867
+ // Radio Stations Data mit alternativen URLs
868
+ const stations = [
869
+ {
870
+ id: 1,
871
+ name: 'Deutschlandfunk',
872
+ genre: 'Nachrichten',
873
+ url: 'https://st01.dlf.de/dlf/01/128/mp3/stream.mp3',
874
+ fallbackUrl: 'https://icecastmdr-ice.akamaized.net/mdr/128k/mp3/live',
875
+ category: 'news',
876
+ icon: '📻'
877
+ },
878
+ {
879
+ id: 2,
880
+ name: 'Bayern 3',
881
+ genre: 'Pop',
882
+ url: 'https://br-br3-live.cast.addradio.de/br/br3/live/mp3/128/stream.mp3',
883
+ fallbackUrl: 'https://mp3channels.webradio.antenne.de/antenne-bayern',
884
+ category: 'pop',
885
+ icon: '🎵'
886
+ },
887
+ {
888
+ id: 3,
889
+ name: 'WDR 4',
890
+ genre: 'Schlager',
891
+ url: 'https://wdr-4-live.icecast.wdr.de/wdr/wdr4/live/mp3/128/stream.mp3',
892
+ fallbackUrl: 'https://mp3channels.webradio.antennekempten.de/antenne-kempten',
893
+ category: 'pop',
894
+ icon: '🎶'
895
+ },
896
+ {
897
+ id: 4,
898
+ name: 'NDR 2',
899
+ genre: 'Pop/Rock',
900
+ url: 'https://ndr-ndr2-niedersachsen.cast.addradio.de/ndr/ndr2/niedersachsen/mp3/128/stream.mp3',
901
+ fallbackUrl: 'https://stream.radiohamburg.de/rhh-live/mp3-128',
902
+ category: 'rock',
903
+ icon: '🎸'
904
+ },
905
+ {
906
+ id: 5,
907
+ name: 'SWR3',
908
+ genre: 'Pop',
909
+ url: 'https://swr-swr3-live.cast.addradio.de/swr/swr3/live/mp3/128/stream.mp3',
910
+ fallbackUrl: 'https://mp3.ffh.de/radioffh/hqlivestream.mp3',
911
+ category: 'pop',
912
+ icon: '🎼'
913
+ },
914
+ {
915
+ id: 6,
916
+ name: 'HR3',
917
+ genre: 'Pop',
918
+ url: 'https://hr-hr3-live.cast.addradio.de/hr/hr3/live/mp3/128/stream.mp3',
919
+ fallbackUrl: 'https://streams.rpr1.de/rpr-mp3-128',
920
+ category: 'pop',
921
+ icon: '🎤'
922
+ },
923
+ {
924
+ id: 7,
925
+ name: 'MDR Jump',
926
+ genre: 'Rock/Pop',
927
+ url: 'https://mdr-jump-live.cast.addradio.de/mdr/mdr-jump/live/mp3/128/stream.mp3',
928
+ fallbackUrl: 'https://stream.rockantenne.de/rockantenne',
929
+ category: 'rock',
930
+ icon: '🎧'
931
+ },
932
+ {
933
+ id: 8,
934
+ name: 'RPR1',
935
+ genre: 'Pop',
936
+ url: 'https://streams.rpr1.de/rpr-mp3-128',
937
+ fallbackUrl: 'https://mp3channels.webradio.antenne.de/antenne-bayern',
938
+ category: 'pop',
939
+ icon: '🎹'
940
+ },
941
+ {
942
+ id: 9,
943
+ name: 'Radio Bremen',
944
+ genre: 'Nachrichten',
945
+ url: 'https://rb-media.rb-radio.de/rb/bremen/live/mp3/128/stream.mp3',
946
+ fallbackUrl: 'https://st01.dlf.de/dlf/01/128/mp3/stream.mp3',
947
+ category: 'news',
948
+ icon: '📰'
949
+ },
950
+ {
951
+ id: 10,
952
+ name: 'SR 1',
953
+ genre: 'Pop',
954
+ url: 'https://sr-sr1-live.cast.addradio.de/sr/sr1/live/mp3/128/stream.mp3',
955
+ fallbackUrl: 'https://stream.sunshine-live.de/live/mp3-256',
956
+ category: 'pop',
957
+ icon: '🎺'
958
+ },
959
+ {
960
+ id: 11,
961
+ name: 'JazzRadio',
962
+ genre: 'Jazz',
963
+ url: 'http://stream.jazzradio.de/jazzradio/mp3-192',
964
+ fallbackUrl: 'https://stream.lounge-radio.com/mp3',
965
+ category: 'jazz',
966
+ icon: '🎷'
967
+ },
968
+ {
969
+ id: 12,
970
+ name: 'BR-Klassik',
971
+ genre: 'Klassik',
972
+ url: 'https://br-brklassik-live.cast.addradio.de/br/brklassik/live/mp3/128/stream.mp3',
973
+ fallbackUrl: 'https://mp3stream.klassikradio.de/klassikradio',
974
+ category: 'klassik',
975
+ icon: '🎻'
976
+ },
977
+ {
978
+ id: 13,
979
+ name: 'DLF Kultur',
980
+ genre: 'Kultur',
981
+ url: 'https://st02.dlf.de/dlf/02/128/mp3/stream.mp3',
982
+ fallbackUrl: 'https://st01.dlf.de/dlf/01/128/mp3/stream.mp3',
983
+ category: 'news',
984
+ icon: '🎭'
985
+ },
986
+ {
987
+ id: 14,
988
+ name: 'Antenne Bayern',
989
+ genre: 'Pop',
990
+ url: 'https://mp3channels.webradio.antenne.de/antenne-bayern',
991
+ fallbackUrl: 'https://mp3.ffh.de/radioffh/hqlivestream.mp3',
992
+ category: 'pop',
993
+ icon: '📡'
994
+ },
995
+ {
996
+ id: 15,
997
+ name: 'Radio Hamburg',
998
+ genre: 'Pop',
999
+ url: 'https://stream.radiohamburg.de/rhh-live/mp3-128',
1000
+ fallbackUrl: 'https://mp3channels.webradio.antenne.de/antenne-bayern',
1001
+ category: 'pop',
1002
+ icon: '⚓'
1003
+ },
1004
+ {
1005
+ id: 16,
1006
+ name: 'FFH',
1007
+ genre: 'Pop',
1008
+ url: 'https://mp3.ffh.de/radioffh/hqlivestream.mp3',
1009
+ fallbackUrl: 'https://streams.rpr1.de/rpr-mp3-128',
1010
+ category: 'pop',
1011
+ icon: '🎪'
1012
+ }
1013
+ ];
1014
+
1015
+ let currentStationIndex = -1;
1016
+ let isPlaying = false;
1017
+ let currentCategory = 'all';
1018
+ let isFallbackMode = false;
1019
+ let simulationInterval = null;
1020
+
1021
+ // Initialize
1022
+ document.addEventListener('DOMContentLoaded', function() {
1023
+ renderStations();
1024
+ setupVolumeControl();
1025
+ setupAudioEvents();
1026
+ });
1027
+
1028
+ // Setup Audio Events
1029
+ function setupAudioEvents() {
1030
+ const audioPlayer = document.getElementById('audioPlayer');
1031
+
1032
+ audioPlayer.addEventListener('loadstart', () => {
1033
+ updateConnectionStatus('connecting', 'Verbinden...');
1034
  });
1035
+
1036
+ audioPlayer.addEventListener('canplay', () => {
1037
+ updateConnectionStatus('connected', 'Verbunden');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1038
  if (isPlaying) {
1039
+ audioPlayer.play();
 
 
 
 
 
 
 
 
 
 
 
1040
  }
1041
+ });
1042
+
1043
+ audioPlayer.addEventListener('error', (e) => {
1044
+ handleAudioError(e);
1045
+ });
1046
+ }
1047
+
1048
+ // Handle Audio Error
1049
+ function handleAudioError(e) {
1050
+ const audioPlayer = document.getElementById('audioPlayer');
1051
+
1052
+ if (!isFallbackMode && currentStationIndex >= 0) {
1053
+ // Versuche Fallback-URL
1054
+ const station = stations[currentStationIndex];
1055
+ if (station.fallbackUrl && audioPlayer.src !== station.fallbackUrl) {
1056
+ showToast('Hauptstream nicht erreichbar, versuche Alternative...', 'error');
1057
+ audioPlayer.src = station.fallbackUrl;
1058
+ audioPlayer.load();
1059
+ return;
1060
  }
1061
  }
1062
+
1063
+ // Wenn auch Fallback nicht funktioniert, aktiviere Simulationsmodus
1064
+ if (!isFallbackMode) {
1065
+ isFallbackMode = true;
1066
+ document.getElementById('fallbackInfo').style.display = 'block';
1067
+ updateConnectionStatus('connected', 'Simulationsmodus');
1068
+ startSimulation();
1069
+ showToast('Streams nicht verfügbar - Simulationsmodus aktiviert', 'error');
1070
+ }
1071
+ }
1072
+
1073
+ // Start Simulation
1074
+ function startSimulation() {
1075
+ const visualizer = document.getElementById('visualizer');
1076
+ visualizer.classList.remove('paused');
1077
+
1078
+ simulationInterval = setInterval(() => {
1079
+ if (isPlaying) {
1080
+ // Simuliere wechselnde Song-Infos
1081
+ const songs = [
1082
+ '🎵 Aktuelles Lied - Künstler',
1083
+ '🎶 Nächster Hit - Bandname',
1084
+ '🎤 Klassiker - Legendärer Künstler',
1085
+ '🎸 Rock Hymne - Famous Band'
1086
+ ];
1087
+ const randomSong = songs[Math.floor(Math.random() * songs.length)];
1088
+ document.getElementById('currentGenre').textContent = randomSong;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1089
  }
1090
+ }, 5000);
1091
+ }
1092
+
1093
+ // Update Connection Status
1094
+ function updateConnectionStatus(status, text) {
1095
+ const statusEl = document.getElementById('connectionStatus');
1096
+ const statusText = document.getElementById('statusText');
1097
+
1098
+ statusEl.className = `connection-status ${status}`;
1099
+ statusText.textContent = text;
1100
+ }
1101
+
1102
+ // Render Stations
1103
+ function renderStations() {
1104
+ const grid = document.getElementById('stationsGrid');
1105
+ grid.innerHTML = '';
1106
+
1107
+ const filteredStations = currentCategory === 'all'
1108
+ ? stations
1109
+ : stations.filter(s => s.category === currentCategory);
1110
+
1111
+ filteredStations.forEach((station, index) => {
1112
+ const card = document.createElement('div');
1113
+ card.className = 'station-card';
1114
+ card.innerHTML = `
1115
+ <div class="station-status"></div>
1116
+ <div class="station-card-header">
1117
+ <div class="station-card-logo">${station.icon}</div>
1118
+ <div class="station-card-info">
1119
+ <h3>${station.name}</h3>
1120
+ <p>${station.genre}</p>
1121
+ </div>
1122
+ </div>
1123
+ <span class="station-genre">${station.category}</span>
1124
+ `;
1125
+ card.onclick = () => selectStation(station);
1126
+ grid.appendChild(card);
1127
  });
1128
+ }
1129
 
1130
+ // Select Station
1131
+ function selectStation