الصور المصغرة مفقودة لتضميناتنا الخارجية عند استخدام topic-thumbnails

نحن نطلق منتدى لمنتجنا، والذي تعمل تضميناته الخارجية بالفعل مع OneBox بعد السماح بإطارات iFrames منا.

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

هل سنحتاج إلى إضافة تكامل إلى lib/onebox/engine؟

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

أنا على علم بـ استخدام صور onebox للصور المصغرة للمواضيع - #20 بواسطة david، والتي لم أجد أنها مفيدة في حالتي.

إعجاب واحد (1)

بعد بعض المناقشة مع فريق Discourse عبر البريد الإلكتروني، أقوم بالتحديث هنا.

الاكتشاف الرئيسي هو أن الصور المصغرة لا يتم تحميلها إذا تم عرض رابط يصبح onebox كـ iframe.

هذا يعني أن الرابط:

https://app.everviz.com/embed/N0dDTJaOQ

سيقوم ولن يقوم بعرض صورة مصغرة اعتمادًا على ما إذا كانت الـ iframes مسموح بها من النطاق (allowed iframes). الحل لهذا هو حقن iframe في المنشور بطريقة ما. لقد قمت بإنشاء إضافة تقوم بذلك، وتتأكد من تعيين display: none على الصورة، لمنع ظهورها في المنشور.

أتخيل أنه من الممكن تعميم هذا إما على:

  1. لجميع الـ oneboxes العامة، قم بتحميل وإخفاء صورة بجانبها بصمت إذا كان get_oembed.thumbnail_url موجودًا.
  2. من المحتمل أن يكون حلاً أفضل، إضافة دعم عام لاستخراج get_oembed.thumbnail_url وربطه بالمنشور، دون أن يكون جزءًا من منطقة cooked نفسها.

الأماكن ذات الصلة:

  1. https://oembed.com/
  2. discourse/lib/onebox/engine at main · discourse/discourse · GitHub
  3. discourse/lib/onebox/engine/standard_embed.rb at main · discourse/discourse · GitHub

أنا لست سعيدًا جدًا بهذا السلوك المنبثق، أي، هل allowed iframes ممكّن أم لا؟ سيكون من الجيد لو استخرجت Discourse واستخدمت جميع الخصائص من نقطة نهاية oembed معينة عندما ترسل GET إليها لأول مرة.

تحديث

كانت لدي فكرة استخدام واجهة برمجة تطبيقات المكونات الإضافية من جانب العميل لتحميل صورة في المنشور.

api.decorateCooked($elem => {
    $elem[0].querySelectorAll('.my-iframe')
        .forEach(function (iframe) {

            // عمل

            iframe.insertAdjacentElement('beforebegin', thumbnail);
        });

}, { id: 'unique_string' });

لكن Discourse لن يلتقط أي شيء.

يبدو أن أحد أمرين يحدثان:

  1. لقد تأخرنا وقام Discourse بالفعل باسترداد الصور المصغرة وإنشائها.
  2. نفتقد بعض السمات في صورتنا مما يتسبب في تفويت آلية إنشاء الصور المصغرة لها.

نأمل أن يكون الأمر الأخير. أحد الأشياء التي يجب ملاحظتها هنا هو أن الصورة لا يتم تحميلها أبدًا إلى مثيل Discourse الخاص بنا، ولكن ببساطة تتم الإشارة إليها من خادمنا الخاص.

هل جربت هذا؟ قد يسمح لك كتابة صندوق واحد محدد لحالتك بتوفير صورة صندوق واحد للمنشور المطبوخ؟ عندها ستعمل الصور المصغرة تلقائيًا.

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

ألاحظ أن مثالك يتضمن og:image في علامات الرأس وهو مثالي.


اقتراحي هو الابتعاد عن جافاسكريبت هنا والبدء في الطهي في Rails.

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

3 إعجابات

مرحباً روبرت، شكراً على ردك!

كان كتابة إضافة (plugin) هو أول ما فعلته، وقد نجح ذلك بشكل رائع - بغض النظر عما إذا كنت أضعها في lib/onebox/engine أو كإضافة منفصلة. العيب هو أننا نستخدم خطة مستضافة، حيث لا يُسمح بالإضافات بشكل مفهوم في الخطط متعددة المستأجرين، مما يجعل التعديل في Rails خارج نطاق الاحتمالات.

هذا يتركنا مع واحدة من ثلاث فرص:

  1. تشغيل نسختنا الخاصة
  2. اختراق شيء ما من جانب العميل، إذا كان يمكن أن ينجح
  3. تقديم طلب سحب (PR) إلى Discourse الرئيسي

لتأطير سؤال هنا. لست متأكداً مما إذا كان سيتم قبول مثل هذا المساهمة، خاصة إذا كان يقوم بتحميل صورة لإخفائها فقط. كيف يمكنني معرفة ذلك؟

