추가로, 현재 기본 동작은 대부분 잘 작동하지만, 동적 임베드를 지원하지 않는 점이 아쉬움입니다. 우리는 iframe 대신 JS를 로드하는 방식을 원합니다. 솔직히 이 문제를 해결하는 다른 방법, 즉 일부 JS를 사용하여 iframe의 크기를 선택적으로 조정하는 방식도 있지만, 단기적으로 oEmbed에 대해 이를 범용적으로 구현할 계획은 없습니다.
주요 발견 사항은 링크가 onebox로 변환되어 iframe으로 렌더링될 경우 썸네일이 로드되지 않는다는 것입니다.
즉, 아래 링크는
https://app.everviz.com/embed/N0dDTJaOQ
도메인에서 iframe이 허용되는지(allowed iframes)에 따라 썸네일이 렌더링되거나 그렇지 않습니다. 이 문제를 해결하기 위해 게시물에 iframe을 주입하는 방법을 찾아야 합니다. 저는 이를 수행하고, 게시물의 이미지 표시를 방지하기 위해 이미지에 display: none이 설정되도록 하는 플러그인을 작성했습니다.
이를 일반화하는 것이 가능할 것 같습니다:
모든 일반 onebox에 대해 get_oembed.thumbnail_url이 존재할 경우, 옆에 이미지를 조용히 로드하고 숨기는 것.
아마도 더 나은 해결책이지만, get_oembed.thumbnail_url을 추출하고 이를 게시물과 연관 짓되, cooked 영역 자체의 일부로 만들지 않는 일반적인 지원 추가.
이것을 시도해 보셨나요? 특정 케이스에 맞는 onebox를 작성하면 cooked post에 onebox 이미지를 제공할 수 있을 것입니다. 그러면 섬네일(thumbnail)이 자동으로 작동하게 됩니다.
Youtube onebox는 플레이 버튼을 클릭할 때까지 정적인 인-사이트(in-site) 콘텐츠인 것 같습니다. 클릭하면 iframe이 표시됩니다. 클릭 전에 제공되는 콘텐츠에는 이미지가 포함되어 있으며, 이 이미지가 캡처되어 섬네일로 사용됩니다. 당연히 Discourse는 iframe에서 내용을 읽을 수 없으므로, 이 기법은 좋은 접근 방식입니다.
예제에 헤더 태그 내에 og:image가 포함되어 있는 것을 확인했습니다. 이는 완벽합니다.
플러그인을 작성하는 것이 제가 처음 시도한 일이었고, 이는 매우 잘 작동했습니다. lib/onebox/engine에 넣든, 별도의 플러그인으로 만들든 관계없이 말이죠. 다만 우리가 호스팅 플랜을 사용 중이라는 점이 문제입니다. 멀티 테넌트 플랜에서는 이해할 수 있는 대로 플러그인 사용이 허용되지 않아서, Rails에서 직접 개발하는 것은 불가능합니다.
이것은 대체로 합리적으로 보입니다. everviz.com(또는 유사한 시각화 서비스)을 위한 onebox 엔진에 대한 PR을 코어에 수용하는 데 열려 있을 것입니다. 하지만 cooked 게시글에 이미지를 삽입하고 숨기는 것은 피해야 합니다. 더 가벼운 옵션이 있습니다. Discourse의 게시글 프로세서가 다음 요소에 대한 업로드를 찾습니다:
따라서 iframe 아래에 앵커로 썸네일을 추가하는 방식이 작동할 수 있습니다. 이를 표시하거나 "hidden"과 같은 클래스를 사용하여 숨길 수 있습니다.
아, 내 실수였네. 네가 맞고, 그 접근 방식은 동작하지 않아. 썸네일을 생성할 때 우리는 다운로드된 이미지만 사용하는데, 앵커 태그로 링크된 이미지는 다운로드되지 않으니까.
여기서 대안으로 @merefield가 추천한 것과 유사한 것을 코어에 추가하되, 지연 로드되는 iframe을 위한 범용 원박서(oneboxer)로 감싸는 방법이 있을 수 있어. 예를 들어 lazy_loaded_iframes라는 새로운 사이트 설정을 추가하고, 원박이 처음에는 OG 태그의 이미지를 출력하도록 할 수 있지 (이것이 썸네일에 의해 잡히게 될 거야). 그리고 클릭 시, 약간의 JS가 이미지를 올바른 iframe으로 교체하도록 하면 돼 (유튜브 iframe 교체 방식과 유사하게).
여기서 까다로운 세부 사항 중 하나는 사용되는 이미지와 iframe의 높이가 동일해야 한다는 거야. 그렇지 않으면 게시글을 스크롤하거나 탐색할 때 원치 않는 점프가 발생할 수 있으니까.