【问题标题】:Resume upload using java youtube API使用 java youtube API 恢复上传
【发布时间】:2013-08-29 12:03:59
【问题描述】:

我正在尝试使用 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 并且不会自动恢复上传。

如何恢复上传?

【问题讨论】:

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


    【解决方案1】:

    文档似乎落后于实际实施。幸运的是,它是开源的,您只需阅读源代码即可找到解决方案。 这是关于版本 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 时完成:

    示例源代码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()));
      }
    });
    

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

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

    【讨论】:

    • 谢谢 - 这已经比我目前所能找到的要好得多了!但是,它不是完整的“可恢复”上传。应用重启后 API 仍然无法恢复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2013-05-10
    • 1970-01-01
    • 2013-10-05
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多