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

페이지 정보

shadow2fox shadow2fox 3,150 7 3 2021.09.01 10:20:26

평점

  • 평점 : 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="https://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="https://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

추천인 3
  • 012i1052u
    내사랑
  • skyfield4u
    하늘구장
  • 소현세자
shadow2fox
10
shadow2fox - 회원등급 : 자연/Level 147 - 포인트 : 2,613,648
레벨 147
경험치 3,240,032

Progress Bar 47.02%

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

댓글7

내사랑님의 댓글

012i1052u
내사랑 2021.09.01 20:18
추가적인 내용이 있네요 잘 적용하겠습니다

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

하늘구장님의 댓글

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

shadow2fox님의 댓글

1/26
shadow2fox
shadow2fox 글쓴이 @하늘구장 2021.06.24 00:33
사용자 인증 정보> API 키 제한 및 이름 변경 > 애플리케이션 제한사항 > HTTP 리퍼러(웹사이트)가 작동되지 않는 것 같습니다 한번 확인해 주세요

하늘구장님의 댓글

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

내사랑님의 댓글

012i1052u
내사랑 2021.06.23 23:15
와우 멋지네요 얼른 적용하고 후기 남기겠습니다 정말 감사합니다

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

shadow2fox님의 댓글

1/26
shadow2fox
shadow2fox 글쓴이 @내사랑 2021.06.24 00:34
불가능에 가깝지만 1일 1팁에 노력 중입니다🙈

내사랑님의 댓글

2/26
012i1052u
내사랑 @shadow2fox 2021.06.24 01:24
아주 잘 작동합니다 앓던 이가 빠진 듯한 기분이에요 숙면하시고 좋은 꿈 꾸세요

Total 762326 페이지

제목 글쓴이 날짜 조회 추천
제로  🏆 💾 [스킨만들기] write.php(글쓰기 폼) 설명입니다 루루아빠 2005.06.23 5,601 0
이윰  🏆 이윰빌더 출석부 최신글 스킨 오늘의 랭킹으로만 나타내기 루루아빠 2018.02.03 2,595 0
제로  🏆 💾 [스킨만들기] view.php(목록보기) 파일 설명입니다 루루아빠 2005.06.23 3,305 0
이윰  🏆 포인트를 걸고 자료 배포시 포인트 수수료율(%) 변경하기 루루아빠 2015.08.23 3,450 0
제로  🏆 💾 [스킨만들기] view_comment.php(댓글 출력 부분) 의 설명입니다 루루아빠 2005.06.23 3,386 0
그누•영카트  🏆 인기검색어 갯수와 일자 수정하기 루루아빠 2015.08.24 2,626 0
이윰  🏆 Eyoom Builder 1.3.16 패치 루루아빠 2018.03.12 2,549 0
제로  🏆 💾 [스킨만들기] view_write_comment.php(댓글 쓰기 부분)의 설명입니다 루루아빠 2005.06.23 3,012 0
그누•영카트  🏆 그누보드 5.1.1 패치 루루아빠 2015.08.28 2,673 0
그누•영카트  🏆 그누보드 5.2.9.8.3 패치 루루아빠 2018.03.22 2,676 0
그누•영카트  🏆 영카트 5.4.4.1 shadow2fox 2021.01.05 1,312 0
제로  🏆 💾 [스킨만들기] view_foot.php(이전 다음글, 버튼 표시 부분)의 설명입니다 루루아빠 2005.06.23 2,723 0
그누•영카트  🏆 영카트 5.0.44 패치 루루아빠 2015.08.28 2,985 0
그누•영카트  🏆 영카트 5.2.9.8.2 패치 루루아빠 2018.03.22 2,774 0
제로  🏆 💾 [스킨만들기] view_list_head.php(리스트의 상단 부분 출력)의 설명입니다 루루아빠 2005.06.23 2,856 0
그누•영카트  🏆 영카트 이미지 가운데 정렬과 이미지 간격 수정 루루아빠 2015.08.28 2,940 0
그누•영카트  🏆 영카트 5.2.9.8.3 패치 루루아빠 2018.03.22 2,761 0
제로  🏆 💾 [스킨만들기] view_list_main.php(목록 출력 부분)의 설명입니다 루루아빠 2005.06.23 2,955 0
이윰  댓글+2🏆 사운드클라우드 embed options 제어하기 루루아빠 2015.09.07 3,911 0
그누•영카트  🏆 그누보드 5.2.9.8.4 패치 루루아빠 2018.03.30 2,514 0
제로  🏆 💾 [스킨만들기] view_list_foot.php(목록 출력 마무리 부분)의 설명입니다 루루아빠 2005.06.23 3,048 0
그누•영카트  🏆 영카트 5.2.9.8.4 패치 루루아빠 2018.03.30 2,671 0
그누•영카트  🏆 영카트 5.4.4.2 shadow2fox 2021.01.05 1,079 0
제로  🏆 제로보드에 나오는 변수들의 뜻 정리 루루아빠 2005.06.23 2,915 0
그누•영카트  🏆 📸 5.2.9.8.4 버전에서 5.3.1 정식버전으로 패치 루루아빠 2018.04.06 2,512 0
제로  🏆 읽고 있는글의 링크를 해제하여 해당글을 다시 클릭할 수 없게 하기 루루아빠 2005.06.24 3,359 0
기타  댓글+1🏆 Jwplayer 반응형으로 검정화면 없이 꽉차게 만들기 루루아빠 2015.09.08 4,293 0
그누•영카트  🏆 📸 5.2.9.8.4 버전에서 5.3.1 정식버전으로 패치 루루아빠 2018.04.06 2,779 0
제로  🏆 글, 링크 이미지, 업로드 이미지 모두 가운데 정렬하기 루루아빠 2005.06.24 2,976 0
그누•영카트  🏆 영카트 5.3.1.1 루루아빠 2018.04.06 2,981 0