[이윰] 유튜브 플레이리스트(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

레벨 147
경험치 3,233,805
Progress Bar 32.9%
- 가입일 : 2015-03-10 12:21:44
- 서명 : 인간에게 가장 큰 선물은
자기 자신에게 기회를 주는 것이다.
- 크리스 가드너, Chris Gardner -
- 자기소개 : There's never a shortcut to happiness.
-
[일일 메모장] 공감되는 말씀입니다2025-06-03
-
[일일 메모장] 그 어떤 후보도 내게 직접적인 득이 될 수 없다면 내 친지와 내 이웃에게 득이 될 것 같은 후보를 뽑으시고 여러모로 따져 보고 헤아려 보아도 그런 자질을 갖춘 이를 찾을 수 없다면 내 나라에 더 득이 되어 줄 후보를 뽑으셨으면 좋겠습니다 어쩌면 내 코가 석 자라는 말도 자유가 없다면 배 부른 소리 일 수 있습니다 어느 개념있는 배우에 대한 기사로 갈음하고 싶습니다 {글} 꼭 소중한 투표 행사하셨으면 합니다2025-06-03
-
[자유 게시판] 저 또한 소중한 하나 표를 행사하려 합니다 좋은 결과를 기대하고 싶습니다2025-06-03
-
[이슈와 관심] 29일 시청했으나 이제서야 댓글을 답니다 속이 타들어가는 느낌과 메스꺼움 그리고 온전치 않은 정신에 불편한 감정을 다스릴 수 없는 시기라 무슨 말을 피력하기가 참 어렵습니다 당분간은 이 상태일 듯 하네요 그럼에도 불구하고 뉴스타파의 노고에 박수를 보냅니다2025-06-01
-
[이슈와 관심] 미약하나마 동참했습니다2025-05-04
-
[생활 정보] 음 180원 다른 운을 기대해봐야겠네요2025-04-26
-
[생활 정보] 나라가 혼돈의 시기를 겪다 보니 봄을 만끽할 겨를 조차 느낄 수 없었네요 정보 감사합니다2025-04-07
-
[생활 정보] 새해 복 많이 받으십시오2025-01-31
댓글7
내사랑님의 댓글
축하합니다. 지뢰폭탄 제거로 11경험치를 획득하였습니다.
하늘구장님의 댓글
shadow2fox님의 댓글
하늘구장님의 댓글
내사랑님의 댓글
축하합니다. 첫 댓글로 18경험치를 획득하였습니다.
shadow2fox님의 댓글
내사랑님의 댓글