通过 YouTube API 更改直播类别的问题

问题描述 投票:0回答:1

我正在使用 YouTube API 设置直播的类别。这是我到目前为止所拥有的。当代码运行时似乎什么也没有发生。

    def Setcategory(id, title):

       //Rest of the function

        request = youtube.videos().update(
            body={
                "id": id,          
                "snippet": {
                    "title": title,
                    "categoryId": "17"
                },
            }
        )
        response = request.execute()
        return response

我已经确保传递了正确的 ID。这似乎不是问题。

我真的很感激对此的一些建议。 谢谢你。

python youtube-api youtube-data-api youtube-livestreaming-api
1个回答
0
投票

我想通了。事实证明,您需要先安排流,然后再修改类别。例如,使用 oAuth,我为我的教堂服务安排了两个流,暂时将第二个计划流更改为不同的流密钥(我有另一个脚本可以在第一个服务结束后将其更改回来):

from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
import os

#authentication filepaths and files
ls_token = '/path/to/token.json'
ls_credentials = '/path/to/credentials.json'

#video ids filepaths and files
video_id_text = "/path/to/video_id.txt"

#AM service metadata
ls_title_AM = "Title"
ls_description_AM = "Description\nDescription on a new line."
ls_date_AM = "2024-04-11T10:30:00-03:00" #YYYY-MM-DDThh:mm:ss-TZ:00
ls_privacy_AM = "private"
thumbnail_AM = "/path/to/AMServiceThumbnail.png"
ls_category_AM = "29" # Category ID for Nonprofits & Activism

#PM service metadata
ls_title_PM = "Title"
ls_description_PM = "Description\nDescription on a new line."
ls_date_PM = "2024-04-11T14:00:00-03:00" #YYYY-MM-DDThh:mm:ss-TZ:00
ls_privacy_PM = "private"
thumbnail_PM = "/path/to/PMServiceThumbnail.png"
ls_category_PM = "29" # Category ID for Nonprofits & Activism

#temporary stream key to change the PM service to in order to not conflict with the AM service
desired_stream_key = "MY_STREAM_KEY"

# Function to authenticate and build the YouTube API client
def get_authenticated_service():
    creds = None
    if os.path.exists(ls_token):
        creds = Credentials.from_authorized_user_file(ls_token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                ls_credentials, SCOPES)
            creds = flow.run_local_server(port=0)
        with open(ls_token, 'w') as token:
            token.write(creds.to_json())
    return build('youtube', 'v3', credentials=creds)

# Function to schedule a live video on YouTube
def schedule_live_video(youtube, title, description, start_time, privacy_status):
    request_body = {
        "snippet": {
            "title": title,
            "description": description,
            "scheduledStartTime": start_time,
        },
        "status": {
            "privacyStatus": privacy_status
        },
        "contentDetails": {
            "enableAutoStart": True,
            "enableAutoStop": True,
            "enableLowLatency": True,
            "enableDvr": True,
            "madeForKids": "false",
            "selfDeclaredMadeForKids": "false"
        }
    }
    live_broadcast = youtube.liveBroadcasts().insert(
        part="snippet,status,contentDetails",
        body=request_body
    ).execute()

    return live_broadcast['id']

from googleapiclient.http import MediaFileUpload

def upload_thumbnail(youtube, video_id, thumbnail_filename):
    # Create a MediaFileUpload object for the thumbnail
    media = MediaFileUpload(thumbnail_filename, chunksize=-1, resumable=True)

    # Call the YouTube API to set the thumbnail for the video
    request = youtube.thumbnails().set(
        videoId=video_id,
        media_body=media
    )
    response = request.execute()
    return response

def get_live_stream_id_by_key(youtube, stream_key):
    request = youtube.liveStreams().list(
        part="id,cdn",
        mine=True,
        fields="items(id,cdn/ingestionInfo/streamName)",
        maxResults=50
    )
    response = request.execute()
    for item in response.get('items', []):
        stream_id = item.get('id')
        cdn_info = item.get('cdn', {})
        ingestion_info = cdn_info.get('ingestionInfo', {})
        if ingestion_info.get('streamName') == stream_key:
            return stream_id
    return None

# Function to modify the category of a live video
def modify_video_category(youtube, video_id, category_id):
    video = youtube.videos().list(
        part="snippet",
        id=video_id
    ).execute()
    snippet = video['items'][0]['snippet']
    snippet['categoryId'] = category_id

    request_body = {
        "id": video_id,
        "snippet": snippet
    }
    youtube.videos().update(
        part="snippet",
        body=request_body
    ).execute()

def main():
    youtube = get_authenticated_service()

    # Schedule the first live video
    video_id1 = schedule_live_video(youtube, ls_title_AM, ls_description_AM,
                                     ls_date_AM, ls_privacy_AM)
    print("First live video scheduled with ID:", video_id1)

    # Upload AMServiceThumbnail.png for the first live video
    thumbnail_filename1 = thumbnail_AM
    thumbnail_response1 = upload_thumbnail(youtube, video_id1, thumbnail_filename1)
    thumbnail_url1 = thumbnail_response1["items"][0]["default"]["url"]

    # Modify the category of the first live video
    modify_video_category(youtube, video_id1, ls_category_AM)
    print("Modified video category of AM service.")

    # Retrieve the ID of the live stream associated with the desired stream key
    desired_stream_id = get_live_stream_id_by_key(youtube, desired_stream_key)

    if desired_stream_id:
        print("Using temporary live stream key for PM service.")
    else:
        print("Temporary live stream key not found.")
        return

    # Schedule the second live video and associate it with the existing live stream
    video_id2 = schedule_live_video(youtube, ls_title_PM, ls_description_PM,
                                     ls_date_PM, ls_privacy_PM)
    print("Second live video scheduled with ID:", video_id2)

    # Associate the second live video with the existing live stream
    youtube.liveBroadcasts().bind(
        part="id,contentDetails",
        id=video_id2,
        streamId=desired_stream_id
    ).execute()

    # Upload PMServiceThumbnail.png for the second live video
    thumbnail_filename2 = thumbnail_PM
    thumbnail_response2 = upload_thumbnail(youtube, video_id2, thumbnail_filename2)
    thumbnail_url2 = thumbnail_response2["items"][0]["default"]["url"]

    # Modify the category of the second live video
    modify_video_category(youtube, video_id2, ls_category_PM)
    print("Modified video category of PM service.")

    # Write the video ids to a file to be used in modifystreamkey.py script
    with open(video_id_text, "w") as f:
        f.write(f"video_id2 = {video_id2}\n")

if __name__ == "__main__":
    main()
© www.soinside.com 2019 - 2024. All rights reserved.