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

페이지 정보

yadolee 루루아빠 4,161 4 3 2021.06.24 05:57:14

본문

유튜브 썸네일 생성 개선하기
현재까지 패치된 이윰빌더에는 유튜브를 비롯한 각종 동영상 사이트의 동영상을 규칙에 맞게 게시할 경우 목록에서 보이도록 자동으로 썸네일이 생성되는 기능이 있다.
이윰빌더 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 생성하기를 다음과 같이 수정한다.

수정 전

    
    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;
    }
수정 후

    
    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

추천인
  • 추천해 주세요

댓글4

shadow2fox님의 댓글

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

하늘구장님의 댓글

1/26
skyfield4u
하늘구장 @shadow2fox 2019.10.11 15:46
몰랐었는데 끌어올리기가 정말 이럴 때 유용한 거네요 기존 소스가 문제가 있었는지도 전혀 몰랐어요 ㅎㅎ 여튼 감사해요

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

내사랑님의 댓글

1/26
012i1052u
내사랑 @shadow2fox 2019.10.12 18:55
저 또한 몰랐던 1人 잘 적용하겠습니다

루루아빠님의 댓글

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

Total 7691026 페이지

제목 글쓴이 날짜 조회 추천
이윰  댓글+1🏆 PHP 8.x Fatal error : 중괄호 사용으로 인한 json.class.php 오류 shadow2fox 2021.02.17 2.7k 1
Bootstrap  🏆 부트스트랩 툴팁 보이기, 감추기 지연 시간 설정하기 루루아빠 2018.01.10 2.7k 0
그누•영카트  🏆 그누보드 5.3.3.2 shadow2fox 2019.08.13 2.7k 0
그누•영카트  🏆 그누보드 5.2.3 패치 루루아빠 2016.10.19 2.7k 0
그누•영카트  🏆 그누보드 5.2.0 패치 루루아빠 2016.07.25 2.7k 0
그누•영카트  🏆 영카트 5.3.1.5 패치 shadow2fox 2018.07.04 2.7k 0
그누•영카트  🏆 영카트 5.3.2.5 shadow2fox 2019.01.29 2.7k 0
Bootstrap  🏆 모달창 내부에서 모달창 부모 닫기 루루아빠 2018.06.02 2.7k 0
그누•영카트  🏆 그누보드 5.2.9.8.4 패치 루루아빠 2018.03.30 2.7k 0
그누•영카트  🏆 댓글에 달린 비밀 댓글을 원댓글 작성자에게도 보여주기 루루아빠 2016.01.30 2.7k 0
Bootstrap  🏆 부트스트랩 툴팁 텍스트 한 줄로 보여주기 루루아빠 2017.08.03 2.7k 1
이윰  댓글+1🏆 이윰빌더 현재 접속자 최신글에서 관리자도 ip가 숨겨지는 문제 해결하기 shadow2fox 2020.04.10 2.7k 1
제로  🏆 💾 원하는 곳에 카테고리 뿌려주기(메뉴로 활용 가능) 루루아빠 2005.07.08 2.7k 0
제로  🏆 로그아웃시 현재접속자 리스트에서 바로 안나오게 하기 루루아빠 2005.07.14 2.7k 0
이윰  댓글+1🏆 현재 게시글 스크랩 갯수 본문에 보여주기 shadow2fox 2019.04.28 2.8k 2
그누•영카트  🏆 그누보드 5.2.9.2 패치 루루아빠 2017.08.31 2.8k 0
이윰  🏆 Eyoom Builder 3.0.7 패치 shadow2fox 2018.10.15 2.8k 0
제로  댓글+1🏆 수정된 정보를 제대로 보여주기 루루아빠 2005.07.03 2.8k 0
제로  댓글+1🏆 음악스킨 안될때 처방법.. 루루아빠 2005.07.09 2.8k 0
그누•영카트  🏆 📸 5.2.9.8.4 버전에서 5.3.1 정식버전으로 패치 루루아빠 2018.04.06 2.8k 0
제로  🏆 [re] 조금더 전문적인 사용법 루루아빠 2005.06.27 2.8k 0
이윰  🏆 Eyoom Builder 1.3.16 패치 루루아빠 2018.03.12 2.8k 0
그누•영카트  🏆 게시판을 디바이스에 따라 보여주기 안보여주기 루루아빠 2015.11.04 2.8k 0
에디터  댓글+1🏆 SmartEditor2 포토 업로더 모바일에서 사진 순서 정렬하기 shadow2fox 2020.04.05 2.8k 1
이윰  🏆 PHP 7.x에서 이윰빌더 알람 푸시(push) 관련 PHP Notice: Undefined index error 해결하기 shadow2fox 2019.01.01 2.8k 0
이윰  🏆 전체검색 리스트 페이지에서 외부 이미지도 썸네일 사용하기 루루아빠 2018.05.06 2.8k 0
Bootstrap  🏆 모달창 오픈시 백그라운드(메인 화면) 스크롤 금지 최종 버전 루루아빠 2018.05.16 2.8k 0
이윰  🏆 게시글 본문에 태그가 포함된 경우 검색시 그대로 노출되는 문제 해결 루루아빠 2016.05.13 2.8k 0
제로  🏆 공지사항 체크를 빼면 제위치로 가지 않는 문제의 해결점 루루아빠 2005.07.07 2.8k 0
이윰  댓글+1🏆 Eyoom Builder 3.0.8 패치 shadow2fox 2019.03.12 2.8k 1