diff --git a/api/version/media-url.php b/api/version/media-url.php index 1901870..d103c34 100644 --- a/api/version/media-url.php +++ b/api/version/media-url.php @@ -105,6 +105,8 @@ $mediaUrl = null; if ($providedUrl) { // Reconstruir la URL si fue pasada sin codificar y otros parámetros quedaron como GET separados $mediaUrl = $providedUrl; + // Normalizar entidades HTML que puedan haber sido almacenadas (ej. & -> &) + $mediaUrl = html_entity_decode($mediaUrl, ENT_QUOTES | ENT_HTML5); $ignoredKeys = ['url','download','id','local']; $extraParts = []; foreach ($_GET as $k => $v) { diff --git a/chat_window.php b/chat_window.php index 18b8e15..e195db3 100644 --- a/chat_window.php +++ b/chat_window.php @@ -707,18 +707,47 @@ if (empty($user_id)) { } break; case 'video': - contentHtml = ``; + // Determinar mejor fuente de media + const mediaSrcVid = isValidMediaUrl(fullUrl) ? fullUrl : (isValidMediaUrl(thumbUrl) ? thumbUrl : (isValidMediaUrl(msg.media_url) ? msg.media_url : (isValidMediaUrl(msg.media_url_external) ? msg.media_url_external : ''))); + console.debug('video media src:', mediaSrcVid, 'fullUrl:', fullUrl, 'thumbUrl:', thumbUrl, 'msg.media_url:', msg.media_url, 'msg.media_url_external:', msg.media_url_external); + if (isValidMediaUrl(mediaSrcVid)) { + contentHtml = ``; + } else { + contentHtml = `
Video no disponible
`; + } break; case 'audio': - contentHtml = ``; + // Determinar mejor fuente de media para audio + const mediaSrcAudio = isValidMediaUrl(fullUrl) ? fullUrl : (isValidMediaUrl(thumbUrl) ? thumbUrl : (isValidMediaUrl(msg.media_url) ? msg.media_url : (isValidMediaUrl(msg.media_url_external) ? msg.media_url_external : ''))); + if (isValidMediaUrl(mediaSrcAudio)) { + contentHtml = ``; + console.debug('audio media src:', mediaSrcAudio, 'effective_media:', msg.effective_media, 'media_url_external:', msg.media_url_external, 'local_file:', msg.local_file); + // Añadir enlace de descarga seguro / proxy si es posible + let audioDownload = null; + let candidate = isValidMediaUrl(msg.effective_media) ? msg.effective_media : (isValidMediaUrl(msg.media_url_external) ? msg.media_url_external : (isValidMediaUrl(msg.local_file) ? msg.local_file : null)); + if (candidate && candidate.indexOf && candidate.indexOf('api/get_media.php?id=') !== -1) { + const parts = candidate.split('id='); + const mid = parts[1] ? decodeURIComponent(parts[1]) : ''; + audioDownload = `/api/version/media-url.php?id=${encodeURIComponent(mid)}&download=1`; + } else if (candidate && /^https?:\/\//i.test(candidate)) { + audioDownload = `/api/version/media-url.php?url=${encodeURIComponent(candidate)}&download=1`; + } else if (candidate && candidate === msg.local_file) { + audioDownload = `/api/version/media-url.php?local=${encodeURIComponent(candidate)}&download=1`; + } + if (audioDownload) { + contentHtml += `
Descargar audio
`; + } + } else { + contentHtml = `
Audio no disponible
`; + } break; case 'document': const filename = msg.filename || msg.content || 'Documento';