举个例子比较好理解,比如我现在要下http://v.youku.com/v_show/id_XNDM2Mjc0MzAw.html这个视频。这里我们要获得的是视频的id,就是XNDM2Mjc0MzAw这部分,这是一个视频唯一的,所以在解析的时候肯定会用到。
为了能看清楚youku视频的播放过程,可以使用火狐的插件firebug对网页进行跟踪,如下图。
可以看到有很多GET,我们要找的应该是以这个id作为参数的GET,在下面我们可以找到这个链接
http://v.youku.com/player/getPlayList/VideoIDS/XNDM2Mjc0MzAw/timezone/+08/version/5/source/video?ran=3545&password=&n=3
这是youku获取播放列表的GET,打开它的响应,这是一个json,我们需要的内容是seed、streamfileids和segs。segs里面放的是视频的分段key,streamfileids是一串乱码,要用seed对他解码。下面我截取了下载器的一部分来说明解码的过程,解析json用的是json-lib-2.4-jdk15。
List<Video> videos = new ArrayList<Video>();
JSONObject data;
//json就是刚获得的响应,类型为String。
data = JSONObject.fromObject(json).getJSONArray("data").getJSONObject(0);
double seed = Double.valueOf(data.getString("seed"));
String style="margin: 3px auto 0px; padding: 0px 3px; outline: none; line-height: 25.2px; font-size: 14px; background: rgb(242, 246, 251); width: 640px; clear: both; border-top: 1px solid rgb(0, 153, 204); border-right: 1px solid rgb(0, 153, 204); border-left: 1px solid rgb(0, 153, 204); border-image: initial; border-bottom: none; font-family: tahoma, arial, "Microsoft YaHei";"> 复制代码代码如下:
private String getFileID(String fileid, double seed) {
String mixed = getFileIDMixString(seed);
String[] ids = fileid.split("\\*");
StringBuilder realId = new StringBuilder();
int idx;
for (int i = 0; i < ids.length; i++) {
idx = Integer.parseInt(ids[i]);
realId.append(mixed.charAt(idx));
}
return realId.toString();
}
private String getFileIDMixString(double seed) {
StringBuilder mixed = new StringBuilder();
StringBuilder source = new StringBuilder(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890");
int index, len = source.length();
for (int i = 0; i < len; ++i) {
seed = (seed * 211 + 30031) % 65536;
index = (int) Math.floor(seed / 65536 * source.length());
mixed.append(source.charAt(index));
source.deleteCharAt(index);
}
return mixed.toString();
}
代码最后将得到一个Video类型的List,Video中的order是视频的编号,seconds是时间长度,size是字节长度,youUrl就是真正的视频地址,还有视频的标题title。还有一些其他的内容都可以从json中获得。