썸네일 생성 및 마크다운 렌더링 문제

안녕하세요,

최근 Discourse 2.5.0 버전 이후 썸네일 생성에 문제가 발생하고 있습니다.
썸네일이 이제 코어에서 생성되는 것 같으며, 이로 인해 모든 썸네일이 삭제되었습니다.
그들을 복원하기 위해 다양한 작업을 시도해 보았으며, 작동하지 않는 상황을 설명드리겠습니다.

참고: 이러한 변경에는 좋은 이유가 있을 수 있지만, 업그레이드 가이드나 해당 변경 사항을 선택적으로 적용할 수 있는 방법 없이 기능을 깨뜨리는 갑작스러운 동작 변경을 도입하는 것은 피해야 합니다. :confounded:

배경

  • Discourse 2.5.0 beta4 (faeb5793ba)
  • Topic List Preview 플러그인 4.4.0
  • WP-Discourse Posts가 Discourse 주제(첫 번째 메시지)에 게시됨 (전체 HTML).

게시물 콘텐츠에 대해, 다음은 예시입니다 (편의를 위해 포맷 적용):

Content

편의를 위해 이미지 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%9d%d7%99-xiaomi-re-2/"></a>
    </small>
</p>
<br />
<p>נעים להכיר!</p>

Discourse 업데이트 이전

TLP는 주제 생성 또는 편집 시 외부 이미지에서 항상 잘 작동했습니다.
그러나 마크다운 문제로 인해 download remote images to local 옵션은 비활성화되어 있었습니다.

마크다운 렌더링 문제

이것은 주요 문제는 아니며, Discourse 업그레이드 후에도 여전히 발생합니다. 여기 설명이 있습니다.
Discourse가 이미지를 다운로드하고 이미지 HTML을 마크다운 문법으로 대체할 때 – 우리의 컨텍스트에서는 다음과 같은 결과가 나옵니다:

