• 북마크
  • 1:1문의
  • 출석부
  • 전체 태그 배경화면 유머 동영상 짤방 움짤 이슈

[이윰] 유튜브 플레이리스트(playlist) 썸네일 추출과 올바르게 적용하기

페이지 정보

shadow2fox 7 371 3 2021.09.01 10:20

평점

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

본문

📝유튜브 플레이리스트(playlist) 썸네일 추출과 올바르게 적용하기
유튜브에서 제공하는 플레이리스트(playlist) 공유 주소에는 세가지 패턴이 있다.
  1. https://youtu.be/QNdFgAAXQ_c?list=PLsOL9rj0pde4hqwb4afL8yhq3cZUFuj3s
  2. https://www.youtube.com/watch?v=QNdFgAAXQ_c&list=PLsOL9rj0pde4hqwb4afL8yhq3cZUFuj3s
  3. https://www.youtube.com/playlist?list=PLsOL9rj0pde4hqwb4afL8yhq3cZUFuj3s
썸네일 추출 시 1번과 2번은 video id(QNdFgAAXQ_c)가 존재하기에 자체적으로 해결가능하지만 3번은 video id(QNdFgAAXQ_c)가 공유 주소에 없음으로 YouTube Data API를 이용해야 한다.
그러므로 언급된 문제점을 해결하기 위해선 YouTube Data API Key가 있어야 하며 YouTube Data API Key가 없다면 https://console.cloud.google.com/를 통해 Key를 발급받아야 한다.
YouTube Data API Key 발급 과정은 구글신을 통해 해결하도록 한다.

그누보드5/eyoom/classes/eyoom.class.php를 열어 // 동영상 경로로 부터 동영상정보 가져오기를 검색한다.

