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

페이지 정보

shadow2fox 2,448 7 3 2021.09.01 10:20

본문

📝 유튜브 플레이리스트(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
  • 내사랑
  • 하늘구장
  • 소현세자
10
shadow2fox - 회원등급 : 자연/Level 142 - 포인트 : 2,531,985
레벨 142
경험치 3,019,710

Progress Bar 39%

- 가입일 : 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 리퍼러(웹사이트)가 작동되지 않는 것 같습니다 한번 확인해 주세요

하늘구장님의 댓글

하늘구장 @shadow2fox 2021.06.24 21:53

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

내사랑님의 댓글

내사랑 2021.06.23 23:15

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

축하합니다. 첫 댓글로 18포인트를 획득하였습니다.

shadow2fox님의 댓글

shadow2fox 글쓴이 @내사랑 2021.06.24 00:34

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

내사랑님의 댓글

내사랑 @shadow2fox 2021.06.24 01:24

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

Total 743438 페이지
제목 글쓴이 날짜 조회 추천
그누•영카트  댓글+2🏆 그누보드(영카트) 5.4.13.1 shadow2fox 2021.07.28 1,178 2
그누•영카트  댓글+2🏆 그누보드(영카트) 5.4.13 shadow2fox 2021.07.28 1,143 2
그누•영카트  댓글+1 그누보드(영카트) 5.4.12 shadow2fox 2021.07.21 965 1
그누•영카트  댓글+2 그누보드(영카트) 5.4.11 (webp 파일 지원) shadow2fox 2021.07.20 953 2
그누•영카트  댓글+1 그누보드(영카트) 5.4.10 shadow2fox 2021.07.01 885 1
그누•영카트  댓글+2🏆 그누보드(영카트) 5.4.9 shadow2fox 2021.06.25 1,091 1
이윰  댓글+4🏆 📸 유튜브 썸네일 생성 개선하기 루루아빠 2021.06.24 3,390 3
JavaScript  댓글+2🏆 Prism.js 플러그인 Copy to Clipboard Button 이용 시 빈칸이 추가되는 문제 해결하기 shadow2fox 2021.06.22 1,089 2
CSS  댓글+2🏆 구문(코드) 강조 Prism.js에서 첫 라인이 빈칸으로 추가되는 문제 해결하기 shadow2fox 2021.06.22 1,096 2
이윰  댓글+2🏆 글, 댓글 작성시 불필요한 앞뒤 공백 제거해 DB에 저장하기 shadow2fox 2021.06.21 1,125 2
JavaScript  댓글+1 텍스트 타입의 input 태그에 텍스트 입력 시 앞뒤 공백제거 shadow2fox 2021.06.20 845 1
그누•영카트  그누보드(영카트) 5.4.8 shadow2fox 2021.06.18 810 0
그누•영카트  그누보드(영카트) 5.4.7 shadow2fox 2021.06.18 912 0
그누•영카트  댓글+4🏆 그누보드 5.4.6 (영카트 포함) shadow2fox 2021.06.18 1,169 2
이윰  댓글+3🏆 첨부 이미지 alt 속성 값 게시글 제목으로 보여주기 shadow2fox 2021.06.11 1,119 2
이윰  댓글+3🏆 게시글 검색 단위에 맞는 메뉴 추가하기 shadow2fox 2021.05.18 1,606 2
그누•영카트  영카트 5.4.5.5.1 shadow2fox 2021.05.18 916 0
그누•영카트  댓글+1🏆 영카트 5.4.5.5 shadow2fox 2021.05.18 1,145 0
그누•영카트  댓글+2🏆 그누보드 5.4.5.5 shadow2fox 2021.05.18 1,181 2
그누•영카트  댓글+5🏆 인기 검색어 특정 게시판 제외, 회원 아이디 제외, 회원의 검색어만 저장 shadow2fox 2021.05.13 3,492 2