true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_TIMEOUT => $timeout, CURLOPT_USERAGENT => 'ClassicXFM/1.0' ]); $res = curl_exec($ch); curl_close($ch); return $res ?: null; } // Last.fm track info function get_track_info($artist, $track, $apiKey) { $url = "https://ws.audioscrobbler.com/2.0/?method=track.getInfo&artist=".urlencode($artist)."&track=".urlencode($track)."&api_key=$apiKey&format=json"; $data = json_decode(fetch_url($url), true); $trackData = $data['track'] ?? null; $cover = ''; if(!empty($trackData['album']['image'])) { $cover = end($trackData['album']['image'])['#text'] ?? ''; } return [ 'artist' => $artist, 'title' => $track, 'album' => $trackData['album']['title'] ?? '', 'cover' => $cover, 'wiki' => $trackData['wiki']['content'] ?? '' ]; } // Last.fm artiest info function get_artist_info($artist, $apiKey) { $url = "https://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=".urlencode($artist)."&api_key=$apiKey&format=json"; $data = json_decode(fetch_url($url), true); $a = $data['artist'] ?? []; $image = ''; if(!empty($a['image'])) { foreach(array_reverse($a['image']) as $img) { if(!empty($img['#text'])) { $image = $img['#text']; break; } } } return [ 'name' => $artist, 'image'=> $image, 'bio' => $a['bio']['summary'] ?? '', 'listeners'=> number_format($a['stats']['listeners'] ?? 0), 'scrobbles'=> number_format($a['stats']['playcount'] ?? 0) ]; } // Apple Music fallback function get_apple_cover($artist, $track, $size=300) { $query = urlencode("$artist $track"); $url = "https://itunes.apple.com/search?term=$query&entity=song&limit=1"; $data = json_decode(fetch_url($url), true); if(!empty($data['results'][0]['artworkUrl100'])) { return str_replace("100x100bb","{$size}x{$size}bb",$data['results'][0]['artworkUrl100']); } return ''; } // Discogs fallback function get_discogs_artist($artist, $token='') { if(!$token) return ''; $url = "https://api.discogs.com/database/search?q=".urlencode($artist)."&type=artist&token=$token"; $data = json_decode(fetch_url($url), true); return !empty($data['results'][0]['cover_image']) ? $data['results'][0]['cover_image'] : ''; } // Algemene cover functie (Last.fm > Apple Music > Discogs > fallback) function get_cover($artist, $track, $lastfmKey, $discogsToken='') { $info = get_track_info($artist, $track, $lastfmKey); $cover = $info['cover'] ?? ''; if(empty($cover)) $cover = get_apple_cover($artist, $track); if(empty($cover) && $discogsToken) $cover = get_discogs_artist($artist, $discogsToken); if(empty($cover)) $cover = 'assets/img/noimglrg.jpg'; return $cover; } // Top albums function get_top_albums($artist, $apiKey, $limit=6) { $url = "https://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums&artist=".urlencode($artist)."&api_key=$apiKey&format=json"; $data = json_decode(fetch_url($url), true); $albums = $data['topalbums']['album'] ?? []; $result = []; foreach(array_slice($albums,0,$limit) as $album) { $img = !empty($album['image'][3]['#text']) ? preg_replace('/^http:/i','https:',$album['image'][3]['#text']) : 'assets/img/noimglrg.jpg'; $result[] = ['name'=>$album['name'],'image'=>$img]; } return $result; } // Similar artists function get_similar_artists($artist, $apiKey, $limit=5) { $url = "https://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=".urlencode($artist)."&api_key=$apiKey&format=json"; $data = json_decode(fetch_url($url), true); $artists = $data['similarartists']['artist'] ?? []; return array_slice($artists,0,$limit); } // DB: laatste track function get_latest_track($db, $type=0) { $res = $db->query("SELECT artist,title,album,date_played FROM songs WHERE song_type=$type ORDER BY date_played DESC LIMIT 1"); return $res ? $res->fetch_assoc() : null; } ?>