10]); $jsonContent = $response['body']; if ($response['code'] !== 200 || !$jsonContent) { return []; } // Parser le JSON $data = json_decode($jsonContent, true); if (!$data || !isset($data['results'])) { return []; } $allTracks = []; // Extraire le domaine de l'instance locale pour filtrer $localDomain = parse_url($funkwhaleUrl, PHP_URL_HOST); // Parcourir les morceaux et filtrer pour garder uniquement les morceaux locaux foreach ($data['results'] as $item) { // Vérifier si le morceau est local en comparant le domaine // Les morceaux fédérés ont généralement un domaine différent dans leur URL $isLocal = true; // Vérifier via l'URL de l'artiste ou de l'album if (isset($item['artist']['channel'])) { $artistDomain = parse_url($item['artist']['channel'], PHP_URL_HOST); if ($artistDomain && $artistDomain !== $localDomain) { $isLocal = false; } } // Ou vérifier via le champ is_local si disponible if (isset($item['is_local']) && !$item['is_local']) { $isLocal = false; } // Ne garder que les morceaux locaux if ($isLocal) { // Récupérer l'URL d'écoute depuis l'API (peut être relative) $listenUrl = $item['listen_url'] ?? ''; // Si l'URL est relative, la transformer en URL absolue if (!empty($listenUrl) && strpos($listenUrl, 'http') !== 0) { $listenUrl = rtrim($funkwhaleUrl, '/') . $listenUrl; } $track = [ 'title' => $item['title'] ?? '', 'artist' => $item['artist']['name'] ?? 'Artiste inconnu', 'album' => $item['album']['title'] ?? '', 'cover' => $item['album']['cover']['urls']['medium_square_crop'] ?? '', 'duration' => $item['uploads'][0]['duration'] ?? 0, 'link' => rtrim($funkwhaleUrl, '/') . '/library/tracks/' . ($item['id'] ?? ''), 'trackId' => $item['id'] ?? 0, 'audioUrl' => $listenUrl, ]; // Formater la durée if ($track['duration']) { $track['formattedDuration'] = formatDuration($track['duration']); } else { $track['formattedDuration'] = ''; } $allTracks[] = $track; } } // Mettre en cache tous les morceaux locaux if (defined('CACHE_ENABLED') && CACHE_ENABLED) { saveToCache($cacheKey, $allTracks); } } catch (Exception $e) { error_log('Erreur lors de la récupération des morceaux Funkwhale: ' . $e->getMessage()); return []; } } // Si pas assez de morceaux, retourner ce qu'on a if (empty($allTracks)) { return []; } // Sélectionner aléatoirement $count morceaux parmi tous les morceaux en cache $trackCount = count($allTracks); if ($trackCount <= $count) { return $allTracks; } // Mélanger et prendre les N premiers shuffle($allTracks); return array_slice($allTracks, 0, $count); }