问题描述
使用下面的链接,可以轻松更新title
:
https://developers.google.com/youtube/v3/live/docs/liveStreams/update?apix=true
。
我希望在Google Apps脚本中使用YouTube API来实现相同的功能。下面的代码可以成功运行,但是与其更新而不创建新的流。
不同之处在于上面的链接不需要scheduledStartTime
。但是API需要它。并且当给定scheduledStartTime
时,它将创建一个新的广播而不是更新原始广播。如果为scheduledStartTime
分配了1970-01-01T00:00:00Z
,就好像没有考虑scheduledStartTime
一样。
要分配的值,以便它更新默认广播流而不是更新默认广播流。 还是还有其他我想完成的更新过程?
这是我的代码:
Logger.log('Starting');
service = getService();
if (service.hasAccess()) {
//Fetch the Livebroadcast Title and Description Details
var url = "https://www.googleapis.com/youtube/v3/livebroadcasts?broadcastStatus=upcoming&broadcastType=all";
var parameters = {'headers' : {'Content-Type': 'application/json','Authorization': 'Bearer ' + service.getAccesstoken()}};
var response = UrlFetchApp.fetch(url,parameters);
var result = JSON.parse(response.getContentText());
//Logger.log(result);
var resource = result.items[0];
//Edit the Livebroadcast Title and Description Details scheduledStartTime
var title = "as per today";
var description = "new desc check";
var scheduledStartTime ='1970-01-01T00:00:00Z';
var privacyStatus = 'public';
//var privacyStatus = 'unlisted';
//var scheduledStartTime = '2020-10-26T04:08:00Z';
data = {
'id' : 'MDaEvnSioI','status' : { 'privacyStatus' : 'public','selfDeclaredMadeForKids' : false},'snippet' : { 'title' : title,'description' : description,'scheduledStartTime' : scheduledStartTime }
};
//Update the Livebroadcast
Logger.log("--");
var jsondata = JSON.stringify(data);
Logger.log(jsondata);
var options = {
'headers': {
'Authorization': 'Bearer ' + service.getAccesstoken()
},'contentType': 'application/json','method' : 'post','payload': jsondata,'muteHttpExceptions':true
};
var response = UrlFetchApp.fetch(url2,options);
Logger.log(response.getContentText());
Logger.log('service has access...!!');
解决方法
如果您只更新广播的title
和description
属性,那么根据官方文档,您可以简单地使用Videos.update
API端点:
snippet.title
(字符串)
广播的标题。请注意,广播仅代表一部YouTube视频。您可以通过修改广播资源或设置相应视频资源的title
字段来设置此字段。
snippet.description
(字符串)
广播的描述。与title
一样,您可以通过修改广播资源或通过设置相应视频资源的description
字段来设置此字段。
要实现此目的,请按以下步骤修改代码:
// First step: obtain the video's 'categoryId'
var url = "https://www.googleapis.com/youtube/v3/videos?part=id,snippet&fields=items/snippet/categoryId&id=MDaEvnSioI";
var options = {
'headers': {
'Authorization': 'Bearer ' + service.getAccessToken()
}
};
var response = UrlFetchApp.fetch(url,options);
var result = JSON.parse(response.getContentText());
var categoryId = result.items[0].snippet.categoryId;
// Second step: update the video's 'title' and 'description',// using its 'categoryId' obtained above
var url2 = "https://www.googleapis.com/youtube/v3/videos?part=id,snippet";
var data2 = {
'id': 'MDaEvnSioI','snippet': {
'title': title,'description': description,'categoryId': categoryId
}
};
var options2 = {
'headers': {
'Authorization': 'Bearer ' + service.getAccessToken()
},'contentType': 'application/json','payload': JSON.stringify(data2),'method': 'put'
};
var response2 = UrlFetchApp.fetch(url2,options2);
请注意,更新视频的title
和description
是分两步的过程,因为根据官方文档,在视频{{1 }}对象,one need to pass也是端点的视频的categoryId
属性。
因此,首先使用Videos.list
API端点查询视频的当前Videos.update
属性,然后再调用snippet
。
还要注意,上面的代码已大大简化,因为它不处理这些API调用可能返回的错误。
关于您的问题(引用)的问题:
[...]并且在给出了scheduleStartTime时,它将创建一个新的广播,而不是更新原始广播。
请确认在URL上调用API:
categoryId
就像处理代码一样,实际上是在调用LiveBroadcasts.insert
API端点,而不是实际上所期望的LiveBroadcasts.update
。
之所以如此,是因为这两个API端点都具有相同的URL。区分两者的是HTTP方法,它们分别调用:前者为Videos.update
,后者为https://www.googleapis.com/youtube/v3/liveBroadcasts
。
由于您对UrlFetchApp.fetch
的第二次呼叫确实将POST
明确指定为PUT
,因此您实际上是在呼叫method
端点,而不是POST