open163_download

download subtitle and video in netease open163

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==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();