結論から申し上げますと
・「ライブ配信およびプレミア配信」と「通常の投稿動画」を区別することは可能です。
しかし
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'になってしまうので、アーカイブ済みの動画はライブ/プレミアを区別できません。