Issue
The YouTube API v3 is horribly documented. I've already reported numerous bugs multiple times but no one reacts. I still have to use this API to upload thumbnails. The guide states:
POST rel="nofollow noreferrer">https://www.googleapis.com/youtube/v3/thumbnails/set
Auth scopes:
- https://www.googleapis.com/auth/youtubepartner
- https://www.googleapis.com/auth/youtube.upload
- https://www.googleapis.com/auth/youtube
Parameters:
- videoId: string The videoId parameter specifies a YouTube video ID for which the custom video thumbnail is being provided.
First of all - the url is wrong. It has to be https://www.googleapis.com/upload/youtube/v3/thumbnails/set
.
Now following code, it uses Unirest
:
final HttpResponse<String> response = Unirest.post("https://www.googleapis.com/upload/youtube/v3/thumbnails/set")
.header("Content-Type", "application/octet-stream")
.header("Authorization", accountService.getAuthentication(account).getHeader())
.field("videoId", videoid)
.field("thumbnail", thumbnail)
.asString();
The received response:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Required parameter: videoId",
"locationType": "parameter",
"location": "videoId"
}
],
"code": 400,
"message": "Required parameter: videoId"
}
}
How can this be? The videoId is set! Anyone already played with this part of the API?
I can change the request to
Unirest.post("https://www.googleapis.com/upload/youtube/v3/thumbnails/set?videoId=" + videoid)
.header("Content-Type", "application/octet-stream")
.header("Authorization", accountService.getAuthentication(account).getHeader())
.field("mediaUpload", thumbnail)
.asString();
This will throw me this error:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "Backend Error"
}
],
"code": 503,
"message": "Backend Error"
}
}
Edit: Same request with URL posted by Ibrahim Ulukaya (the original url from the reference guide):
{
"error": {
"errors": [
{
"domain": "global",
"reason": "wrongUrlForUpload",
"message": "Uploads must be sent to the upload URL. Re-send this request to https://www.googleapis.com/upload/youtube/v3/thumbnails/set"
}
],
"code": 400,
"message": "Uploads must be sent to the upload URL. Re-send this request to https://www.googleapis.com/upload/youtube/v3/thumbnails/set"
}
}
Solution
We dug the issue, here are the steps you have to follow if you don't want to use the library.
1) POST https://www.googleapis.com/upload/youtube/v3/thumbnails/set?videoId=VIDEO_ID&uploadType=resumable with an empty body
2) get back the URL in the Location: header of the response, and POST to that URL with Content-Type: image/png and the thumbnail in the body
Answered By - Ibrahim Ulukaya
Answer Checked By - Dawn Plyler (JavaFixing Volunteer)