[이윰] 유튜브 썸네일 생성 개선하기

페이지 정보

루루아빠 3,426 4 3 2021.06.24 05:57

평점

  • - 평점 : 5점 (2명 참여)

본문

유튜브 썸네일 생성 개선하기
현재까지 패치된 이윰빌더에는 유튜브를 비롯한 각종 동영상 사이트의 동영상을 규칙에 맞게 게시할 경우 목록에서 보이도록 자동으로 썸네일이 생성되는 기능이 있다.
이윰빌더 1.3.16 이전에는 유튜브로부터 0.jpg를 다운받아 썸네일을 생성했고 그 이후엔 maxresdefault.jpg를 다운받아 썸네일을 생성해 고품질의 이미지를 저장할 수 있게 되었지만 생각외로 HD가 아닌 영상들이 많아 썸네일 생성의 의의가 무색해지는 결과가 있어 개선해 보았다.

개선 내용 - 유튜부에서 제공하는 동영상의 maxresdefault.jpg를 다운받아 썸네일이 고화질이면 설정값대로 썸네일을 생성하고 실제 썸네일이 아닌 기본 maxresdefault.jpg이면 hqdefault.jpg를 다운받아 그누보드 게시판 설정 > 갤러리 이미지 폭의 설정과 상관없이 검정 여백을 제거해 480x270 크기로 크롭(crop)만 적용해 저장한다.

유튜브 제공 기본 maxresdefault.jpg 썸네일 이미지참고

유튜브에선 동영상이 고화질 썸네일을 갖지 않는 경우 왼편의 이미지(maxresdefault.jpg)로 대체해 제공하고 있으며 이윰빌더의 게시판 설정 > 목록에서 동영상이미지 사용과 그누보드 게시판 설정 > 갤러리 이미지 폭을 통해 썸네일을 생성하고 있다.
 
1. 그누보드5/eyoom/classes/eyoom.class.php 를 열어 URL로부터 동영상 이미지 경로를 찾기를 검색해 하단 줄을 다음과 같이 수정한다.

수정 전

            default : $video['img_url'] = ''; break;
        }
        return $video;
    }
수정 후

            default : $video['img_url'] = ''; break;
        }
        return $video;
    }

    public function get_imgurl_from_video2($src) {        // 추가 시작 - youtube maxresdefault 썸네일이 없으면 hqdefault로 만들기
        $video = $this->video_from_soruce($src);
        $video_url = $src[0];

        switch($video['host']) {
            case 'youtu.be':
            case 'youtube.com':
                $path_name = mb_substr($video['key1'],0,11,"utf-8");
                $video['img_url'] = "http://img.youtube.com/vi/{$path_name}/hqdefault.jpg";
                break;

            default : $video['img_url'] = ''; break;
        }
        return $video;
    }        // 추가 끝

2. 바로 동영상 URL를 이용하여 목록이미지 thumbnail 생성하기를 다음과 같이 수정한다.

수정 전

    /**
     * 동영상 URL를 이용하여 목록이미지 thumbnail 생성하기
     */
    public function make_thumb_from_video($src, $bo_table, $wr_id, $width, $height) {
        global $w;
        $src = preg_replace('/ /', '', $src);

        $prefix = 'vlist';

        $video = $this->get_imgurl_from_video($src);
        $path = trim($this->get_filename_from_url($video['img_url']));
        $filename = $path['filename'];
        $thumb_info = '/file/' . $bo_table . '/' . $prefix . '_thumb_' . $wr_id . '_' . $filename;
        $vlist_thumb_path = G5_DATA_PATH . $thumb_info;
        $vlist_thumb_url = G5_DATA_URL . $thumb_info;

        if ($video['img_url']) {
            //if (file_exists($vlist_thumb_path) && $w != 'u') {
            //새글 및 글 수정 시
            if (file_exists($vlist_thumb_path)) {
                return $vlist_thumb_url;
            } else {
                $local_image = G5_DATA_PATH . '/file/' . $bo_table . '/' . $prefix . '_img_' . $wr_id . '_' . $filename;

                if (file_exists($local_image)) {
                    return $this->make_thumb_list_image($prefix, $bo_table, $wr_id, $filename, $width, $height, $video['host']);
                } else {
                    $this->save_url_image($video['img_url'], $local_image);
                    return $this->make_thumb_list_image($prefix, $bo_table, $wr_id, $filename, $width, $height, $video['host']);
                }
            }
        } else return false;
    }
