通过查看 Google Drive 嵌入播放器的请求,我自己找到了解决方案。
基本上你会请求这个地址:
https://docs.google.com/get_video_info?authuser=&docid=<YOUR_VIDEO_ID>
您可以在 OAuth 身份验证后使用 Drive 客户端执行此操作,或附加&access_token=YOUR_TOKEN
在 URL 的末尾。两种选择都有效。
响应包含 URL 编码的字段和值对,以及有关视频的信息。我们的 porpuse 的有趣字段是fmt_stream_map
,它包含各种格式和编解码器的可用流列表。这些 URL 可以发送到 Flash 或 HTML5 播放器,无需验证即可复制。
如果您想在任何特定时刻开始播放视频,只需&begin=MILLISECONDS
在流 URL 的末尾添加即可。
注意:您可以从字段中获取 URL 列表url_encoded_fmt_stream_map
。它有点难以解析,但包含其他有用的信息,如视频 mime 类型和编解码器。
示例代码:
Credential credential = getOAuth2Credential(); //Your authentication stuff
//Create a new authorized API client
Drive service = new Drive.Builder(new NetHttpTransport(), new JacksonFactory(), credential).build();
String fileId = "XXXXXXXXXXX"; //Your video docid in Google Drive
HttpResponse resp = service.getRequestFactory()
.buildGetRequest(new GenericUrl("https://docs.google.com/get_video_info?authuser=&docid=" + fileId)).execute();
//Convert response InputStream to String
String content = "";
InputStreamReader isr = new InputStreamReader(resp.getContent());
int ch = 0;
while (ch != -1) {
ch = isr.read();
if (ch != -1) content += (char)ch;
}
//Split response in pairs field / value
StringTokenizer st = new StringTokenizer(content, "&");
while (st.hasMoreTokens()) {
String token = st.nextToken();
if (token.split("=").length == 2) {
String field = token.split("=")[0];
String value = URLDecoder.decode(token.split("=")[1], "UTF-8");
if ("url_encoded_fmt_stream_map".equals(field)) {
//Prints info of each available video Stream
String[] urlList = value.split(",");
for (int i=0; i < urlList.length; i++) {
System.out.println("Stream #" + i + ":");
System.out.println("URL: " + URLDecoder.decode(urlList[i].split("&")[1].split("=")[1], "UTF-8"));
System.out.println("Quality: " + URLDecoder.decode(urlList[i].split("&")[3].split("=")[1], "UTF-8"));
String type = URLDecoder.decode(urlList[i].split("&")[2], "UTF-8");
if (type.indexOf(';') > 0) {
System.out.println("Mime type: " + type.substring(5, type.indexOf(';')));
System.out.println("Codecs: " + type.substring(type.indexOf("codecs=\"") + 8, type.lastIndexOf('"')));
}
else {
System.out.println("Mime type: " + type.substring(5));
}
}
}
}
}