open163_download

download subtitle and video in netease open163

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

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