76 lines
6.4 KiB
Markdown
76 lines
6.4 KiB
Markdown
|
+++
|
|||
|
date = "2019-10-29"
|
|||
|
tags = ["youtube"]
|
|||
|
title = "youtubeでlistを作ってみた"
|
|||
|
slug = "youtube"
|
|||
|
+++
|
|||
|
|
|||
|
自分が好きそうな曲のリストを作ってみました。`nightcore`というジャンルが好き。youtubeでlistを作るのはこれがはじめてかもしれない。聴いてると横に似てる曲がポンポン出てくるので適当に追加。
|
|||
|
|
|||
|
<iframe width="100%" height="400" src="https://www.youtube.com/embed/videoseries?list=PLqs8DaKUViAS8LGerf7CFGr2rUtuKLP61" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
|
|||
|
|
|||
|
## リストの公開について
|
|||
|
|
|||
|
正直、リストを公開しようかどうしようか迷いました。なぜなら違法動画だとか色々なことを言われることを恐れたからです。リスト公開には、メリットが一つもなく、デメリットしかありません。
|
|||
|
|
|||
|
しかし、そういった理由から今の時代、有益な情報の公開、共有が阻害されているような気がしましたので、一転して公開することにしました。
|
|||
|
|
|||
|
まず違法動画か否かは、権利者の意思やライセンスの内容によります。ですが、リストに追加する際、一つ一つの動画に対して、権利者の所在を突き止め、その意思を確認するという調査は行っていません。また意思に反する場合でも独自性が認められるか否かによって法解釈は変わってきます。例えば、カバーやリミックス、歌ってみたがどの程度認められるかです。その点で言えば、私は、元の曲との差分を調査することも行っていません。つまり、著作者やライセンス内容を突き止め、もし著作者の意思に反する場合、次は独自性の解釈の問題になりますが、そういった調査を全然やっていないということです。そんな暇はありませんし、する気もありません。
|
|||
|
|
|||
|
私がやるのは、仮に自身が作成したコンテンツの権利が侵害された場合は、その申立てと、逆に自分が間違って侵害コンテンツをアップロードしないように気をつけることだけです。自分が全く権利を持たないコンテンツに対して、その権利を過剰に主張したりすることはほぼありません。それは基本的に当事者間で解決すべき問題です。権利者でも運営でも何でもない個人ユーザーが、youtubeに流れてくるコンテンツ一つ一つに対して、膨大な調査や検証を行うというのは非現実的で、必要性もありません。そんな暇はないし、する気もありません。
|
|||
|
|
|||
|
もちろん、個人の態度として様々な態度があってもいいし、私もこれは流石にダメだろというものは追加していません。ただ、その判断は完璧かと言うと、そうではない。しかし、私は、多くの人がそういった完璧ではないリストを公開してくれる社会のほうが良いと思います。この人、どんな曲聞くのかなとか、知れたほうが嬉しいのです。みなさんも、見えない誰かから文句を言われることを恐れず、どんどんとyoutube再生リストなどの情報を公開してみてはどうでしょう?仮に批判があり、それが正当ならそのとき修正していけばいいのではと私は思います。
|
|||
|
|
|||
|
youtubeは現在、適法、違法問わず動画内容を自動解析し元の権利者に還元する制度プログラムを進めていたと思います。
|
|||
|
|
|||
|
いい曲あったら、教えてください!
|
|||
|
|
|||
|
## youtube api
|
|||
|
|
|||
|
あと、listのurlを一つずつgetできないかと思い、apiでやってみた例。
|
|||
|
|
|||
|
```sh
|
|||
|
# oauth(get scoop)
|
|||
|
$ id=`cat ./config.json|jq -r .id`
|
|||
|
$ open -a Google\ Chrome "https://accounts.google.com/o/oauth2/auth?client_id=${id}&redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&scope=https://www.googleapis.com/auth/youtube&response_type=code&access_type=offline"
|
|||
|
# token
|
|||
|
$ code=`cat ./config.json|jq -r .code`
|
|||
|
$ secret=`cat ./config.json|jq -r .secret`
|
|||
|
$ curl -s -d "code=${code}&client_id=${id}&client_secret=${secret}&redirect_uri=http://localhost/oauth2callback&grant_type=authorization_code" -X POST "https://accounts.google.com/o/oauth2/token" >! token.json
|
|||
|
# token-refresh
|
|||
|
# https://developers.google.com/youtube/v3/guides/auth/server-side-web-apps?hl=ja#OAuth2_Refreshing_a_Token
|
|||
|
$ id=`cat ./config.json|jq -r .id`
|
|||
|
$ code=`cat ./config.json|jq -r .code`
|
|||
|
$ secret=`cat ./config.json|jq -r .secret`
|
|||
|
$ refresh=`cat ./token.json|jq -r .refresh_token`
|
|||
|
$ token=`curl -s -d "client_id=${id}&client_secret=${secret}&refresh_token=${refresh}&grant_type=refresh_token" https://www.googleapis.com/oauth2/v4/token|jq -r .access_token`
|
|||
|
$ echo "
|
|||
|
{
|
|||
|
\"access_token\": \"$token\",
|
|||
|
\"expires_in\": 3600,
|
|||
|
\"refresh_token\": \"$refresh\",
|
|||
|
\"scope\": \"https://www.googleapis.com/auth/youtube\",
|
|||
|
\"token_type\": \"Bearer\"
|
|||
|
}" >! token.json
|
|||
|
|
|||
|
# example
|
|||
|
$ export ACCESS_TOKEN=`cat ./token.json | jq -r .access_token`
|
|||
|
$ list=XXXXXXX
|
|||
|
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" "https://www.googleapis.com/youtube/v3/channels?part=id&mine=true"
|
|||
|
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=${list}&maxResults=50"
|
|||
|
$ next=`curl -H "Authorization: Bearer $ACCESS_TOKEN" "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=PLqs8DaKUViAS8LGerf7CFGr2rUtuKLP61&maxResults=50"|jq -r .nextPageToken`
|
|||
|
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=PLqs8DaKUViAS8LGerf7CFGr2rUtuKLP61&maxResults=50&pageToken=${next}"
|
|||
|
|
|||
|
# videoid
|
|||
|
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=${list}&maxResults=50" >! p1.json
|
|||
|
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=PLqs8DaKUViAS8LGerf7CFGr2rUtuKLP61&maxResults=50&pageToken=${next}" >! p2.json
|
|||
|
$ cat p1.json| jq -r ".items|.[].snippet.resourceId.videoId" >! list.txt
|
|||
|
$ cat p2.json| jq -r ".items|.[].snippet.resourceId.videoId" >> list.txt
|
|||
|
$ cat list.txt|sed "s#^#https://www.youtube.com/watch?v=#g"
|
|||
|
```
|
|||
|
|
|||
|
## 追記
|
|||
|
|
|||
|
その後、時間空いたときにちょっと調べたり、削除したりでリスト整理しました。
|
|||
|
|