文档章节

Java 解析优酷地址获取视频真实地址

SuShine
 SuShine
发布于 2015/06/25 15:27
字数 391
阅读 115
收藏 0
package com.example.testtoast;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class VideoTools {

	public String getVideoUrl(String htmlUrl) throws JSONException {
		// 正则表达式解析地址,取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);
		System.out.print(s);
		JSONObject jsobj = new JSONObject(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.length(); 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;
		}

	}
}

本文转载自:http://blog.csdn.net/sfshine/article/details/9025191

共有 人打赏支持
SuShine
粉丝 123
博文 496
码字总数 144699
作品 0
朝阳
后端工程师
通过JAVA获取优酷、土豆、酷6、6间房等视频

通过JAVA获取优酷、土豆、酷6、6间房、56视频,现在很多社会网站都有这个功能,用户输入优酷、土豆、酷6、6间房、56视频地址后,能找到对应的视频及视频的缩略图,有些社区网站还能获取到视频...

主编
2011/05/02
0
1
云妹总结了一些最最最常见的Java面试题供大家参考

云妹导读:String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性 String类中使用字符数组:private final cha...

阿里云科技快讯
08/17
0
0
【java爬虫】---爬虫+jsoup轻松爬博客

爬虫+jsoup轻松爬博客 最近的开发任务主要是爬虫爬新闻信息,这里主要用到技术就是jsoup,jsoup 是一款 Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API...

雨点的名字
07/19
0
0
使用Java的request获取IP地址实例

本文向您介绍使用Java获取IP地址的方法,在request.getRemoteAddr()方法在使用方向代理失效的情况下,本文的方法依然可以获取真是地址。 在JSP里,获取客户端的IP地址的方法是:request.get...

功夫panda
2012/12/17
0
0
面向基础系列之---Java网络编程---网络连接组件的使用(InetAddress)

这个系列是我一直想写的,因为从入职第一年的第一个月开始(那时还在zte),我就买了网络上唯一的一本,写Java网络的书籍:《Java网络编程》。当时功底一般,感觉看起来,还是很多云里雾里,...

心中的理想乡
09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
2
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
7
0
在Ubuntu安装和配置Sphinx

Ubuntu系统默认是配置有sphinx的,先检查一下,别多此一举。。。。。 在开始本指南之前,您需要: 一个Ubuntu 16.04服务器。 sudo的一个非root用户,您可以通过以下设置本教程 。 安装在服务...

阿锋zxf
今天
3
0
Qt编写输入法V2018超级终结版

对于qt嵌入式linux开发人员来说,输入法一直是个鸡肋问题,要么不支持实体键盘同步,要么不能汉字输入,要么不支持网页输入等,这几年通过陆续接触大量的各种输入法应用场景客户,得到真实需...

飞扬青云
今天
2
0
TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部