query("
SELECT id, titulo, artista, imagen_portada, youtube_id, vistas, likes
FROM canciones
WHERE estado = 'aprobada'
ORDER BY fecha_creacion DESC
LIMIT 6
");
$ultimas = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt2 = $pdo->query("
SELECT id, titulo, artista, imagen_portada, youtube_id, vistas, likes
FROM canciones
WHERE estado = 'aprobada'
ORDER BY vistas DESC
LIMIT 6
");
$populares = $stmt2->fetchAll(PDO::FETCH_ASSOC);
$total_canciones = $pdo->query("SELECT COUNT(*) FROM canciones WHERE estado = 'aprobada'")->fetchColumn();
$total_cantautores = $pdo->query("SELECT COUNT(DISTINCT artista) FROM canciones WHERE artista IS NOT NULL AND artista != '' AND artista != 'Artista desconocido'")->fetchColumn();
} catch (Exception $e) {
$db_error = true;
}
}
/**
* Obtiene la imagen de la canción con fallback inteligente
* 1. Portada personalizada (si existe)
* 2. YouTube mqdefault (320x180) - si existe
* 3. YouTube default (120x90) - siempre existe
* 4. Imagen por defecto del sitio
*/
function getImagenCancion($cancion) {
// 1. Portada personalizada
if (!empty($cancion['imagen_portada'])) {
return htmlspecialchars($cancion['imagen_portada']);
}
// 2. Miniatura YouTube con fallback
if (!empty($cancion['youtube_id'])) {
$ytId = htmlspecialchars($cancion['youtube_id']);
// mqdefault es 320x180, pero NO siempre existe
// default.jpg es 120x90, SIEMPRE existe
// Usamos mqdefault con fallback a default.jpg vía JavaScript
return 'https://img.youtube.com/vi/' . $ytId . '/mqdefault.jpg';
}
// 4. Imagen por defecto
return '/assets/img/default-song.jpg';
}
/**
* Genera el HTML de la imagen con manejo de errores (onerror)
* Si mqdefault falla, carga default.jpg; si eso también falla, gradiente CSS
*/
function renderImagenCancion($cancion) {
$imagen = getImagenCancion($cancion);
$titulo = htmlspecialchars($cancion['titulo']);
if (!empty($cancion['youtube_id'])) {
$ytId = htmlspecialchars($cancion['youtube_id']);
// onerror: si mqdefault falla → default.jpg → si eso falla → data URI transparente (muestra gradiente CSS de fondo)
return '';
}
return '
';
}
function formatearArtista($artista) {
if (empty($artista) || $artista === 'Artista desconocido') {
return 'Intérprete/Autor no especificado';
}
if (strpos($artista, ' - ') !== false) {
list($autor, $interprete) = explode(' - ', $artista, 2);
$autor = trim($autor);
$interprete = trim($interprete);
return htmlspecialchars($interprete) . ' (' . htmlspecialchars($autor) . ')';
}
return htmlspecialchars($artista);
}
function renderCard($cancion) {
$titulo = htmlspecialchars($cancion['titulo']);
$artista = formatearArtista($cancion['artista']);
$vistas = number_format($cancion['vistas'] ?? 0);
$likes = number_format($cancion['likes'] ?? 0);
$url = '/cancion.php?id=' . (int)$cancion['id'];
return '
El cancionero comunitario de la música de autor en español. Encuentra letras, acordes y dedica canciones a quienes amas.
Estamos experimentando problemas técnicos. Intenta recargar la página en unos momentos.
No hay canciones registradas aún.
No hay canciones populares aún.
Únete a nuestra comunidad y comparte tu música con miles de personas que buscan letras con significado.
Unirme a la comunidad