إعجابَين (2)

ربما أحرزت بعض التقدم في هذا. بالنظر إلى:\n\napi.composerBeforeSave\n\nوالتي يتم التعامل مع ردها في composer.js. من هناك، يمكننا أن نرى أن طريقتي createPost و editPost تستدعيان getCookedHtml، والتي تعيد بشكل أساسي innerHTML الخاص بـ:\n\njs\nconst editorPreviewNode = document.querySelector(\n \"#reply-control .d-editor-preview\"\n);\n\n\nمما يعني أنه إذا قمنا بتعديل هذا المحدد، فقد نتمكن من فرض بعض HTML المكافئ لتحميل صورة عادية. ومع ذلك، يبدو أن تعديل editorPreviewNode.innerHTML لا يؤدي إلى أي تغيير على الإطلاق.\n\nلماذا هذا، أو ماذا يمكنني تعديله في composerBeforeSave للقيام بشيء مشابه؟

هذا منطقي بالنسبة لي إلى حد كبير، أعتقد أننا سنكون منفتحين على قبول طلب سحب (PR) إلى النواة لمحرك onebox لـ everviz.com (أو خدمات التصور المماثلة). ومع ذلك، سأتجنب إدراج وإخفاء صورة في المنشور cooked، هناك خيار أخف. سيبحث معالج المنشور الخاص بـ Discourse عن تحميل للعناصر التالية:

لذا، قد تعمل إضافة الصورة المصغرة كمرساة أسفل الإطار المضمن (iframe)؟ يمكنك إبقائها مرئية، أو إخفائها باستخدام فئة مثل “hidden”.

5 إعجابات

مرحباً، بينار، شكراً على الرد.

باستخدام

  <div>
   #{get_oembed.html}
   <a class="hidden" href="https://app.everviz.com/thumbnails/#{match[:uuid]}.png"></a>
  </div>

كطريقة to_html الخاصة بي، ينتج المخرجات التالية:

  <div class="...">
    <iframe>
      ...
    </iframe>
    <a class="hidden" href="https://app.everviz.com/thumbnails/[...].png" rel="nofollow ugc noopener"></a>
  </div>

ربط صورة مباشرة، ينتج:

<a href="https://app.everviz.com/thumbnails/[...].png" target="_blank" rel="noopener" class="onebox">
   <img src="//localhost:3000/uploads/default/original/1X/[...].png"
        style="aspect-ratio: 690 / 459;" loading="lazy">
</a>

مما يجعل الأمر يبدو وكأن محرك image_onebox.rb يعمل على المدخلات فقط إذا تم ربط صورة خارج سياق محرك onebox مختلف.

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

هل سيكون طلب سحب (PR) مقبولاً في هذه الحالة لإدراج صورة وإخفائها؟ أم أنه من الضروري القيام بشيء أكثر تعقيدًا؟

لست متأكدًا من أنني أتابع، لا ينبغي أن يمر هذا عبر محرك onebox للصور.

هل هذا:

<a class="hidden" href="https://app.everviz.com/thumbnails/[...].png" rel="nofollow ugc noopener"></a>

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

إعجابَين (2)

نعتذر عن هذا الالتباس، فقد بدا الإخراج مشابهاً لمحرك onebox الخاص بالصور.

الرابط المقترح (المزود بشكل صحيح بمعرف فريد عالمي) لا يعمل. وكذلك هذه الصورة التي سحبتها من جوجل (وأنا أكتب هنا كعلامة ربط). إذا كان لصق بعض HTML يعادل الحصول على إخراج onebox، فهذا يفسر نتائجنا.


https://static-cse.canva.com/blob/1031184/1600w-wK95f3XNRaM.jpg

إعجاب واحد (1)

آه، خطأي، أنت على حق، هذا النهج لا يعمل. عندما ننشئ صورًا مصغرة، نستخدم فقط الصور التي تم تنزيلها ولكن الصور المرتبطة في علامة ربط (anchor tag) لا يتم تنزيلها.

قد يكون البديل هنا هو إضافة شيء مشابه لما أوصى به @merefield إلى النواة (core)، ولكن مغلف كـ oneboxer عام لإطارات iframe المحملة بكسل (lazy-loaded). ربما إضافة إعداد موقع جديد lazy_loaded_iframes، ويمكن لـ onebox إخراج الصورة من علامة OG (والتي يجب أن تلتقطها الصور المصغرة)، وعند النقر عليها، يستبدل القليل من جافاسكريبت (JS) الصورة بإطار iframe الصحيح (مشابه لاستبدال إطار iframe الخاص بيوتيوب).

التفصيل الصعب هنا هو أن الصورة المستخدمة وإطار iframe يجب أن يكون لهما نفس الارتفاع، وإلا فقد يؤدي ذلك إلى قفزات غير مرغوب فيها عند التمرير/التنقل في المشاركات.

3 إعجابات