Youtube의 게시 제한

YouTube에서 잠금 알림



자동 게시를 반복하던 어느 날 YouTube 커뮤니티에서 게시한 동영상을 잠갔다는 연락이 있습니다.

같은 동영상을 YouTube Stadio 경유로부터 투고했을 경우는 문제 없기 때문에, 아무래도 자동 투고의 상한에 걸렸던 모습. 상한의 해제는 어플리케이션의 승인되면 대응할 수 있을 것 같지만, Web를 조사한 한은 간단하게는 통과하지 않을 것 같다. 어쩔 수 없는 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만이었던 것을 라이브 스트리밍/브로드캐스트가 가능한 대로 스코프를 넓힙니다.python:test.py
YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
token.pickle 파일을 삭제하고 인증을 다시 시도합니다.
또한 YouTube Stadio에서 실시간 스트리밍 시작을 신청해야합니다.

파이썬 프로그램



test.py에 다음 코드를 작성합니다.
기본 라이브 스트림의 키를 가져와 라이브 브로드캐스트와 연결합니다.
그리고 지정된 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에서 다시 업로드할 수밖에 없습니다.

좋은 웹페이지 즐겨찾기