- リンクを取得
- ×
- メール
- 他のアプリ
YouTubeからロックの通知
自動投稿を繰り返していたある日YouTubeコミュニティから投稿した動画をロックしたとの連絡が。
同じ動画をYouTube Stadio経由から投稿した場合は問題ない為、どうやら自動投稿の上限に引っかかった様子。
上限の解除はアプリケーションの承認されれば対応できそうだが、Webを調べた限りは簡単には通らなさそう。
仕方がないのYouTubeのライブ配信を使って動画ファイルをRTMP経由でアップロードします。
この作業にはGCPとBloggerの連携の箇所の修正が必要です。
仕方がないのYouTubeのライブ配信を使って動画ファイルをRTMP経由でアップロードします。
この作業にはGCPとBloggerの連携の箇所の修正が必要です。
YouTube Data APIスコープの変更
test.py
YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
uploadだけだったものをライブストリーミング/ブロードキャストが可能な様にスコープを広げます。
token.pickleファイルを削除し、認証をし直してください。
またYouTube Stadioからライブストリーミングの開始を申請が必要です。
またYouTube Stadioからライブストリーミングの開始を申請が必要です。
Pythonプログラム
test.pyに以下のコードを記述します。
デフォルトのライブストリームのキーを取得し、ライブブロードキャストと紐づけます。
そして指定されたRTMPのURLにffmpegで動画ストリーミングを流しこみます。
デフォルトのライブストリームのキーを取得し、ライブブロードキャストと紐づけます。
そして指定されたRTMPのURLにffmpegで動画ストリーミングを流しこみます。
test.py
import datetime
from pytz import timezone
def getStreamKey(title,desc):
youtube = get_authenticated_service(YOUTUBE_API_SERVICE_NAME,YOUTUBE_API_VERSION)
request = youtube.liveStreams().list(
part="snippet,cdn,contentDetails,status",
mine = True
)
response = request.execute()
key = None
for item in response['items']:
if 'Default' in item['snippet']['title']:
key = item['cdn']['ingestionInfo']['streamName']
start = datetime.datetime.now(timezone('Asia/Tokyo'))
start = start + datetime.timedelta(seconds=5)
day = start.strftime('%Y年%m月%d日 ')
start_date = start.strftime('%Y-%m-%dT%H:%M:%S+09:00')
end = start + datetime.timedelta(hours=1)
end_date = end.strftime('%Y-%m-%dT%H:%M:%S+09:00')
request = youtube.liveBroadcasts().insert(
part="id,snippet,contentDetails,status",
body={
"contentDetails": {
"enableClosedCaptions": True,
"enableContentEncryption": True,
"enableDvr": True,
"enableEmbed": True,
"enableAutoStart": True,
"enableAutoStop": True,
"recordFromStart": True,
"startWithSlate": True
},
"snippet": {
"title": day + title,
"description" : desc,
"scheduledStartTime": start_date,
"scheduledEndTime": end_date
},
"status": {
"privacyStatus": "public"
}
}
)
response = request.execute()
broadcast_id = response['id']
request = youtube.liveBroadcasts().bind(
id = broadcast_id,
part="id,snippet,contentDetails,status",
streamId = item['id']
)
response = request.execute()
time.sleep(5)
return key
def streamVideo(title,desc):
key = getStreamKey(title,desc)
if key == None:
return
cmd = 'ffmpeg -y -i /tmp/input.mp4 -i /tmp/temp.mp3 '
cmd += ' -movflags +faststart -c:a aac -profile:a aac_low -ac 2 -ar 48000 -c:v libx264'
cmd += ' -vf yadif=0:-1:1 -profile:v high -bf 2 -g 30 -coder 1 -b:v 1M -b:a 384k'
cmd += ' -pix_fmt yuv420p -map 0:v:0 -map 1:a:0 -shortest '
cmd += ' -f flv rtmp://a.rtmp.youtube.com/live2/' + key
rtn = subprocess.run(cmd, shell=True, stdout=PIPE, stderr=PIPE, text=True)
上記で作成したstreamVideo()をgetRss()から呼び出してください。
test.py
def getRss():
with open('/tmp/temp.mp3' ,mode='wb+') as f:
f.truncate(0)
rssUrl = 'https://news.google.com/news/rss/headlines/section/topic/TECHNOLOGY'
rssLang = '?hl=en-US&gl=US&ceid=US:en'
feed = feedparser.parse(rssUrl + rssLang)
for entry in feed.entries:
link = entry.get('link')
getBody(link)
#makeVideo()
#youtube_upload('この動画のタイトル','この記事の説明',['この動画のタグ'])
streamVideo('この記事のタイトル','この記事の説明')
time.sleep(5)
これでライブ配信された動画がYoutube上に残っているはずです。
と言いたいところでしたが公開から6時間くらいすると非公開にされてしまうようです。
根本的にはGoogleへ認証してもらうしかないのかもしれません。
もしくはYoutubeStudioから再アップロードするしかないです。
根本的にはGoogleへ認証してもらうしかないのかもしれません。
もしくはYoutubeStudioから再アップロードするしかないです。
なお、音声のみ配信をしたい場合はPodCastでの音声配信を参考にしてください。