pythonでYouTube Data APIを用いて特定のチャンネルが配信中であるかどうかを判定するプログラムを書いています。以下のようなコードを書いてみたのですが、serch().lisy()で取得される情報が配信中の動画のIDではなく、一つ前の動画のIDを取得してしまうため、実際に配信中のチャンネルであっても配信していないという判定になってしまいます。video().list()に手動で配信中んぼ動画のIDを入れた場合は、正しく動作します。
以下が、作成したコードです。
python
1from googleapiclient.discovery import build 2from datetime import datetime, timedelta 3 4 5api_key = '自分のAPIキー' 6youtube = build('youtube', 'v3', developerKey=api_key) 7 8def youtube_search(channel_id: str) -> list: 9 # Search: list で channel_id から検索する 10 search_response = youtube.search().list(channelId=channel_id, part='id', order='date', maxResults=1).execute() 11 return search_response.get('items', []) 12 13def youtube_video_details(video_id: str) -> list: 14 # Videos: list で video_id から検索する 15 video_response = youtube.videos().list(id=video_id, part='liveStreamingDetails').execute() 16 return video_response.get('items', []) 17 18if __name__ == '__main__': 19 for item in youtube_search('チャンネルID'): 20 video_id = item['id']['videoId'] 21 details = youtube_video_details(video_id) 22 23print('########################################################################') 24 25try: 26 scheduled_start_time = datetime.strptime(details[0]['liveStreamingDetails']['actualEndTime'], '%Y-%m-%dT%H:%M:%SZ') 27 scheduled_start_time_jst = scheduled_start_time + timedelta(hours=9) # 日本時間(JST)にする 28 print(video_id, scheduled_start_time_jst, '現在、配信は行われていません。') 29except: 30 print('現在、配信中') 31 32 33print('#################') 34print(youtube_search('チャンネルID'))
このコードの作戦としては、配信中の動画の場合はactualEndTimeが存在しないことに着目して 最新の動画のactualEndTimeを取得しようとしたときにエラーになるかどうかで、配信中かどうかを確認しようとしました。
実行結果の詳細は、以下の通りです。
weather newsのような四六時中配信している特殊なチャンネルであれば、配信中の判定ができる。
個人の配信者の方、数人をサンプルに試したところ、配信中の方のチャンネルIDを入力して実行しても配信中判定にはならなかった。
ご指導の程、よろしくお願いします。
[追記]
一部のチャンネルでは、正常な動作をしました。
配信者特有のいわゆる「待機所」という形の特殊な枠(動画の判定でAPIが取得しているかは謎ですが)が何か悪さをしている気がしてきました。(本配信以外で配信予定の枠をとっているチャンネルでは、配信中にも関わらず、配信中の判定になりませんでした。逆に、本配信のみでチャンネルが動いているものに関しては、正常に配信中の判定になりました。)片っ端から実験した結果、この推測にたどり着きました。
おそらくですが、APIがライブ配信であることを認識する形式の動画形式が、複数あることで挙動が不安定になると思われます。ライブ配信とプレミアム公開の動画が同じ判定をされるようなので、そのことも絡んでいるのかもしれません。(一応、最新の動画IDを取得する形にはしているのですが...)
ライブ配信を一つのチャンネルで複数行っている場合は、正しく配信中の判定になっていました。抽出された動画は、最も新しく配信を開始した動画になりました。(WeatherNewsで調査)
待機所を用意しているチャンネルであっても、ライブ配信をしていないときは最新の配信のアーカイブの動画IDを取得しました。
待機所を用意しているチャンネルが配信中の時に、上記のプログラムを実行した場合は、最新の動画アーカイブでもない"比較的"新しい動画IDが出力されました。

回答2件
あなたの回答
tips
プレビュー