Reputation: 95
I am trying to upload an mp4 file to my youtube channel using the YouTube Data API, however, I keep getting a 401 Unauthorized back.
Using the google console cloud I created an (unrestricted) API key. Afterwards, I enabled YouTube Data API v3 I then copied the java code snippet from the use cases documentation for making a Video.Insert call to their services.
The things I changed from the snippet (required):
I used the aforementioned API key to replace "YOUR_API_KEY"
And also replaced new File("YOUR_FILE")
for obvious reasons. The file is a 17MB mp4 file.
Because the package provided with the snippet no longer comes with com.google.api.client.json.jackson2.JacksonFactory;
Following this solution I included the dependency:
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson</artifactId>
<version>1.29.2</version>
</dependency>
And I replaced JacksonFactory.getDefaultInstance()
with new JacksonFactory()
Finally, as youtubeService.videos().insert(args)
doesn't support a string as its first argument I replaced the string with a List.of()
of the CSV string. I've also tried a List with each of the comma-seperated strings as items in the list but that doesn't seem to change the outcome either.
This results in the following request: https://youtube.googleapis.com/upload/youtube/v3/videos?key=MyKeyAware&part=snippet&part=status&uploadType=resumable
For good measure, here are the relevant dependencies I'm using (excluding the aforementioned dependency):
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.35.1</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-youtube</artifactId>
<version>v3-rev20220612-1.32.1</version>
</dependency>
I would really appreciate some help as I've been struggling with this issue for a while now!
Code:
package nl.phi.ysg.service.YoutubeApi;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.InputStreamContent;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.model.Video;
import com.google.api.services.youtube.model.VideoSnippet;
import com.google.api.services.youtube.model.VideoStatus;
import org.springframework.core.io.ClassPathResource;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.List;
public class YoutubeApiServiceImpl implements YoutubeApiService {
private static final String DEVELOPER_KEY = "...";
private static final String APPLICATION_NAME = "YSG";
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
/**
* Build and return an authorized API client service.
*
* @return an authorized API client service
* @throws GeneralSecurityException, IOException
*/
public static YouTube getService() throws GeneralSecurityException, IOException {
final NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
return new YouTube.Builder(httpTransport, JSON_FACTORY, null).setApplicationName(APPLICATION_NAME).build();
}
public static void main(String[] args) throws GeneralSecurityException, IOException, GoogleJsonResponseException {
YouTube youtubeService = getService();
// Define the Video object, which will be uploaded as the request body.
Video video = new Video();
// Add the snippet object property to the Video object.
VideoSnippet snippet = new VideoSnippet();
snippet.setCategoryId("22");
snippet.setDescription("Description of uploaded video.");
snippet.setTitle("Test video upload.");
video.setSnippet(snippet);
// Add the status object property to the Video object.
VideoStatus status = new VideoStatus();
status.setPrivacyStatus("private");
video.setStatus(status);
File mediaFile = new ClassPathResource("test/test.mp4").getFile();
InputStreamContent mediaContent = new InputStreamContent("application/octet-stream", new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());
// Define and execute the API request
YouTube.Videos.Insert request = youtubeService.videos().insert(List.of("snippet,status"), video, mediaContent);
Video response = request.setKey(DEVELOPER_KEY).execute();
System.out.println(response);
}
}
Upvotes: 1
Views: 410
Reputation: 40326
It's unclear from your question but the error indicates that you're not including User authentication (OAuth) and this is required by the YouTube API:
See the Quickstart specifically creating OAuth client ID in step 2b.
The API key is used to authenticate your app.
The OAuth2 client ID is used to authenticate human users.
Upvotes: 1