Problemi con le miniature di Soundcloud e YouTube onebox

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

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…

C’è un solo topic (e solo uno, l’ultimo) con una onebox di YouTube che non genera la miniature, non sappiamo perché: https://the.eqlzr.org/t/look-mom-no-computer-diy-synths/75.

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

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

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

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

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.

Questo è anche rilevante per te @Arkshine

Grazie @merefield, è molto informativo.

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

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.

Ah, non mi era venuto in mente di controllare il codice sorgente. :slight_smile:

Era un onebox, ma l’URL aveva un argomento in più:

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

L’ho modificato nell’URL semplice:

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

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.

Interessante, darò un’occhiata la prossima settimana. Penso che dovrebbe funzionare comunque, anche con un argomento in più.

Ah, capisco, quindi hai estratto l’HTML di anteprima del Onebox e ne hai ricavato le miniature. Per SoundCloud, questo fornisce una miniatura :+1:

Sì, questo si basa sull’incredibile hack di @angus :smiley: 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.

Per la differenza relativa a YouTube, vedi:

Per il problema di SoundCloud, vedi:

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.

È strano, puoi condividere qui quei link specifici di YouTube? Entrambe le forme dovrebbero funzionare.

Forse anche un nuovo rendering avrebbe funzionato.
Ma sembra che persista nelle versioni:

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.