【備忘】YouTubeチャンネル一覧の更新作業フロー

【随時更新】クラリネット奏者のYouTubeチャンネル一覧は未掲載のYouTubeチャンネルが溜まってきたら更新するようにしています。「一覧」には更新日現在の動画の本数とチャンネル登録者数、関連記事へのリンクを掲載しているのですが、もちろん一つ一つ手作業で書き換えているわけではありません。どうやって更新しているのか、その作業フローを備忘的に書いていきます。

大まかな作業フロー

大まかに作業フローを書いていくと、以下のようになります。

YouTubeでの作業
発見・チャンネル登録
チャンネル管理画面をコピー

StackEditでの作業
Markdownエディタに貼り付け
GitHubで同期

Pythonでの作業
新しく見つけたチャンネルを分類
Markdownからチャンネルリストを抽出

noteでの作業
noteに貼り付け・見出し調整

以下、解説していきます。

YouTubeでの作業

発見・チャンネル登録
まずクラリネット奏者あるいはクラリネット関連のチャンネルを見つけたら、すかさずチャンネル登録します。

チャンネル管理画面をコピー
YouTube→左側「登録チャンネル」タブ→右上「管理」から「チャンネル管理画面」に行きます。「チャンネル管理画面」から自分が登録したチャンネルの一覧が見られます。

管理画面の一番下まで行き、「Ctrl+A」「Ctrl+C」でコピーします。この画面は100件ずつくらいのページが、スクロールにより順次読み込まれる仕様なので、下まで行かないと最初の100件分くらいのデータしか得られません。

StackEditでの作業

Markdownエディタに貼り付け
コピーした管理画面(登録チャンネルの一覧)をオンラインMarkdownエディタであるStackEditに貼り付けます。数あるエディタの中でStackEditは、コピペしたときにリンクタグを自動的にMarkdown形式に変換してくれます。

つまりこれ↓

<a href="リンク先のURL">アンカーテキスト</a>

がこの状態↓

[アンカーテキスト](リンク先のURL)

になって貼り付けられます。

GitHubで同期
またStackEditはGitHubと同期できますので、Markdown化した登録チャンネルの一覧をGitHubプライベートリポジトリ、Pullしてローカルへと持ってきます。

Pythonでの作業

新しく見つけたチャンネルを分類
見つけたチャンネルを「日本」「海外」「メーカー」「その他」に分類しています。「その他」は総合メーカーなどでクラリネット関連動画の本数が少ないものなどを分類しています。

YouTubeのチャンネルには固有のIDがふられていますので、それで管理しています。例えばBuffet CramponのYouTubeチャンネルは、

"https://www.youtube.com/channel/UCXwJn9cZXYYbzE5quOKLYtA"

なので、末尾の"UCXwJn9cZXYYbzE5quOKLYtA"が固有IDになります。

メーカーであれば、下のように「makerリスト」に追記していきます。↓

maker = ["UCXwJn9cZXYYbzE5quOKLYtA", "UCZkAUDFr_euKonE5v2SMlFQ", \
    "UCEMwVy7W1o7U9egRlPztdAw", "UCnfs2J7A2I3xPHX0H7kAi7w"]

同様に日本の奏者のチャンネルは「japanリスト」、海外の奏者のチャンネルは「overseaリスト」、その他は「othersリスト」に追記しています。

また、クラリネットとは無関係なチャンネルは「not_clリスト」に入れておきます。

これまで書いた記事の中で紹介したチャンネルは、関連記事へのリンクをつけるために「articles辞書」に追記して管理します。辞書のキーはnoteの記事IDになっています。

articles = {"n3175b17a893f":["UCesx9qQ6fNUUkY32nnqjJPw", "UCBN2wRb1kriHjAhaZksH1iA", \"UCocjUeEBvmuWul96oRvdqzw", 
                            "UCs8HIjbnXBKsFOw0afoa54A"], \
           "nf5379d794673":["UCPkYE41JwiUYg1aWH5gq_ng", "UC_3OpJdb7bvRmNscWx22tbQ", "UC7kQcAAGlxapXMGRZM5MUgQ", \
                            "UCbveck2KSYGpzA9Zd1QK93A", "UCbjkzBEfjaCtYf8E2q__V1w", "UC6RK2OBWZbDb2yTeJBtNK1A", \
                            "UCPUeaPB13a1CXptwC0-DytQ", "UCPUeaPB13a1CXptwC0-DytQ", "UCc9Vl1C6eOhYlFdhrBZH1IQ", \
                            "UC5NqImqYvxfJ8cjVdAIXtSg", "UCg5C1hgwHIkZxz1ALsAKD7A"]}

