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

짧은주소
-
https://yadolee.com/tip/905 주소복사
본문
📝 유튜브 플레이리스트(playlist) 썸네일 추출과 올바르게 적용하기
유튜브에서 제공하는 플레이리스트(playlist) 공유 주소에는 세가지 패턴이 있다.
그러므로 언급된 문제점을 해결하기 위해선 YouTube Data API Key가 있어야 하며 YouTube Data API Key가 없다면 https://console.cloud.google.com/를 통해 Key를 발급받아야 한다.
YouTube Data API Key 발급 과정은 구글신을 통해 해결하도록 한다.
그누보드5/eyoom/classes/eyoom.class.php를 열어 // 동영상 경로로 부터 동영상정보 가져오기를 검색한다.
수정 전
// 동영상 key 추출하기을 검색한다.
수정 전
// 수집된 동영상 정보를 iframe source로 구현을 검색한다.
수정 전
URL로부터 동영상 이미지 경로를 찾기를 검색한다.
수정 전
- https://youtu.be/QNdFgAAXQ_c?list=PLsOL9rj0pde4hqwb4afL8yhq3cZUFuj3s
- https://www.youtube.com/watch?v=QNdFgAAXQ_c&list=PLsOL9rj0pde4hqwb4afL8yhq3cZUFuj3s
- https://www.youtube.com/playlist?list=PLsOL9rj0pde4hqwb4afL8yhq3cZUFuj3s
그러므로 언급된 문제점을 해결하기 위해선 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

레벨 148
경험치 3,280,323
Progress Bar 38.12%
- 가입일 : 2015-03-10 12:21:44
- 서명 : 인간에게 가장 큰 선물은
자기 자신에게 기회를 주는 것이다.
- 크리스 가드너, Chris Gardner -
- 자기소개 : There's never a shortcut to happiness.
-
[이슈와 관심] 무릎을 탁 치게 만드는 과학적 접근법이네요2025-09-26
-
[자유 게시판] 그러게나 말입니다{이모티콘}2025-09-19
-
[자유 게시판] 루루맘은 실시간으로 아메리카 퍼스트 필드 경기장에서 직관하셨더랍니다 매년 이맘때면 미국에 비지니스 겸 여행 중이신데 솔트레이크시티가 주무대시라2025-09-19
-
[자유 게시판] 89세 나이시라 어쩌면 급작스러운 소식은 아니더라도 한없이 나약한 인간이기에 떠나는 이와 남겨진 이 나 또한 선택되어진다는 걸 깨닫게 됩니다.2025-09-17
-
[Web Server Tip] 저 또한 불편하단 느낌이 한동안 들었는데 막상 내려놓고 작업하니 시간이 소모될 뿐 문제될 건 없었습니다 차분하게 작업해 보세요{이모티콘}2025-09-10
-
[Web Server Tip] 패치할 양이 제법 많지만 그 기능을 사용하지 않더라도 충돌이 있다거나 하진 않았습니다 참고하세요2025-09-09
-
[이슈와 관심] 정경심 동양대 표창장 위조 판결 뒤집는 새로운 증거 나와 https://youtu.be/1ni0YkMIidM2025-08-13
-
[이슈와 관심] 외국 기사도 참고하셨음 좋겠습니다 {글}2025-07-18
댓글7
내사랑님의 댓글
축하합니다. 지뢰폭탄 제거로 11경험치를 획득하였습니다.
하늘구장님의 댓글
shadow2fox님의 댓글
하늘구장님의 댓글
내사랑님의 댓글
축하합니다. 첫 댓글로 18경험치를 획득하였습니다.
shadow2fox님의 댓글
내사랑님의 댓글