# ============================================================================= # Radio station configuration # --------------------------------------------------------------------------- # Copy this file to ".env" and edit the values. Every station only needs to # touch this file — no PHP changes required. # # cp .env.example .env # # Booleans accept: true/false, 1/0, yes/no, on/off. # Lines starting with # are comments. Quote values that contain spaces or #. # ============================================================================= # ----------------------------------------------------------------------------- # Branding & metadata # ----------------------------------------------------------------------------- SITE_NAME="My Radio" # Short name used for og:site_name (defaults to SITE_NAME). SITE_SHORT_NAME="My Radio" SITE_TAGLINE="Streaming 24/7" SITE_DESCRIPTION="Listen to my internet radio station 24/7 with all the music you can handle!" SITE_KEYWORDS="radio, internet radio, music, live stream" # Public URL of this site, with trailing slash. Used for canonical/OpenGraph tags. SITE_URL="https://radio.example.com/" SITE_LOCALE="en_US" SITE_LANG="en" SITE_AUTHOR="" # ----------------------------------------------------------------------------- # SEO / icons # ----------------------------------------------------------------------------- # OpenGraph / share image. Absolute URL recommended (falls back to album art # at runtime once a track is playing). OG_IMAGE="https://radio.example.com/assets/icons/og.png" OG_IMAGE_WIDTH="" OG_IMAGE_HEIGHT="" # Render the favicon / touch-icon links. The repo ships a default set in # ICONS_DIR (favicon-96x96.png, favicon.svg, favicon.ico, apple-touch-icon.png, # site.webmanifest, web-app-manifest-*.png) — replace them with your own. SHOW_ICONS=true ICONS_DIR="assets/icons" # Browser UI colors. THEME_COLOR="#e21d31" TILE_COLOR="#5e656e" # ----------------------------------------------------------------------------- # Stream (the audio the browser plays) # ----------------------------------------------------------------------------- # Public URL of your stream mount (what nginx proxies to Icecast). STREAM_URL="https://radio.example.com/stream" STREAM_TYPE="audio/mpeg" # ----------------------------------------------------------------------------- # Offline fallback (used when now-playing reports the stream is offline) # ----------------------------------------------------------------------------- # Optional local/hosted audio to play when the live stream is down (looped like # a "we'll be right back" bed). Leave blank to just show the offline art. OFFLINE_STREAM_URL="" # e.g. OFFLINE_STREAM_URL="assets/audio/offline.mp3" OFFLINE_STREAM_TYPE="audio/mpeg" OFFLINE_LOOP=true # A distinct placeholder image shown while offline. OFFLINE_ART="assets/img/offline.svg" # Text shown in place of the track name / artist while offline. OFFLINE_NAME="Off air" OFFLINE_MESSAGE="We'll be right back" # ----------------------------------------------------------------------------- # Now playing (metadata the SERVER fetches, then normalizes for the browser) # ----------------------------------------------------------------------------- # provider: icecast | azuracast | shoutcast | custom NOWPLAYING_PROVIDER="icecast" # The status endpoint your PHP server fetches. This may be an internal address # (e.g. http://127.0.0.1:8000/...) since only the server hits it. # icecast -> http://127.0.0.1:8000/status-json.xsl # azuracast -> https://azura.example.com/api/nowplaying/your_station_shortcode # shoutcast -> http://127.0.0.1:8000/stats?json=1 # custom -> any URL returning JSON NOWPLAYING_URL="http://127.0.0.1:8000/status-json.xsl" # Icecast only: if you run multiple mounts, name the one to read (e.g. /stream). ICECAST_MOUNT="" # How to split a combined "ArtistTitle" string (Icecast/Shoutcast). # The original dou.bet station uses " <-|-> ". Most setups use " - ". TITLE_DELIMITER=" - " # Polling / timeouts (seconds). NOWPLAYING_POLL_SECONDS=10 NOWPLAYING_TIMEOUT=5 # Clean junk out of titles. Separate entries with "||". With CLEANUP_IS_REGEX # each entry is a case-insensitive regex (no delimiters), otherwise it is a # literal string removed wherever it appears. # literal example: # TITLE_CLEANUP=".mp3|| [Explicit]|| (Radio Edit)|| (Remastered)|| (Live)|| (Demo)" # regex example (strips any "(... Remaster ...)" or "(... Mix)"): # TITLE_CLEANUP="\s*\([^)]*remaster[^)]*\)|\s*\([^)]*mix\)" # CLEANUP_IS_REGEX=true TITLE_CLEANUP="" CLEANUP_IS_REGEX=false # --- custom provider only: JSON field paths (dot notation, arrays ok: a.b.0.c) CUSTOM_ARTIST_PATH="" CUSTOM_TITLE_PATH="" CUSTOM_ALBUM_PATH="" CUSTOM_ART_PATH="" CUSTOM_LISTENERS_PATH="" # If your feed only has a single combined field, set this instead of # CUSTOM_ARTIST_PATH/CUSTOM_TITLE_PATH; it is split on TITLE_DELIMITER. CUSTOM_TITLE_COMBINED_PATH="" # ----------------------------------------------------------------------------- # Artwork & lyrics (Genius is optional) # ----------------------------------------------------------------------------- # source: auto | provider | genius | none # auto = use provider art if present, else Genius (if configured), else fallback # provider = only use art the stream provider itself supplies (e.g. AzuraCast) # genius = always look art up on Genius # none = always use the fallback image ARTWORK_SOURCE="auto" FALLBACK_ART="assets/img/placeholder.svg" # Optional Last.fm fallback used when Genius has no cover art. # Get a key at https://www.last.fm/api/account/create LASTFM_API_KEY="" # Show a "Show lyrics" button. Lyrics are looked up on LRCLIB (free, no key) # first, falling back to Genius below only if LRCLIB has nothing. LYRICS_ENABLED=true # Prefer the first English-language match on Genius (costs a few extra API # calls per song). Useful if your library has many non-English duplicates. # Only applies to the Genius fallback. LYRICS_PREFER_ENGLISH=false # Genius API token — optional, only used as a lyrics fallback when LRCLIB has # nothing (still used as the primary/only source for album art lookups). # Get one at https://genius.com/api-clients (Client Access Token). # Provide EITHER the plain token... GENIUS_TOKEN="" # ...OR a base64-encoded token (kept for compatibility with the original project). GENIUS_API_BASE64="" # ----------------------------------------------------------------------------- # Theme & colors (also drives CSS variables — restyle without editing CSS) # ----------------------------------------------------------------------------- THEME_BG="#000000" THEME_BG_MOBILE="#262626" THEME_SURFACE="#1a1a1a" THEME_TEXT="#ffffff" THEME_MUTED="#bfbfbf" THEME_ACCENT="#e21d31" THEME_ACCENT_HOVER="#cf1b2d" THEME_ACCENT_TEXT="#000000" THEME_RADIUS="15px" THEME_FONT="Helvetica, Calibri, Tahoma, Verdana, Arial, sans-serif" # Recolor the page background to match the current album art (auto light/dark # text). Needs CORS-accessible art to sample; falls back gracefully otherwise. THEME_DYNAMIC_BG=true # ----------------------------------------------------------------------------- # Player # ----------------------------------------------------------------------------- # rich = custom play/pause button, seek + volume sliders, elapsed time, LIVE badge # simple = plain native