Проблема с генерацией миниатюр и рендерингом markdown

Здравствуйте,

С момента выхода последней версии Discourse 2.5.0 у меня возникли проблемы с генерацией миниатюр.
Похоже, что теперь миниатюры генерируются из ядра, что привело к удалению всех существующих миниатюр.
Я пробовал различные операции по их восстановлению и объясню ситуации, в которых это не работает.

Примечание: вероятно, у этого изменения есть веская причина, но было бы очень кстати не вносить внезапные изменения в поведение, ломающие функциональность, без возможности подготовиться, например, с помощью руководства по обновлению и/или возможности явно включить это изменение, пожалуйста. :confounded:

Контекст

  • Discourse 2.5.0 beta4 (faeb5793ba)
  • Плагин Topic List Preview версии 4.4.0
  • WP-Discourse: публикации размещаются как есть (полный HTML) в темах Discourse (первое сообщение).

Что касается содержимого поста, вот пример (отформатированный для вас):

Содержимое

HTML-код изображения для удобства:

<img
        width="150"
        height="84"
        src="https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית-150x84.jpg"
        class="attachment-thumbnail size-thumbnail"
        alt=""
        srcset="
            https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית-150x84.jpg     150w,
            https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית-300x169.jpg    300w,
            https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית-1200x675.jpg  1200w,
            https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית-1536x864.jpg  1536w,
            https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית-2048x1152.jpg 2048w,
            https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית-788x443.jpg    788w,
            https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית.jpg           1280w
        "
        sizes="(max-width: 150px) 100vw, 150px"
    />
<div data-wp>
    <a
        href="https://www.banggood.com/Xiaomi-Redmi-Router-AC2100-2033Mbps-2_4G-5G-Dual-Band-Wireless-Router-6High-Gain-Antennas-128MB-OpenWRT-WiFi-Router-p-1614038.html"
        target="_blank"
        ><img src="https://zuzu.deals/wp-content/uploads/2020/01/5e3128b4e5da7-150x150.jpg"/>
    </a>
    <div>
        <div data-buy>
            <a
                href="https://www.banggood.com/Xiaomi-Redmi-Router-AC2100-2033Mbps-2_4G-5G-Dual-Band-Wireless-Router-6High-Gain-Antennas-128MB-OpenWRT-WiFi-Router-p-1614038.html"
                target="_blank">קנייה
            </a>
            <span data-clipboard-text="BG38b2ac" data-coupon>BG38b2ac</span><i></i>
        </div>
        <div data-price>$43.99</div>
    </div>
</div>
<hr />
<p>
    <small>
        &nbsp;פורסם ב:&nbsp;<a href="https://zuzu.deals/%d7%a7%d7%95%d7%a4%d7%95%d7%9f-%d7%91%d7%9c%d7%a2%d7%93%d7%99-%d7%a8%d7%90%d7%95%d7%98%d7%a8-%d7%97%d7%96%d7%a7-%d7%95%d7%97%d7%93%d7%a9-%d7%a9%d7%9c-%d7%a9%d7%99%d7%90%d7%95%d7%9e%d7%99-xiaomi-re-2/"></a>
    </small>
</p>
<br />
<p>נעים להכיר!</p>

До обновления Discourse

TLP всегда хорошо работал с нашими внешними изображениями, как при создании темы, так и при её редактировании.
Однако у нас была отключена опция download remote images to local из-за проблем с разметкой Markdown.

Проблема с рендерингом Markdown

Это не основная проблема, и она сохраняется даже после обновления Discourse. Вот некоторые пояснения.
Когда Discourse скачивает и заменяет HTML-код изображения на синтаксис Markdown — в нашем контексте это приводит к следующему:

