我正在使用 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。这似乎不是问题。
我真的很感激对此的一些建议。 谢谢你。
我想通了。事实证明,您需要先安排流,然后再修改类别。例如,使用 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()