優勝しました。

みなさん。お久しぶりです。Noteを書くのは酸化ケツぶりですね。この傘下穴の間に色々ありました。チャンネル登録者は本名義より多くなり(は?)、100人を超え(は?)、イクでしょうは7000回再生されました(は?)。は?

さて、今回𝕟𝕠𝕥𝕖を書いたのは、他でもない、第1回 𝕺𝖐𝖎𝖇𝖆𝖟𝖔𝖐𝖚 𝕮𝖔𝖒𝖒𝖚𝖓𝖎𝖙𝖞 低評価投票で優勝したからです。皆さんの熱い愛と低評価のお陰で、無事1位を摂ることが出来ました。ありがとうございます。(蒲焼きになれ。)

参加者視点はここまで、ここからは少し真面目に主催者視点の話をしてみたいと思います。

ところで、置き場族の動画は全部で幾つあるかご存知ですか?(制限時間:1秒、配点:252)

A:129
B:134
C:139
D:145

1

0

0...0...0...

正解は配点の252!素直にアルファベットを選んだやつは蒲焼きの刑!(蒲焼きに頼りすぎ)

というわけで(ここで素に戻らない)、ランキングで対象にした動画は252本あります。これだけ見ると「お前...まさか252本全部調べたのか...!?」と思われるかもしれません。思わなかった方は感情が無いと思います。勿論、毎週投稿して最も"定期"な置き場を目指しては特にいないたわしにそんな時間はありません。そこでYouTube Data API(名前合ってる?)を用いて、置き場族の全動画の情報を一気に取得して楽しました。しかしこの方法、確かに楽なのですが一つ問題があります。

画像1

これはYouTube Data API(名前合ってた)の「割り当て」画面です。基本的にAPIというのは、サーバーへの過負荷とか不正行為とかとかとかとかとかを防ぐために、アクセス量を制限しています。そして、これだけの量の動画の情報を取得するのをデバッグしつつ何度か繰り返すと、画像のように結構大変なことになります。おかげで一度開発がストップしてしまいました。いやだねえ。

次に取得して表示するまでのプログラムについてです。JavaScriptくらいしかいじったことないので、今回はJavaScriptで処理を行いHTMLの表に表示する方法を撮りました。盗撮ですね。そんな気がしましたら、まず全動画のIDを取得するために、全置き場のチャンネルIDをセットして置きます。

let channel_id_list=[
	"UCaKyEB0O5b3SiHo3tLDHYMg"//定期
	,"UClJ0nDTqMg2sRiEVgr9opbg"//不定期
	,"UCkVqz5XNedY0sEp6sXZx_Fg"//未定期
	,"UCNc_XzpeorSVcELQnF1DOwg"//非定期
	,"UCf4ja1PwuoGhTNt7bAxlsxw"//雑定期
	,"UC5m91KvZJ8rZTh85M3Yb5wQ"//超定期
	,"UCZV8MN66iq2adWnrOCraiMw"//既定期
	,"UCiXG1zaBeMpbhf4GW9WjdKQ"//最定期
	,"UC7OXciG1SqTDd8F-FSE5cFA"//定期券
];

あ、ちなみにここに書いてあるプログラムは一部なのでこれ全部をコピペして集めても動きません。かなしいね?
これを元に繰り返し処理を行います。APIからデータを取得するために何か外部ファイルを送ってもらうやつ(語彙力)を使うます。

let request=new XMLHttpRequest(); ​

チャンネルIDを元に動画IDを取得するのですが、ここで一つ問題があります。1回で取得できる件数は50件で、それ以上ある場合NextTokenという値が帰ってくるので、こいつを元に更に取得を続ける必要があります。(しかも過去になりすぎると問題があるってマ?YouTube君さぁ...)
というわけで、こんな感じでやや複雑になってしまいました。

let url;
if(next_token==""){
url="https://www.googleapis.com/youtube/v3/search/?channelId="+channel_id_list[channel_i]+"&part=id&fields=nextPageToken,items.id.videoId&maxResults=50&order=date&key=ここに取得したAPIキー"
}
else{
url="https://www.googleapis.com/youtube/v3/search/?channelId="+channel_id_list[channel_i]+"&pageToken="+next_token+"&part=id&fields=nextPageToken,items.id.videoId&maxResults=50&order=date&key=ここに取得したAPIキー"
next_token="";
}

こうしてURLを指定したらデータを取得して...というのを繰り返します。全てのチャンネルに対してこの操作を終えたら、取得した動画IDを元に今度はそれぞれの動画の情報を取得します。具体的には、
・動画ID
・動画のタイトル
・動画の統計情報(視聴回数、コメント数、高評価低評価数)
です。こちらは特に複雑な処理は必要ありませんでした。

let url="https://www.googleapis.com/youtube/v3/videos/?id="+movie_id_list[movie_i]+"&part=id,statistics,snippet&fields=items.id,items.snippet.title,items.statistics&key=ここにAPIキー";

こちらも取得し終わったら、並び替えを行います。今回は低評価の割合で並び替えたいので、

低評価数÷(高評価数+低評価数)

の値を基準に並び替えを行います。JavaScriptの 配列.sort(比較関数) の比較関数に上記の式で比較するような関数をぶちこむことで、比較的簡単にできます。(簡単だとは言ってない)

function evaluation_sorter(a,b){
	let al=a.statistics.likeCount-0;
	let ad=a.statistics.dislikeCount-0;
	let bl=b.statistics.likeCount-0;
	let bd=b.statistics.dislikeCount-0;
	let aw=al+ad;
	let bw=bl+bd;
	let ar=al/aw;
	let br=bl/bw;
	return ar-br;
}
//中略
movie_data_list.sort(evaluation_sorter);

最期に取得した情報を表示して終わりん!って感じです。あんまりF5押しまくるとすぐにAPI制限に達しかねないので、慎重にやらないといけないので大変でした。

というわけで主催者側からは異常です。ところでこれ何のn⃞o⃞t⃞e⃞(←これちゃんと表示されないんだけどなんで)だっけ。てかどうする?もう話すことなくない?どうするホテル来る?

いいなと思ったら応援しよう!

コメント

ログイン または 会員登録 するとコメントできます。
あなたも書ける! 会員登録はこちら
優勝しました。|最定期置き場
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1