# nlフィルタ定義(文字コード判定用なのでこの行は削除しないこと)
#original 20170602
#modified 20170603 js部の再実装, スライダーのスナップ, リセットボタン, 位置変更 by ◆2TK8xdazzp3d
#modified 20170603 スタイル最適化、ボタン追加等 by ◆awd5z.AlOFJq

# 注意1: 導入・除去にはwatchページのハード再読み込みが必要
# 注意2: 公式プレイヤーが動かなくなる可能性あり(ソースコードを無視して無理やり書き換えているため)
# 注意3: 0.50,0.75,1.00,1.25,...へのスナップはChromeでのみ動作

[Script]
Name = Playbackrate Changer[HTML5]
URL = www\.nicovideo\.jp\/watch\/
Require = 'html5';
Append<
window.addEventListener("load", function(){
"use strict";
const
  // 動画を切り替えた時にvideoが再生成されるので
  // videoの親要素を監視してvideoタグが作られたら再生速度を設定
  VideoContainerObserver = function(VideoContainer) {
    var
      F1 = function (mutation) {
        var video = VideoContainer[0].getElementsByTagName("video");
        if (video[0]) {
          video[0].playbackRate = +document.getElementById("pce-speed").value;
          return true;
        }
      },
      observer = new MutationObserver(F1);
    F1(); // 最初からvideoタグが存在する場合のために最初に一度走らせる
    observer.observe(VideoContainer[0], {childList: true});
  },
  setup = function() {
    var VideoContainer = document.getElementsByClassName("VideoContainer");
    if (VideoContainer[0] == null) return;
    
    var speed = document.getElementById("pce-speed");
    var output = document.getElementById("pce-value");
    // スライダーを動かした時の処理
    var speedChangedHandler = function() {
      var rate = +speed.value;
      output.innerText = rate;
      
      var video = document.getElementsByTagName("video");
      if (video[0]) video[0].playbackRate = rate;
    };
    speed.addEventListener('input', speedChangedHandler);
    
    // 初期値設定
    speed.value = 1.00;
    output.innerText = 1.00;
    
    // Resetボタンを押した時はスライダーを等速へ動かしたことにする
    document.getElementById("pce-reset").addEventListener("click", function() {
      speed.value = 1.00;
      speedChangedHandler();
    });
	
	document.getElementById("pce-plus-0.01").addEventListener("click", function() {
      speed.value = parseFloat(speed.value) + parseFloat(0.01);
      speedChangedHandler();
    });
	
	document.getElementById("pce-plus-0.1").addEventListener("click", function() {
      speed.value = parseFloat(speed.value) + parseFloat(0.10);
      speedChangedHandler();
    });
	
	document.getElementById("pce-plus-1").addEventListener("click", function() {
      speed.value = parseFloat(speed.value) + parseFloat(1.00);
      speedChangedHandler();
    });
	
	document.getElementById("pce-minus-0.01").addEventListener("click", function() {
      speed.value -= 0.01;
      speedChangedHandler();
    });
    
	document.getElementById("pce-minus-0.1").addEventListener("click", function() {
      speed.value -= 0.10;
      speedChangedHandler();
    });
	
	document.getElementById("pce-minus-1").addEventListener("click", function() {
      speed.value -= 1.00;
      speedChangedHandler();
    });
    // videoの親要素を監視開始
    VideoContainerObserver(VideoContainer);
  };
setup();

});
>

[Replace]
Name = Kill official playbackRate controller[HTML5]
URL = [^/]+.nimg.jp/(?:web/)?scripts/pages/watch/watch_(?:app|dll).js
Multi = TRUE
Match<
playbackRate
>
Replace<
playbackRate_
>

[Replace]
Name = Pl-Ch-Elem[HTML5]
URL = www\.nicovideo\.jp\/watch\/
Require = 'html5';
Match<
</body>
>
Replace<
/* Playbackrate-Changer-Element(pce) */
<div id="pce-wrapper">
<div id="pce-title"><h3>Playbackrate Changer</h3></div>
<div><input id="pce-speed" type="range" min="0.01" max="4" step="0.01" value="1" list="pce-speed-list"></div>
<datalist id="pce-speed-list">
<option value="0.50">
<option value="0.75">
<option value="1.00">
<option value="1.25">
<option value="1.50">
<option value="2.00">
<option value="3.00">
</datalist>
<div id="pce-value"></div>
<input id="pce-minus-0.01" type="button" value="-0.01">
<input id="pce-minus-0.1" type="button" value="-0.1">
<input id="pce-minus-1" type="button" value="-1">
<input id="pce-reset" type="button" value="reset">
<input id="pce-plus-1" type="button" value="+1">
<input id="pce-plus-0.1" type="button" value="+0.1">
<input id="pce-plus-0.01" type="button" value="+0.01">
</div>
<style>
#pce-wrapper::before{
display:block;
position:absolute;
top:0;bottom:0;left:0;right:0;
background:white;
filter: blur(7px);
opacity: .9;
content:' ';
z-index: -1;
}
#pce-wrapper{
position:fixed;
z-index: 10000; /*siteHeader.css line84 override*/
right:1px;
bottom:30px;
width: 380px;
height: 100px;
border-style: solid;
border-width: 2px;
border-color: lightblue;
}
#pce-speed{ width: 100%; }
</style>
/* pce */
</body>
>

