analyze($file); $metadata = [ 'title' => basename($file), 'artist' => 'Unknown Artist', 'album' => 'Unknown Album', 'duration' => 0, 'albumArt' => null ]; if (isset($fileInfo['tags']['id3v2'])) { $metadata['title'] = $fileInfo['tags']['id3v2']['title'][0] ?? $metadata['title']; $metadata['artist'] = $fileInfo['tags']['id3v2']['artist'][0] ?? $metadata['artist']; $metadata['album'] = $fileInfo['tags']['id3v2']['album'][0] ?? $metadata['album']; } if (isset($fileInfo['playtime_seconds'])) { $metadata['duration'] = $fileInfo['playtime_seconds']; } if (isset($fileInfo['comments']['picture'])) { $picture = $fileInfo['comments']['picture'][0]; $metadata['albumArt'] = 'data:' . $picture['image_mime'] . ';base64,' . base64_encode($picture['data']); } return $metadata; } function scanMusicFiles($directory) { $musicExtensions = ['mp3', 'wav', 'ogg', 'flac', 'm4a', 'opus']; $musicFiles = []; $escapedDir = escapeshellarg($directory); $files = shell_exec("find $escapedDir -maxdepth 1 -type f"); $fileList = explode("\n", trim($files)); $processedFiles = []; foreach ($fileList as $file) { $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (in_array($ext, $musicExtensions)) { $processedFiles[] = [ 'path' => $file, 'filename' => basename($file), 'metadata' => extractMusicMetadata($file) ]; } } return $processedFiles; } $file = resolve_path($_GET['q'] ?? ''); if (!file_exists($file) || !is_file($file)) { die("File not found: " . htmlspecialchars($file)); } $currentFileInfo = [ 'path' => $file, 'filename' => basename($file), 'metadata' => extractMusicMetadata($file) ]; $directory = dirname($file); $playlist = scanMusicFiles($directory); $fallbackSvg = 'data:image/svg+xml;utf8,' . urlencode(' '); ?>
= htmlspecialchars($currentFileInfo['metadata']['artist']) ?>
= htmlspecialchars($playlistItem['filename']) ?>
= htmlspecialchars($playlistItem['metadata']['artist']) ?>