download subtitle and video in netease open163
// ==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();