1

我正在尝试使用 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();
    }
}

我的互联网连接缓慢且不稳定,如果我可以恢复上传工作,那将非常有帮助。此处此处的文档似乎向我建议,“setDirectUploadEnabled(false)”应该完全可以解决问题。嗯......显然它没有。

如果我的 Internet 连接中断,则会引发 IOException 并且不会自动恢复上传。

如何恢复上传?

4

1 回答 1

2

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

如果在上传过程中发生 IOException,com.google.api.client.googleapis.media.MediaUploadErrorHandler则用于处理异常。此处理程序还负责恢复上传,但只有在 HTTP 请求中注册的另一个异常处理程序成功处理 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 时完成:

这里的示例源代码像这样初始化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每次构造 a 并设置 IOExceptionHandler 时都会调用HTTPRequest。从那里开始,MediaUploadErrorHandler将首先将异常传递给HttpBackOffIOExceptionHandler可能会休眠一段时间,然后再允许重试。之后,MediaUploadErrorHandler将尝试继续上传。

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

于 2013-08-27T14:07:50.953 回答