質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

4259閲覧

Youtube Data APIを使ってライブアーカイブ情報のみ取得したい

na34

総合スコア5

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/11/04 05:08

前提・実現したいこと

Youtube Data APIを使ってライブアーカイブ情報のみ取得したい。

「CHANNEL_ID」で指定しているチャンネル最新の動画5件に、
ライブアーカイブと通常投稿動画が混在すること。

発生している問題・エラーメッセージ

特定チャンネルから「eventType = "none"」パラメータを使用してアーカイブ動画を取得することはできたが、
通常投稿(ライブ配信ではない動画)も同じパラメータとなるためライブアーカイブのみ取得することができない状況。

該当のソースコード

Python

1#!/usr/bin/env python3 2 3import json 4from apiclient.discovery import build 5 6def main(): 7 API_KEY = '自身のAPIKEY' 8 YOUTUBE_API_SERVICE_NAME = 'youtube' 9 YOUTUBE_API_VERSION = 'v3' 10 CHANNEL_ID = 'UCK9V2B22uJYu3N7eR_BT9QA' 11 12 youtube = build( 13 YOUTUBE_API_SERVICE_NAME, 14 YOUTUBE_API_VERSION, 15 developerKey=API_KEY 16 ) 17 18 response = youtube.search().list( 19 part = "snippet", 20 channelId = CHANNEL_ID, 21 eventType = "none", 22 maxResults = 5, 23 type = "video", 24 order = "date" 25 ).execute() 26 27 for item in response.get('items', []): 28 if item["id"]["kind"] != "youtube#video": 29 continue 30 31 print('*' * 10) 32 print(json.dumps(item, indent=2, ensure_ascii=False)) 33 print('*' * 10) 34 35if __name__ == "__main__": 36 main()

試したこと

「eventType = "none"」パラメータを指定
-> ライブアーカイブ動画と通常投稿動画は共にnone状態のため切り分けができない

補足情報(FW/ツールのバージョンなど)

使用言語 : Python
OS : Windows10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/04 12:56

通常投稿動画には、いわゆる「プレミア配信」の動画も含まれるのでしょうか?
na34

2021/11/05 13:28

「プレミア配信」「プレミア公開」は通常投稿動画に含めたいです。 あくまで、双方リアルタイムで行っているライブアーカイブのみ取得したく思います。
guest

回答1

0

ベストアンサー

結論から申し上げますと
「ライブ配信およびプレミア配信」と「通常の投稿動画」を区別することは可能です。

しかし

APIを使用してライブ配信とプレミア配信を区別することは、現時点では不可能のようです。
(注:ライブ状態に限り判定する方法はありますが、アーカイブ済みの場合はAPIを使用して判定することはできません。後述)

#【説明】
「ライブ配信・プレミア配信」と「通常の投稿動画」は以下の項目によって区別することができます。

[ライブ配信・プレミア配信]
==> videos.list というAPIを使用したときに「liveStreamingDetails」が存在する

[通常の投稿動画]
==> videos.list というAPIを使用したときに「liveStreamingDetails」が存在しない

(注)この「videos.listというAPI」とは、「個別の動画の情報を得るAPI」です。
(質問文内のコードで使われている「videos.search」は、
チャンネルIDやキーワードを指定して、複数の動画を検索する別のAPIになります)

下記リンクに説明があります。
Videos: list  |  YouTube Data API  |  Google Developers


「videos.listというAPI」で、partに「liveStreamingDetails」を指定すると、
ライブ動画・プレミア動画については、下記のように
配信動画の予約開始時間や実開始時間・実終了時間に関する情報を得ることができます。

JSON

1# 「videos.list」APIで、part="liveStreamingDetails"を指定したときに得られるレスポンス 2{ 3 "items": [ 4 { 5 "id": "動画ID", 6 "liveStreamingDetails": { 7 "actualStartTime": "2020-01-01T12:03:10Z",# 配信開始時刻 8 "actualEndTime": "2020-01-1T16:40:30Z",   # 配信終了時刻 9 "scheduledStartTime": "2020-01-01T12:00:00Z"   # 配信者が設定した配信予約時刻 10 } 11 } 12 ] 13}