수정 후

    /**
     * 동영상 URL를 이용하여 목록이미지 thumbnail 생성하기
     */
    public function make_thumb_from_video($src, $bo_table, $wr_id, $width, $height) {
        global $w;
        $src = preg_replace('/ /', '', $src);

        $prefix = 'vlist';

        $video = $this->get_imgurl_from_video($src);
        $filename = trim($this->get_filename_from_url($video['img_url']));
        $thumb_info = '/file/' . $bo_table . '/' . $prefix . '_thumb_' . $wr_id . '_' . $filename;
        $vlist_thumb_path = G5_DATA_PATH . $thumb_info;
        $vlist_thumb_url = G5_DATA_URL . $thumb_info;

        if ($video['img_url']) {
            //if (file_exists($vlist_thumb_path) && $w != 'u') {
            //새글 및 글 수정 시
            if (file_exists($vlist_thumb_path)) {
                return $vlist_thumb_url;
            } else {
                $local_image = G5_DATA_PATH . '/file/' . $bo_table . '/' . $prefix . '_img_' . $wr_id . '_' . $filename;
                if (file_exists($local_image)) {
                    if (preg_match('/maxresdefault/i', $local_image)) {
                        $youtube_image_size = getimagesize($local_image);
                        if ($youtube_image_size[0] > 480) {        // youtube maxresdefault 썸네일 가로 크기가 480 보다 크다면
                            return $this->make_thumb_list_image($prefix, $bo_table, $wr_id, $filename, $width, $height, $video['host']);
                        } else {
                            @unlink($local_image);
                        }
                    }
                } else {
                    $this->save_url_image($video['img_url'], $local_image);
                    if (preg_match('/maxresdefault/i', $local_image)) {
                        $youtube_image_size = getimagesize($local_image);
                        if ($youtube_image_size[0] <= 480) {        // youtube maxresdefault 썸네일 가로 크기가 480 이하라면
                            @unlink($local_image);
                            return $this->make_thumb_from_video2($src, $bo_table, $wr_id, $width, $height);
                        } else {
                            return $this->make_thumb_list_image($prefix, $bo_table, $wr_id, $filename, $width, $height, $video['host']);
                        }
                    } else {
                        return $this->make_thumb_list_image($prefix, $bo_table, $wr_id, $filename, $width, $height, $video['host']);
                    }
                }
            }
        } else return false;
    }

    public function make_thumb_from_video2($src, $bo_table, $wr_id, $width, $height) {        // youtube maxresdefault 썸네일이 없으면 hqdefault로 만들기
        global $w;
        $src = preg_replace('/&nbsp;/', '', $src);

        $prefix = 'vlist';

        $video = $this->get_imgurl_from_video2($src);
        $filename = trim($this->get_filename_from_url($video['img_url']));
        $thumb_info = '/file/' . $bo_table . '/' . $prefix . '_thumb_' . $wr_id . '_' . $filename;
        $vlist_thumb_path = G5_DATA_PATH . $thumb_info;
        $vlist_thumb_url = G5_DATA_URL . $thumb_info;

        if ($video['img_url']) {
            if ( file_exists($vlist_thumb_path) && $w != 'u') {
                return $vlist_thumb_url;
            } else {
                $local_image = G5_DATA_PATH . '/file/' . $bo_table . '/' . $prefix . '_img_' . $wr_id . '_' . $filename;
                if (!file_exists($local_image)) {
                    $this->save_url_image($video['img_url'], $local_image);
                    if (preg_match('/(hqdefault|sddefault)/i', $local_image)) {
                        $youtube_image_size = getimagesize($local_image);
                        if ($youtube_image_size[0] < 480) {        // youtube hqdefault 썸네일 가로 크기가 480 미만이라면
                            return $this->make_thumb_list_image($src, $bo_table, $wr_id, $width, $height, $video['host']);
                        } else {
                            return $this->make_thumb_list_image2($prefix, $bo_table, $wr_id, $filename, $width, $height, $video['host']);
                        }
                    }
                }
            }
        } else return false;
    }

3. 다운로드된 비디오 이미지 파일을 썸네일화를 검색해 하단부를 다음과 같이 수정한다.

수정 전

            @unlink($img);

            return $out_url;

        } else return false;
    }
수정 후

            @unlink($img);

            return $out_url;

        } else return false;
    }

    public function make_thumb_list_image2 ($prefix, $bo_table, $wr_id, $filename, $width, $height) {        // 추가 시작 - youtube hqdefault 크롭만

        $img_info = '/file/' . $bo_table . '/' . $prefix . '_img_' . $wr_id . '_' . $filename;
        $img = G5_DATA_PATH . $img_info;

        if (file_exists($img)) {
            $size = getimagesize($img);
            switch ($size['mime']) {
                case "image/jpeg"    : $source = @imagecreatefromjpeg($img); $ext = 'jpg'; break;
                case "image/gif"    : $source = @imagecreatefromgif($img); $ext = 'gif'; break;
                case "image/png"    : $source = @imagecreatefrompng($img); $ext = 'png'; break;
            }

            $source_y_left_top = 45;
            $img_crop_y = 270;
            $width = $size[0];
            $height = $img_crop_y;

            $dest = @imagecreatetruecolor($width, $height);
            $out_file = G5_DATA_PATH . '/file/' . $bo_table . '/' . $prefix . '_thumb_' . $wr_id . '_' . $filename;
            $out_url = G5_DATA_URL . '/file/' . $bo_table . '/' . $prefix . '_thumb_' . $wr_id . '_' . $filename;
            @imagecopyresampled($dest, $source, 0, 0, 0, $source_y_left_top, $width, $height, $size[0], $img_crop_y);
            @imagejpeg($dest, $out_file , 100);
            @imagedestroy($dest);
            @imagedestroy($source);
            @unlink($img);

            return $out_url;

        } else return false;
    }        // 추가 끝

