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 '' . $titulo . ''; } return '' . $titulo . ''; } 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 '
' . renderImagenCancion($cancion) . '
' . $titulo . '
' . $artista . '
👁 ' . $vistas . ' ❤️ ' . $likes . '
'; } ?> CancioneroWeb - La música nos une con los demás

La música nos une
con los demás

El cancionero comunitario de la música de autor en español. Encuentra letras, acordes y dedica canciones a quienes amas.

Canciones
Cantautores
Comunidad

⚠️ Error temporal

Estamos experimentando problemas técnicos. Intenta recargar la página en unos momentos.

🆕 Últimas Registradas

Ver todas →

No hay canciones registradas aún.

🔥 Más Populares

Ver top completo →

No hay canciones populares aún.

🎸 Explora por Género

🎤
Balada
🥁
Salsa
🎹
Pop
🎸
Trova
🤠
Ranchera
🌹
Bolero

¿Eres cantautor?

Únete a nuestra comunidad y comparte tu música con miles de personas que buscan letras con significado.

Unirme a la comunidad