Estamos usando Topic List Previews (legacy) com blocos em nossa página principal. Ontem, tivemos que reconstruir nossa instância por motivos não relacionados ao TPL. Estávamos cientes da mudança no backend de miniaturas no núcleo do Discourse e sabíamos que a atualização poderia causar problemas com as miniaturas. Ainda assim, era necessário fazer.
De qualquer forma, após a reconstrução (incluindo a atualização do Postgres), todas as miniaturas vindas dos oneboxes desapareceram. Sem problema, re-assamos todos os posts e então a maioria das miniaturas reapareceu (bom), mas não todas (intrigante e ruim). Re-assamos mais algumas vezes, só por precaução, mas ainda há alguns posts que não terão sua miniatura na página principal, mesmo que os oneboxes sejam renderizados sem problemas na página do tópico.
Dois padrões detectados até agora:
Os oneboxes do Soundcloud são renderizados sem problemas, mas a miniatura falta sistematicamente (“Select Thumbnail” não mostra nenhuma miniatura), e nenhum rebuild HTML resolve isso. Por exemplo, verifique https://the.eqlzr.org/t/female-pressure-podcast-episode-60-inverno/89.
Algumas miniaturas de oneboxes do YouTube estavam faltando na página principal (apenas algumas) e, em seguida, após visitar a página do tópico, elas apareciam magicamente na página principal. No entanto…
Como discutido, a lógica de geração de miniaturas (thumbnailing) já está integrada ao núcleo.
O que o TLP precisava fazer antes não é mais necessário, em grande parte.
Como referência, os critérios principais para inclusão são os seguintes:
def extract_images_for_post
# todas as imagens com um atributo src
@doc.css("img[src]") -
# menos emojis
@doc.css("img.emoji") -
# menos imagens dentro de citações
@doc.css(".quote img") -
# menos ícones de site de onebox
@doc.css("img.site-icon") -
# menos avatares de onebox
@doc.css("img.onebox-avatar") -
# menos imagens pequenas de onebox (imagens grandes são .aspect-image-full-size)
@doc.css(".onebox .aspect-image img")
end
O TLP modifica isso ligeiramente, mas apenas para flexibilizar. Gostaria de eliminar completamente essa sobrescrita, se possível:
def extract_images_for_post
# todas as imagens com um atributo src
@doc.css("img[src]") -
# menos emojis
@doc.css("img.emoji") -
# menos imagens dentro de citações
@doc.css(".quote img") -
# menos ícones de site de onebox
@doc.css("img.site-icon") -
# menos avatares de onebox
@doc.css("img.onebox-avatar") #Critérios mais amplos que o Núcleo do Discourse
end
Como você pode ver, estou reduzindo a quantidade de exclusões ao permitir imagens pequenas de onebox conforme definido pelo núcleo.
Em vez de manter isso no TLP, seria bom obter consenso e paridade entre os casos de uso, para que eu não precise manter isso no plugin de forma alguma.
Só quero dizer que a geração anterior de miniaturas dos oneboxes do Soundcloud proporcionou resultados excelentes, e essa regressão está realmente incomodando para um site focado em música como o nosso.
Não me importo se perdermos uma miniatura do YouTube aqui e ali.
Curioso para ver como isso vai evoluir. Concordo que o objetivo é ajustar finamente a geração de miniaturas no núcleo do Discourse para encontrar o melhor ponto de equilíbrio entre os muitos requisitos e desejos. Obrigado a todos que estão trabalhando nisso.
À primeira vista, não acho que seja um onebox do YouTube. Suspeito que alguém tenha usado o código de incorporação bruto do YouTube na postagem. Se você o converter em um onebox, a miniatura deve funcionar.
Isso costumava funcionar com o antigo plugin TLP? Os oneboxes do Soundcloud são iframes, então tenho dificuldade em ver como poderíamos extrair uma imagem de miniatura deles, mesmo atualizando nossos critérios de seleção. @merefield, o TLP tinha alguma lógica específica para o Soundcloud em algum lugar?
Sim, havia alguma lógica personalizada em torno dos oneboxes, embora isso não fosse exclusivo do SoundCloud:
if @has_oneboxes
cooked = PrettyText.cook(@post.raw)
if img
## Precisamos de algo mais específico para identificar a imagem
img_id = img
src = img.attribute("src").to_s
img_id = src.split('/').last.split('.').first if src
end
prior_oneboxes = []
Oneboxer.each_onebox_link(cooked) do |url, element|
if !img || (img && cooked.index(element).to_i < cooked.index(img_id).to_i)
html = Nokogiri::HTML::fragment(Oneboxer.cached_preview(url))
prior_oneboxes = html.css('img')
end
end
if prior_oneboxes.any?
prior_oneboxes = prior_oneboxes.reject do |html|
class_str = html.attribute('class').to_s
class_str.include?('site-icon') || class_str.include?('avatar')
end
if prior_oneboxes.any? && validate_image_for_previews(prior_oneboxes.first)
img = prior_oneboxes.first
end
end
end
Isso foi removido para delegar à lógica principal.
Não houve uma mudança imediata. Após reconstruir o HTML, também não houve mudança imediata, mas então fui verificar o Sidekiq e vi um trabalho relacionado agendado. Depois de esperar pacientemente 4 minutos, a miniatura agora está disponível e é exibida na página principal. Obrigado, @david, por uma resposta tão rápida, e num domingo!
Com certeza. Infelizmente, não tirei nenhuma captura de tela. A página principal mostrava a imagem à esquerda do onebox.
Sim, isso é baseado na marvilhosa solução de @angus Não assumo nenhuma responsabilidade! Mas funciona bem.
ATUALIZAÇÃO: Na verdade, estou mentindo, minhas digitais também estão por toda parte! Eu escrevi parte desse código há tanto tempo que havia esquecido, foi em 2015!
Esses são ambos problemas complicados e, por enquanto, acho que vamos manter o comportamento como está. Talvez possamos adicionar algumas melhorias no futuro. Criei alguns tópicos de #feature para acompanhar o progresso.
Eu tive o mesmo problema com links do YouTube no formato https://youtu.be/. Depois de alterá-los para o formato https://www.youtube.com/watch?v= funcionou novamente.
Eu redefini o link para o antigo, mas agora tudo é renderizado corretamente. Acho que isso foi devido a um erro de renderização após a atualização da beta6.