Japonx 字幕&视频 下载(支持PotPlayer播放)

下载 japonx 的字幕和视频。

Versión del día 20/11/2018. Echa un vistazo a la versión más reciente.

// ==UserScript==
// @name        Japonx 字幕&视频 下载(支持PotPlayer播放)
// @description 下载 japonx 的字幕和视频。
// @version     4.0.5
// @author      ThisAV
// @homepage    https://greasyfork.org/zh-CN/users/122964
// @namespace   https://greasyfork.org/users/122964
// @feedback    https://greasyfork.org/en/scripts/372676/feedback
// @connect     japronx.com
// @connect     japonx.net
// @connect     japonx.vip
// @include     https://japonx.net/portal/index/detail/id/*
// @include     https://japonx.vip/portal/index/detail/id/*
// @include     https://www.japonx.net/portal/index/detail/id/*
// @include     https://www.japonx.vip/portal/index/detail/id/*
// @run-at      document-idle
// @require     http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js
// @require     https://greasyfork.org/scripts/373130/code/ProtocolCheck.js?version=635816
// @icon        https://www.japonx.vip/favicon.ico
// @grant       GM_addStyle
// @grant       unsafeWindow
// @grant       GM_xmlhttpRequest
// @grant       GM_openInTab
// ==/UserScript==

