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.
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…
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
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
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.
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.
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.
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?
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.
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.
Sí, esto se basa en el maravilloso hack de @angus ¡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!
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.
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.
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.