Problemas con miniaturas de Soundcloud y YouTube oneboxes

Estamos utilizando Topic List Previews (legacy) con tarjetas en nuestra página principal. Ayer tuvimos que reconstruir nuestra instancia por razones ajenas a TPL. Éramos conscientes del cambio en el backend de miniaturas en el núcleo de Discourse y sabíamos que la actualización podría causar problemas con las miniaturas. Aun así, era necesario hacerlo. :slight_smile:

De todos modos, después de la reconstrucción (incluida la actualización de Postgres), todas las miniaturas procedentes de oneboxes desaparecieron. Sin problema, volvimos a hornear todos los mensajes y entonces la mayoría de las miniaturas reaparecieron (bien), pero no todas (intrigante y malo). Volvimos a hornear un par de veces más por si acaso, pero hay algunos mensajes que no muestran su miniatura en la página principal, incluso si los oneboxes se renderizan sin problemas en la página del tema.

Hasta ahora hemos detectado dos patrones:

  • Los oneboxes de Soundcloud se renderizan sin problemas, pero la miniatura falta sistemáticamente (“Seleccionar miniatura” no muestra ninguna miniatura) y ninguna reconstrucción HTML lo solucionará. Por ejemplo, revisa https://the.eqlzr.org/t/female-pressure-podcast-episode-60-inverno/89.
  • Algunas miniaturas de los oneboxes de YouTube faltaban en la página principal (solo algunas) y luego, después de visitar la página del tema, aparecían mágicamente en la página principal. Sin embargo…

Hay un tema (y solo uno, el último) con un onebox de YouTube que no genera miniatura; no tenemos idea de por qué: https://the.eqlzr.org/t/look-mom-no-computer-diy-synths/75.

2 Me gusta

Como se discutió, la lógica de generación de miniaturas ahora está integrada en el núcleo.

Lo que TLP solía tener que hacer ya no es necesario, en gran medida.

Como referencia, los criterios principales para la inclusión son los siguientes:

  def extract_images_for_post
    # todas las imágenes con un atributo src
    @doc.css("img[src]") -
    # menos emojis
    @doc.css("img.emoji") -
    # menos imágenes dentro de citas
    @doc.css(".quote img") -
    # menos iconos de sitio de onebox
    @doc.css("img.site-icon") -
    # menos avatares de onebox
    @doc.css("img.onebox-avatar") -
    # menos imágenes pequeñas de onebox (las imágenes grandes son .aspect-image-full-size)
    @doc.css(".onebox .aspect-image img")
  end

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

TLP modifica esto ligeramente, pero solo para relajarlo. Me gustaría eliminar esta sobrescritura por completo si es posible:

  def extract_images_for_post
    # todas las imágenes con un atributo src
    @doc.css("img[src]") -
    # menos emojis
    @doc.css("img.emoji") -
    # menos imágenes dentro de citas
    @doc.css(".quote img") -
    # menos iconos de sitio de onebox
    @doc.css("img.site-icon") -
    # menos avatares de onebox
    @doc.css("img.onebox-avatar") # Criterios más amplios que el núcleo de Discourse
  end

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

Como pueden ver, estoy reduciendo la cantidad de exclusiones permitiendo imágenes pequeñas de onebox según lo definido por el núcleo.

En lugar de mantener esto en TLP, sería bueno lograr un consenso y paridad en todos los casos de uso, para no tener que mantenerlo en absoluto en el plugin.

Esto también es relevante para ti @Arkshine

3 Me gusta

Gracias @merefield, esto es muy informativo.

Solo quiero decir que la miniatura anterior de los oneboxes de Soundcloud ofrecía excelentes resultados, y este retroceso es realmente molesto para un sitio centrado en la música como el nuestro. :slight_smile:

No me importa si nos saltamos una miniatura de YouTube de vez en cuando.

Me pregunto cómo evolucionará esto. Estoy de acuerdo en que el objetivo es ajustar finamente la generación de miniaturas en el núcleo de Discourse para encontrar el mejor punto de equilibrio entre las muchas necesidades y deseos. Gracias a todos los que están trabajando en esto.

1 me gusta

A primera vista, no creo que eso sea un onebox de YouTube. Sospecho que alguien ha utilizado el código de incrustación de YouTube en bruto en la publicación. Si lo conviertes en un onebox, la miniatura debería funcionar.

¿Esto funcionaba antes con el antiguo plugin TLP? Los oneboxes de Soundcloud son iframes, así que me cuesta ver cómo podríamos extraer una imagen de miniatura de ellos, incluso actualizando nuestros criterios de selección. @merefield, ¿tenía TLP alguna lógica específica para Soundcloud en algún lugar?

4 Me gusta

Sí, había cierta lógica personalizada alrededor de los oneboxes, aunque esto no era exclusivo de SoundCloud:

    if @has_oneboxes
      cooked = PrettyText.cook(@post.raw)

      if img
        ## Necesitamos algo más específico para identificar la imagen
        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

Esto se ha eliminado para delegar en la lógica central.

3 Me gusta

Ah, no se me ocurrió revisar el código fuente. :slight_smile:

Era un onebox, pero la URL tenía un argumento extra:

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

Lo cambié a la URL simple:

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

No hubo un cambio inmediato. Después de reconstruir el HTML tampoco hubo un cambio inmediato, pero luego fui a verificar Sidekiq y vi un trabajo relacionado programado. Después de esperar pacientemente 4 minutos, la miniatura ahora está disponible y se muestra en la página principal. Gracias @david por una respuesta tan rápida, ¡y en un domingo!

Absolutamente. Lamentablemente, no tomé ninguna captura de pantalla. La página principal mostraba la imagen a la izquierda del onebox.

2 Me gusta

Interesante, lo revisaré la próxima semana. Creo que debería seguir funcionando, incluso con un argumento adicional.

Ah, ya veo, así que extrajiste el HTML de vista previa del Onebox y obtuviste las miniaturas de ahí. Para SoundCloud, eso proporciona una miniatura :+1:

5 Me gusta

Sí, esto se basa en el maravilloso hack de @angus :smiley: ¡No me hago responsable! Aunque funciona muy bien.

ACTUALIZACIÓN: En realidad, miento, ¡mis huellas dactilares también están por todas partes! Escribí parte de este código hace tanto tiempo que lo había olvidado, ¡fue en 2015!

5 Me gusta

Ambos son problemas complejos y, por ahora, creo que dejaremos el comportamiento tal como está. Quizás podamos incorporar algunas mejoras en el futuro. He creado un par de temas de #feature para seguir el progreso.

Para la diferencia con YouTube, consulta:

Para el problema con SoundCloud, consulta:

5 Me gusta

Tuve el mismo problema con los enlaces de YouTube en formato https://youtu.be/. Al cambiarlos al formato https://www.youtube.com/watch?v= volvieron a funcionar.

Eso es extraño, ¿puedes compartir esos enlaces específicos de YouTube aquí? Cualquiera de las dos formas debería funcionar.

Tal vez una nueva renderización también habría funcionado.
Pero parece que persiste en las versiones:

Restablecí el enlace al anterior, pero ahora todo se renderiza correctamente. Supongo que esto se debió a un error de renderizado después de la actualización de beta6.

1 me gusta

Este tema se cerró automáticamente 30 días después de la última respuesta. Ya no se permiten nuevas respuestas.