Markdownからチャンネルリストを抽出
先ほど同期したMarkdown「youtube_chs.md」からデータを抽出してnoteに投稿しやすいように整形します。そのコードが以下です。リストや辞書は省略しています。

def inverse_lookup(d, x):
   return [k for k,v in d.items() if x in v ]

fd = open('youtube_chs.md', encoding='utf-8')
data = fd.read()
fd.close()

chs = data.split('''[ホーム](https://www.youtube.com/ "ホーム")[急上昇](https://www.youtube.com/feed/trending "急上昇")[登録チャンネル](https://www.youtube.com/feed/subscriptions "登録チャンネル")[ライブラリ](https://www.youtube.com/feed/library "ライブラリ")\n\n''')[1] \
       .split("\n登録済み\n\n")
chs.pop(-1)

not_cl = []

maker = []
japan = []
oversea = []
others = []

articles = {}


print("### 日本")
for ch in chs:
   ch_id = ch.split("\n\n")[0].replace('[](https://www.youtube.com/channel/', '').replace(')', '')
   if (ch_id not in not_cl) and (ch_id in japan):
       print(ch.split("\n\n")[3].replace('\n', ''))
       print(ch.split("\n\n")[4].replace('\n', '').replace('•', '・'))
       print(ch.split("\n\n")[0].replace('[](', '').replace(')', ''))
       if len(inverse_lookup(articles, ch_id)) != 0:
           for i in inverse_lookup(articles, ch_id):
               print("関連記事: https://note.com/syam_cl/n/" + i)
       print("")
       
print("### 海外")
for ch in chs:
   ch_id = ch.split("\n\n")[0].replace('[](https://www.youtube.com/channel/', '').replace(')', '')
   if (ch_id not in not_cl) and (ch_id in oversea):
       print(ch.split("\n\n")[3])
       print(ch.split("\n\n")[4].replace('\n', '').replace('•', '・'))
       print(ch.split("\n\n")[0].replace('[](', '').replace(')', ''))
       if len(inverse_lookup(articles, ch_id)) != 0:
           for i in inverse_lookup(articles, ch_id):
               print("関連記事: https://note.com/syam_cl/n/" + i)
       print("")
       
print("### メーカー")
for ch in chs:
   ch_id = ch.split("\n\n")[0].replace('[](https://www.youtube.com/channel/', '').replace(')', '')
   if (ch_id not in not_cl) and (ch_id in maker):
       print(ch.split("\n\n")[3])
       print(ch.split("\n\n")[4].replace('\n', '').replace('•', '・'))
       print(ch.split("\n\n")[0].replace('[](', '').replace(')', ''))
       if len(inverse_lookup(articles, ch_id)) != 0:
           for i in inverse_lookup(articles, ch_id):
               print("関連記事: https://note.com/syam_cl/n/" + i)
       print("")
       
print("### その他")
for ch in chs:
   ch_id = ch.split("\n\n")[0].replace('[](https://www.youtube.com/channel/', '').replace(')', '')
   if (ch_id not in not_cl) and (ch_id in others):
       print(ch.split("\n\n")[3])
       print(ch.split("\n\n")[4].replace('\n', '').replace('•', '・'))
       print(ch.split("\n\n")[0].replace('[](', '').replace(')', ''))
       if len(inverse_lookup(articles, ch_id)) != 0:
           for i in inverse_lookup(articles, ch_id):
               print("関連記事: https://note.com/syam_cl/n/" + i)
       print("")
       
print("### 未分類")
for ch in chs:
   ch_id = ch.split("\n\n")[0].replace('[](https://www.youtube.com/channel/', '').replace(')', '')
   if (ch_id not in not_cl) and ((ch_id not in japan) and (ch_id not in oversea) and (ch_id not in maker) and (ch_id not in others)):
           print(ch.split("\n\n")[3])
           print(ch_id)
           print("")

noteでの作業

noteに貼り付け・見出し調整
上のコードの出力結果をnoteの下書きページに貼り付けます。見出しなどは手動で調整します。

noteがMarkdownに対応すれば、この辺の作業も省略できそうです。

以上が、更新の作業フローになります。これを知ってもう一度「一覧」を見て頂けたら見方が変わるかもしれません。


この記事が気に入ったらサポートをしてみませんか?