مشاكل مع الصور المصغرة من Soundcloud و YouTube oneboxes

نحن نستخدم Topic List Previews (legacy) مع البطاقات في صفحتنا الرئيسية. بالأمس، اضطررنا إلى إعادة بناء مثيلنا لأسباب لا علاقة لها بـ TPL. كنا على علم بتغيير نظام خلفي لتصغير الصور في نواة Discourse، وكنا نعلم أن الترقية قد تسبب مشاكل مع الصور المصغرة. ومع ذلك، كان لا بد من القيام بذلك. :slight_smile:

على أي حال، بعد إعادة البناء (بما في ذلك ترقية Postgres)، اختفت جميع الصور المصغرة القادمة من oneboxes. لا مشكلة، أعيدنا خبز جميع المنشورات، ثم عادت معظم الصور المصغرة للظهور (جيد) لكن ليس جميعها (مثير للاهتمام وسيء). أعيدنا خبز عدد قليل من المنشورات مرة أخرى احتياطًا، لكن هناك بعض المنشورات المتبقية التي لن تحصل على صورتها المصغرة في الصفحة الرئيسية حتى لو تم عرض oneboxes دون مشاكل في صفحة الموضوع الخاصة بها.

تم رصد نمطان حتى الآن:

  • تظهر oneboxes الخاصة بـ Soundcloud دون مشاكل، لكن الصورة المصغرة مفقودة بشكل منهجي (“Select Thumbnail” لن تظهر أي صور مصغرة)، ولن يحل إعادة بناء HTML هذه المشكلة. على سبيل المثال، تحقق من https://the.eqlzr.org/t/female-pressure-podcast-episode-60-inverno/89.
  • كانت بعض الصور المصغرة الخاصة بـ YouTube oneboxes مفقودة في الصفحة الرئيسية (فقط بعضها)، ثم، بعد زيارة صفحة الموضوع، ستظهر بشكل سحري في الصفحة الرئيسية. ومع ذلك…

هناك موضوع واحد (موضوع واحد فقط، وهو الأخير) يحتوي على onebox من YouTube لن يولد صورة مصغرة، ولا نعرف السبب: https://the.eqlzr.org/t/look-mom-no-computer-diy-synths/75.

كما تم الاتفاق، أصبحت منطقية إنشاء الصور المصغرة مدمجة الآن في النواة.

ما كان على TLP القيام به لم يعد ضروريًا إلى حد كبير.

للمرجعية، المعايير الأساسية للإدراج هي التالية:

  def extract_images_for_post
    # جميع الصور التي تحتوي على سمة src
    @doc.css("img[src]") -
    # ناقص الرموز التعبيرية
    @doc.css("img.emoji") -
    # ناقص الصور داخل الاقتباسات
    @doc.css(".quote img") -
    # ناقص أيقونات مواقع onebox
    @doc.css("img.site-icon") -
    # ناقص صور رموز onebox
    @doc.css("img.onebox-avatar") -
    # ناقص صور onebox الصغيرة (الصور الكبيرة هي .aspect-image-full-size)
    @doc.css(".onebox .aspect-image img")
  end

من discourse/lib/cooked_post_processor.rb at main · discourse/discourse · GitHub

يقوم TLP بتعديل هذا قليلاً، ولكن فقط لتوسيع نطاقه. أود التخلي عن هذا التجاوز بالكامل إذا أمكن:

  def extract_images_for_post
    # جميع الصور التي تحتوي على سمة src
    @doc.css("img[src]") -
    # ناقص الرموز التعبيرية
    @doc.css("img.emoji") -
    # ناقص الصور داخل الاقتباسات
    @doc.css(".quote img") -
    # ناقص أيقونات مواقع onebox
    @doc.css("img.site-icon") -
    # ناقص صور رموز onebox
    @doc.css("img.onebox-avatar") #معايير أوسع من نواة Discourse
  end

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

كما ترون، أنا أقوم بتقليل عدد الاستثناءات من خلال السماح بصور onebox الصغيرة كما عرّفتها النواة.

بدلاً من الحفاظ على هذا في TLP، سيكون من الجيد الحصول على توافق في الآلات وتكافؤ عبر حالات الاستخدام، حتى لا أضطر إلى الحفاظ على هذا في الإضافة على الإطلاق.

هذا الأمر ذو صلة أيضًا بك @Arkshine

شكرًا لك @merefield، هذه معلومات قيمة جدًا.