[...]<a href="<link_here>" target="_blank">![|150x150](upload://l0iarnA6SPVAyJN5l7pnQxZnPvE.jpeg)</a>[...]

Discourse는 이미지를 렌더링할 수 없습니다.

Image

image

이 문제를 해결하려면 위에 최소한 빈 줄이 필요합니다:

[...]<a href="<link_here>" target="_blank">

![|150x150](upload://l0iarnA6SPVAyJN5l7pnQxZnPvE.jpeg)</a>[...]
Image

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으로 설정되어 있습니다.
Settings

이로 인해 모든 게시물을 다시 베이킹(rebake)하여 이미지를 다운로드하도록 지시를 받았습니다. 그리고 여기서 이상한 일이 시작됩니다.

  1. rake posts:rebake는 큰 효과가 없었습니다 (적어도 주제의 첫 번째 메시지에는 효과가 없었지만, 많은 PullHotlinkedImages를 트리거했습니다).
    1.1. 일부 주제를 살펴보니 class 또는 srcset 속성이 있는 이미지 HTML이 원인인 것 같아서, 다음 코드로 모든 이미지를 정규화(normalize)하려고 시도했습니다 (ruby를 잘 모름) – 일부 주제에는 도움이 되었습니다.
    1.2. 그러나 마크다운 문제로 인해 수정을 위해 줄바꿈을 추가해야 했습니다. – 적어도 그 주제들에 대해서는 썸네일이 작동했습니다.
Code
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. 그런 다음 위의 코드와 유사하지만 특정 주제 ID를 사용하고 post.rebake!만 사용하는 rails 콘솔을 시도했습니다 – 효과 없음
  4. 주제 내의 모든 이미지가 항상 다운로드되는 것은 아닙니다.
  5. @Canapin이 Download remote images from older posts? - #3 by vinothkannans 를 가리켜 주었습니다; 이제 모든 게시물을 다시 베이킹하려고 시도 중입니다. – 불행히도 도움이 되지 않았습니다

왜 어떤 이미지는 작동하고 다른 이미지는 작동하지 않는지 정말 미칠 것 같습니다. 기준 문제라고 생각하지 않습니다. 이미지 설정은 높게 되어 있습니다. 그 뒤에 있는 로직을 정말로 이해하지 못합니다. 이것은 무작위인 것처럼 보입니다.

현재 여전히 많은 수의 썸네일이 누락되어 있습니다. 아마도 대부분은 수동으로 편집/저장하여 수정할 수 있겠지만, 그것은 실현 가능하지 않습니다. 저는 클라이언트를 위해 이것을 수행하고 있으며, 이 문제를 해결하려고 시도하는 데 이미 많은 시간을 잃었습니다.

업로드된 이미지를 썸네일로 사용하는 것에 반대하지는 않지만:

  • 이미지가 다운로드되지 않는 구체적인 이유가 있는지 알려주실 수 있나요? 도움이 될 수 있는 설정이 있나요? 우리가 무언가 필요한가요? 어떻게 디버깅해야 하나요?
  • 콘솔을 통해 편집/저장처럼 다운로드를 강제하는 방법이 있나요?
  • HTML로 둘러싸인 경우 마크다운 이미지 렌더링을 허용해 주실 수 있나요?

문제를 충분히 정확하게 설명했기를 바랍니다.

도움과 해결책에 대해 미리 감사드립니다.

Hi @Arkshine, 문제가 발생하고 있다는 소식을 전해듣고 유감입니다. 불행히도, 특히 저희 플러그인 API의 범위를 넘어 핵심 동작을 오버라이드하는 경우를 제외하고는 모든 서드파티 플러그인과 호환성을 보장할 수 없습니다. 향후 TLP가 사용하는 핵심 오버라이드의 수를 줄일 수 있을 것이며, 이를 통해 안정성이 향상되기를 희망합니다.

썸네일 표시를 위한 공식 솔루션도 현재 제공하고 있으며, 이는 지원되는 플러그인 API를 완전히 사용하여 구현되었습니다.

핵심 썸네일은 로컬 이미지에서만 작동한다는 지적이 정확합니다. 궁극적으로 TLP는 이미지를 가져와 로컬에 저장하기도 했기 때문에, 차이점은 이제 pull_hotlinked_images 작업을 사용하여 모든 작업을 일관된 방식으로 수행한다는 점입니다.

여기 해결해야 할 문제가 몇 가지 있는 것 같습니다. 아무것도 놓치지 않도록 이를 분리하는 것이 최선이라고 생각합니다. 게시글을 읽어보니 두 가지 사항을 확인했습니다:

원격 이미지 가져오기로 인해 잘못된 html/markdown이 생성되어서는 안 되므로, 이를 수정하도록 하겠습니다. Contribute > Bug 토픽을 열고 저를 언급해 주시면 조사하겠습니다.

다시 한번, 특수 문자가 여기에서 이미지를 깨뜨려서는 안 됩니다. 다른 Contribute > Bug 토픽을 열고 확인해 보겠습니다.

답변해 주셔서 감사합니다, @david.

마크다운과 특수 문자가 포함된 링크에 대해서는 알겠습니다. 감사합니다.


그러나, 결국 제 주된 문제는 여전히 Discourse가 이미지를 강제 다운로드하도록 하는 것입니다. 마크다운 문제는 콘솔을 통해 해결할 수 있고, 모든 링크에 특수 문자가 있는 것도 아닙니다. 여전히 섬네리가 없는 주제들이 많습니다. 제가 도움을 요청하는 부분은 바로 이 점입니다.

예를 들어, 이 링크에는 특수 문자가 없습니다. 그런데 Save Edit(편집 저장)을 누르지 않는 한, 콘솔에서 rebaking을 통해 이미지를 다운로드하지도 않고, Rebuild HTML 링크를 사용해도 다운로드되지 않습니다.

Save Edit을 누를 때와 동일한 방식으로 Discourse가 이미지를 다운로드하도록 강제할 수 있는 rails 명령어나 다른 방법이 있을까요?


사실 컴포넌트를 사용해 보았지만 잘 작동하지 않았습니다. 하지만 섬네리 문제가 해결되면 다시 시도해 보겠습니다.

이건 제휴 사이트인가요?

그건 좀 이상하네요. 제 아이디어가 하나 있습니다 - 이 게시글들은 시스템 사용자에 의해 생성된 건가요? 아니면 디스코봇(Discobot)이 만든 건가요?

대부분은 일반 관리자 사용자입니다. 해당 토픽은 WP Discourse를 통해 API로 생성됩니다.

예를 들어 이 토픽처럼요:

@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>]

컴포저에서 Save Edit(편집 저장)을 누르면:

잘 보입니다 image

그런 다음 이미지가 다운로드되는 것을 볼 수 있습니다:

아, 이제 알겠습니다. 여기서는 다음 문제가 있습니다.

pull hotlinked images 작업을 예약하기 전에 이 로직이 있기 때문입니다:

이것은 pull_hotlinked_image 작업이 무한 루프로 예약되는 것을 방지하기 위해 설계되었습니다. 하지만 이 로직을 개선해야 할 수도 있습니다. 이 게시물 중 하나에 대한 수정 이력을 확인하여 시스템이 마지막으로 편집한 이유가 무엇인지 확인해 주시겠습니까?

이 주제에 대해:

  1. image
  2. image (카테고리 변경)
  3. image (나 저장만)
  4. image (시스템이 이미지를 마크다운으로 대체)

그러니까, 카테고리 변경 때문인 것 같나요?

네, 그거면 설명이 되겠네요! 단기적인 해결책으로 다음과 같은 방식으로 hotlinked images 작업을 수동으로 실행할 수 있습니다:

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

다만, 더 나은 해결책이 필요합니다. 제 할 일 목록에 추가해 두겠습니다.

놀랍네요. 한번 시도해 보겠습니다!

수정:

명령어가 정말 많이 도움이 되었다는 걸 확인했습니다. 이제 대부분의 이미지가 복구되었습니다. 다시 한번 감사합니다!

아직 특수문자가 포함된 이미지나, 이미지가 깨졌다고 표시되어 있지만 실제로는 그렇지 않은 토픽과 같은 엣지 케이스가 처리되지 않고 있습니다. (#9890이 병합되고 마크다운에 대한 수정이 이루어진다면, 아마 모든 문제가 해결될 것입니다.)

방금 시스템 사용자 편집에 대한 이 수정 사항을 병합했습니다:

다른 문제들은 모두 별도의 주제로 분리한 것 같습니다. 만약 놓친 부분이 있다면 @Arkshine 님은 언제든지 새로운 주제를 열어주세요.

참고로 이 설정을 방금 제거했습니다. 이제 핫링크된 이미지를 가져올 때 게시글의 경과일을 확인하지 않습니다.

cc @merefield