Nous utilisons Topic List Previews (legacy) avec des vignettes sur notre page d’accueil. Hier, nous avons dû reconstruire notre instance pour des raisons sans rapport avec TPL. Nous étions au courant du changement de backend de génération de miniatures dans le cœur de Discourse et nous savions que la mise à niveau pouvait causer des problèmes avec les miniatures. Néanmoins, cela devait être fait.
Quoi qu’il en soit, après la reconstruction (incluant la mise à niveau de Postgres), toutes les miniatures provenant des oneboxes ont disparu. Pas de problème, nous avons tout récuir, et la plupart des miniatures sont réapparues (bien), mais pas toutes (intrigant et mauvais). Nous avons récuir quelques fois de plus au cas où, mais certains posts restants n’affichent toujours pas leur miniature sur la page d’accueil, même si les oneboxes s’affichent correctement sur la page du sujet.
Deux modèles détectés jusqu’à présent :
Les oneboxes Soundcloud s’affichent sans problème, mais la miniature manque systématiquement (« Sélectionner une miniature » n’affiche aucune miniature), et aucun reclassement HTML ne résout cela. Par exemple, consultez https://the.eqlzr.org/t/female-pressure-podcast-episode-60-inverno/89.
Certaines miniatures d’oneboxes YouTube manquaient sur la page d’accueil (seulement certaines), puis, après avoir visité la page du sujet, elles réapparaissaient magiquement sur la page d’accueil. Cependant…
Comme discuté, la logique de génération des vignettes est désormais intégrée au cœur du système.
Ce que TLP devait faire n’est plus nécessaire, dans une large mesure.
Pour référence, les critères de base pour l’inclusion sont les suivants :
def extract_images_for_post
# toutes les images avec un attribut src
@doc.css("img[src]") -
# moins les émojis
@doc.css("img.emoji") -
# moins les images à l'intérieur des citations
@doc.css(".quote img") -
# moins les icônes de site onebox
@doc.css("img.site-icon") -
# moins les avatars onebox
@doc.css("img.onebox-avatar") -
# moins les petites images onebox (les grandes images sont .aspect-image-full-size)
@doc.css(".onebox .aspect-image img")
end
TLP modifie légèrement cela, mais uniquement pour assouplir les critères. J’aimerais pouvoir supprimer complètement cette surcharge si possible :
def extract_images_for_post
# toutes les images avec un attribut src
@doc.css("img[src]") -
# moins les émojis
@doc.css("img.emoji") -
# moins les images à l'intérieur des citations
@doc.css(".quote img") -
# moins les icônes de site onebox
@doc.css("img.site-icon") -
# moins les avatars onebox
@doc.css("img.onebox-avatar") # Critères plus larges que le cœur de Discourse
end
Comme vous pouvez le voir, je réduis le nombre d’exclusions en autorisant les petites images onebox telles que définies par le cœur du système.
Plutôt que de maintenir cela dans TLP, il serait préférable d’obtenir un consensus et une parité entre les cas d’utilisation, afin que je n’aie pas à maintenir cela dans le plugin du tout.
Je tiens simplement à dire que l’ancienne génération de vignettes pour les oneboxes SoundCloud donnait de superbes résultats, et cette régression est vraiment gênante pour un site axé sur la musique comme le nôtre.
Je ne m’oppose pas si nous manquons une vignette YouTube de temps en temps.
Curieux de voir comment cela évoluera. Je suis d’accord pour dire que l’objectif est d’affiner la génération de vignettes dans le cœur de Discourse afin de trouver le meilleur terrain d’entente entre les nombreuses exigences et souhaits. Merci à tous ceux qui travaillent sur ce sujet.
À première vue, je ne pense pas que ce soit une onebox YouTube. Je soupçonne que quelqu’un a utilisé le code d’intégration YouTube brut dans le message. Si vous le transformez en une onebox, la miniature devrait fonctionner.
Est-ce que cela fonctionnait auparavant avec l’ancien plugin TLP ? Les oneboxes Soundcloud sont des iframes, donc je peine à voir comment nous pourrions extraire une image de miniature à partir d’elles, même en mettant à jour nos critères de sélection. @merefield, TLP avait-il une logique spécifique à Soundcloud quelque part ?
Oui, il existait une logique personnalisée autour des oneboxes, bien que cela ne concernait pas uniquement SoundCloud :
if @has_oneboxes
cooked = PrettyText.cook(@post.raw)
if img
## Nous avons besoin de quelque chose de plus spécifique pour identifier l'image
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
Ceci a été retiré pour s’en remettre à la logique principale.
Il n’y a pas eu de changement immédiat. Après avoir reconstruit le HTML, il n’y a toujours pas eu de changement immédiat, mais j’ai ensuite vérifié Sidekiq et j’ai vu un job associé programmé. Après avoir attendu patiemment 4 minutes, la vignette est maintenant disponible et elle s’affiche sur la page principale. Merci @david pour une réponse si rapide, et un dimanche en plus !
Absolument. Malheureusement, je n’ai pris aucune capture d’écran. La page principale affichait l’image à gauche du onebox.
Intéressant, je vais jeter un coup d’œil là-dessus la semaine prochaine. Je pense que cela devrait encore fonctionner, même avec un argument supplémentaire.
Ah, je vois. Vous avez donc récupéré le HTML de l’aperçu du Onebox et extrait les vignettes à partir de celui-ci. Pour SoundCloud, cela donne une vignette
Oui, cela est basé sur le génial hack de @angus ! Je n’assume aucune responsabilité ! Cela fonctionne bien, cependant.
MISE À JOUR En fait, je mens, mes empreintes digitales sont aussi partout dessus ! J’ai écrit une partie de ce code il y a si longtemps que je l’avais oublié, en 2015 !
Ce sont deux problèmes délicats, et je pense que pour l’instant, nous laisserons le comportement tel quel. Nous pourrons peut-être apporter quelques améliorations à l’avenir. J’ai créé quelques sujets #feature pour suivre les progrès.
J’ai eu le même problème avec les liens YouTube de style https://youtu.be/. Après les avoir changés au format https://www.youtube.com/watch?v=, cela a de nouveau fonctionné.
J’ai réinitialisé le lien vers l’ancien, mais maintenant tout s’affiche correctement. Je suppose que cela était dû à une erreur de rendu après la mise à jour beta6.