Stiamo utilizzando Topic List Previews (legacy) con le tessere nella nostra pagina principale. Ieri abbiamo dovuto ricostruire la nostra istanza per motivi non legati a TPL. Eravamo a conoscenza del cambiamento del backend di generazione delle miniature nel core di Discourse e sapevamo che l’aggiornamento poteva causare problemi con le miniature. Tuttavia, era necessario procedere.
Comunque, dopo la ricostruzione (incluso l’aggiornamento di Postgres), tutte le miniature provenienti dalle onebox sono sparite. Nessun problema: abbiamo rigenerato tutti i post e la maggior parte delle miniature è riapparsa (bene), ma non tutte (curioso e negativo). Abbiamo rigenerato un paio di volte ancora, per sicurezza, ma ci sono alcuni post rimanenti che non mostrano la miniature nella pagina principale, anche se le onebox vengono visualizzate correttamente nella pagina del topic.
Fino ad ora abbiamo rilevato due pattern:
Le onebox di Soundcloud vengono visualizzate senza problemi, ma la miniature manca sistematicamente (“Select Thumbnail” non mostra alcuna miniature) e nessun rebuild HTML risolve il problema. Ad esempio, controlla https://the.eqlzr.org/t/female-pressure-podcast-episode-60-inverno/89.
Alcune miniature delle onebox di YouTube mancavano nella pagina principale (solo alcune) e poi, dopo aver visitato la pagina del topic, apparivano magicamente nella pagina principale. Tuttavia…
Come discusso, la logica di produzione delle miniature è ora integrata nel core.
Ciò che TLP doveva fare in passato non è più necessario, in gran parte.
A titolo di riferimento, i criteri principali per l’inclusione sono i seguenti:
def extract_images_for_post
# tutte le immagini con un attributo src
@doc.css("img[src]") -
# meno emoji
@doc.css("img.emoji") -
# meno immagini all'interno delle citazioni
@doc.css(".quote img") -
# meno icone di sito onebox
@doc.css("img.site-icon") -
# meno avatar onebox
@doc.css("img.onebox-avatar") -
# meno immagini onebox piccole (le immagini grandi sono .aspect-image-full-size)
@doc.css(".onebox .aspect-image img")
end
TLP modifica leggermente questo codice, ma solo per renderlo meno restrittivo. Vorrei eliminare completamente questa sovrascrittura, se possibile:
def extract_images_for_post
# tutte le immagini con un attributo src
@doc.css("img[src]") -
# meno emoji
@doc.css("img.emoji") -
# meno immagini all'interno delle citazioni
@doc.css(".quote img") -
# meno icone di sito onebox
@doc.css("img.site-icon") -
# meno avatar onebox
@doc.css("img.onebox-avatar") # Criteri più ampi rispetto al Discourse Core
end
Come puoi vedere, sto riducendo il numero di esclusioni consentendo immagini onebox piccole come definite dal core.
Invece di mantenere questo codice in TLP, sarebbe utile raggiungere un consenso e una parità tra i casi d’uso, in modo da non doverlo più mantenere nel plugin.
Voglio solo dire che il precedente ridimensionamento delle onebox di Soundcloud forniva ottimi risultati, e questa regressione dà davvero fastidio a un sito focalizzato sulla musica come il nostro.
Non mi dispiace se saltiamo di tanto in tanto un’anteprima di YouTube.
Sono curioso di vedere come evolverà la situazione. Concordo sul fatto che l’obiettivo sia affinare il ridimensionamento delle anteprime nel core di Discourse per trovare il miglior compromesso tra le molte esigenze e desideri. Grazie a tutti quelli che stanno lavorando a questo.
A prima vista, non credo che sia un onebox di YouTube. Sospetto che qualcuno abbia utilizzato il codice di incorporamento grezzo di YouTube nel post. Se lo converti in un onebox, l’anteprima dovrebbe funzionare.
Funzionava in passato con il vecchio plugin TLP? I onebox di Soundcloud sono iframe, quindi fatico a vedere come potremmo estrarre un’immagine di anteprima da essi, anche aggiornando i nostri criteri di selezione. @merefield, il TLP aveva qualche logica specifica per Soundcloud da qualche parte?
Sì, c’era una logica personalizzata relativa alle onebox, sebbene non fosse esclusiva di SoundCloud:
if @has_oneboxes
cooked = PrettyText.cook(@post.raw)
if img
## Abbiamo bisogno di qualcosa di più specifico per identificare l'immagine
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
Questa logica è stata rimossa per affidarsi alla logica principale.
Non c’è stato alcun cambiamento immediato. Nemmeno dopo aver ricostruito l’HTML si è verificato un cambiamento immediato, ma poi sono andato a controllare Sidekiq e ho visto un lavoro correlato in coda. Dopo aver atteso pazientemente 4 minuti, la miniatura è ora disponibile e viene visualizzata nella pagina principale. Grazie @david per una risposta così veloce, e di domenica!
Assolutamente sì. Purtroppo, non ho fatto uno screenshot. La pagina principale mostrava l’immagine a sinistra del onebox.
Sì, questo si basa sull’incredibile hack di @angus Non mi assumo alcuna responsabilità! Funziona comunque bene.
AGGIORNAMENTO In realtà, mento, ci sono anche le mie impronte digitali ovunque! Ho scritto parte di questo codice così tanto tempo fa che l’avevo dimenticato, nel 2015!
Questi sono entrambi problemi complessi e, per ora, pensiamo di mantenere il comportamento così com’è. Potremmo riuscire ad apportare alcuni miglioramenti in futuro. Ho creato un paio di argomenti #feature per tracciare i progressi.
Ho avuto lo stesso problema con i link di YouTube nello stile https://youtu.be/. Dopo averli modificati nello stile https://www.youtube.com/watch?v=, ha funzionato di nuovo.
Ho reimpostato il link a quello vecchio, ma ora tutto viene renderizzato correttamente. Immagino che ciò fosse dovuto a un errore di rendering dopo l’aggiornamento beta6.