أود فقط أن أقول أن المصغرات السابقة لروابط Soundcloud المدمجة (oneboxes) كانت تقدم نتائج ممتازة، وهذا التراجع مزعج حقًا لموقع يركز على الموسيقى مثل موقعنا. :slight_smile:

لا يزعجني إذا فاتنا بعض المصغرات لفيديوهات YouTube هنا وهناك.

أنا فضولي لمعرفة كيف سيتطور هذا الأمر. أتفق على أن الهدف هو ضبط عملية إنشاء المصغرات في نواة Discourse بدقة للوصول إلى أفضل أرضية مشتركة بين المتطلبات والرغبات العديدة. شكرًا للجميع الذين يعملون على هذا.

بمجرد إلقاء نظرة، لا أعتقد أن هذا صندوق يوتيوب واحد. أشك في أن شخصًا ما استخدم كود تضمين يوتيوب خام في المنشور. إذا حوّلتّه إلى صندوق واحد، يجب أن تعمل الصورة المصغرة.

هل كان هذا يعمل سابقًا مع إضافة TLP القديمة؟ صناديق Soundcloud هي إطارات مضمنة (iframes)، لذا أجد صعوبة في تخيل كيف يمكننا استخراج صورة مصغرة منها، حتى مع تحديث معايير اختيارنا. @merefield، هل كانت لإضافة TLP منطق مخصص لـ Soundcloud في مكان ما؟

نعم، كان هناك منطق مخصص يتعلق بـ oneboxes، رغم أن هذا لم يكن مخصصًا حصريًا لـ SoundCloud:

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

      if img
        ## نحتاج إلى شيء أكثر تحديدًا لتحديد الصورة
        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

تم إزالة هذا الجزء للاعتماد على المنطق الأساسي.

آه، لم يخطر ببالي التحقق من المصدر. :slight_smile:

كان عنصرًا مدمجًا تلقائيًا، لكن الرابط كان يحتوي على وسيطة إضافية:

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

غيرته إلى الرابط العادي:

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

لم يحدث تغيير فوري. بعد إعادة بناء HTML، لم يحدث تغيير فوري أيضًا، لكنني ذهبت للتحقق من Sidekiq ورأيت مهمة مرتبطة مجدولة. بعد انتظار 4 دقائق بصبر، أصبحت الصورة المصغرة متاحة الآن وتُعرض في الصفحة الرئيسية. شكرًا لك @david على الرد السريع如此، وفي يوم الأحد أيضًا!

بالتأكيد. للأسف، لم أقوم بتصوير أي لقطة شاشة. كانت الصفحة الرئيسية تعرض الصورة على يسار العنصر المدمج تلقائيًا.

مثير للاهتمام، سألقي نظرة على هذا الأسبوع القادم. أعتقد أنه يجب أن يعمل بشكل صحيح، حتى مع وجود وسيطة إضافية.

آه، فهمت، إذن قمت بسحب HTML الخاص بـ معاينة Onebox واستخرجت الصور المصغرة منه. بالنسبة لـ SoundCloud، يعطي ذلك صورة مصغرة :+1:

نعم، هذا مبني على الاختراق الرائع من @angus :D! أنا لا أتحمل أي مسؤولية! لكنه يعمل بشكل جيد.

تحديث: في الواقع، أنا أكذب، فأثار أصابعي موجودة عليها أيضاً! لقد كتبت جزءاً من هذا الكود منذ فترة طويلة نسيتُها، عام 2015!

هذه مشكلتان معقدتان، وأعتقد أنه سنترك السلوك كما هو حالياً. قد نتمكن من إضافة بعض التحسينات في المستقبل. لقد أنشأت بضع مواضيع #feature لتتبع التقدم

للفارق في يوتيوب، انظر:

للمشكلة المتعلقة بـ SoundCloud، انظر:

واجهت نفس المشكلة مع روابط يوتيوب بصيغة https://youtu.be/. بعد تغييرها إلى الصيغة https://www.youtube.com/watch?v=، عادت لتعمل مرة أخرى.

هذا غريب، هل يمكنك مشاركة روابط يوتيوب المحددة هذه هنا؟ أي من الصيغتين يجب أن تعمل.

ربما كان إعادة التصيير سيقوم بالمهمة أيضًا.
لكن يبدو أنها استمرت في الإصدارات:

لقد قمت بإعادة تعيين الرابط إلى القديم، والآن يتم تصيير كل شيء بشكل جيد. أعتقد أن هذا كان بسبب خطأ في التصيير بعد تحديث النسخة التجريبية 6.