通过YouTube API更新默认广播的流标题

问题描述

使用下面的链接,可以轻松更新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...!!');

解决方法

如果您只更新广播的titledescription属性,那么根据官方文档,您可以简单地使用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);

请注意,更新视频的titledescription是分两步的过程,因为根据官方文档,在视频{{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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...