[이윰] 유튜브 플레이리스트(playlist) 썸네일 추출과 올바르게 적용하기
페이지 정보
shadow2fox
2,526 7 3
2021.09.01 10:20
짧은주소
-
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
레벨 142
경험치 3,042,400
Progress Bar 92%
- 가입일 : 2015-03-10 12:21:44
- 서명 : 인간에게 가장 큰 선물은
자기 자신에게 기회를 주는 것이다.
- 크리스 가드너, Chris Gardner -
- 자기소개 : There's never a shortcut to happiness.
-
1 [짤방 게시판] 히라세 아이리 - 주간 플레이보이 2024 No.12•132024-05-17
-
[짤방 게시판] 하시모토 리나 - 주간 플레이보이 2024 No.12•132024-05-17
-
1 [짤방 게시판] 에나 - 주간 플레이보이 2024 No.12•132024-05-17
-
[공유 자료실] VMware Workstation Pro + Player v17.5.2 Build 23775571 (2024-05-14)2024-05-15
-
1 [짤방 게시판] 사이토 야스요 - 주간 플레이보이 2024 No.12•132024-05-15
-
1 [짤방 게시판] 스기모토 아이리 - 주간 플레이보이 2024 No.12•132024-05-15
-
1 [짤방 게시판] 아카세 아카리 - 주간 플레이보이 2024 No.12•132024-05-15
-
1 [IT 정보] VMware Workstation Pro, VMware Fusion Pro : 이제 개인은 무료로 사용 가능+12024-05-15
-
[생활 정보] 100원이 넘는 적립 금액은 최초이지 않나 싶네요 고생하셨습니다{이모티콘}2024-04-23
-
[자유 게시판] 부활 곡에 잘 어울릴 듯 한 보이스 컬러네요 동감입니다2024-03-31
-
[생활 정보] 80원의 행복이네요{이모티콘}2024-03-21
-
[자유 게시판] 같은 의견이에요2024-03-14
-
[자유 게시판] 다시 봐도 감동입니다{이모티콘}2024-03-11
-
[자유 게시판] 제가 라이브 시청을 하지 않아야 대활약을 해서 손흥민 선수를 위해 안타깝지만 자제 중입니다{이모티콘} 반더벤 또한 너무 잘하지 않았나 싶었네요2024-03-03
-
[자유 게시판] 하늘구장님 늘 감사드리며 마음을 담아 새해 인사를 전합니다 새해 복 많이 받으세요2024-02-09
-
[이슈와 관심] 최소 누군가는 가학 대통령으로 기억할 것 같습니다2024-01-29
댓글7
내사랑님의 댓글
축하합니다. 지뢰폭탄 제거로 11경험치를 획득하였습니다.
하늘구장님의 댓글
shadow2fox님의 댓글
하늘구장님의 댓글
내사랑님의 댓글
축하합니다. 첫 댓글로 18경험치를 획득하였습니다.
shadow2fox님의 댓글
내사랑님의 댓글