我正在尝试使用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();
}
}
我有一个缓慢且不稳定的互联网连接,如果我可以获得可恢复的上传工作,那将非常有用。文档here和here似乎向我建议" setDirectUploadEnabled(false)"应该完全做到这一点。嗯......显然它没有。
如果我的互联网连接中断,则抛出IOException并且没有自动上传恢复。
如何恢复上传?
答案 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
在我添加的初始化程序中被调用。