Erweiterte Spezifikation: Webbasierte Spotify-Style MP3-Play...
Prompt
Erweiterte Spezifikation: Webbasierte Spotify-Style MP3-Player App (Einzelne HTML-Datei) Erstelle eine vollstĂ€ndige, webbasierte Audio-Player-App als eine einzelne HTML-Datei (HTML, CSS, JavaScript inline, Tailwind CSS via CDN, music-metadata-browser via CDN). Der Player soll folgende Funktionen und Design-Anforderungen erfĂŒllen. Alle sichtbaren Texte, Buttons, Labels und Beschriftungen sind in Englisch. 0. Globale Architektur & Persistenz 0.1 Zustands-Persistenz (ĂŒber Reload & Reboot) Alle nutzerbezogenen Daten werden clientseitig persistiert: localStorage: LautstĂ€rke, Mute-Status, letzter gespielter Song + Position, Wiedergabemodus, Shuffle-History, EQ-Presets, Custom-EQ-Werte, Sleep-Timer-Wert, Theme (Akzentfarbe, OLED-Schwarz), API-Keys, Last.fm Session-Token, Playback-Speed, Sortierung, Lyrics-Toggle, Dislike-Reset-Datum, Balance/Mono, Output-Device-ID. IndexedDB: Queue-Inhalte (mit Position), Playlists (Ordner-Handles + Songs), Favoriten, Dislikes (mit Ablaufdatum âMitternacht"), Play Counts, Hörzeit-Statistiken (Day/Week/Month/All), Lyrics-Cache, Waveform-Cache, Song-Metadaten-Fingerprints. Ordner-Handles: In Chromium-basierten Browsern via File System Access API persistent speichern (ĂŒberlebt Reboot, benötigt nur Re-Grant). In Firefox Fallback: Ordner bei jedem Start neu wĂ€hlen, aber alle anderen Daten werden trotzdem wiederhergestellt. 0.2 Toast-Benachrichtigungssystem Oben rechts erscheint ein kleines abgerundetes Toast-Panel (max. 3 gestapelt). Auto-dismiss nach 3s mit Fade-out. Beispiele: âAdded to Queue", âSong Liked ", âDisliked until tomorrow", âFolder imported", âScrobble sent", âLyrics not found". Icons je nach Aktion. 0.3 Tab-Titel & dynamisches Favicon Tab-Titel: đ” [Song Title] â [Artist] wĂ€hrend Wiedergabe, sonst Music Player. Favicon: Wird zur Laufzeit aus dem Cover-Thumbnail generiert (Canvas â Data-URL â link[rel=icon]). 0.4 UnterstĂŒtzte Audioformate .mp3, .flac, .m4a, .ogg, .wav. Metadaten (ID3, Vorbis, MP4-Atoms) werden via music-metadata-browser einheitlich extrahiert. Cover-Fallback mit Gradient + Initialen. 0.5 Drag & Drop Ordner-Import Drop-Zone ĂŒber gesamten Viewport. Beim Drag-Over: blauer Ring + âDrop folder to import"-Text. Chromium: persistierbares Handle. Firefox: Fallback auf <input webkitdirectory>. 1. Ordnerauswahl & Playlist-Management 1.1 Import Add-Folder-Button im Playlist-Panel (File System Access API, Fallback <input webkitdirectory>). Drag & Drop (siehe 0.5). Ordner â Playlist (Name = Ordnername, via KontextmenĂŒ umbenennen). Automatisches Einlesen aller unterstĂŒtzten Formate, Tag-Extraktion, Cover-Fallback. 1.2 Playlist-Panel (linke Seitenleiste) Hamburger-Button toggle, Slide-Animation, Overlay mit Blur + pointer-events: none auf dem Rest, Klick-auf-Overlay schlieĂt Panel. Drei-Punkte-MenĂŒ pro Playlist: Rename, Delete, Duplicate. Playlists bleiben persistent in IndexedDB (mit File-Handle-Referenz). 1.3 Verhalten bei Playlist-Wechsel Aktueller Song bleibt aktiv, wenn in neuer Playlist vorhanden (smooth Scroll zum Eintrag). Andernfalls: Stop + zufĂ€lliger Song aus neuer Playlist. Suchfilter wird bei Wechsel zurĂŒckgesetzt. 2. Layout (Spotify-Vibe, dunkles Theme) 2.1 Top-Bar Von links nach rechts: Hamburger (Playlist-Panel Toggle) Aktueller Playlist-Name (groĂ) Sort-Button (NEU): Dropdown mit âSort by: Title / Artist / Album / Duration / Date Added" + Ascending/Descending Toggle. Position stabil. Suchfeld mit Live-Fuzzy-Filter (Tippfehler-Toleranz via Levenshtein), Treffer-Highlight in Songliste (fett + Akzentfarbe). X-Button zum Resetten. Theme-Switcher (NEU): Farb-Palette-Icon, Popover mit Farbkreis fĂŒr Akzentfarbe + Toggle âOLED Black" (reines #000 Hintergrund). 2.2 Now-Playing-Bereich (zentral) Cover (groĂ), Titel, KĂŒnstler, Album. NEU â âUp Next"-Vorschau: Unter aktuellem Song erscheinen die nĂ€chsten 2 Songs (pre-rolled bei Shuffle, Queue-Songs haben PrioritĂ€t) als kleine Zeilen mit Mini-Cover, Titel, Artist, Dauer. Klick â Song wird sofort abgespielt. Dynamische Cover-Farben: Durchschnittsfarbe des Covers wird als sanfter Gradient-Hintergrund (mit dunklem Overlay fĂŒr Kontrast) ĂŒber den Now-Playing-Bereich gelegt. Aktualisiert sich bei Songwechsel mit Fade. 2.3 Steuerungselemente Play/Pause, Skip Prev, Skip Next, Volume-Slider, Fortschrittsbalken (siehe 4.2). NEU darunter eine zweite Zeile: Playback-Speed-Dropdown (0.75x / 1x / 1.25x / 1.5x / 2x) Mini-Player-Button Settings-Button (links neben Volume, Position stabil) Queue-Button (unten rechts, wie gehabt) 2.4 Songliste Scrollbarer Container, fixe Höhe. Zeilenlayout: Cover-Thumb + Titel links, Artist/Album mittig (zentriert), Dauer rechts. Hover zeigt statt Dauer ein âź-Icon mit groĂer Hitbox. KontextmenĂŒ mit: Play Now Play Next (NEU â schiebt Song direkt nach aktuellem in Queue) Add to Queue Add to Favorites / Remove Dislike / âNot today" (NEU â Song wird bis Mitternacht ĂŒbersprungen, persistent) Song Details (NEU â öffnet Song-Detailseite, siehe Abschnitt 10) Interaktive Artist-Namen bleiben wie spezifiziert (Shift+Click = Suche). 3. Wiedergabemodi Normal, Smart Shuffle 2.0 (Default), Repeat One. Smart Shuffle 2.0: Zufall mit Gewichtung â selten gespielte Songs (niedriger Play Count) und lange nicht gehörte Songs haben höhere Chance. 4-Songs-Abstandsregel bleibt. Dislikes werden bis Mitternacht ausgeschlossen. Pre-Rolling: Die nĂ€chsten 2 Songs werden beim Songwechsel im Voraus gewĂŒrfelt und in der âUp Next"-Vorschau (2.2) angezeigt. Bei manuellem Skip oder Shuffle-Wechsel wird neu gewĂŒrfelt. Aktiver Modus wird grĂŒn (#1DB954) hervorgehoben. Buttons beeinflussen Layout anderer Controls nicht. 4. Steuerungselemente â Slider & Audio 4.1 Slider GroĂe Hitboxen, Maus- + Touch-Drag. Fortschritt + Volume. 4.2 Waveform-Fortschrittsbalken (NEU â SoundCloud-Style) Statt linearem Balken wird die dekodierte Audio-Welle als SVG-Balkendiagramm angezeigt. Wird nur fĂŒr aktuellen + nĂ€chsten Song via OfflineAudioContext im Web Worker berechnet und in IndexedDB gecacht. Fortschritt wird als âgefĂŒllter" Teil der Welle dargestellt. 4.3 Playback-Speed (NEU) 0.75x â 2x via <audio>.playbackRate. Toggle âPreserve Pitch" (default an). Crossfade-Dauer wird an Tempo angepasst. 4.4 Crossfade 4 Sekunden Fade-out / Fade-in ĂŒber Gain-Nodes, zwei Audio-Elemente. Aktiv in Normal, Smart Shuffle, Queue. Inaktiv bei Repeat-One. 4.5 Audio-Chain (Web Audio API) <audio> â Gain(Crossfade) â BiquadFilter-Kette (10-Band EQ) â Bass-Enhancer (Low-Shelf + Waveshaper) â Reverb (ConvolverNode mit synthetisch generierter Impulsantwort, Dry/Wet-Regler) â Stereo Balance (PannerNode) â Mono-Mix-Option (ChannelMerger) â Limiter (DynamicsCompressorNode gegen Clipping bei EQ-Boost) â setSinkId (AusgabegerĂ€t, Chromium only, graceful Fallback) â Destination. Alle Effekte kompatibel mit Crossfade und zwei Audio-Elementen (Chain wird fĂŒr beide parallel aufgebaut). 5. Queue-System (erweitert) Slide-Up-Animation aus Queue-Button, Overlay mit Blur, SchlieĂen per X oder Overlay-Click. Drag & Drop Sortieren innerhalb der Queue (NEU). Hover â Dauer wird zu X (Remove). Play Next + Add to Queue aus Song-KontextmenĂŒ (siehe 2.4). Cover-Fluganimationen (1/x-Kurve) bleiben wie spezifiziert. Wiedergabe-PrioritĂ€t: Repeat One > Queue > Play Next Songs > Shuffle/Normal. 6. Now-Playing-GroĂansicht (Liquid Glass) Klick auf Cover â Fullscreen-Overlay mit Frosted-Glass (backdrop-filter: blur). EnthĂ€lt: Cover, Song-Metadaten, alle Controls. NEU-Erweiterungen: Lyrics-Panel (umschaltbar rechts oder unter Cover): synchronisiert mitscrollend (siehe 5.1). Visualizer-Modus: Toggle fĂŒr Fullscreen-Spektrum-Visualizer (AnalyserNode, 128 Bins, Balken in Akzentfarbe, 60 fps). SchlieĂen per X oder Backdrop-Click mit Scale/Fade-Animation. 7. Lyrics-System (NEU) Lokale Tags: USLT-Frames (unsynced) aus ID3 direkt darstellen. LRCLIB-Fallback (lrclib.net): Kostenlose, offene API (kein Key nötig). Abfrage mit track_name, artist_name, album_name, duration. Synced Lyrics (LRC-Format) mit Zeitstempeln. Cache: Jeder Treffer wird dauerhaft in IndexedDB gespeichert. Song wird nur einmal angefragt, danach auch offline verfĂŒgbar. Display: Synced Lyrics scrollen automatisch mit (aktuelle Zeile fett + Akzentfarbe, andere ausgegraut). Unsynced Lyrics als einfacher Textblock. Toggle: In Settings deaktivierbar (Datenschutz-Hinweis). 8. Artist-Detailseite (erweitert) Wie spezifiziert (Liquid-Glass, Last.fm-Stats, lokale Songs, Similar Artists aus Playlist). NEU: Hörzeit-Statistik dieses Artists: Today / This Week / This Month / All Time (Kacheln). Most Played Songs dieses Artists (Top 5) als separate Liste. Navigation zwischen Artists bricht Wiedergabe nicht ab. 9. Settings-Panel (erweitert) Slide-Animation, Overlay-Logik wie gehabt. Drei Hauptbereiche + NEUE Sektionen: 9.1 API Key (Last.fm) Maskiertes Eingabefeld mit Auge-Icon + Save/Clear. 9.2 Equalizer 10-Band (60Hzâ16kHz), vertikale Slider, Presets (Flat, Bass Boost, Treble, Vocal, Rock, Pop, Electronic, Loudness, Custom), animiertes Gliden der Slider bei Preset-Wechsel, dB-Werte, Reset-Button. Presets in localStorage. 9.3 Sleep Timer 1â100 min Slider + NEU: Toggle âAfter current song" (stoppt nach Songende statt nach Timer). Aktiver Timer = grĂŒner Punkt am settings-Icon. 9.4 NEUE Settings-Sektionen Themes: Farbkreis fĂŒr Akzentfarbe + OLED-Black-Toggle. Last.fm Scrobbling: Connect-Button (OAuth-Flow: Request Token â Authorize â Session Key in localStorage). Status-Anzeige. Auto-scrobble bei >50% oder 4min. track.updateNowPlaying bei Songstart. Lyrics: Toggle (enable/disable), Button âClear lyrics cache" mit Toast-Feedback. Dislikes: Button âReset all dislikes" (löscht ânot today"-Markierungen). Audio Effects: Reverb (Room-Size-Slider + Dry/Wet), Bass Enhancer (Amount-Slider), Limiter (Threshold-Slider), Balance (L/R-Slider), Mono-Toggle. Output Device: Dropdown mit navigator.mediaDevices.enumerateDevices() (Audio-Ausgang), nur Chromium. Playback Speed Preset: Default-Wert + Pitch-Preservation-Toggle. 10. Song-Detailseite (NEU) Auslöser: Klick auf I im Song-KontextmenĂŒ (2.4) oder auf Cover im Now-Playing. Liquid-Glass-Fullscreen-Overlay mit: GroĂes Cover, Titel, Artist(s), Album Technical Info: Bitrate (aus MP3-Header gelesen, VBR = Durchschnitt), Sample Rate, Channels, DateigröĂe, Format, HinzufĂŒgedatum Listening Stats: Play Count, Last Played, Total Listening Time, Favorite-Status ( Toggle), Dislike-Status All ID3 Tags: als scrollbare Liste (Key: Value) Actions: Play Now, Play Next, Add to Queue, Favorite, Dislike, Open Artist Page SchlieĂen per X oder Backdrop-Click. 11. Hörzeit-Statistik (NEU) Globale Stats in Settings-Panel als eigener Tab: Today / This Week / This Month / This Year / All Time als groĂe Kacheln. Top Artists (Top 10) der jeweiligen Zeitspanne. Top Songs (Top 10). Listening Streak (aufeinanderfolgende Tage mit Musik). Alle Daten in IndexedDB, persistiert ĂŒber Reload/Reboot. 12. Keyboard-Shortcuts (NEU) Immer aktiv, auĂer bei Fokussierung von Input-Feldern (dann nur Esc zum Verlassen). Hilfe-Overlay via ?-Taste: Taste Aktion Space / K Play / Pause J -10 Sekunden L +10 Sekunden â / â -10s / +10s (alternativ) â / â Volume +/- M Mute / Unmute S Shuffle-Modus wechseln R Repeat-Modus wechseln N Next Track P Previous Track / Suche fokussieren F Fullscreen Now-Playing-Overlay Q Queue öffnen/schlieĂen Esc Overlay schlieĂen ? Shortcut-Hilfe anzeigen 13. Mini-Player / Picture-in-Picture (NEU) Auslöser: -Button in Steuerungsleiste. Chromium: Picture-in-Picture API (videoRequestPictureInPicture) mit einem unsichtbaren <video>-Element, das Cover + Visualizer rendert. Immer-on-top, synchronisiert mit Main-Player. Firefox/Fallback: window.open() mit festen Dimensionen (300Ă400px), synchronisiert via BroadcastChannel oder shared localStorage Events. Inhalt: Cover, Titel, Artist, Play/Pause, Skip Prev/Next, Volume, Close-Button. Sync: Alle Ănderungen (Song, Position, Volume) spiegeln sich in Main-Player und Mini-Player sofort. 14. Last.fm Scrobbling (NEU) Auth-Flow: auth.getToken â User autorisiert auf last.fm â auth.getSession â Session-Key in localStorage. track.updateNowPlaying: bei Songstart. track.scrobble: bei >50% Spieldauer oder â„4 Minuten. Fehlerbehandlung: Stille via try/catch, Toast âScrobble failed" bei Fehler. 15. Dynamische Cover-Farben (NEU) Canvas extrahiert beim Songwechsel die dominierende Farbe des Covers. Diese wird als sanfter Radial-Gradient-Hintergrund ĂŒber den Now-Playing-Bereich und die Now-Playing-GroĂansicht gelegt, mit einem dunklen Overlay (opacity ~0.6) um Text-Kontrast zu garantieren. Farbwechsel mit 500ms Fade-Transition. 16. Technisches Setup Single HTML file, inline CSS/JS, Tailwind via CDN. Web Workers fĂŒr: Audio-Dekodierung (Waveforms), Fuzzy-Search-Index, Cover-Farbextraktion. IndexedDB mit klarer Schema-Struktur (Stores: playlists, songs, queue, favorites, dislikes, playCounts, listeningStats, lyrics, waveforms, settings). Graceful Degradation fĂŒr nicht-unterstĂŒtzte APIs (setSinkId, PiP). Keine Demo-Songs, keine externen Lyrics-Dateien. Leichtgewichtig: soll auf alten Rechnern und schwachen Browsern flĂŒssig laufen. Bitte liefere die komplette Lösung als eine einzelne HTML-Datei. Benutze inaudible der ganzen Seite KEINE Emojis! Erstelle eigene passende icons wenn gebraucht
A system prompt was added to support web rendering
Response not available
Response not available