文档章节

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

SuShine
 SuShine
发布于 2015/06/25 15:27
字数 391
阅读 122
收藏 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
粉丝 126
博文 565
码字总数 154303
作品 0
朝阳
后端工程师
私信 提问
通过JAVA获取优酷、土豆、酷6、6间房等视频

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

主编
2011/05/02
0
1
推荐假期学java基础的经典入门视频

推荐假期学java基础的经典入门视频 年底了,要放假了,明年该找工作了。给想在java方面发展的朋友推荐一个经典的JAVA入门视频,可以利用假期时间看看,学学基础,为找工作做做前期准备。是一...

luodis
2010/12/28
358
2
求高手解答----java 如何获取网页上动态生成的图片的真实地址

如题。现在我已经能够利用java解析html中的普通的图片地址。 但是 我现在想实现-->获取那种网页中看不到图片的地址,但是利用浏览器就可以获取它的真实地址(这种图片资源应该是利用形如js代...

芮淼一线
2015/05/24
1K
2
双十一需要仪式感,包邮送15本实体书 | 粉丝福利第⑤期 |

  ps:想到明天就是11.11光棍节,今日注定脱光无望,在这没有情人的光棍节,感谢北京大学为我们(Java进阶架构师,Java技术驿站,方志朋)赞助了6种共15本书!希望大家都能中奖抱着书本摩擦...

java进阶架构师
2018/11/10
0
0
第7课:Java Spring Boot 2.0安全机制、漏洞与MVC身份验证实战

《阿里巴巴Java Spring Boot 2.0开发实战课程》07课 本期分享专家:徐雷—阿里巴巴特邀Java讲师,MongoDB讲师 本期分享主题:Java Spring Boot2.0实战MyBatis与优化 (Java面试题) Java Spri...

徐雷frank
2018/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

面向对象接口多态

第3天 面向对象 今日内容介绍  接口  多态  笔记本案例 今日学习目标  写出定义接口的格式  写出实现接口的格式  说出接口中成员的特点  接口和抽象类的区别  能够说出使用多...

stars永恒
22分钟前
2
0
摄像头基础介绍

一、摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中...

天王盖地虎626
23分钟前
2
0
浅谈一致性Hash原理及应用

在讲一致性Hash之前我们先来讨论一个问题。 问题:现在有亿级用户,每日产生千万级订单,如何将订单进行分片分表? 小A:我们可以按照手机号的尾数进行分片,同一个尾数的手机号写入同一片/...

Java干货分享
45分钟前
3
0
React SSR样式及SEO的实践

前一篇主要记录了一下SSR配置以及结合Redux的使用。这里简单说一下React SSR中样式处理和更优雅的SEO SSR样式 在React客户端渲染,添加样式很容易。写一个css样式文件,在对应组件中引用。标...

前端小攻略
52分钟前
5
0
华为手机太猛!余承东吹的牛今天都实现了

华为是世界上少有的在2B和2C领域同时取得成功公司。如今,华为消费者业务的营收,已经在华为总营收中占据“半壁江山”。 12月27日,华为董事长郭平在新年致辞中披露,预计2018年华为预计实现...

linux-tao
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部