動畫瘋·Plus

分級標識自動同意、自動切換至下一集、自動點此跳過廣告、影片空降座標、網頁全螢幕、子母畫面

目前為 2021-08-02 提交的版本,檢視 最新版本

// ==UserScript==
// @name         動畫瘋·Plus
// @namespace    https://home.gamer.com.tw/homeindex.php?owner=xu3u04u48
// @version      1.21.7
// @description  分級標識自動同意、自動切換至下一集、自動點此跳過廣告、影片空降座標、網頁全螢幕、子母畫面
// @author       xu3u04u48
// @match        *://ani.gamer.com.tw/animeVideo.php?sn=*
// @icon         https://i2.bahamut.com.tw/anime/baha_s.png
// @require      https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js
// @grant GM_setValue
// @grant GM_getValue
// @run-at document-end
// ==/UserScript==

(function() {
    'use strict';

    //禁止檔廣告警告視窗彈出
    blockalert("廣告");

    //設定值初始化
    var fun = {'ncc_warning':false,'video_next':true,'ad_skip':true};
    var ncc_warning_save = GM_getValue('ncc_warning') == undefined ? fun.ncc_warning : GM_getValue('ncc_warning');
    var video_next_skip = GM_getValue('video_next') == undefined ? fun.video_next : GM_getValue('video_next');
    var ad_skip_save = GM_getValue('ad_skip') == undefined ? fun.ad_skip : GM_getValue('ad_skip');

    //取得動畫瘋 animefun Function
    var deviceid = animefun.getdeviceid();
    var sn = animefun.videoSn;
    //取得用戶狀態
    var token = Token();

    //使用者介面
    var aniplusui_html = '<div class="ani-tabs__item">';
    aniplusui_html += '<div id="ani-tab-content-setting-aniplus" class="plus_ani-tabs-link" style="cursor: pointer;">動畫瘋·Plus</div>';
    aniplusui_html += '</div>';
    $('.sub_top').append(aniplusui_html);
    $('.ani-tab-content').append('<div id="ani-tab-content" class="ani-tab-content__item" style="display: none;"></div>');

  $("#ani-tab-content-setting-aniplus").click(function(e){
    $(".ani-tab-content__item").css("display","none");
    $("#ani-tab-content").css("display","block");
    $('.ani-tabs-link').removeClass('is-active');
    $(this).addClass("is-active");
  })

  $(".ani-tabs-link").click(function(e){
    $("#ani-tab-content").css("display","none");
    $('#ani-tab-content-setting-aniplus').removeClass('is-active');
  })

    //使用者介面CSS
    $('head').append(`
<style>

.plus_ani-tabs-link {
    position: relative;
    display: block;
    padding: 0 16px;
    background: var(--card-bg);
    color: var(--text-primary-color);
    text-decoration: none;
    font-family: "Helvetica Neue", "Helvetica", "Arial", "PingFangTC-Light", "STHeitiTC-Light", "Microsoft JhengHei", "微軟正黑體", sans-serif;
}

.plus_ani-tabs-link:after {
    left: 0;
    bottom: 0;
    z-index: 1;
    width: 100%;
    height: 3px;
    background: var(--border-timeline);
}

.plus_ani-tabs-link:before {
    bottom: 3px;
    left: 50%;
    margin-left: -5px;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 0 5px 4px 5px;
    border-color: transparent transparent;
    -webkit-transform: translate3d(0, 3px, 0);
    transform: translate3d(0, 3px, 0);
}

.plus_ani-tabs-link:before, .plus_ani-tabs-link:after {
    content: "";
    position: absolute;
}

.plus_ani-tabs-link.is-active {
    color: var(--text-primary-color);
}

.plus_ani-tabs-link.is-active:after {
    height: 3px;
    background: var(--selected-color);
}

.plus_ani-tabs-link.is-active:before {
    -webkit-animation: none;
    animation: none;
}

.plus_ani-tabs-link.is-active:before {
    bottom: 6px;
    border-color: transparent transparent var(--selected-color) transparent;
}

.ani-setting-item a {
    color: unset;
}

.plus_bullet-send {
padding:0 5px 0 5px;
width:20%;
z-index:1;
border-radius:5px;
cursor:all-scroll;
}

.plus_bullet-control {
left:unset;
right:0;
z-index:1;
height:100%;
}

.plus_bullet-send_icon {
width: 35px;
height: 38px;
float: right;
padding: 6px 8px;
border-style: none;
background-color: transparent;
color: #fff;
opacity: 0.7;
}

.plus_bullet-send_icon:before {
content: "chat";
}

.plus_bullet-send_icon:before {
font-size: 19px !important;
direction: ltr;
display: inline-block;
font-family: 'Material Icons';
font-style: normal;
font-weight: normal;
letter-spacing: normal;
text-transform: none;
white-space: nowrap;
word-wrap: normal;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
-moz-osx-font-smoothing: grayscale;
-webkit-font-feature-settings: 'liga';
font-feature-settings: 'liga';
}

.plus_bullet-send_icon:hover{
opacity: 1;
}


.plus_Web_fullscreen_icon {
width: 35px;
height: 38px;
float: right;
padding: 6px 8px;
border-style: none;
background-color: transparent;
color: #fff;
opacity: 0.7;
}

.plus_Web_fullscreen_icon:before {
content: "aspect_ratio";
}

.plus_Web_fullscreen_icon:before {
font-size: 19px !important;
direction: ltr;
display: inline-block;
font-family: 'Material Icons';
font-style: normal;
font-weight: normal;
letter-spacing: normal;
text-transform: none;
white-space: nowrap;
word-wrap: normal;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
-moz-osx-font-smoothing: grayscale;
-webkit-font-feature-settings: 'liga';
font-feature-settings: 'liga';
}

.plus_Web_fullscreen_icon:hover{
opacity: 1;
}

.plus_time_body{
width: 100%;
padding: 8px;
min-height: 170px;
border: 1px solid #ddd;
background: #f5f5f5;
border-radius: 4px;
box-sizing: border-box;
}


html[data-theme='dark'] .plus_time_body{
background: #272728;
border: 1px solid #424242;
}

.plus_keyword-label {
display: inline-flex;
align-items: center;
max-width: 100%;
margin: 0 4px 4px 0;
background: #02B4D8;
font-size: 13px;
color: #fff;
border-radius: 4px;
}

.plus_keyword-label > span {
display: block;
padding: 3px 6px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
vertical-align: middle;
}

.plus_k-label {
align-items: center;
max-width: 100%;
margin: 0 4px 4px 0;
padding: 3px 6px;
background: #02B4D8;
font-size: 13px;
color: #fff;
border-radius: 4px;
display: inline-block;
}

.plus_k-label > span {
display: none
}

.plus_k-label:hover span {
min-height: 20px;
width: 330px;
position: absolute;
z-index: 999;
padding: 10px;
display: block;
background-color:rgba(0, 0, 0, 0.86);
color: #ffffff;
border-radius: 5px;
font-size: 16px;
left: 50px;
}

.plus_explain {
font-size: 21px;
color: #888;;
padding: 0 0 0 5px;
}

.plus_explain:before {
content: "help";
}

.plus_explain:before {
direction: ltr;
display: inline-block;
font-family: 'Material Icons';
font-style: normal;
font-weight: normal;
letter-spacing: normal;
text-transform: none;
white-space: nowrap;
word-wrap: normal;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
-moz-osx-font-smoothing: grayscale;
-webkit-font-feature-settings: 'liga';
font-feature-settings: 'liga';
}


.plus_explain > span {
display: none
}

.plus_explain:hover span {
min-height: 20px;
width: 330px;
position: absolute;
z-index: 999;
padding: 10px;
display: block;
background-color:rgba(0, 0, 0, 0.86);
color: #ffffff;
border-radius: 5px;
font-size: 16px;
left: 50px;
}

.plus_no_sub {
text-align: center;
color: #888;
margin: 10px auto;
}

button.plus_refresh {
float: none;
margin: 0;
padding: 0;
height: 30px;
width: 30px;
border: 1px solid #ccc;
background: #eee;
font-size: 18px;
border-radius: 5px;
cursor: pointer;
outline: none;
}

.ani-tab-content__item .plus_refresh  {
width: 30px;
height: 30px;
border: 1px solid #00B4D8;
background: #00B4D8;
color: #fff;
}

.ani-tab-content__item .plus_refresh:hover {
background: #FFF049;
border-color: #FFF049;
color: #333;
}

.plus_material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 21px;
letter-spacing: normal;
text-transform: none;
display: inline-block;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
font-feature-settings: "liga" 1;
}

.ani-tab-content__item .plus_refresh > i {
vertical-align: middle;
}

.video-next-button {
display: block;
position: absolute;
color: #fff;
background: #000;
text-decoration: none;
padding: 10px;
bottom: 40px;
right: 0px;
z-index: 10;
border-top: 1px solid #aaa;
border-left: 1px solid #aaa;
border-bottom: 1px solid #aaa;
font-size: 1.5em;
}

.plus_dialog-border{
border: 1px solid #599bdc;
position: absolute;
z-index: 1000;
background: white;
padding: 10px;
font-size: 1.3rem;
right: 15px;
color: #888888;
}

.plus_picture_in_picture_icon {
width: 35px;
height: 38px;
float: right;
padding: 6px 8px;
border-style: none;
background-color: transparent;
color: #fff;
opacity: 0.7;
}

.plus_picture_in_picture_icon:before {
content: "branding_watermark";
}

.plus_picture_in_picture_icon:before {
font-size: 19px !important;
direction: ltr;
display: inline-block;
font-family: 'Material Icons';
font-style: normal;
font-weight: normal;
letter-spacing: normal;
text-transform: none;
white-space: nowrap;
word-wrap: normal;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
-moz-osx-font-smoothing: grayscale;
-webkit-font-feature-settings: 'liga';
font-feature-settings: 'liga';
}
.plus_picture_in_picture_icon:hover {
opacity: 1;
}


.plus-keyword-header .plus-bluebtn {
flex: 0 0 auto;
position: relative;
display: inline-block;
padding: 6px 12px;
font-size: 13px;
border-radius: 4px;
vertical-align: middle;
}

.plus-bluebtn {
border-radius: 10px;
padding: 12px;
text-align: center;
text-decoration: none;
color: #fff;
margin: 0px 7px 0 0;
background: #00B4D8;
display: inline-block;
font-size: 1.3em;
}

.plus-bluebtn:disabled{
background-color:#ebebe4;
color: #757575;
}


.plus-input {
display: inline-block;
margin: 0 8px 0 0;
padding: 0 8px;
height: 30px;
border: 1px solid #ddd;
box-sizing: border-box;
border-radius: 4px;
font-size: 16px;
vertical-align: middle;
width: 165px;
}

.plus-input.plus-input--keyword {
max-width: 300px;
margin: 0px 8px 0px 8px;
}

.plus-input--keyword {
width: 71px !important;
}

.v_danmu_box{
    position: absolute;
    background-color: #292929ed;
    border-radius: 4px;
    width: auto;
    height: 40px;
	margin: 0px 5px 0px 0px;
	padding: 0 5px;
	z-index: 1;
    font-family: Microsoft JhengHei, Heiti, Simhei, Simsun, wqy-zenhei, MS Mincho, Meiryo, Microsoft Yahei, monospace;
    font-size: 12px;
}

.v_danmu_box_b {
	display: flex;
    align-items: center;
    height: inherit;
}

.v_danmu_text{
    font-size: 12px;
    height: 28px;
    margin: 0px 5px;
    max-width: 180px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    background-color: rgba(255, 255, 255, 0);
    border: none;
    color: white;
    border-radius: 4px;
    padding: 0px 5px;
}

.v_danmu_menu{
    border-radius: 4px;
    width: 56px;
    height: 28px;
    margin: 0 2px;
    color: #fff;
    cursor: pointer;
    background-color: #404040;
    display: flex;
    align-items: center;
    justify-content: center;
}


.plus_version {
font-size: 15px;
color: #666;
position: absolute;
right: 0;
margin: 0 15px 0 0px;
}

.plus_version > span {
display: none
}

.plus_version:hover span {
min-height: 20px;
width: 330px;
position: absolute;
z-index: 999;
padding: 10px;
display: block;
background-color: rgba(0, 0, 0, 0.86);
color: #ffffff;
border-radius: 5px;
font-size: 16px;
right: 0;
}
</style>
`);

    //使用者介面HTML
    var version = GM_info.script.version;
    var ui_html = '<div class="ani-setting-section">';
    ui_html += '<div id="plussetup" class="plus_dialog-border" style="display:none;">設定已儲存,需重整網頁套用設定</div>';
    ui_html += '<h4 class="ani-setting-title" style=" display: flex;align-items: center;">動畫瘋·Plus ';
    ui_html += '<div class="plus_explain"><span>此插件設計是為了給短時間大量補番的人使用的,並加入一些沒用的功能<br>如果您覺得此插件好用,請付費支持動畫瘋讓此插件能持續為本平台服務';
    ui_html += '</span></div>';
    ui_html += '<div class="plus_version">' + version + '<span>修改問題。</span></div>';
    ui_html += '</h4>';
    ui_html += '<div class="ani-setting-item ani-flex">';
    ui_html += '<div class="ani-setting-label">';
    ui_html += '<span class="ani-setting-label__mian">Google Chrome擴充插件</span>';
    ui_html += '</div>';
    ui_html += '<div class="ani-setting-value ani-set-flex-right">';
    ui_html += '<a href="https://chrome.google.com/webstore/detail/%E5%8B%95%E7%95%AB%E7%98%8B%C2%B7plus/jkpkmeimgkhodlppajjgikfcodlilmpd" target="_blank">前往安裝</a>';
    ui_html += '</div>';
    ui_html += '</div>';

    ui_html += '<div class="ani-setting-item ani-flex">';
    ui_html += '<div class="ani-setting-label">';
    ui_html += '<span id="firefox_w" class="ani-setting-label__mian">自動同意分級標識警告</span>';
    ui_html += '</div>';
    ui_html += '<div class="ani-setting-value ani-set-flex-right">';
    ui_html += '<div class="ani-checkbox">';
    ui_html += '<label class="ani-checkbox__label">';
    ui_html += '<input id="grading" type="checkbox">';
    ui_html += '<div class="ani-checkbox__button"></div>';
    ui_html += '</label>';
    ui_html += '</div>';
    ui_html += '</div>';
    ui_html += '</div>';

    ui_html += '<div class="ani-setting-item ani-flex">';
    ui_html += '<div class="ani-setting-label">';
    ui_html += '<span class="ani-setting-label__mian">自動切換至下一集</span>';
    ui_html += '</div>';
    ui_html += '<div class="ani-setting-value ani-set-flex-right">';
    ui_html += '<div class="ani-checkbox">';
    ui_html += '<label class="ani-checkbox__label">';
    ui_html += '<input id="video_next_skip" type="checkbox">';
    ui_html += '<div class="ani-checkbox__button"></div>';
    ui_html += '</label>';
    ui_html += '</div>';
    ui_html += '</div>';
    ui_html += '</div>';

    ui_html += '<div class="ani-setting-item ani-flex">';
    ui_html += '<div class="ani-setting-label">';
    ui_html += '<span class="ani-setting-label__mian">自動點此跳過廣告</span>';
    ui_html += '</div>';
    ui_html += '<div class="ani-setting-value ani-set-flex-right">';
    ui_html += '<div class="ani-checkbox">';
    ui_html += '<label class="ani-checkbox__label">';
    ui_html += '<input id="ad_skip" type="checkbox">';
    ui_html += '<div class="ani-checkbox__button"></div>';
    ui_html += '</label>';
    ui_html += '</div>';
    ui_html += '</div>';
    ui_html += '</div>';

    ui_html += '<div class="ani-setting-item ani-flex">';
    ui_html += '<div class="ani-setting-label">';
    ui_html += '<span class="ani-setting-label__mian">彈幕開關 按鍵設定</span>';
    ui_html += '</div>';
    ui_html += '<div class="ani-setting-value ani-set-flex-right">';
    ui_html += '<div class="plus-keyword-header">';
    ui_html += '<input type="text" id="danmu_key"  readonly="readonly" class="plus-input--keyword ani-input ani-input--keyword" event.returnValue = false;">';
    ui_html += '<input id="danmu_key_sendout" class="plus-bluebtn" value="儲存" disabled type="submit" style="border:2px blue none;">';
    ui_html += '</div>';
    ui_html += '</div>';
    ui_html += '</div>';

    ui_html += '<div class="ani-setting-item ani-flex">';
    ui_html += '<div class="ani-setting-label">';
    ui_html += '<span class="ani-setting-label__mian">空降座標</span>';
    ui_html += '</div>';
    ui_html += '<div class="ani-setting-value ani-set-flex-right">';
    ui_html += '<div class="plus-keyword-header">';
    ui_html += '<input type="text" id="plus-video-skip-minute" class="plus-input--keyword ani-input ani-input--keyword" disabled placeholder="00" onKeypress="if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false;">:';
    ui_html += '<input type="text" id="plus-video-skip-second" class="plus-input--keyword ani-input ani-input--keyword" disabled placeholder="00" onKeypress="if (event.keyCode < 48 || event.keyCode > 57) event.returnValue = false;">';
    ui_html += '<input id="plus-video-skip-sendout" class="plus-bluebtn" value="降落" disabled type="submit" style="border:2px blue none;">';
    ui_html += '</div>';
    ui_html += '</div>';
    ui_html += '</div>';

    ui_html += '<div class="ani-setting-item">';
    ui_html += '<div class="ani-setting-label">';
    ui_html += '<span class="ani-setting-label__mian">空降足跡<font size="2">(點擊降落)</font></span>';
    ui_html += '<span class="plus_explain"><span>說明:<br>運作原理是取所有彈幕文字並利用關鍵字篩選<br>如果有在自訂過濾關鍵字新增"空降"or"座標"和開啟自動過濾<br>結果會不同</span></span>';
    ui_html += '<div class="ani-setting-value ani-set-flex-right">';
    ui_html += '<span class="plus_k-label">確認座標<span>說明:已回報的座標</span></span>';
    ui_html += '<span class="plus_k-label" style="background:#bbbbbb;">其它座標<span>說明:<br>其它座標又稱未確定座標,有可能的原因是紀念觀賞時間<br>或未放入"空降"or"座標"關鍵字</span></span>';
    ui_html += '<button class="plus_refresh"><i class="plus_material-icons">refresh</i></button>';
    ui_html += '</div>';
    ui_html += '</div>';
    ui_html += '<div class="plus_time_body">';
    ui_html += '<ul class="plus_no_sub"><img src="https://i2.bahamut.com.tw/anime/no_sub.png"style="width: 33%;"><br>正在努力尋找中···</ul>';
    ui_html += '</div>';
    ui_html += '</div>';
    ui_html += '</div>';
    $("#ani-tab-content").append(ui_html);

    var Firefox_w = '<span class="plus_explain"><span>因Firefox瀏覽器的政策【禁止自動播放聲音】,如果啟動此選項後無法正常播放影片<br>';
    Firefox_w +='請在瀏覽器權限【防止網站自動播放聲音】將【ani.gamer.com.tw】加入例外網站</span></span>';
    if(BrowserCheck("Firefox")[0] != null )$("#firefox_w").after(Firefox_w);


    //網頁全螢幕
    window.Webfullscreen = setInterval(function(){
        let webfullscreen_h = '<button onclick="$(this).web_fullscreen();" class="plus_Web_fullscreen_icon vjs-control vjs-show-tip" type="button" aria-disabled="false" title="網頁全螢幕" ></button>';
        if($(".control-bar-rightbtn").length == 1 && $(".plus_Web_fullscreen_icon").length == 0){
            $(".vjs-fullscreen-control").after(webfullscreen_h);
        }else if($(".plus_Web_fullscreen_icon").length == 1){
            clearInterval(window.Webfullscreen);
        }
    },500);

    var webfullscreen_s = true;
    $.fn.web_fullscreen = function(){
        let win_height = $(window).height();
        let win_width = $(window).width();
        if(webfullscreen_s){
            webfullscreen_s = false;
            $("body").after('<div id="Web_fullscreen_style"></div>');
            $("#animeTip").css("bottom","-40px");
            $("html").css({"overflow-y":"hidden","overflow-x":"hidden"});
            $(".vjs-indent-button").css("display","none");
            $(".vjs-danmu").css("perspective","805.536px");
            $(".videoframe").css("height", win_height + "px");
        }else{
            webfullscreen_s = true;
            $("#Web_fullscreen_style").remove();
            $("#animeTip").css("bottom","0px");
            $("html").css({"overflow-y":"unset","overflow-x":"unset"});
            $(".videoframe").css({"height":"","width":"","margin":""});
            $(".vjs-indent-button").css("display","unset");
            $(".vjs-danmu").css("perspective","401.09px");
        }

        $(document).keydown(function(e) {
            if(e.keyCode == 27 && !webfullscreen_s){
                webfullscreen_s = true;
                $("#Web_fullscreen_style").remove();
                $("#animeTip").css("bottom","0px");
                $("html").css({"overflow-y":"unset","overflow-x":"unset"});
                $(".videoframe").css({"height":"","width":"","margin":""});
                $(".vjs-indent-button").css("display","unset");
                $(".vjs-danmu").css("perspective","");
            }
        });

        $(window).resize(function() {
            if(!webfullscreen_s){
                let win_height = $(window).height();
                $(".videoframe").css("height",win_height+"px");
            }
        });

        //網頁全螢幕CSS
        $('#Web_fullscreen_style').append(`
           <style>
              .container-player {max-width: unset !important;}
              .player {padding-top: 0 !important;margin-top: 0 !important;z-index: 999 !important;position: fixed !important;}
              .videoframe {width: 100% !important;margin: auto !important;max-height: unset !important;}
              .video {width: 100% !important;height: 100% !important;position: unset !important;padding-bottom: unset !important;}
              .BH_background {margin-top: unset !important;position: relative position: fixed}
              @media (min-width: 1000px)
              .BH_background {margin-top: unset !important;}
              .top_sky {display: none !important;}
              .mainmenu {display: none !important;}
              .subtitle {display: none !important;}
           </style>
        `);

        videojs.getPlayer("ani_video").danmu.DanmuManager.onResize();
    };


    //全螢幕偵測
    $(document).on("mozfullscreenchange webkitfullscreenchange fullscreenchange", fullscreenChange);
    function fullscreenChange(){
        let isFullScreen = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen;
        setTimeout(function () {
            if (isFullScreen) {
                $(".plus_Web_fullscreen_icon").css("display", "none");
                $(".plus_picture_in_picture_icon").css("display", "none");
            } else {
                $(".plus_Web_fullscreen_icon").css("display", "");
                $(".plus_picture_in_picture_icon").css("display", "");
            }
        },500);
    }

    //偵測分級標識警告&廣告狀態
    setTimeout(function(){
        window.initial = setInterval(function(){
            if ($("#ani_video_html5_api")[0] == null) return;
            let src = $("#ani_video_html5_api").attr("src");
            let readyState = $("#ani_video_html5_api")[0].readyState;
            if($(".R18").length == 0 && $(".vast-skip-button").length == 0 && src.indexOf("fbcdn.net") == -1 && readyState != 0){
                $("#plus-video-skip-minute").attr("disabled",false);
                $("#plus-video-skip-second").attr("disabled",false);
                $("#plus-video-skip-sendout").attr("disabled",false);
                $("#void_speed").attr("disabled",false);
                if(video_next_skip){video_ended();}
                danmuGetload();
                video_danmun();
                clearInterval(window.initial);
            }
        },1000);
    },1000);



    var countdown = 5; //5秒後切換至下一集
    var repeate = true //防止計時器重複執行

    //自動切換至下一集
    $("#video_next_skip").change(function() {
        GM_setValue('video_next',$(this).prop("checked"));
        $("#plussetup").css("display","block");
        setTimeout(function(){$("#plussetup").css("display","none")},3000);
    });

    if(video_next_skip){
        $("#video_next_skip").prop("checked",true);
        window.next_button = setInterval(function () {
            if($("#ani_video-next").length == 0){
                $("#ani_video").append('<div class="video-next-button" id="ani_video-next" style="display:none"></div>');
            }else{
                clearInterval(window.next_button);
            }
        },1000);
    }

    function video_ended(){
        $("#ani_video-next").html('<p class="vast-skip-button-text" id="video_next_countdown" style="float: left;"></p><p id="stop_video-next" style="cursor:pointer;float: left;padding: 0 0 0 10px;">X</p>');
        $("#ani_video_html5_api").on( 'ended', function() {
            countdown = 5;
            let nextplayer = $('.playing').next().html();
            let match = (nextplayer != null) ? nextplayer.match('<a href="(.*)">')[1] : null;
            if(match != null && repeate){
                video_next();
                repeate = false;
            }
        });
        $("#stop_video-next").click(function () {
            repeate = true;
            $("#ani_video-next").css("display", 'none');
            clearInterval(window.videoend);
        });

    }

    function video_next(){
        window.videoend = window.setInterval(function () {
            let ended = $("#ani_video_html5_api")[0].ended;
            let nextplayer = $('.playing').next().html();
            let match = (nextplayer!=null)?nextplayer.match('<a href="(.*)">')[1]:null;
            if (ended && match != null) {
                $("#ani_video-next").css("display", '');
                $("#video_next_countdown").text(countdown.toString().padStart(2, "0") + " 秒後切換至下一集");
                if (countdown == 1){
                    document.location.href = "https://ani.gamer.com.tw/animeVideo.php" + match
                }else if (countdown < 1){
                    countdown = 1;
                    $("#ani_video-next").css("display", 'none');
                }
                countdown -= 1;
            } else {
                repeate = true;
                $("#ani_video-next").css("display", 'none');
                clearInterval(window.videoend);
            }
        }, 1000)
    }

    //自動同意分級標識警告
    $("#grading").change(function() {
        GM_setValue('ncc_warning',$(this).prop("checked"));
        $("#plussetup").css("display","block");
        setTimeout(function(){$("#plussetup").css("display","none")},3000);
    });

    if(ncc_warning_save){
        let rating_img = $(".rating > img").attr("src");
        let img_cut = rating_img.substr(30);
        $("#grading").prop("checked",true);
        window.ncc = setInterval(function(){
            if($("#adult").length > 0){
                if(img_cut != 'TW-18UP.gif'|| token[1] == 1){
                    setTimeout(function () {$("#adult").click();},1000);
                }
                clearInterval(window.ncc);
            }
        },1000);
    }

    //自動點此跳過廣告
    $("#ad_skip").change(function() {
        GM_setValue('ad_skip',$(this).prop("checked"));
        $("#plussetup").css("display","block");
        setTimeout(function(){$("#plussetup").css("display","none")},3000);
    });


    if(ad_skip_save){
        $("#ad_skip").prop("checked",true);
        window.ad_skip_checker = setInterval(function(){
            var anitxt = ($(".nativeAD-skip-button,.vast-skip-button").length == 1)?$(".nativeAD-skip-button,.vast-skip-button")[0].innerText:null
            var aniad = ($(".video-adHandler-background-blocker").length == 1)?true:false
            if($("video").length && $(".R18").length == 0 && !aniad) {
                clearInterval(window.ad_skip_checker);
            }else if($("video").length && anitxt == "點此跳過廣告" && aniad){
                $("#adSkipButton , .nativeAD-skip-button").click();
            }
        },1000);
    }

    //空降座標
    $('#plus-video-skip-sendout').on('click', function() {
        var minute = $("#plus-video-skip-minute").val();
        var second = $("#plus-video-skip-second").val();
        $("#plus-video-skip-minute").val("");
        $("#plus-video-skip-second").val("");
        if($("#ani_video_html5_api")[0].paused != true){
            $(".vjs-play-control").click();
        }
        fast_forward(minute,second);
    });

    //改變影片時間
    function fast_forward(minute,second){
        let video_minute = parseInt(minute) || 0;
        let video_second = parseInt(second) || 0;
        if((video_minute*60) + video_second < $("#ani_video_html5_api")[0].duration){
            $("#ani_video_html5_api")[0].currentTime = (video_minute*60) + video_second;
            if($("#ani_video_html5_api")[0].paused == true){$(".vjs-play-control").click();}
        }else{
            if($("#ani_video_html5_api")[0].paused == true){$(".vjs-play-control").click();}
            alert("未知的座標,空降失敗");
        }
    }


    //空降足跡-解析影片時間
    function time_parse(stringasc,array,bool){
        var match = stringasc.match(/[0-9]+:[0-9]+/g);
        for(var id in match){
            var split = match[id].split(":");
            var match1 = split[0].match(/[0-9]{2,3}/g),match2 = split[1].match(/[0-9]{2,3}/g);
            var minute = (!match1)? "0"+split[0]:split[0], second = (!match2)? "0"+split[1]:split[1];
            var addjson = {"airborne":bool,"time":minute+":"+second};
            array.push(addjson);
        }
    }


    //空降足跡
    function danmuGet(){
        var array= [];
        var settings = {
            "async": true,
            "crossDomain": true,
            "url": "ajax/danmuGet.php",
            "method": "POST",
            "data": {
                "sn": animefun.videoSn
            }
        }
        $.ajax(settings).done(function (response) {
            $(".plus_time_body").html('<ul class="plus_no_sub" style="display: inline;"></ul>');
            for(var key in response){
                let stringasc = tobig5(response[key].text);
                let match = stringasc.match(/[0-9]{1,3}:[0-9]{1,3}/g);
                if( stringasc.indexOf("空降") != "-1" || stringasc.indexOf("座標") != "-1"){
                    time_parse(stringasc,array,true);
                }else if(match){
                    time_parse(stringasc,array,false);
                }
            }
            var deduped = filter_r(array,'time'); //清除重複
            var json = jsonsort(deduped,'time'); //排序
            if(json.length){
                for(var arrayid in json){
                    let airborne = (json[arrayid].airborne)?"":"background:#bbbbbb;"
                    $(".plus_no_sub").append('<li class="plus_k-label" style="cursor:pointer;'+airborne+'" onclick="$(this).fast_forward_skip(\''+json[arrayid].time+'\')">'+json[arrayid].time+'</li>');
                }
            }else{
                $(".plus_time_body").html('<ul class="plus_no_sub"><img src="https://i2.bahamut.com.tw/anime/no_sub.png"style="width: 33%;"><br>目前沒有人嘗試空降<br>發個彈幕報告空降座標吧!</ul>')
            }
        });
    }


    //空降足跡-改變影片時間
    $.fn.fast_forward_skip = function (match){
        let src = $("#ani_video_html5_api").attr("src");
        let readyState = $("#ani_video_html5_api")[0].readyState;
        if($(".R18").length == 0 && $(".vast-skip-button").length == 0 && src.indexOf("fbcdn.net") == -1 && readyState != 0){
            if($("#ani_video_html5_api")[0].paused != true){$(".vjs-play-control").click();}
            let split = match.split(":");
            fast_forward(split[0],split[1]);
        }
    }

    function danmuGetload() {
        setTimeout(function () {
            danmuGet();//載入空降足跡
            //空降足跡重整
            $(".plus_refresh,#bahablack,.bluebtn").click(function () {
                setTimeout(function () { danmuGet() }, 1000)
            });
        }, 1000)
    }

    //子母畫面
    window.picture = setInterval(function () {
        let picture = '<button id="plus_picture_in_picture" class="plus_picture_in_picture_icon vjs-control vjs-button vjs-show-tip" type="button" aria-disabled="false" title="子母畫面"';
        picture += '"><span aria-hidden="true" class="vjs-icon-placeholder"></span><span class="vjs-control-text" aria-live="polite"></span></button>';
        if($(".control-bar-rightbtn").length == 1 && $("#plus_picture_in_picture").length == 0){
            $(".plus_Web_fullscreen_icon").after(picture);
        }else if($("#plus_picture_in_picture").length == 1){
            clearInterval(window.picture);
            addpicture_in_picture();
        }
    },500);

    function addpicture_in_picture(){
        let video = $("#ani_video_html5_api")[0];
        $("#plus_picture_in_picture").click(function(){
            if(document.pictureInPictureEnabled){
                if (video !== document.pictureInPictureElement){
                    video.requestPictureInPicture();
                }else{
                    document.exitPictureInPicture();
                }
            }else{
                $(".video-js").append('<div id="nopicture" class="vjs-switchRes-button">子母畫面API目前不支援此瀏覽器</div>');
                setTimeout(function () { $("#nopicture").remove() }, 3000);
            }
        });

        video.addEventListener('enterpictureinpicture', () => {
            $("#ani_video_html5_api").attr("poster",picture_screenshot(video,"image/jpeg",0.1));
        });
        video.addEventListener('leavepictureinpicture', () => {
            $("#ani_video_html5_api").attr("poster","");
        });
    }


    function picture_screenshot(video,imagetype,level = null){
        let canvas = document.createElement("canvas");
        canvas.width = 1920;
        canvas.height = 1080;
        let ctx = canvas.getContext("2d");
        ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
        let dataUrl = canvas.toDataURL(imagetype,level);

        return dataUrl;
    }


    //彈幕開關快捷鍵
    $('#danmu_key').val(GM_getValue("danmu_keyname"));
    $('#danmu_key').attr("data-key",GM_getValue("danmu_keyid"));

    $('#danmu_key').keydown(function (event) {
        event.preventDefault();
        var index = [27,32,37,38,39,40,70,77,84]
        if($.inArray(event.which,index) != -1) return;
        $(this).val(event.key);
        $(this).attr("data-key",event.which);
    });

    $("#danmu_key").focus(function(){
        $("#danmu_key_sendout").attr("disabled",false);
    });

    $("#danmu_key_sendout").click(function(){
        var keyname = $('#danmu_key').val();
        var keyid = $('#danmu_key').attr("data-key");
        GM_setValue('danmu_keyname',keyname);
        GM_setValue('danmu_keyid',keyid);
        $(this).attr("disabled",true);
    });

    $(document).keydown(function(event){
        if(event.which == GM_getValue("danmu_keyid")){
            var danmuToggle = $("#danmuToggle")[0]
            var e = videojs.getPlayer('ani_video').danmu.DanmuManager._setting.danmuProcess;
            e ? ($("#danmu-show").prop("checked", !1),danmuToggle.classList.add("vjs-danmu-close"),danmuToggle.title = "關閉彈幕") :
            ($("#danmu-show").prop("checked", !0),danmuToggle.classList.remove("vjs-danmu-close"),danmuToggle.title = "開啟彈幕");
            videojs.getPlayer('ani_video').danmu.DanmuManager.setDanmuProcess(!e);
        }
    });


    //在影片上右鍵選取彈幕
    function video_danmun(){
        $("video").on("mousedown", function(e) {
            e.preventDefault();
            if($(".v_danmu_box").length > 0 && !$(".v_danmu_box").is(e.target) && $(".v_danmu_box").has(e.target).length === 0 ){
                $(".v_danmu_box").remove();
            }else{
                var cmt = $(".danmu");
                var html,danmu_T,danmu_X,danmu_Y,danmu_T_P,find_c,listid;

                for(var i = 0; i <= cmt.length-1; i ++) {

                    if ($(".danmu").length >= 1  && $.inArray('danmu-mode-rolling', cmt[i].classList) == -1) {
                        find_c = $.inArray('useless',cmt[i].classList);
                        cmt[i].style.width = "auto";
                        cmt[i].style.left = ($("#ani_video_html5_api").width() - Number(cmt[i].offsetWidth))/2 +"px";
                        danmu_T_P = cmt[i].offsetLeft;
                    }else if ($(".danmu").length >= 1  && $.inArray('danmu-mode-rolling', cmt[i].classList) != -1){
                        find_c = $.inArray('useless',cmt[i].classList);
                        var style = window.getComputedStyle(cmt[i]);
                        var matrix = new WebKitCSSMatrix(style.webkitTransform);
                        danmu_T_P = matrix.m41;
                    }else{
                        find_c = -1;
                        danmu_T_P = cmt[i].offsetLeft;
                    }

                    danmu_X = (e.offsetX >= danmu_T_P && e.offsetX <= danmu_T_P + cmt[i].offsetWidth);
                    danmu_Y = (e.offsetY >= cmt[i].offsetTop && e.offsetY <= cmt[i].offsetTop + cmt[i].offsetHeight)

                    if(danmu_X && danmu_Y && find_c == -1 && e.button===2){
                        listid = i;
                        var accuse_id = $(".danmu").length >= 1 ? /\d+$/gm.exec(cmt[i].id)[0]:"";
                        var position = e.offsetX > $("#ani_video_html5_api").width() - 421 ? `left:${$("#ani_video_html5_api").width() - 421}px;`:`left:${e.offsetX + 5}px;`;
                        danmu_T = cmt[i].innerText.toString();
                        html =
                            `<div id="video_danmu" style="top:${e.offsetY + 5}px; ${position}" class="v_danmu_box" data-block="${accuse_id}">
                                <div class="v_danmu_box_b">
                                    <input type="text" id="newkeyword" class="v_danmu_text" disabled></input>
                                    <div id="copy" class="v_danmu_menu">複製</div>
                                    <div id="filter" class="v_danmu_menu" style="display:none" onclick="animefun.addkeyword();$('.v_danmu_box').remove();">過濾</div>
                                    <div id="edit" class="v_danmu_menu">編輯</div>
                                    <div id="ben" class="v_danmu_menu">消音</div>
                                    <div id="accuse" class="v_danmu_menu" style="background-color: #960505b5;">檢舉</div>
                                </div>
                            </div>`;
                    }

                    if($(".danmu").length >= 1  && cmt[i].classList[1] != "danmu-mode-rolling"){
                        cmt[i].style.width = "";
                        cmt[i].style.left = "";
                    }

                }
                if($(".v_danmu_box").length < 1 )$(".video-js").append(html);
                $(".v_danmu_text").val(danmu_T);
                video_danmun_edit();
                video_danmun_copy();
                video_danmun_accuse(listid);
                video_danmun_ben();
            }
        });
    };


    //彈幕編輯
    function video_danmun_edit(){
        $("#edit").click(function(){
            $(this).text( $(this).text() == "編輯" ? "取消" : "編輯");
            $('.v_danmu_text').attr('disabled', function(index, attr){
                return attr == "disabled" ? false : true;
            });
            $('.v_danmu_text').css('background-color', function(index, css){
                return css == "rgba(255, 255, 255, 0)" ? "rgba(255, 255, 255, 0.2)" : "rgba(255, 255, 255, 0)";
            });
            $('.v_danmu_text').focus();
            $("#copy,#accuse,#filter,#ben").toggle();
        })
    }

    //彈幕複製
    function video_danmun_copy(){
        $("#copy").click(function(){
            $('#danmutxt').val($(".v_danmu_text").val());
            $('.v_danmu_box').remove();
            $('#danmutxt').focus();
        })
    }


    //彈幕檢舉
    function video_danmun_accuse(i){
        if($(".danmu").length == 0)$("#accuse").remove();
        $("#accuse").click(function(){
            var blocksn = $(this).parent().parent().data("block");
            video_danmun_accuselink(blocksn,i);
            $('.v_danmu_box').remove();
        })
    }

    //彈幕消音
    function video_danmun_ben(){
        if($(".danmu").length == 0)$("#ben").remove();
        $("#ben").click(function(){
            var data = animefun.danmu;
            var blocksn = $(this).parent().parent().data("block");
            for (var key in data) {
                if(data[key].sn == blocksn){
                    video_danmun_benlink(data[key].userid,blocksn)
                    $('.v_danmu_box').remove();
                }
            }
        })
    }

    //送出彈幕檢舉
    function video_danmun_benlink(uid,videoSn){
        getCSRFToken().done(function(token) {
            jQuery.ajax({
                url: '/ajax/blackUser.php',
                data: {'fid':uid,'cno':0,'token':token,'vidoeSn':sn},
                method: 'POST',
                dataType: 'json'
            }).done(function(rdata) {
                if (rdata.error) {
                    $(".video-js").append(`<div id="nopicture" class="vjs-switchRes-button">消音失敗,請稍後再試</div>`);
                    setTimeout(function () { $("#nopicture").remove() }, 3000);
                } else {
                    $(".refresh").click();
                }
            });
        });
    }

    //送出彈幕消音
    function video_danmun_accuselink(sn,i){
        getCSRFToken().done(function(token) {
            var apiLink = 'https://api.gamer.com.tw/mobile_app/anime/'
            jQuery.ajax({
                url: apiLink + 'v1/danmu_accuse.php',
                data: {'danmaku_sn': [sn], 'token': token},
                method: 'POST',
                dataType: 'json',
                xhrFields: {
                    withCredentials: true
                }
            }).done(function(rdata) {
                if (rdata.code == 0) {
                    $(".video-js").append(`<div id="nopicture" class="vjs-switchRes-button">檢舉失敗,請稍後再試</div>`);
                    setTimeout(function () { $("#nopicture").remove() }, 3000);
                } else {
                    $(".danmu")[i].innerText = "已完成檢舉!";
                }
            });
        });
    }

    //Tool

    //用戶狀態
    function Token(){
        var vip,login;
        $.ajax({
            url: 'ajax/token.php',
            data: { sn: sn, device: deviceid},
            type: "GET",
            async: false,
            success: function(t) {
                var e = jQuery.parseJSON(t);
                vip = e.vip;
                login = e.login;
            }
        });
        return [vip,login];
    }

    //Token
    function getCSRFToken() {
        return jQuery.ajax({
            url: '/ajax/getCSRFToken.php',
            cache: false
        });
    }

    //文字半形全形轉換
    function tobig5(obj){
        var text = obj;
        var asciiTable = "!\"#$%&\’()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
        var big5Table = "%uFF01%u201D%uFF03%uFF04%uFF05%uFF06%u2019%uFF08%uFF09%uFF0A%uFF0B%uFF0C%uFF0D%uFF0E%uFF0F%uFF10"+
            "%uFF11%uFF12%uFF13%uFF14%uFF15%uFF16%uFF17%uFF18%uFF19%uFF1A%uFF1B%uFF1C%uFF1D%uFF1E%uFF1F%uFF20%uFF21%uFF22%uFF23"+
            "%uFF24%uFF25%uFF26%uFF27%uFF28%uFF29%uFF2A%uFF2B%uFF2C%uFF2D%uFF2E%uFF2F%uFF30%uFF31%uFF32%uFF33%uFF34%uFF35%uFF36"+
            "%uFF37%uFF38%uFF39%uFF3A%uFF3B%uFF3C%uFF3D%uFF3E%uFF3F%u2018%uFF41%uFF42%uFF43%uFF44%uFF45%uFF46%uFF47%uFF48%uFF49"+
            "%uFF4A%uFF4B%uFF4C%uFF4D%uFF4E%uFF4F%uFF50%uFF51%uFF52%uFF53%uFF54%uFF55%uFF56%uFF57%uFF58%uFF59%uFF5A%uFF5B%uFF5C"+
            "%uFF5D%uFF5E";
        var result = "";
        for (var i = 0; i < text.length; i++) {
            var val = escape(text.charAt(i));
            var j = big5Table.indexOf(val);
            result += (((j > -1) && (val.length == 6)) ? asciiTable.charAt(j / 6) : text.charAt(i));
        }
        return result;
    }


    //清除Json重複
    function filter_r(arr,attr){
        var tmp = {},re = [],len = arr.length;
        for(var i=0;i<len;i++){
            if(!(arr[i][attr] in tmp)) re.push(arr[i]);
            tmp[arr[i][attr]] = 1;
        }
        return re;
    }


    //排序Json
    function jsonsort(json,key){
        for(var j=1; j < json.length; j++){
            var temp = json[j],val = temp[key],i = j-1;
            while(i >=0 && json[i][key]>val){
                json[i+1] = json[i];
                i = i-1;
            }
            json[i+1] = temp;
        }
        return json;
    }

    //修改 alert Function
    function blockalert(v){
        unsafeWindow.alert = function (t) {
            if (!t.includes(v)){
                alert(t);
            }
        };
    }

    //瀏覽器檢查
    function BrowserCheck(name){
        let Regex = name+"/(\\d*)";
        let re = new RegExp(Regex,"gm");
        let Browser = window.navigator.userAgent.match(re);
        let Search = (Browser!= null)?Browser[0].indexOf(name):null;
        let BrowserVar = (Browser!= null)?Browser[0].match(/\d*$/gm):[0];
        return [Search,BrowserVar[0]];
    }


})();