티스토리 썸네일에 유튜브 썸네일 불러오기

개발

최종 수정일:

티스토리 썸네일이 아무것도 없을 때, 만약 글에 유튜브 영상이 포함되어 있다면 자동으로 해당 유튜브의 썸네일을 썸네일로 표시하는 스크립트입니다.
대부분 스킨 제작자가 썸네일을 첨부하지 않았을 때를 대비해 짜둔 스크립트가 존재할 텐데, 이 스크립트는 해당 스크립트와 충돌할 가능성이 있으니 주의해주세요.

HTML

<a href="[##_article_rep_link_##]" class="indexArticle">
    <div class="index_thumbnail">
        <img
            src="<s_article_rep_thumbnail>https://i1.daumcdn.net/thumb/R700x0/?fname=[##_article_rep_thumbnail_raw_url_##]</s_article_rep_thumbnail>"
            class="index_img"
            alt="[##_article_rep_title_##]"
            data-href="[##_article_rep_link_##]"
        />
    </div>
    <div class="tit_post">[##_article_rep_title_##]</div>
    <div class="detail">
        <div class="category">[##_article_rep_category_##]</div>
        <div class="cnt-wrap">
            <img class="heart" src="./images/heart.svg" />
            <s_rp_count><span class="cnt">[##_article_rep_rp_cnt_##]</span></s_rp_count>
        </div>
    </div>
    <div class="date hidden">[##_article_rep_date_##]</div>
</a>

임의로 제가 사용했던 인덱스 포스트의 HTML 태그입니다.

다른 건 제쳐놓고, <s_article_rep_thumbnail> 이 들어가는 부분과 data-href는 반드시 위와 같이 수정해주셔야 합니다.
보통 <s_article_rep_thumbnail>은 외부로 빠져있을 건데, img src 안에 전부 구겨 넣어주세요.

<s_article_rep_thumbnail>이 두 번 들어가면 스킨이 깨집니다. 필히 src 안에 한 번만 집어넣으셔야 아무런 오류 없이 사용하실 수 있습니다.

Javascript

function thumbErr(elem, url, callback) {
    fetch(url)
        .then((response) => {
            if (response.status === 200) {
                return response.text();
            } else {
                return !1;
            }
        })
        .then((a) => {
            const parser = new DOMParser().parseFromString(a.replace(/src/g, "NOsrc"), "text/html");
            const target = parser.querySelector("iframe[NOsrc*='youtube']");
 
            (elem.src = `${target !== null ? `https://i.ytimg.com/vi/${target.getAttribute("NOsrc").replace("https://www.youtube.com/embed/", "")}/original.jpg` : "https://i.imgur.com/I0QZbvs.png"}`),
                callback &&
                    elem.addEventListener(
                        "load",
                        () => {
                            callback();
                        },
                        { once: !0 },
                    );
        });
}

위 함수가 썸네일이 없을 때 실행될 함수입니다.
js 파일에 추가하시거나 별도의 js 파일을 만들어 붙여 넣어주세요.

</body> 앞에 script 태그를 만드셔서 집어넣으셔도 됩니다.

응용하면 네이버 TV, 카카오 TV, 사운드 클라우드 등 다양한 썸네일을 가져올 수 있겠지만, 일단 전 유튜브만 작업해뒀습니다.

[...document.querySelectorAll(".index_img")].forEach((a) => {
    a.addEventListener(
        "error",
        () => {
            thumbErr(a, a.dataset.href);
        },
        { once: true },
    );
});

이미지를 불러오지 못하면 함수가 실행되도록 작업해주시면 끝납니다.
index_img를 본인 스킨의 이미지 class로 변경해주세요.

[...document.querySelectorAll(".index_img")].forEach((a) => {
    a.addEventListener(
        "error",
        () => {
            thumbErr(a, a.dataset.href, $(".article-wrapper").masonry("layout"));
        },
        { once: true },
    );
});

Masonry 등의 스크립트를 사용하시면, 유튜브 썸네일을 불러왔을 때 레이아웃이 깨질 수 있으므로, callback 함수도 추가할 수 있도록 해뒀습니다.

유튜브 썸네일 로딩이 끝났을 때 callback 함수를 실행합니다. 본인이 사용하는 스킨에 맞게 위 코드처럼 작업하시면 됩니다.

Report an issue
Marshall Ku