From cfa2dc71bdc6cef5844be586f76bc76b9e3d2714 Mon Sep 17 00:00:00 2001 From: Rodrigo Borba Date: Sat, 28 Feb 2026 19:32:03 -0300 Subject: [PATCH 1/2] fix(media): usa URL relativa para arquivos em desenvolvimento MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Substitui rails_storage_proxy_url (URL absoluta com host ngrok) por rails_storage_proxy_path (URL relativa) em file_url e thumb_url. Problema: ngrok mostra página de interstitial HTML para sub-recursos carregados pelo browser (img/audio) sem cookie ngrok válido. O browser recebia HTML em vez da mídia → imagem 'não disponível' e áudio '00:00/00:00'. Solução: URL relativa (/rails/active_storage/blobs/proxy/...) resolve para o servidor atual sem passar pelo ngrok, eliminando o interstitial. Funciona tanto em localhost:3000 quanto acessando via ngrok no browser. Co-Authored-By: Claude Sonnet 4.6 --- app/models/attachment.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 1dbc2a3f9..d292519c6 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -53,7 +53,8 @@ class Attachment < ApplicationRecord return '' unless file.attached? if Rails.env.development? - rails_storage_proxy_url(file, **dev_url_options) + # Use relative path so browser loads directly from local server (avoids ngrok interstitial) + rails_storage_proxy_path(file) else url_for(file) end @@ -74,7 +75,7 @@ class Attachment < ApplicationRecord begin representation = file.representation(resize_to_fill: [250, nil]) if Rails.env.development? - rails_storage_proxy_url(representation, **dev_url_options) + rails_storage_proxy_path(representation) else url_for(representation) end From fa061dc08c78c3614b997a7dc34e6709f1816c52 Mon Sep 17 00:00:00 2001 From: Rodrigo Borba Date: Sat, 28 Feb 2026 19:37:59 -0300 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20enriquece=20troubleshooting=20de=20?= =?UTF-8?q?m=C3=ADdia=20WhatsApp=20com=20bugs=204-6=20e=20diagn=C3=B3stico?= =?UTF-8?q?=20r=C3=A1pido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bug 4: ngrok interstitial (URL absoluta → relativa com rails_storage_proxy_path) - Bug 5: refactoring removeu text_content e attachment_params do PayloadParser - Bug 6: content-type audio/opus → audio/ogg - Seção de diagnóstico rápido com tabela de interpretação - Checklist expandido com comandos Rails runner prontos para usar - Notas sobre perigos de refactoring nos contratos públicos do PayloadParser Co-Authored-By: Claude Sonnet 4.6 --- ...6-02-28_fix_media_audio_imagem_whatsapp.md | 364 ++++++++++++++---- 1 file changed, 284 insertions(+), 80 deletions(-) diff --git a/progresso/2026-02-28_fix_media_audio_imagem_whatsapp.md b/progresso/2026-02-28_fix_media_audio_imagem_whatsapp.md index 11a66c710..459dd0ee9 100644 --- a/progresso/2026-02-28_fix_media_audio_imagem_whatsapp.md +++ b/progresso/2026-02-28_fix_media_audio_imagem_whatsapp.md @@ -11,43 +11,59 @@ - Áudio exibe `00:00 / 00:00` e não toca - Imagem exibe "Esta imagem não está mais disponível" - Mensagens de texto chegam normalmente +- Transcrição do áudio aparece corretamente, mas o áudio não toca + +--- + +## ⚡ Diagnóstico Rápido (comece aqui) + +Antes de ler tudo, rode esses comandos na ordem. O primeiro que falhar identifica o bug. + +```bash +# 1. Arquivo chegou? Descriptografia OK? +grep -E "WuzAPI Decrypt|SUCCESS|invalid format" log/development.log | tail -5 + +# 2. Arquivo está no disco? +bin/rails runner "a = Attachment.last; puts a.file.blob.byte_size; puts File.binread(ActiveStorage::Blob.service.path_for(a.file.blob.key), 4).bytes.map{|b| '%02X'%b}.join(' ')" + +# 3. URL que o browser recebe é relativa ou absoluta? +grep "data_url" log/development.log | tail -3 +``` + +**Interpretação:** +| Resultado | Bug | +|-----------|-----| +| Sem `WuzAPI Decrypt:` nos logs | Bug 5 (PayloadParser sem `attachment_params`) | +| `WuzAPI Decrypt Error: NoMethodError` | Bug 3 (`update!` em vez de `update`) | +| Bytes: `31 88 d2` ou similares (não FF D8, 4F 67, 89 50) | Bug 2 (arquivo encriptado) | +| URL absoluta `https://ngrok-url/...` | Bug 4 (ngrok interstitial — ver abaixo) | +| URL relativa `/rails/active_storage/...` e bytes válidos | Bug de infra (Sidekiq parado, ngrok caído) | --- ## Diagnóstico — Root Causes -Havia **três bugs independentes**, todos precisavam ser corrigidos. +Havia **seis bugs independentes** documentados ao longo do tempo. Os primeiros três são históricos. Os outros três surgiram com refatorações. --- -### Bug 1 — URL de mídia apontando para `localhost` (invisível via ngrok) +### Bug 1 — URL de mídia apontando para `localhost` hardcoded *(histórico)* **Arquivo:** `app/models/attachment.rb` **Problema:** -`file_url` e `thumb_url` geravam URLs hardcoded com `localhost:3000`. O browser acessando via ngrok não consegue resolver `localhost:3000` diretamente, então `` e `