java獲取優(yōu)酷視頻地址示例
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
public class VideoTools
{
public static void main(String[] args) throws Exception
{
VideoTools manager = new VideoTools();
String jsonUrl = manager.getVideoUrl("http://v.youku.com/v_show/id_XMTgzNDA5OTMy.html");
System.out.println(jsonUrl.split("#").length);
}
public String getVideoUrl(String htmlUrl) throws JSONException{
//正則表達(dá)式解析地址,取id
Pattern p = Pattern.compile(".*id_(\\w+)\\.html");
String u = htmlUrl;
Matcher m = p.matcher(u);
String id = "";
if (m.find()) {
id = m.group(1);
}
System.out.println(id);
// String id="XMTgzNDA5OTMy";
String s = getContent("http://v.youku.com/player/getPlayList/VideoIDS/"+id);
JSONObject jsobj = new JSONObject();
jsobj =jsobj.fromObject(s);
JSONArray jsonarr = jsobj.getJSONArray("data");
System.out.println(jsobj);
JSONObject obj1 = jsonarr.getJSONObject(0);
String title= obj1.getString("title");
double seed = obj1.getDouble("seed");
JSONObject obj2 = obj1.getJSONObject("streamfileids");
String mp4id = null;
String flvid = null;
String format = null;
try
{
mp4id = obj2.getString("mp4");
format = "mp4";
} catch (JSONException e)
{
System.out.println("沒有MP4格式");
try
{
flvid = obj2.getString("flv");
format = "flv";
} catch (JSONException e1)
{
System.out.println("沒有FLV格式");
return "";
}
}
String realfileid = null;
if (format.equals("mp4"))
{
realfileid = getFileID(mp4id, seed);
} else
{
realfileid = getFileID(flvid, seed);
}
String idLeft = realfileid.substring(0, 8);
String idRight = realfileid.substring(10);
String sid = genSid();
JSONObject obj3 = obj1.getJSONObject("segs");
JSONArray mp4arr = obj3.getJSONArray(format);
String VideoUrl="";
for (int i = 0; i < mp4arr.size(); i++)
{
JSONObject o = mp4arr.getJSONObject(i);
String k = o.getString("k");
String url = "http://f.youku.com/player/getFlvPath/sid/" + sid + "_" + String.format("%1$02X", i) + "/st/" + format
+ "/fileid/" + idLeft + String.format("%1$02X", i) + idRight + "?K=" + k;
System.out.println(url);
VideoUrl+=url+"#";
}
return VideoUrl;
}
private static 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();
}
public static String genSid()
{
int i1 = (int) (1000 + Math.floor(Math.random() * 999));
int i2 = (int) (1000 + Math.floor(Math.random() * 9000));
return System.currentTimeMillis() + "" + i1 + "" + i2;
}
private static 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();
}
public static String getContent(String strUrl) {
try {
URL url = new URL(strUrl);
BufferedReader br = new BufferedReader(new InputStreamReader(
url.openStream()));
String s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
return sb.toString();
} catch (Exception e) {
return "error open url:" + strUrl;
}
}
}
相關(guān)文章
Mybatis-Plus實(shí)現(xiàn)自動(dòng)生成代碼的操作步驟
AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個(gè)模塊的代碼,極大的提升了開發(fā)效率,本文將給大家介紹Mybatis-Plus實(shí)現(xiàn)自動(dòng)生成代碼的操作步驟2023-10-10
SpringBoot2.x 整合 thumbnailator 圖片處理的示例代碼
這篇文章主要介紹了SpringBoot2.x 之整合 thumbnailator 圖片處理,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
mybatis參數(shù)類型不匹配錯(cuò)誤argument type mismatch的處理方案
這篇文章主要介紹了mybatis參數(shù)類型不匹配錯(cuò)誤argument type mismatch的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解,一些常用的工具類、線程池、緩存,數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)連接池、賬戶登錄系統(tǒng)、配置文件等程序中可能只允許我們創(chuàng)建一個(gè)對(duì)象,這就需要單例模式,需要的朋友可以參考下2023-12-12
圖解Java中歸并排序算法的原理與實(shí)現(xiàn)
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。本文將通過圖片詳解插入排序的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08
使用java的Calendar對(duì)象獲得當(dāng)前日期
本文給大家分享的是使用使用java的Calendar對(duì)象獲得當(dāng)前日期的上幾個(gè)度開始、結(jié)束時(shí)間,主要思路是先獲得當(dāng)前季度的開始和結(jié)束日期,在當(dāng)前日期的基礎(chǔ)上往前推3個(gè)月即上個(gè)季度的開始和結(jié)束日期,十分的實(shí)用,小伙伴們可以參考下。2015-07-07