수정 전

    private function video_from_soruce($src) {
        $url = $src[0];
        $video_url = trim(strip_tags($url));
        $video_url = preg_replace('/amp;/','&',$video_url);
        $info = $this->eyoom_host($video_url);
        $host = $info['host'];
        $query = $info['query'];
        $video['host'] = $host;
수정 후

    private function video_from_soruce($src) {
        $url = $src[0];
        $video_url = trim(strip_tags($url));
        $video_url = preg_replace('/amp;/','&',$video_url);
        $info = $this->eyoom_host($video_url);
        if(isset($info['host'])) $host = $info['host'];
        if(isset($info['query'])) $query = $info['query'];
        $video['host'] = $host ?? '';
        if(isset($host)) {
            $explode_url = explode($host.'/',$url);
            $src[1] = $explode_url[1] ?? '';
            //watch?v=가 포함된 공유주소에서 watch?v=제거 후 동영상 key 추출하기
            if(stripos($src[1], 'watch?v=') !== false) $src[1] = str_replace('watch?v=', '', $src[1]);
        }

// 동영상 key 추출하기을 검색한다.

수정 전

            case 'youtube.com':
                if ($src[1]) {
                    $video['key1'] = $src[1];
                } else {
                    $video['key1'] = $query['v'];;
                }
                break;
수정 후

            case 'youtu.be':
            case 'youtube.com':
                if (isset($src[1]) && $src[1] && !(isset($query['list']) && $query['list'])) {
                    $video['key1'] = $src[1];
                } else {
                    //유튜브 재생목록 가져오기
                    if(isset($query['v']) && $query['v']) {
                        $video['key1'] = $query['v'];
                        $explode_key = explode("list=",$video['key1']);
                        $video['key1'] = $explode_key[0];
                        $video['vlist'] = $explode_key[1];
                    } else {
                        if(isset($query['list'])) $video['vlist'] = $query['list'];
                    }
                }
                break;

// 수집된 동영상 정보를 iframe source로 구현을 검색한다.

수정 전

            case 'youtu.be':
            case 'youtube.com':
                $vlist = $video['key2'] ? '&list='.$video['key2'] : '';
                $source = '<iframe width="'.$video['width'].'" height="'.$video['height'].'" src="http://www.youtube.com/embed/'.$video['key1'].'?wmode=opaque&autohide=1'.$vlist.'" frameborder="0" allowfullscreen></iframe>';
                break;
수정 후

            case 'youtu.be':
            case 'youtube.com':
                if(isset($video['vlist']) && $video['vlist']) {
                    $vlist = '&list='.$video['vlist'];        //유튜브 재생목록 가져오기
                    $source = '<iframe width="'.$video['width'].'" height="'.$video['height'].'" src="//www.youtube.com/embed/?wmode=opaque&autohide=1&showinfo=0&modestbranding=1&rel=0&enablejsapi=1&vq=hd1080'.$vlist.'" frameborder="0" allowfullscreen></iframe>';
                } else {
                    $source = '<iframe width="'.$video['width'].'" height="'.$video['height'].'" src="//www.youtube.com/embed/'.$video['key1'].'?wmode=opaque&autohide=1&showinfo=0&modestbranding=1&rel=0&enablejsapi=1&vq=hd1080" frameborder="0" allowfullscreen></iframe>';
                }
                break;

URL로부터 동영상 이미지 경로를 찾기를 검색한다.

수정 전

            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}/maxresdefault.jpg";
                break;
수정 후

            case 'youtu.be':
            case 'youtube.com':
                $path_name = mb_substr($video['key1'],0,11,"utf-8");
                if(isset($video['key1']) && $video['key1']) {
                    $video['img_url'] = "https://img.youtube.com/vi/{$path_name}/maxresdefault.jpg";
                } else {
                    $url = 'https://www.googleapis.com/youtube/v3/playlists?part=snippet&id='.$video['vlist'].'&key=YouTube Data API Key';
                    $data = $this->curl_web_scripping($url);
                    $json = json_decode($data,true);
                    //플레이리스트 썸네일 추출 용 Json 데이타에 maxresdefault.jpg 값이 존재하면 maxresdefault.jpg를 이용해 썸네일을 생성하고 존재하지 않으면 sddefault.jpg를 이용해 생성
                    $maxres = $json['items'][0]['snippet']['thumbnails']['maxres']['url'];
                    $standard = $json['items'][0]['snippet']['thumbnails']['standard']['url'];
                    if(isset($maxres)) $video['img_url'] = $maxres;
                    else $video['img_url'] = $standard;
                }
                break;

📌플레이리스트(playlist)가 아닌 단일 동영상이 올바르게 나타나지 않는 문제 해결
📌php8.x 대응 수정
📌글 작성 시에만 적용되던 유튜브 썸네일 생성 개선하기를 글 수정 시와 더불어 플레이리스트(playlist) 썸네일과 단일 동영상 간의 썸네일 교차 변경이 적용되도록 수정
📌2021년 9월 1일
- watch?v=가 포함된 공유주소에서 watch?v=제거 후 동영상 key 추출하기
- 플레이리스트(playlist) 썸네일 추출 용 Json 데이타에 maxresdefault.jpg 값이 존재하면 maxresdefault.jpg를 이용해 썸네일을 생성하고 존재하지 않으면 sddefault.jpg를 이용해 생성

끌어올림|2021.09.01 10:20|횟수 2

9
shadow2fox - 회원등급 : 숲/Level 131 - 포인트 : 2,254,011
레벨 131
경험치 2,558,561

Progress Bar 11%

- 가입일 : 2015-03-10 12:21:44
- 서명 : 인간에게 가장 큰 선물은 자기 자신에게 기회를 주는 것이다. - 크리스 가드너, Chris Gardner -
- 자기소개 : There's never a shortcut to happiness.

댓글7

내사랑님의 댓글

내사랑 2021.09.01 20:18

추가적인 내용이 있네요
잘 적용하겠습니다

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

하늘구장님의 댓글

하늘구장 2021.06.24 00:05

유튜브 api를 신청해야 하겠네요
저도 적용 후 테스트 해 보고 후기 남길께요
멋진 팁 감사합니다

shadow2fox님의 댓글

shadow2fox 글쓴이 2021.06.24 00:33

사용자 인증 정보> API 키 제한 및 이름 변경 > 애플리케이션 제한사항 > HTTP 리퍼러(웹사이트)가 작동되지 않는 것 같습니다
한번 확인해 주세요

하늘구장님의 댓글

하늘구장 2021.06.24 21:53

애플리케이션 제한사항에 기존 세팅 값은 반영되는데
신규 HTTP 리퍼러(웹사이트)는 저도 안되서
IP 주소로 설정했어요
대 구글이 왜 이러는지 모르겠어요
그리고 수정 내용까지 적용해서 아주 잘 작동하고 있어요
다시 한번 감사드려요

내사랑님의 댓글

내사랑 2021.06.23 23:15

와우 멋지네요
얼른 적용하고 후기 남기겠습니다
정말 감사합니다

축하합니다. 첫 댓글로 18경험치를 획득하였습니다.

shadow2fox님의 댓글

shadow2fox 글쓴이 2021.06.24 00:34

불가능에 가깝지만
1일 1팁에 노력 중입니다🙈

내사랑님의 댓글

내사랑 2021.06.24 01:24

아주 잘 작동합니다
앓던 이가 빠진 듯한 기분이에요
숙면하시고 좋은 꿈 꾸세요