📌글 수정 시 유튜브 동영상 소스가 변경되었다면 변경된 동영상 썸네일로 교체
📌플레이리스트(playlist) 썸네일과 단일 동영상 간의 썸네일 교차 변경이 적용되도록 수정

끌어올림|2021.06.24 05:57|횟수 2

추천인
  • 추천해 주세요
6
루루아빠 - 회원등급 : 최고관리자 - 포인트 : 1,288,352
레벨 96
경험치 1,383,360

Progress Bar 54%

- 가입일 : 2015-03-04 03:24:54
- 서명 : KNOW YOUR LIMITS BUT NEVER STOP TRYING TO EXCEED THEM !!
- 자기소개 : 루루의 자랑 루루아빠랍니다~~

댓글4

shadow2fox님의 댓글

shadow2fox 2019.10.11 11:00

[2019년 10월 11일] 썸네일 추출 오류(타 동영상 썸네일을 만들지 못하는 문제) 수정

하늘구장님의 댓글

하늘구장 @shadow2fox 2019.10.11 15:46

몰랐었는데 끌어올리기가 정말 이럴 때 유용한 거네요 기존 소스가 문제가 있었는지도 전혀 몰랐어요 ㅎㅎ 여튼 감사해요

축하합니다. 지뢰폭탄 제거로 48경험치를 획득하였습니다.

내사랑님의 댓글

내사랑 @shadow2fox 2019.10.12 18:55

저 또한 몰랐던 1人 잘 적용하겠습니다

루루아빠님의 댓글

루루아빠 글쓴이 2018.06.08 05:25

[2018년 06월 28일] 동영상이 삭제된 경우를 위해 대체 기본 이미지인 hqdefault.jpg를 다운받아 크롭(crop)은 적용하지 않고 게시판에 정의된 썸네일 크기로만 키우도록 추가 수정했다.

Total 7461438 페이지
제목 글쓴이 날짜 조회 추천
jQuery  🏆 마우스 클릭 및 엔터를 일정 초 이상 유지하면 특정 url로 이동하기 shadow2fox 2018.07.11 1,850 0
이윰  댓글+2🏆 작성글 날림 방지하기 shadow2fox 2018.07.04 2,069 0
그누•영카트  🏆 영카트 5.3.1.5 패치 shadow2fox 2018.07.04 2,113 0
그누•영카트  🏆 그누보드 5.3.1.5 패치 shadow2fox 2018.07.04 1,944 0
이윰  🏆 PHP 7.x에서 이윰빌더 알람 푸시(push) 관련 PHP Notice: Undefined index: alarm 해결하기 shadow2fox 2018.07.01 2,061 0
이윰  🏆 내글반응 내용 추출 쌍 따옴표가 &#034;로 표시되는 문제 해결하기 shadow2fox 2018.06.18 2,017 0
그누•영카트  🏆 게시판 관리자는 글쓰기, HTML, DHTML 제한 적용받지 않기 shadow2fox 2018.06.09 1,943 0
그누•영카트  댓글+1🏆 특정 레벨회원까지 캡차 적용하기 shadow2fox 2018.06.09 1,833 0
그누•영카트  🏆 특정 게시판에선 인기검색어 수집하지 않기 루루아빠 2018.06.08 1,840 0
그누•영카트  🏆 영카트 5.3.1.4 패치 루루아빠 2018.06.06 2,621 0
그누•영카트  🏆 그누보드 5.3.1.4 패치 루루아빠 2018.06.06 2,101 0
Bootstrap  🏆 모달창 내부에서 모달창 부모 닫기 루루아빠 2018.06.02 2,003 0
그누•영카트  🏆 영카트 5.3.1.3 패치 루루아빠 2018.05.29 2,449 0
그누•영카트  🏆 그누보드 5.3.1.3 패치 루루아빠 2018.05.29 2,215 0
jQuery  🏆 타겟 링크가 내 주소인지 외부 주소인지 확인하기 루루아빠 2018.05.22 1,916 0
Bootstrap  🏆 모달창 오픈시 백그라운드(메인 화면) 스크롤 금지 최종 버전 루루아빠 2018.05.16 2,153 0
이윰  🏆 Eyoom Builder 3.0.2 패치 루루아빠 2018.05.14 1,989 0
이윰  🏆 전체검색 리스트 페이지에서 외부 이미지도 썸네일 사용하기 루루아빠 2018.05.06 2,221 0
이윰  🏆 전체검색 리스트 페이지에서 동영상 썸네일 이미지도 사용하기 루루아빠 2018.05.04 2,308 0
이윰  🏆 이윰빌더 사용하지 않기 루루아빠 2018.04.25 2,096 0