文档章节

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

SuShine
 SuShine
发布于 2015/06/25 15:27
字数 391
阅读 106
收藏 0
点赞 0
评论 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
粉丝 119
博文 443
码字总数 98932
作品 0
青岛
后端工程师
通过JAVA获取优酷、土豆、酷6、6间房等视频

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

主编
2011/05/02
0
1
使用Java的request获取IP地址实例

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

功夫panda
2012/12/17
0
0
Java虚拟机--一个类如何加载?

文末有彩蛋!!!!!! 类加载 对于虚拟机来说,一个对象的创建十分复杂,包含了很多步骤。首先,我们要从类加载说起。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期...

贾博岩
04/04
0
0
优秀的 Android 开源项目

摘要 转载http://www.trinea.cn/android/android-open-source-projects-view/,方便大家找到自己合适的资料 目录[-] 一、ListView 二、ActionBar 三、Menu 四、ViewPager 、Gallery 五、Gri...

ljrapple
2015/04/06
0
1
MySQL多数据源笔记5-ShardingJDBC实战

Sharding-JDBC集分库分表、读写分离、分布式主键、柔性事务和数据治理与一身,提供一站式的解决分布式关系型数据库的解决方案。 从2.x版本开始,Sharding-JDBC正式将包名、Maven坐标、码云仓...

狂小白
03/19
0
0
关于java的DNS解析IP缓存问题

java对DNS解析IP进行缓存,默认缓存超时时间为-1(在重启JVM前永久缓存), 在第一次访问某域名后将会缓存解析到的IP地址,之后直接从缓存里获得所需的信息(如IP地址),而无需再访问DNS服务...

Sub
2013/08/09
0
0
jvm生命周期之类的加载、连接、初始化

加载 在java中,我们经常会接触到一个词——类加载,它和这里的加载并不是一回事,通常我们说类加 载指的是类的生命周期中加载、连接、初始化三个阶段。在加载阶段,java虚拟机会做什么工作呢...

javatomcat
2014/03/15
0
1
如何用JMF编写MP3音乐播放器1——(图文)如何使用JMF及其环境变量的配置

Java Media Framework JMF,全名为Java Media Framework,它可以在java applet和application中使用音频,视频或者其他基于时间的多媒体。 1.JMF对音频的支持 但是本人经过测试和编写,发现JMF并...

cui314461408
2013/08/09
0
0
Hadoop tutorial - 2 - 安装hadoop 2015-3-23

工具: xshell () 安装包: hadoop-2.6.0.tar.gz->2.4.1 http://archive.apache.org/dist/hadoop/core/hadoop-2.4.1/ ----------5/19/2017----------start https://archive.apache.org/dist......

jayronwang
2015/03/23
0
0
[转]理解JNDI中 java:comp/env/jdbc/datasource 与 jdbc...

在描述JNDI,例如获得数据源时,JNDI地址有两种写法,例如同是 jdbc/testDS 数据源: A: java:comp/env/jdbc/testDS B: jdbc/testDS 这两种写法,配置的方式也不尽相同,第一种方法应该算是一...

穿越星辰
2011/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周一乱弹 —— 如果是你喜欢的女同学找你借钱

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享Michael Learns To Rock的单曲《Fairy Tale》 《Fairy Tale》- Michael Learns To Rock 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
43分钟前
11
3
NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
11
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部