(function(){
    'use strict';
    var urls=location.href,
        host=location.hostname,
        PageId=location.href.replace(/.+\/id\/(\d+).html/i,'$1'),
        VideoID=$('dt:contains(番號)').next().text(), //番号
        VideoUrl,
        VideoDownload=false,
        VideoSubUrl,
        webTitle=document.title='【'+VideoID+'】'+document.title;

    var JaPronX={
        CheckUrl : function(url, callback){
            GM_xmlhttpRequest({
              url:url,
                /*
              headers: {
                'Host':'japronx.com',
                'Content-Type': 'application/x-www-form-urlencoded'
              },*/
                method:'head',
                synchronous:true,
                ontimeout:10000,
                onload:callback,
                onerror:function(e){
                    if(url.search('.mp4')>-1&&e.status==0) {
                        $('.d-btn.download').attr({'href':url,'target':'blank','download':VideoID+'.mp4'}).text('服务器无响应,请求失败').css({'width':'250px','color':'red'});
                    }
                    console.log('CheckUrl error:', e.status, url, e);
                }
            });
        }
    }

    GM_addStyle('#JaPonxTool{position:absolute;right:280px;top:20px;} .btnC{border:1px solid #d7dadb;padding:8px;border-radius:6px;display:inline-block;color:#000;background:#fff;margin:15px 0 0 15px;}');

    var $btnDiv = $('#d-btn');
    if(0) $btnDiv.append('<a class="d-btn sub" target="_blank" href="https://'+host+'/portal/index/ajax_get_js.html?id='+PageId+'">Ajax</a>');
    $('<a>').attr({'class':'btnC','href':"https://www.japonx.vip/portal/index/detail/id/"+(Number(PageId)+1)+".html"}).text('下一页').insertAfter($('#logo-maker, h2:contains(熱門推薦)').css({'display':'inline'}));


    var ajaxGetID=function(){
        GM_xmlhttpRequest({
            'url':'/portal/index/ajax_get_js.html?id='+PageId,
            'method':'get',
            //'data' : 'id='+PageId,
            'responseType':'text',
            'async':false,
            'onload' : function(e){
                var s=e.responseText;
                GM_addStyle("dl.desc {width:400px;} #contents-inline dl a:hover{border:1px solid #00aaff;margin:1px!important;} .play{margin-right:0px!important;} .PotPlayer, .sub{width:130px;}");
                //console.log('GM_xmlhttpRequest: ',e, s);

                //console.log('VideoUrl: ',VideoUrl);

                var Arry=s.split(/\||'\.split\('/i), M3U8_Hash=[], M3U8_MD5, M3U8_Expires, VttData/*字幕上传日期*/, VttHash/*字幕文件 Hash*/, $zmBtn;
                $.each(Arry,function(index,val){
                    //console.log(index, val.length, val);
                    switch(val.length) {
                            //M3U8 32位 Hash 提取
                        case 32: M3U8_Hash.push(val);break;
                        case 22: M3U8_MD5=val;break;
                        case 10: if(/\d{10}/.test(val)) M3U8_Expires=val;break;
                        case 8: if(/2\d{7}/.test(val)) VttData=val;break;
                    }
                });

                //console.log(M3U8_Hash, M3U8_Hash.length, M3U8_MD5, M3U8_Expires, VttData);
                if(!M3U8_MD5) {
                    console.log('获取 M3U8_MD5 失败');
                    $('.d-btn.download').text('获取 M3U8_MD5 失败').css({'width':'230px'});
                    setTimeout(ajaxGetID, 2000);
                    return false;
                }

                //字幕
                if(s.search(/\|vtt\|/im)===-1) $zmBtn = $('<a class="d-btn sub" style="color:#ccc;" href="javascript:void(0);">无字幕文件</a>');
                console.log('M3U8_Hash.length',M3U8_Hash.length);
                switch(M3U8_Hash.length) {
                    case 2:
                        $.each(M3U8_Hash, function(i,Hash){
                            CheckVtt(Hash);
                        });
                        break;
                    case 1:
                        CheckVtt(M3U8_Hash.toString());
                        break;
                    case 0:
                        $('.d-btn.download').text('未找到资源').css({'width':'150px'});
                }

                function CheckVtt(Hash){
                    JaPronX.CheckUrl('https://'+host+'/upload/admin/'+VttData+'/'+Hash+'.vtt',function(e){
                        //console.log(i, Hash, e);
                        switch(e.status) {
                            case 200:
                                VideoSubUrl='https://'+host+'/upload/admin/'+VttData+'/'+Hash+'.vtt';
                                $zmBtn = $('<a class="d-btn sub" target="_blank">下载字幕</a>').attr({'download':VideoID+'.vtt', 'href':VideoSubUrl});
                                $btnDiv.append($zmBtn);
                                break;
                            case 404:
                                JaPronX.CheckUrl("https://p.japronx.com/output/"+Hash+"/index.m3u8?md5="+M3U8_MD5+"&expires="+M3U8_Expires,function(e){
                                    //console.log('Video:', i, Hash, e);
                                    if(e.status===200) {
                                        VideoUrl="https://p.japronx.com/output/"+Hash+"/index.m3u8?md5="+M3U8_MD5+"&expires="+M3U8_Expires;
                                        VideoDown(VideoUrl);
                                    }
                                });
                                break;
                            default:
                                console.log(e.status);
                        }
                    });
                }

                function VideoDown(VideoUrl){
                    JaPronX.CheckUrl(VideoUrl, function(e){//M3U8
                        //console.log('load: ', VideoUrl, e);
                        switch(e.status){
                            case 200:
                                 $('.d-btn.download').attr({'href':VideoUrl, 'target':'blank'}).text('M3U8').css({'color':'black','width':'100px'});
                                $btnDiv.append($('<a class="d-btn PotPlayer">').attr({'href':'potplayer://'+VideoUrl}).css({'color':'black'}).text('Potplayer').click(function(){
                                    window.protocolCheck(this.href, function(){
                                        if(confirm("协议未注册,现在去注册程序协议?")) GM_openInTab("https://greasyfork.org/zh-CN/scripts/372676/#potplayer");
                                    });
                                }));
                                break;
                            case 404:
                                $('.d-btn.download').text('404');
                                break;
                            default:
                                $('.d-btn.download').text('获取失败').css({'width':'120px'}).attr({'href':'javascript:location.reload();'});
                                break;
                        }
                    });
                }
            },
            'error' : function(e){
                console.log('$ error:',e);
            }
        });
    }
    ajaxGetID();
})();