ライブ配信には、当然、配信者が設定した配信予約時刻や実際の配信開始時刻/終了時刻というものが存在します。
一方、通常の投稿動画には「配信開始時刻」の概念が存在しませんので
これらの情報が存在しません。

ただし、プレミア配信動画も同じように配信予約時刻・配信開始・終了時刻が設定されています。
プレミアは御存知のように、2分前くらいから大音量の予告時間が流れて本編が再生されますよね。
つまりプレミア動画は配信者が配信予約を行っているため、ライブ配信と同様に配信予約時刻・配信開始・終了時刻のデータが記録されているわけです。

以上が、「ライブ動画とプレミア動画を区別できない理由」です。

YouTube APIにプレミア動画を判定するオプションがあればよいですが、
残念ながらそのようなオプションは現時点では存在しないようです。
参考:stackoverflowという海外の質問サイト
=>これは「動画がプレミアかどうかどうやって判定すればいいですか?」という質問なのですが、結局「色々試したがアーカイブされている状態からプレミアかどうか判定するのは無理」というコメントがなされています。

したがって、残念ながら質問者様の希望する動作は完全には実現できないと思われます。
下記に参考として、「ライブ動画・プレミア動画」と「通常の投稿動画」を判定するプログラムを記します。


(参考)「ライブ動画・プレミア動画」と「通常の投稿動画」を判定するプログラムの例

python

1import json 2from apiclient.discovery import build 3 4 5# liveStreamingDetailsを返す関数。 6#  liveStreamingDetailsが存在すれば、それを返す 7#  liveStreamingDetailsが存在しなければ、noneを返す 8def getLiveStreamingDetails(youtube, videoId): 9 10 # 個別の動画の情報を得るためのAPI 11 response = youtube.videos().list( 12 part="liveStreamingDetails", # 配信時刻に関する情報を指定 13 id=videoId, # 調べる対象の動画ID 14 ).execute() 15 liveStreamingDetails = response["items"][0].get("liveStreamingDetails") 16 return liveStreamingDetails 17 18 19def main(): 20 API_KEY = 'APIキー' 21 YOUTUBE_API_SERVICE_NAME = 'youtube' 22 YOUTUBE_API_VERSION = 'v3' 23 CHANNEL_ID = 'UCK9V2B22uJYu3N7eR_BT9QA' 24 25 youtube = build( 26 YOUTUBE_API_SERVICE_NAME, 27 YOUTUBE_API_VERSION, 28 developerKey=API_KEY 29 ) 30 31 response = youtube.search().list( 32 part = "snippet", 33 channelId = CHANNEL_ID, 34 eventType = "none", 35 maxResults = 50, 36 type = "video", 37 # order = "date" # 条件にdateを指定すると上位50件の中に通常投稿動画が現れないため、ここではあえて外しています。 38 ).execute() 39 40 for item in response.get('items', []): 41 if item["id"]["kind"] != "youtube#video": 42 continue 43 videoId = item["id"]["videoId"] 44 title = item["snippet"]["title"] 45 liveStreamingDetails = getLiveStreamingDetails(youtube, videoId) 46 47 if liveStreamingDetails: 48 # liveStreamingDetailsが存在する->ライブまたはプレミア配信 49 print(f"○(ライブorプレミア)動画ID:{videoId} タイトル:{title}") 50 else: 51 # liveStreamingDetailsが存在しない->通常投稿動画 52 print(f"×( 通 常 投 稿 )動画ID:{videoId} タイトル:{title}") 53 54if __name__ == "__main__": 55 main()

注)ライブ状態の配信に限り、ライブ配信とプレミア配信を判定する方法は存在します。
Youtube Data API からプレミア公開・予約されたライブ配信を判別する方法について

ただし、配信終了後にはどちらもliveBroadcastContentが'processed'になってしまうので、アーカイブ済みの動画はライブ/プレミアを区別できません。

投稿2021/11/05 15:28

編集2021/11/05 15:56
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

na34

2021/11/05 23:35

丁寧な回答ありがとうございました。 頂いたコードでこちらでも動作再現することができました。 「liveStreamingDetails」パラメータはとても便利ですね。 ライブ動画とプレミア動画を区別できない件は現状実装されていないとのことで理解しました。 その点に関してはこちらで工夫して実現したいことに繋げようと思います。 本質問に回答いただき感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問