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

페이지 정보

루루아빠 4 591 3
2019.10.11 11:04

평점

본문

유튜브 썸네일 생성 개선하기
현재까지 패치된 이윰빌더에는 유튜브를 비롯한 각종 동영상 사이트의 동영상을 규칙에 맞게 게시할 경우 목록에서 보이도록 자동으로 썸네일이 생성되는 기능이 있다.
이윰빌더 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') {
                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') {
                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('/ /', '', $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/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;
    }        // 추가 끝

끌어올림|2019.10.11 11:04|횟수 1

5
루루아빠 - 회원등급 : 최고관리자 - 포인트 : 923,596
레벨 75
경험치 853,556

Progress Bar 94%

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

댓글4

루루아빠님의 댓글

루루아빠 글쓴이 2018.06.08 05:25

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

shadow2fox님의 댓글

shadow2fox 2019.10.11 11:00

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

하늘구장님의 댓글

하늘구장 2019.10.11 15:46

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

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

내사랑님의 댓글

내사랑 2019.10.12 18:55

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