加油吧! Youtube君

觀察教學課程影片清單的觀看人次走向

by sj82516

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.16.1/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script>
<h4>請輸入想要觀察的影片清單ID</h4>
<input id="playlistTitleId" type="text" value="PLXVfgk9fNX2I7tB6oIINGBmW50rrmFTqf">
<h4 id='playlistTitle'>Youtube影片清單</h4>
<canvas id="myChart" width="1200" height="400"></canvas>

JavaScript

const key = 'AIzaSyA9dn126LgbRvoViXhY1bBbZfzWZktJNjs';
// 影片ID可用:PLXVfgk9fNX2I7tB6oIINGBmW50rrmFTqf

// 取得播放清單的標題
function getYoutubePlaylistTitle(plId){
	return axios.get('https://www.googleapis.com/youtube/v3/playlists?'
                 + 'key='+key
                 + '&part=snippet'
                 + '&id='+ plId)
}

// 取得播放清單id中的所有影片資訊
// 回傳Promise,用then即可接一個包含所有影片資訊的陣列
function getYoutubeFullPlaylist(plId){
	let playlist = [];
    // 用遞迴輪詢全部的影片
	function recur(plId, nextPageToken){
    	return axios.get('https://www.googleapis.com/youtube/v3/playlistItems?'
				 + 'maxResults=10'
                 + '&key='+key
                 + '&part=snippet'
                 + '&playlistId='+ plId
                 + (nextPageToken?'&pageToken='+nextPageToken:''))
                 .then(result=>{
                 	if(result.data.nextPageToken){
                    	playlist = playlist.concat(result.data.items);
                    	return recur(plId, result.data.nextPageToken)
                    }else{
                    	console.log(result);
                    	playlist = playlist.concat(result.data.items);
                        return Promise.resolve(playlist)
                    }
                 })
    }
   	return recur(plId);
}

// 取得影片清單id中的所有影片的統計資料
// 回傳Promise,用then即可接一個包含所有影片資訊的陣列
function getVedioViewSum(vedioIdList){
	let promiseArr = [];
	while(vedioIdList.length!=0){
    	// 因為api一次最多吃50筆,要輪詢
    	let vedioIdListString = vedioIdList.splice(0,50).join(",");
        promiseArr.push(axios.get('https://www.googleapis.com/youtube/v3/videos?'
                + 'key=' + key
                + '&id=' + vedioIdListString
                + '&part=statistics,snippet'));
    }
    return promiseArr;
}

// 整理影片要儲存的資料
class Vedio {
	constructor(id, title, viewCount, likeCount){
    	this.id = id;
    	this.title = title;
        this.viewCount = viewCount;
        this.likeCount = likeCount;
    }
}

// 彙整函式,整合 
// 取得影片清單標題 -> 取得影片中的所有影片 -> 取得所有影片觀看人次 ->...