使用java youtube API恢复上传

时间:2013-08-26 21:49:51

标签: java youtube-api youtube-data-api resume-upload

我正在尝试使用Java API将视频上传到YouTube:

    private Video uploadVideo(final YouTube youtube, final Video video, final InputStreamContent mediaContent)
            throws IOException {
        YouTube.Videos.Insert videoInsert = youtube.videos().insert("snippet,statistics,status", video, mediaContent);

        MediaHttpUploader uploader = videoInsert.getMediaHttpUploader();
        uploader.setDirectUploadEnabled(false);
        uploader.setProgressListener(progressListener);
        return videoInsert.execute();
    }
}

我有一个缓慢且不稳定的互联网连接,如果我可以获得可恢复的上传工作,那将非常有用。文档herehere似乎向我建议" setDirectUploadEnabled(false)"应该完全做到这一点。嗯......显然它没有。

如果我的互联网连接中断,则抛出IOException并且没有自动上传恢复。

如何恢复上传?

1 个答案:

答案 0 :(得分:2)

文档似乎落后于实际实施。幸运的是,它是开源的,您只需阅读源代码即可找到解决方案。 这是关于版本1.16-rc

如果在上传过程中发生IOException,则com.google.api.client.googleapis.media.MediaUploadErrorHandler用于处理异常。此处理程序还负责恢复上载,但只有在HTTP-Request中注册的另一个异常处理程序成功处理IOException时才会这样做。由于当前版本中的注释表明:

,此前提条件可能会在将来发生变化
// TODO(peleyal): figure out what is best practice - call serverErrorCallback only if I/O
// exception was handled, or call it regardless

由于默认的io异常处理程序为null,因此必须明确设置。这可以在构建YouTube - Object:

时完成

示例源代码here初始化YouTube对象,如下所示:

youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(
          "youtube-cmdline-uploadvideo-sample").build();

要使此示例生效,请将该行修改为:

youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() {          
  @Override
  public void initialize(HttpRequest request) throws IOException {
    credential.initialize(request);
    request.setIOExceptionHandler(new HttpBackOffIOExceptionHandler(new ExponentialBackOff()));
  }
});

每次构造HTTPRequestInitializer时都会调用HTTPRequest并设置IOExceptionHandler。从那里MediaUploadErrorHandler将首先将异常传递给HttpBackOffIOExceptionHandler,它可能会在允许重试之前休眠一段时间。之后,MediaUploadErrorHandler将尝试继续上传。

请注意,credential也是HttpRequestInitializer,您需要执行两个初始值设定项。因此,在我的示例中,credential在我添加的初始化程序中被调用。