- // ==UserScript==
- // @name open163_download
- // @namespace zt
- // @version 0.1
- // @description download subtitle and video in netease open163
- // @author zt
- // @include http://*.163.com/movie/*
- // @include http://*.163.com/special/*
- // ==/UserScript==
- var debug = true;
-
- var xbug = debug ? console.debug.bind(console) : function(){},
- xlog = debug ? console.log.bind(console) : function(){};
-
-
- function insertAfter( newElement, targetElement ){ // newElement是要追加的元素 targetElement 是指定元素的位置
- var parent = targetElement.parentNode; // 找到指定元素的父节点
- if( parent.lastChild == targetElement ){ // 判断指定元素的是否是节点中的最后一个位置 如果是的话就直接使用appendChild方法
- parent.appendChild( newElement, targetElement );
- }else{
- parent.insertBefore( newElement, targetElement.nextSibling );
- }
- }
-
- //获得视频,字幕链接
- function geturl(url,doc,callback){
- //var lc = location,url = location.href,doc = document;
- var piece_url = url.split('/');
- //xbug(doc);
- var scripts = doc.getElementsByTagName("script");
- //xbug(scripts);
- var curmovieappsrc = null;
- for(var i=0;i<scripts.length;i++){
- if(scripts[i].textContent == ""){
- continue;
- }
- var re= /(http:\/\/mov\.bn\.netease\.com\/open\-movie\/nos+[^']*)/i;
- temp = re.exec(scripts[i].textContent);
- //xbug(temp);
- if(temp != null)
- curmovieappsrc = temp[0];
- }
- //xbug(curmovieappsrc);
- //var curmovie = openCourse.getCurrentMovie();
- //var curmovieappsrc = curmovie.appsrc;
- var curmovieflv = "";
- curmovieflv = curmovieappsrc.replace(".m3u8",".flv").replace("mp4","flv");
- var lenofpurl = piece_url.length;
- piece_url[lenofpurl-1] = "2_" + piece_url[lenofpurl-1].split(".")[0] + ".xml";
- var xml_url = "http://live.ws.126.net/movie/" + piece_url.slice(lenofpurl-3).join("/");
- //xbug(curmovieflv);
- //xbug(xml_url);
- var zh_srt = "";
- var en_srt = "";
- GM_xmlhttpRequest({
- method: 'GET',
- url: xml_url,
- onload: function(res){
- var xmldoc = "";
- if(res.status==200){
- // For Firefox
- xmldoc = new DOMParser().parseFromString(res.responseText, 'text/html');
- // For Chrome
- if(xmldoc == undefined){
- xmldoc = doc.implementation.createHTMLDocument("");
- xmldoc.querySelector('html').innerHTML = res.responseText;
- }
- //xbug(xmldoc);
- var all = xmldoc.getElementsByTagName("all")[0];
- //xbug(all);
- var subs = all.getElementsByTagName("subs")[0].childNodes;
- //xbug(subs);
- for(var i=0;i<subs.length;i++){
- var name = subs[i].getElementsByTagName("name")[0].textContent;
- if(name == "中文")
- zh_srt = subs[i].getElementsByTagName("url")[0].textContent;
- if(name == "英文")
- en_srt = subs[i].getElementsByTagName("url")[0].textContent;
- }
- //xbug(curmovieflv);
- callback(curmovieflv,zh_srt,en_srt);
- }
- }
- });
- }
- //获得单独视频页面
- function getmovpage(movurlt,doc,callback){
- //xbug(movurlt);
- GM_xmlhttpRequest({
- method: 'GET',
- url: movurlt,
- onload: function(res){
- if(res.status==200){
- // For Firefox
- var movdoc = new DOMParser().parseFromString(res.responseText, 'text/html');
- // For Chrome
- if(movdoc == undefined){
- movdoc = doc.implementation.createHTMLDocument("");
- movdoc.querySelector('html').innerHTML = res.responseText;
- }
- //xbug(movdoc);
- callback(movdoc);
- }
- }
- });
- }
- //在课程的页面插入
- function insert2(curmovieflv,zh_srt,en_srt,insertplace,doc){
- if(en_srt != ""){
- var ensrt = doc.createElement("a");
- ensrt.innerHTML = '<a href="' + en_srt + '"><em class="f-cgreen"> 英文</em></a>';
- insertAfter(ensrt, insertplace.nextSibling);
- }
- if(zh_srt != ""){
- var zhsrt = doc.createElement("a");
- zhsrt.innerHTML = '<a href="' + zh_srt + '"><em class="f-cgreen"> 中文</em></a>';
- insertAfter(zhsrt, insertplace.nextSibling);
- }
- if(curmovieflv != ""){
- c = count+1;
- var flv = doc.createElement("a");
- flv.innerHTML = '<a href="' + curmovieflv + '"><em class="f-cgreen"> 视频'+'</em></a>';
- insertAfter(flv, insertplace.nextSibling);
- }
- }
- //在单独的视频页面插入
- function insert(curmovieflv,zh_srt,en_srt,insertplace,doc){
- if(en_srt != ""){
- var ensrt = doc.createElement("span");
- ensrt.className = "f-fl intro f-pr";
- ensrt.innerHTML = '<a href="' + en_srt + '"><em class="f-cgreen"> 英文</em></a>';
- insertAfter(ensrt, insertplace.nextSibling);
- }
- if(zh_srt != ""){
- var zhsrt = doc.createElement("span");
- zhsrt.className = "f-fl intro f-pr";
- zhsrt.innerHTML = '<a href="' + zh_srt + '"><em class="f-cgreen"> 中文</em></a>';
- insertAfter(zhsrt, insertplace.nextSibling);
- }
- if(curmovieflv != ""){
- var flv = doc.createElement("span");
- flv.className = "f-fl intro f-pr";
- flv.innerHTML = '<a href="' + curmovieflv + '"><em class="f-cgreen"> 视频</em></a>';
- xbug(curmovieflv);
- insertAfter(flv, insertplace.nextSibling);
- }
- }
-
- var count = 0;
- var ahref = new Array();
- var movurl = new Array();
- var timer = null;
- //请求单独视频页面,得到视频字幕链接,然后插入
- function sentMsg(){
- if(count < movurl.length){
-
- //xbug("c",count,"c");
- getmovpage(movurl[count],document,function(movdoc){
- //xbug("h",count,"h");
- //xbug(movurl[count]);
- geturl(movurl[count],movdoc,function(curmovieflv,zh_srt,en_srt){
- //xbug(movdoc);
- insert2(curmovieflv,zh_srt,en_srt,ahref[count],document);
- count++;
- });
- });
- //sleep(5000);
-
- }else {
- clearInterval(timer);
-
- }
-
- }
-
- function sleep(n) {
- var start = new Date().getTime();
- while(true) if(new Date().getTime()-start > n) break;
- }
- //处理课程页面
- function processspecialpage(url,doc){
- var list1 = doc.getElementById("list1");
- var list2 = doc.getElementById("list2");
- var list1tr = list1.getElementsByTagName("tr");
- var list2tr = list2.getElementsByTagName("tr");
- var listtr = new Array();
- var i;
- for(i = 0;i<list1tr.length;i++){
- listtr[i] = list1tr[i];
- }
- for(;i<list1tr.length+list2tr.length;i++){
- listtr[i]=list2tr[i-list1tr.length];
- }
- var j = 0;
- for(i=0;i<listtr.length;i++){
- if(listtr[i].getAttribute("class") == null)
- continue;
- //xbug(i);
- if(listtr[i].getAttribute("class")=="u-even" || listtr[i].getAttribute("class")=="u-odd"){
- ahref[j] = listtr[i].getElementsByTagName("a")[0];
- //xbug(ahref);
- movurl[j] = ahref[j].getAttribute("href");
- j++;
- //xbug(movurl[i]);
- //xbug("hi",i,"hi");
- }
- }
- //xbug(movurl);
- count = 0;
- timer = setInterval(sentMsg,3000);
- }
- //处理单独视频页面
- function processmoviepage(url,doc){
- geturl(url,doc,function(curmovieflv,zh_srt,en_srt){
- //xbug(flvandsrt);
- var spantags = doc.getElementsByTagName("span");
- //xbug(spantags);
- var intro = null;
- for(i=0;i<spantags.length;i++){
- if(spantags[i].getAttribute("class") == null)
- continue;
- //xbug(spantags[i].getAttribute("class"));
- if (spantags[i].getAttribute("class") == "f-fl intro f-c6 f-pr j-hoverdown") {
- intro=spantags[i];
- break;
- }
- }
- //xbug(intro);
- if(intro == null)
- return;
- insert(curmovieflv,zh_srt,en_srt,intro,doc);
- });
- }
-
-
- function open163(){
- var lc = location,url = location.href,doc = document;
- if(url.indexOf("special/") >= 0){
- processspecialpage(url,doc);
- }
- else{
- processmoviepage(url,doc);
- }
- }
- open163();