[...]<a href="<ссылка_здесь>" target="_blank">![|150x150](upload://l0iarnA6SPVAyJN5l7pnQxZnPvE.jpeg)</a>[...]

Discourse не может отобразить изображение.

Изображение

image

Чтобы исправить проблему, необходимо как минимум добавить пустую строку выше:

[...]<a href="<ссылка_здесь>" target="_blank">

![|150x150](upload://l0iarnA6SPVAyJN5l7pnQxZnPvE.jpeg)</a>[...]
Изображение

Возможно ли разрешить рендеринг изображений Markdown, если они окружены HTML, пожалуйста?

После обновления Discourse

  • Все миниатюры были удалены.
  • Все изображения корректно отображаются в содержимом темы.
  • Из-за этой функции (FEATURE: Include optimized thumbnails for topics (#9215) · discourse/discourse@03818e6 · GitHub, я так думаю) мы были вынуждены включить опцию download remote images to local, так как, похоже, теперь невозможно получить миниатюру из внешней ссылки… :pensive:
  • Параметр download remote images max days old установлен на максимум, 10000.
Настройки

На основе этого мне посоветовали перекомпилировать все посты, чтобы изображения были скачаны. И вот здесь начинается странное.

  1. rake posts:rebake не оказал большого эффекта (по крайней мере, на первое сообщение темы, хотя он и вызвал множество PullHotlinkedImages).
    1.1. Просматривая некоторые темы, я подумал, что причиной являются HTML-теги изображений с атрибутами class или srcset, поэтому попробовал нормализовать все изображения с помощью следующего кода (я не знаю Ruby) — Это помогло для некоторых тем.
    1.2. Однако из-за проблемы с Markdown мне пришлось добавить новые строки для исправления. — По крайней мере, для этих тем миниатюры заработали.
Код
Post.where(post_number: 1)
    .where("raw LIKE '%<img%/>%'")
    .each 
        do |post|
            post.raw.gsub!(/<img[^>]+(src="[^"]+")[^>]+\/>/, "<img \\1 />")
            post.save!(validate: true)
            post.rebake!  
        end

Post
  .where(post_number: 1)
  .where("raw LIKE '%upload://%'").each 
     do |post|  
       post.raw.gsub!(/(!\[.*upload:\/\/.*\))/, "\n\n\\1") 
       post.save!(validate: false); 
       post.rebake! 
     end
  1. Ручное редактирование (без изменения содержимого, просто сохранение) игнорируемой темы работает в большинстве случаев. Изображение скачивается.
    2.1. Некоторые темы игнорируются даже после редактирования. Я вижу, что срабатывает PullHotlinkedImages, но изображения не скачиваются. (как в этом HTML <img src="https://zuzu.reviews/wp-content/uploads/2020/05/HiZERO-VS-BISSEL-VS-שואב-אלחוטי-VS-שואב-רובוטי-VS-מגב-ודלי-VS-מטאטא-VS-ספונגה-חשמלית-150x84.jpg" />, ссылка)
  2. После нормализации и увидев, что редактирование может помочь скачать изображение, я попробовал выполнить rake posts:rebake несколько раз — без эффекта.
  3. Затем я попробовал использовать rails console, аналогично коду выше, но с конкретным ID темы и только с post.rebake!без эффекта.
  4. Не все изображения из темы всегда скачиваются.
  5. @Canapin указал мне на Download remote images from older posts? - #3 by vinothkannans ; я пытаюсь перекомпилировать все посты сейчас. — К сожалению, это не помогло.

Это просто безумие, почему одни изображения работают, а другие нет. Я не думаю, что это вопрос критериев. Настройки изображений высокие. Я действительно не понимаю, какая здесь логика, это кажется случайным.

В настоящее время у нас всё ещё много отсутствующих миниатюр. Скорее всего, большинство из них можно исправить вручную через редактирование/сохранение, но это нереализуемо. Я делаю это для клиента и уже потратил много времени на попытку исправить проблему.

Мне не против, если в качестве миниатюр будут использоваться загруженные изображения, но:

  • Можете ли вы сказать, есть ли конкретные причины, по которым изображения не скачиваются? Есть ли настройки, которые могут помочь? Нужно ли нам что-то ещё? Как отладить?
  • Есть ли способ принудительно скачать их, аналогично редактированию/сохранению через консоль?
  • Можете ли вы разрешить рендеринг изображений Markdown, если они окружены HTML?

Надеюсь, я достаточно точно описал проблему.

Заранее спасибо за любую помощь и решение.}

Привет @Arkshine, жаль слышать, что у вас возникли проблемы. К сожалению, мы не можем гарантировать совместимость со всеми сторонними плагинами, особенно если они переопределяют базовое поведение за пределами возможностей наших API плагинов. В дальнейшем TLP должен будет сократить количество используемых им переопределений ядра, и, надеемся, стабильность улучшится.

Обратите внимание, что у нас теперь есть официальное решение для отображения миниатюр, которое полностью реализовано с использованием поддерживаемых нами API плагинов.

Вы правы, что миниатюры ядра работают только для локальных изображений. В конечном итоге TLP также загружал изображения и хранил их локально, поэтому сейчас разница лишь в том, что мы делаем всё последовательно, используя задачу pull_hotlinked_images.

Похоже, здесь есть несколько проблем, которые нужно решить. Я думаю, лучше разделить их, чтобы ничего не упустить. Прочитав ваш пост, я вижу два момента:

Загрузка удалённых изображений не должна приводить к некорректному HTML/Markdown, поэтому мы постараемся исправить это. Пожалуйста, создайте тему с тегом bug, отметьте меня, и мы разберёмся.

Опять же, специальные символы не должны нарушать работу изображений. Пожалуйста, создайте ещё одну тему с тегом bug, и мы посмотрим.

Спасибо за ответ, @david.

Что касается Markdown, то ссылка со специальными символами поможет. Спасибо.


Однако в конечном итоге моя главная проблема — заставить Discourse принудительно скачивать изображение. Проблему с Markdown можно решить через консоль, и не все ссылки содержат специальные символы. У нас всё ещё много тем без миниатюр. Именно об этом я прошу помощи.

Например, эта ссылка не содержит специальных символов. И если я не нажму Save Edit, изображение не будет скачано ни через пересборку (rebaking) из консоли, ни с помощью ссылки Rebuild HTML.

Есть ли какая-то команда Rails или что-то ещё, что может заставить Discourse скачать изображение так же, как при нажатии Save Edit?


На самом деле я уже пробовал использовать этот компонент, но он работал не очень хорошо. Но попробую ещё раз, как только проблема с миниатюрами будет решена.

Это партнерский сайт?

Это странно. У меня есть одна идея — эти посты созданы системным пользователем? Или Discobot?

Большинство из них — обычные пользователи-администраторы. Эти темы создаются через API из WP Discourse.

Например, эта:

@Arkshine, там должна была быть ссылка?

Извините, я тестировал пример и случайно нажал кнопку.

Тем не менее, я начал выполнять этот код, чтобы проверить, поможет ли это (извините, если он режет глаза!)

Post
  .joins(:topic)
  .where(post_number: 1)
  .where('topics.visible = true')
  .where('topics.deleted_at IS NULL')
  .each do |post| 
     post.baked_version = nil
     post.save!(validate: false)
     post.rebake!
   end

Это заняло некоторое время. Я видел довольно много задач Jobs::PullHotlinkedImages.
Но, похоже, это не сильно помогло.

Если вы проверите конкретную тему, например, эту тему.

В консоли я вижу, что запускается Jobs::ProcessPost, но не Jobs::PullHotlinkedImages.

[106] pry(main)> Post.update_all(baked_version: nil)
=> 38808

[107] pry(main)> Post.where(post_number: 1, topic_id: 64215).each do |post| post.rebake!; end
=> [#<Post:0x0000557fe01f2fd8
  id: 79717,
  user_id: 3,
  topic_id: 64215,
  post_number: 1,
  raw:
   "<div data-wp><a href=\"https://www.mooki.co.il/gaming/hbilvt-giiming-mwtlmvt/mvwb-giiming-khvl-sparkfox-wvlhn-giiming-mqcvei-lumi-whvr-2\" target=\"_blank\"><img src=\"https://zuzu.deals/wp-content/uploads/2020/05/5ebcf97155cd2-150x150.png\" /></a><div><div data-buy><a href=\"https://www.mooki.co.il/gaming/hbilvt-giiming-mwtlmvt/mvwb-giiming-khvl-sparkfox-wvlhn-giiming-mqcvei-lumi-whvr-2\" target=\"_blank\">קנייה</a><span data-clipboard-text=\"GLA679\" data-coupon>GLA679</span><i></i></div><div data-price>₪679 <span data-old-price>₪1378</span></div></div></div><hr /><p><small>&nbsp;פורסם ב:&nbsp;<a href=\"https://zuzu.deals/%d7%91%d7%9c%d7%a2%d7%93%d7%99-%d7%95%d7%91%d7%9e%d7%97%d7%99%d7%a8-%d7%97%d7%98%d7%99%d7%a4%d7%94-%d7%9e%d7%95%d7%a9%d7%91-%d7%92%d7%99%d7%99%d7%9e%d7%99%d7%a0%d7%92-%d7%90%d7%93%d7%95%d7%9d-spark/\"></a></small></p><br><p><img src=\"https://www.mooki.co.il/pub/media/catalog/product/cache/0f831c1845fc143d00d6d1ebc49f446a/_/s/_sparkfox_k1_5_.png\" /></p>\n<p style=\"text-align: center;\">בין אם אתם גיימרים ובין אם אתם פשוט עובדים ויושבים כל היום והגב כבר זועק לכיסא טוב יותר, הנה לכם עוד מבצע בלעדי במחיר חטיפה!<br />\nכיסא גיימינג מפנק, אוזניות גיימינג ומשלוח מהיר בחינם, עם אחריות יבואן רשמי &#8211; רק ב679₪!!!</p>\n<p style=\"text-align: center;\">השתמשו בקופה בקופון הבלעדי &#8211; <strong>GLA679</strong></p>\n<div> <img src=\"https://zuzu.deals/wp-content/uploads/2020/05/90902-801-09_2_1.jpg\" /></div>\n<div>\n<h3 style=\"text-align: center;\">מושב גיימינג מקצועי SPARKFOX GC60P</h3>\n</div>\n<div>מושב גיימינג בעל עיצוב מיוחד למשחקי מחשב לנוחות מקסימאלית למשתמש</div>\n<div>\n<ul>\n<li>מושב בעל משענת גב גבוהה</li>\n<li>נוחות המקסימאלית למשך זמן משחק ארוך</li>\n<li>זוג כריות לתמיכה בצוואר ובגב התחתון</li>\n<li>סוג חומר: ספוג יצוק</li>\n<li>סוג מסגרת: מתכת</li>\n<li>חומר: עור עם סיבי פחם</li>\n<li>משענות ידיים: מתכווננות מעלה / מטה</li>\n<li>סוג מנגנון: פרפר</li>\n<li>סוג הרמה: הידראולית Class4</li>\n<li>טווח משענת גב: 90°-180°</li>\n<li>סוג בסיס: ניילון</li>\n<li>חומר גלגל: ניילון</li>\n<li>יכולת נשיאה: עד 150 ק”ג</li>\n<li>אחריות: שנה</li>\n</ul>\n<div><strong>מידות</strong></div>\n<div>\n<ul>\n<li>רוחב: 67 ס&quot;מ</li>\n<li>עומק: 67 ס&quot;מ</li>\n<li>גובה משתנה: 124-132 ס&quot;מ</li>\n</ul>\n<h3></h3>\n<p><img src=\"https://zuzu.deals/wp-content/uploads/2020/05/90902-802-08_3_1.jpg\" /></p>\n<h3 style=\"text-align: center;\">אוזניות גיימינג SPARKFOX K1</h3>\n<div>אוזניות גיימינג בעיצוב מיוחד לנוחות מקסימלית לשמע ודיבור וביטול רעשי רקע</div>\n<div>\n<ul>\n<li>ניתנות לשימוש ברוב הקונסולות הקיימות בשוק</li>\n<li>שמע וניהול שיחות בטלפונים ובמחשבים ניידים</li>\n<li>ווסת עוצמת השמע הינו בכבל של האוזנייה- לגישה נוחה</li>\n<li>שמע מעולה ממנהלי התקנים גדולים של 50 מ&quot;מ</li>\n<li>בקרי עוצמת הקול וההשתקה</li>\n<li>כוסות אוזניים מרופדות גדולות לנוחות מרבית</li>\n<li>קשת האוזנייה מתכווננת להתאמה מושלמת לראשכם</li>\n<li>מתחבר ישירות ליציאת בקרי 3.5 מ&quot;מ</li>\n</ul>\n</div>\n<div>מצורף מתאם מיוחד לחיבור האוזניות למחשב נייח ע&quot;י מפצל 3.5 מ&quot;מ ל 2 יציאות 3.5 מ&quot;מ</div>\n</div>\n</div>\n<p>&nbsp;</p>\n<div data-custom-html=\"\"></div>",
  cooked:
   "<div data-wp=\"\">\n<a href=\"https://www.mooki.co.il/gaming/hbilvt-giiming-mwtlmvt/mvwb-giiming-khvl-sparkfox-wvlhn-giiming-mqcvei-lumi-whvr-2\" target=\"_blank\"><img src=\"https://zuzu.deals/wp-content/uploads/2020/05/5ebcf97155cd2-150x150.png\"></a><div>\n<div data-buy=\"\">\n<a href=\"https://www.mooki.co.il/gaming/hbilvt-giiming-mwtlmvt/mvwb-giiming-khvl-sparkfox-wvlhn-giiming-mqcvei-lumi-whvr-2\" target=\"_blank\">קנייה</a><span data-clipboard-text=\"GLA679\" data-coupon=\"\">GLA679</span><i></i>\n</div>\n<div data-price=\"\">₪679 <span data-old-price=\"\">₪1378</span>\n</div>\n</div>\n</div><hr><p><small> פורסם ב: <a href=\"https://zuzu.deals/%d7%91%d7%9c%d7%a2%d7%93%d7%99-%d7%95%d7%91%d7%9e%d7%97%d7%99%d7%a8-%d7%97%d7%98%d7%99%d7%a4%d7%94-%d7%9e%d7%95%d7%a9%d7%91-%d7%92%d7%99%d7%99%d7%9e%d7%99%d7%a0%d7%92-%d7%90%d7%93%d7%95%d7%9d-spark/\"></a></small></p><br><p><img src=\"https://www.mooki.co.il/pub/media/catalog/product/cache/0f831c1845fc143d00d6d1ebc49f446a/_/s/_sparkfox_k1_5_.png\"></p>\n<p>בין אם אתם גיימרים ובין אם אתם פשוט עובדים ויושבים כל היום והגב כבר זועק לכיסא טוב יותר, הנה לכם עוד מבצע בלעדי במחיר חטיפה!<br>\nכיסא גיימינג מפנק, אוזניות גיימינג ומשלוח מהיר בחינם, עם אחריות יבואן רשמי – רק ב679₪!!!</p>\n<p>השתמשו בקופה בקופון הבלעדי – <strong>GLA679</strong></p>\n<div> <img src=\"https://zuzu.deals/wp-content/uploads/2020/05/90902-801-09_2_1.jpg\">\n</div>\n<div>\n<h3>מושב גיימינג מקצועי SPARKFOX GC60P</h3>\n</div>\n<div>מושב גיימינג בעל עיצוב מיוחד למשחקי מחשב לנוחות מקסימאלית למשתמש</div>\n<div>\n<ul>\n<li>מושב בעל משענת גב גבוהה</li>\n<li>נוחות המקסימאלית למשך זמן משחק ארוך</li>\n<li>זוג כריות לתמיכה בצוואר ובגב התחתון</li>\n<li>סוג חומר: ספוג יצוק</li>\n<li>סוג מסגרת: מתכת</li>\n<li>חומר: עור עם סיבי פחם</li>\n<li>משענות ידיים: מתכווננות מעלה / מטה</li>\n<li>סוג מנגנון: פרפר</li>\n<li>סוג הרמה: הידראולית Class4</li>\n<li>טווח משענת גב: 90°-180°</li>\n<li>סוג בסיס: ניילון</li>\n<li>חומר גלגל: ניילון</li>\n<li>יכולת נשיאה: עד 150 ק”ג</li>\n<li>אחריות: שנה</li>\n</ul>\n<div><strong>מידות</strong></div>\n<div>\n<ul>\n<li>רוחב: 67 ס\"מ</li>\n<li>עומק: 67 ס\"מ</li>\n<li>גובה משתנה: 124-132 ס\"מ</li>\n</ul>\n<h3></h3>\n<p><img src=\"https://zuzu.deals/wp-content/uploads/2020/05/90902-802-08_3_1.jpg\"></p>\n<h3>אוזניות גיימינג SPARKFOX K1</h3>\n<div>אוזניות גיימינג בעיצוב מיוחד לנוחות מקסימלית לשמע ודיבור וביטול רעשי רקע</div>\n<div>\n<ul>\n<li>ניתנות לשימוש ברוב הקונסולות הקיימות בשוק</li>\n<li>שמע וניהול שיחות בטלפונים ובמחשבים ניידים</li>\n<li>ווסת עוצמת השמע הינו בכבל של האוזנייה- לגישה נוחה</li>\n<li>שמע מעולה ממנהלי התקנים גדולים של 50 מ\"מ</li>\n<li>בקרי עוצמת הקול וההשתקה</li>\n<li>כוסות אוזניים מרופדות גדולות לנוחות מרבית</li>\n<li>קשת האוזנייה מתכווננת להתאמה מושלמת לראשכם</li>\n<li>מתחבר ישירות ליציאת בקרי 3.5 מ\"מ</li>\n</ul>\n</div>\n<div>מצורף מתאם מיוחד לחיבור האוזניות למחשב נייח ע\"י מפצל 3.5 מ\"מ ל 2 יציאות 3.5 מ\"מ</div>\n</div>\n</div>\n<p> </p>\n<div data-custom-html=\"\"></div>",
  created_at: Thu, 14 May 2020 07:55:31 UTC +00:00,
  updated_at: Tue, 26 May 2020 14:56:16 UTC +00:00,
  reply_to_post_number: nil,
  reply_count: 0,
  quote_count: 0,
  deleted_at: nil,
  off_topic_count: 0,
  like_count: 0,
  incoming_link_count: 2,
  bookmark_count: 0,
  score: 10.8,
  reads: 4,
  post_type: 1,
  sort_order: 1,
  last_editor_id: -1,
  hidden: false,
  hidden_reason_id: nil,
  notify_moderators_count: 0,
  spam_count: 0,
  illegal_count: 0,
  inappropriate_count: 0,
  last_version_at: Thu, 14 May 2020 09:19:26 UTC +00:00,
  user_deleted: false,
  reply_to_user_id: nil,
  percent_rank: 0.0,
  notify_user_count: 0,
  like_score: 0,
  deleted_by_id: nil,
  edit_reason: nil,
  word_count: 939,
  version: 3,
  cook_method: 1,
  wiki: false,
  baked_at: Tue, 26 May 2020 16:59:49 UTC +00:00,
  baked_version: 2,
  hidden_at: nil,
  self_edits: 2,
  reply_quoted: false,
  via_email: false,
  raw_email: nil,
  public_version: 3,
  action_code: nil,
  image_url: "https://zuzu.deals/wp-content/uploads/2020/05/5ebcf97155cd2-150x150.png",
  locked_by_id: nil,
  image_upload_id: nil>]

Если я нажму «Сохранить редактирование» в редакторе:

Я вижу это правильно: image

Затем я вижу, что изображение загружено:

А, понятно. Проблема здесь в следующем:

Поскольку у нас есть такая логика перед планированием задачи по извлечению встроенных изображений:

Это предназначено для предотвращения бесконечного цикла планирования задач pull_hotlinked_image. Но, возможно, нам нужно улучшить эту логику. Можете ли вы проверить историю изменений одной из таких тем и выяснить, почему она была в последний раз отредактирована системой?

По этой теме:

  1. image
  2. image (изменение категории)
  3. image (я нажал «Сохранить редактирование»)
  4. image (система заменила изображение на markdown)

Так что, я полагаю, это из-за изменения категории?

Да, это объясняет ситуацию! В качестве временного решения вы можете вручную запустить задачу по загрузке внешних изображений, выполнив что-то вроде:

Jobs.enqueue_in(10, :pull_hotlinked_images, post_id: post.id)

Однако нам нужно более надежное решение. Я добавлю это в свой список задач.

Потрясающе. Давайте попробую это!

РЕДАКТИРОВАНИЕ:

Только для подтверждения: команда очень помогла. Теперь большинство изображений вернулись. Еще раз спасибо!

Остались пограничные случаи, которые не были обработаны, например, изображения со специальными символами или темы, где изображения помечены как поврежденные, хотя на самом деле они не повреждены (исправление «Rebuild HTML» исправляет их, а затем сохранение редактирования позволяет их скачать). Если #9890 будет принят и будет исправлен баг с markdown, это, вероятно, решит все проблемы.

Я только что объединил это исправление для редактирования system-user:

Думаю, мы вынесли все остальные проблемы в отдельные темы, но если мы что-то упустили, пожалуйста, не стесняйтесь открыть новую тему @Arkshine

Кстати, я только что убрал этот параметр. Мы больше не проверяем возраст поста при загрузке хостинговых изображений.

cc @merefield