Problemas com miniaturas dos oneboxes do Soundcloud e do YouTube

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. :slight_smile:

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…

Existe um (e apenas um, o último) tópico com um onebox do YouTube que não gera uma miniatura; não temos ideia do porquê: https://the.eqlzr.org/t/look-mom-no-computer-diy-synths/75.

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

da discourse/lib/cooked_post_processor.rb at main · discourse/discourse · GitHub

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

da https://github.com/paviliondev/discourse-topic-previews/blob/master/lib/cooked_post_processor_edits.rb

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.

Isso também é relevante para você @Arkshine

Obrigado, @merefield, isso é muito informativo.

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. :slight_smile:

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.

Ah, não me ocorreu verificar a origem. :slight_smile:

Era um onebox, mas a URL tinha um argumento extra:

https://www.youtube.com/watch?v=4T6J-K8_yk4&list=PLluPQLh1xzlL2agiCCQFClcsutli90Qnz

Mudei para a URL simples:

https://www.youtube.com/watch?v=4T6J-K8_yk4

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.

Interessante, vou dar uma olhada nisso na próxima semana. Acredito que ainda deve funcionar, mesmo com um argumento extra.

Ah, entendi, então você extraiu o HTML de pré-visualização do Onebox e retirou as miniaturas dele. Para o SoundCloud, isso gera uma miniatura :+1:

Sim, isso é baseado na marvilhosa solução de @angus :smiley: 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.

Para a diferença do YouTube, veja:

Para o problema do SoundCloud, veja:

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.

Isso é estranho. Você pode compartilhar esses links específicos do YouTube aqui? Qualquer um dos dois formatos deve funcionar.

Talvez um novo renderizamento também tivesse resolvido.
Parece que ele continua vivo nas versões:

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.