['timeout' => 10]]); return @file_get_contents($url, false, $context); } // Returns ['title', 'artist', 'album'] while streaming, null when offline, // or false when the status API could not be reached. function fetchCurrentTrack() { $response = httpGet(ICECAST_STATUS_URL); if ($response === false) return false; $data = json_decode($response, true); if (!isset($data['icestats']['source'])) return null; $source = $data['icestats']['source']; $currentStream = (!is_array($source) || isset($source['title'])) ? $source : $source[0]; $raw = decodeMetaField($currentStream, 'title'); $parts = array_map('trim', explode(' - ', $raw, 3)); return [ 'title' => $parts[0] ?? '', 'artist' => $parts[1] ?? '', 'album' => $parts[2] ?? '', ]; } // Look up album art from iTunes Search API function lookupAlbumArt(string $artist, string $album): string { if ($artist === '' || $album === '') return ''; $query = urlencode($artist . ' ' . $album); $itunesResponse = httpGet("https://itunes.apple.com/search?term={$query}&entity=album&media=music&limit=1"); if ($itunesResponse === false) return ''; $itunesData = json_decode($itunesResponse, true); if (empty($itunesData['results'][0]['artworkUrl100'])) return ''; return str_replace('100x100bb', '400x400bb', $itunesData['results'][0]['artworkUrl100']); } function lastfmTrackUrl(string $artist, string $title): string { return 'https://www.last.fm/music/' . rawurlencode($artist) . '/_/' . rawurlencode($title); } function lastfmAlbumUrl(string $artist, string $album): string { return 'https://www.last.fm/music/' . rawurlencode($artist) . '/' . rawurlencode($album); }