複製代碼代碼如下:
導入java.io..bufferedreader;
導入java.io.io.inputStreamReader;
導入java.net.url;
導入java.util.regex.matcher;
導入java.util.regex.pattern;
導入net.sf.json.jsonarray;
導入net.sf.json.jsonexception;
導入net.sf.json.jsonobject;
公共類錄像帶
{
公共靜態void main(string [] args)引發異常
{
Videotools Manager = New Videotools();
字符串jsonurl = manager.getVideourl(“ http://v.youku.com/v_show/id_xmtgznda5otmy.html”);
system.out.println(jsonurl.split(“#”)。長度);
}
公共字符串getVideourl(字符串htmlurl)拋出jsonexception {
//正則表達式解析地址,ID
模式p = pattern.compile(“。*id _(// w+)//。html”);
字符串u = htmlurl;
Matcher M = P.Matcher(U);
字符串ID =“”;
如果(m.find()){
id = m.group(1);
}
system.out.println(id);
//字符串id =“ xmtgznda5otmy”;
字符串s = getContent(“ http://v.youku.com/player/getplaylist/videoids/”+id);
jsonObject jsobj = new jsonObject();
jsobj = jsobj.fromobject(s);
JSONARRAY JSONARR = JSOBJ.GEGJSONARRAY(“ data”);
system.out.println(jsobj);
jsonObject obj1 = jsonarr.getJsonObject(0);
字符串標題= obj1.getString(“ title”);
double seed = obj1.getDouble(“ seed”);
jsonObject obj2 = obj1.getJsonObject(“ streamfileids”);
字符串mp4id = null;
字符串flvid = null;
字符串格式= null;
嘗試
{
mp4id = obj2.getString(“ mp4”);
格式=“ mp4”;
} catch(jsonexception e)
{
system.out.println(“沒有mp4格式”);
嘗試
{
flvid = obj2.getString(“ flv”);
格式=“ flv”;
}捕獲(jsonexception e1)
{
system.out.println(“沒有flv格式”);
返回 ””;
}
}
字符串realfileid = null;
if(format.equals(“ mp4”))
{
realfileid = getfileid(mp4id,seed);
} 別的
{
realfileid = getfileid(flvid,seed);
}
字符串idleft = realfileid.substring(0,8);
字符串idright = realfileid.substring(10);
字符串sid = gensid();
jsonObject obj3 = obj1.getJsonObject(“ segs”);
jsonarray mp4arr = obj3.getjsonarray(格式);
字符串vivenourl =“”;
for(int i = 0; i <mp4arr.size(); i ++)
{
jsonObject o = mp4arr.getJsonObject(i);
字符串k = o.getString(“ k”);
字符串url =“ http://f.youku.com/player/getflvpath/sid/” + sid +“ _” + string.format(“%1 $ 02X”,i) +“/st/st/sT /” +格式
+“/fileid/” + idleft + string.format(“%1 $ 02X”,i) + idright +“?k =” + k;
System.out.println(url);
viverourl+= url+“#”;
}
返回視頻;
}
私有靜態字符串getFileId(字符串fileid,double seed)
{
字符串混合= getFileIdMixString(seed);
字符串[] 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));
}
返回realid.tostring();
}
公共靜態字符串Gensid()
{
int i1 =(int)(1000 + Math.floor(Math.random() * 999));
int i2 =(int)(1000 + Math.floor(Math.random() * 9000));
返回system.currentTimeMillis() +“” + i1 +“” + i2;
}
私有靜態字符串GetFileIdMixString(雙種子)
{
StringBuilder混合= new StringBuilder();
StringBuilder source = new StringBuilder(“ abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz ////////:__-- 1234567890”);
int index,len = source.length();
for(int i = 0; i <len; ++ i)
{
種子=(種子 * 211 + 30031)%65536;
index =(int)Math.floor(seed / 65536 * source.length());
混合。Append(source.Charat(index));
source.deletecharat(index);
}
返回混合。toString();
}
公共靜態字符串getContent(string strurl){
嘗試 {
URL URL =新URL(strurl);
BufferedReader br = new BufferedReader(new InputStreamReader(
url.openstream());
字符串s =“”;
StringBuffer SB = new StringBuffer(“”);
while((s = br.readline())!= null){
SB.Append(S);
}
br.close();
返回sb.tostring();
} catch(異常E){
返回“錯誤打開URL:” + strurl;
}
}
}