2016-10-26 6 views
0

Я пытаюсь сохранить видео через API YouTube. В основном это уже работает отлично, только за одним исключением: Если я пытаюсь установить status.setPublishAt() яJava - API для YouTube - setPublishAt на видео приводит к «400 Bad Request - invalidVideoMetadata»

400 Bad Request 
{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "youtube.video", 
    "location" : "body", 
    "locationType" : "other", 
    "message" : "The request metadata is invalid.", 
    "reason" : "invalidVideoMetadata" 
} ], 
"message" : "The request metadata is invalid." 
} 

код выглядит следующим образом:

YouTube.Videos.List listVideosRequest = M_YOUTUBE.videos().list("snippet,status").setId(_dbVideo.getYoutubeId()); 

VideoListResponse listResponse = listVideosRequest.execute(); 

List<Video> videoList = listResponse.getItems(); 
if (videoList.isEmpty()) { 
    return false; 
} 

Video video = videoList.get(0); 
VideoStatus status = video.getStatus(); 

status.setPrivacyStatus(_dbVideo.getPrivacyStatus()); // "private" 

String sPublishedAt = _dbVideo.getPublishedAt(); 
// sPublishAt is in ISO 8106: "2016-10-28T10:01:00.000+02:00" 
if (sPublishedAt != null && sPublishedAt != "") { 
    // this line leads to the bad request. 
    status.setPublishAt(new DateTime(sPublishedAt)); 
} else { 
    status.setPublishAt(null); 
} 

VideoSnippet snippet = video.getSnippet(); 

String sTitle = _dbVideo.getTitle(); 
String sDescription = _dbVideo.getDescription(); 
String sTags = _dbVideo.getTags(); 

... 

snippet.setTitle(sTitle); 
snippet.setDescription(sDescription); 
snippet.setTags(tagList); 
snippet.setCategoryId(_dbVideo.getCategoryId()); 

YouTube.Videos.Update updateVideosRequest = M_YOUTUBE.videos().update("snippet,status", video);   
updateVideosRequest.execute(); 

Для процесса загрузкой данных я использую в основном тот же код, и он работает там. Если я решил не устанавливать свойство publishAt с датой и вместо этого устанавливать его в null, он также работает нормально. Я что-то упускаю?

Обновление: Происхождение происходит только в том случае, если видео было установлено на public. Если я решим установить его обратно на private и установить новый publishAt, я получу BadRequest.

ответ

1

Вы должны отправить все значения статуса, иначе метод обновления будет считать, что вы пытаетесь их очистить. Вы отправляете setPrivacyStatus и публикуете. Но вы должны отправить все остальные параметры в свой запрос. Кроме того, если вы отправляете время публикации слишком близко к текущему времени, оно будет показывать badRequest (400) invalidPublishAt. попробуйте поставить 60 минут. Меня устраивает.

+0

Спасибо за ваш ответ. Пробовал, но безуспешно. В любом случае, это не объяснит, почему на самом деле работает с просто установкой privacystatus и publishAt на null. – PAWL

+0

@PAWL, если api не показывает privacystatus и опубликованоAt, это означает, что оно равно null. и когда вы отправляете свой запрос на сервер, не меняя его. он работает правильно. – Kumar

+0

@PAWL снова отправляет 400 badRequest – Kumar