[Typing-Tube]試聴再生を追加

try to take over the world!

目前為 2022-06-28 提交的版本,檢視 最新版本

// ==UserScript==
// @name         [Typing-Tube]試聴再生を追加
// @namespace    http://tampermonkey.net/
// @version      3.7
// @description  try to take over the world!
// @author       You
// @include        https://typing-tube.net*
// @exclude      https://typing-tube.net/movie/*

// ==/UserScript==
let Phone_flag = navigator.userAgent.match(/(iPhone|iPod|iPad|Android.*Mobile)/i)
let control_enable = 1
let humenID = 0
let request_videoid = ""
let img_selector
let td_flag = false
let resize_dom
let hover_id = 0
let hover_request_videoid = ""
let demo_player_html = document.createElement('div');
demo_player_html.setAttribute("id", "player_demo");
let tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
let start_time = 0
let img_height_size = 0
let img_width_size = 0
let preview_time = 0

let transparent_cover = document.createElement('div');
transparent_cover.setAttribute("id", "transparent_cover");

let loading_html = document.createElement('span');
loading_html.setAttribute("id", "loading_logo");
loading_html.setAttribute("class", "loader");





let speed_Fixed = [0.25,0.5,0.75,1.00,1.25,1.5,1.75,2]
let speed_title
function set_preview_video(event){
if(event.key == "Shift"){
    if(hover_id && hover_id[0] != humenID[0]){
        humenID = hover_id
        $.ajax({
            type: 'POST',
            url: '/movie/lyrics/' + humenID,
            success:function(data){
                const data_split = data.split("\n")
                start_time = -1
				 speed_title = data_split[0].match(/^【\d?\.?\d?\d倍速】/)
				if(speed_title){
					speed_title = parseFloat(speed_title[0].slice(1))
					if(!speed_Fixed.includes(speed_title)){
						speed_title = false
					}
				}
                for(let i=0;i<data_split.length;i++){
                    if(i>0){
                        if(start_time == -1 && data_split[i].split("\t")[2]){
                            start_time = Math.floor(+data_split[i].split("\t")[0])
                            preview_time = +data_split[i].split("\t")[0]
                        }else if(data_split[i].split("\t")[0].substr( -5, 1 ) == "."){
                            start_time = Math.floor(+data_split[i].split("\t")[0])
                            preview_time = +data_split[i].split("\t")[0]
                            break;
                        }
                    }
                }
                demo_video_delete()
                control_enable = 0
            if(timeline_flag && !user_timeline_flag){
				transparent_cover.setAttribute("style", "left: 0;right: 0;margin: auto;");
  //              demo_player_html.setAttribute("style", "left: 0;right: 0;margin: auto;z-index:1;opacity: 0;");
            }else{
                demo_player_html.setAttribute("style", "opacity: 0;");
				transparent_cover.setAttribute("style", "z-index:1;");
			}
                onYouTubeIframeAPIReady_demo(data.match(/(v=).*\n/)[0].slice(2))
            }
        });
    }else if(hover_request_videoid && request_videoid != hover_request_videoid){
        demo_video_delete()
        request_videoid = hover_request_videoid
        control_enable = 1
        preview_time = 0
            if(timeline_flag && !user_timeline_flag){
				transparent_cover.setAttribute("style", "left: 0;right: 0;margin: auto;");
 //               demo_player_html.setAttribute("style", "left: 0;right: 0;margin: auto;z-index:1;opacity: 0;");
            }else{
				demo_player_html.setAttribute("style", "opacity: 0;z-index:1;");
			}
        onYouTubeIframeAPIReady_demo(request_videoid)
    }
}
}



var player_demo
let username_selector
function onYouTubeIframeAPIReady_demo(preview_videoid) {

        if(td_flag){
            img_height_size = 60
            img_width_size = 90
            document.getElementsByTagName('section')[0].insertAdjacentHTML('beforebegin', `<div id="player_demo" style="opacity: 0;"></div>`)
            document.getElementById("player_demo").parentNode.insertBefore(transparent_cover, document.getElementById("player_demo"));
			document.getElementById("transparent_cover").appendChild(loading_html);
			document.getElementById("loading_logo").style.top = "42px"
			document.getElementById("loading_logo").style.left = "88%"
			if(td_flag.classList[0] == "mt-5"){
const elements = [].slice.call( document.querySelectorAll("li.mt-5") ) ;
// 要素の順番を取得
if(elements.indexOf( td_flag )){
				document.getElementById("player_demo").classList.add('mt-5');
				document.getElementById("transparent_cover").classList.add('mt-5');
}
			}
				demo_player_html.setAttribute("style", "position:absolute;opacity: 0;");
				document.getElementById("transparent_cover").setAttribute("style", "z-index:1;");
			transparent_cover.style.height = (img_height_size)+"px"
			transparent_cover.style.width = (img_width_size)+"px"
        }else if(img_selector){
            img_height_size = img_selector.height
            img_width_size = img_selector.width

            if(timeline_flag){
						if(!user_timeline_flag){
					img_selector.parentNode.classList.add('col-12');
					username_selector = img_selector.parentNode.querySelector(".username")
				//	demo_player_html.style.top = (parseInt(getComputedStyle( username_selector, null ).marginBottom)+username_selector.offsetHeight)+"px"
					transparent_cover.style.top = (parseInt(getComputedStyle( username_selector, null ).marginBottom)+username_selector.offsetHeight)+"px"
				}
            }
			transparent_cover.style.height = (img_height_size)+"px"
			transparent_cover.style.width = (img_width_size)+"px"
if(hover_id){
			transparent_cover.setAttribute("href", "https://typing-tube.net/movie/show/"+humenID);
}else if(hover_request_videoid){
	transparent_cover.setAttribute("href", "/movie/edit?videoid="+request_videoid);
}
            img_selector.parentNode.insertBefore(demo_player_html, img_selector);
            img_selector.parentNode.insertBefore(transparent_cover, img_selector);
			document.getElementById("transparent_cover").appendChild(loading_html);


			document.getElementById("loading_logo").style.top = ""
			document.getElementById("loading_logo").style.left = ""
			document.getElementById("transparent_cover").addEventListener("mousedown",mouseclick_event,true)
            demo_player_html = document.getElementById("player_demo").cloneNode(true)
            resize_dom = img_selector.parentNode.querySelector("img[src*='i.ytimg.com']")
        }

    player_demo = new YT.Player('player_demo', {
        height: img_height_size ,
        width: img_width_size ,
        playerVars: {
            autoplay: 1,
            disablekb: 1,
            modestbranding:1,
            origin: location.protocol + '//' + location.hostname + "/",
            start: start_time
        },
        videoId: preview_videoid,
        events: {
            'onReady': onPlayerReady_demo,
            'onStateChange': onPlayerStateChange_demo

        }
    });
}

function onPlayerReady_demo(event) {
    player_demo.setVolume(+document.getElementById("volume_control").value)
    window.addEventListener('keydown',keydown_et,true);
    player_demo.seekTo(preview_time-0.07)

}

function onPlayerStateChange_demo(event) {
if(player_demo){
	if(event.data == 0){
		demo_video_delete()

	}else if(event.data == 1){
	if(speed_title){
		player_demo.setPlaybackRate(speed_title);
	}
		document.getElementById("player_demo").style.opacity = 1

	}else if(event.data == -1){

	}
}
}


function keydown_et(event){
    if(event.key == "Escape"){
        demo_video_delete()
		humenID = 0
		request_videoid = ""
if(!img_selector){
		hover_id = 0
		hover_request_videoid = ""
}
        window.removeEventListener('keydown',keydown_et,true);
    }
}

function demo_video_delete(){
    if(player_demo){
        if(resize_dom){
			resize_dom.style.opacity = 1
            resize_dom = 0
        }
if(document.getElementById("loading_logo") != null){
		document.getElementById("loading_logo").remove()
}
if(document.getElementById("player_demo") != null){
		document.getElementById("player_demo").remove()
}
        player_demo = false
    }
}








//Set EventListener

window.addEventListener( 'resize', function() {
    if(resize_dom && document.getElementById("player_demo") != null && img_height_size != 60){
        img_height_size = resize_dom.height
        img_width_size = resize_dom.width
		document.getElementById("transparent_cover").style.height = img_height_size+"px"
		document.getElementById("transparent_cover").style.width = img_width_size+"px"
        document.getElementById("player_demo").setAttribute("height",img_height_size)
        document.getElementById("player_demo").setAttribute("width",img_width_size)
            if(timeline_flag){
				if(!user_timeline_flag){
				document.getElementById("player_demo").style.top = (parseInt(getComputedStyle( username_selector, null ).marginBottom)+username_selector.offsetHeight)+"px"
				document.getElementById("transparent_cover").style.top = (parseInt(getComputedStyle( username_selector, null ).marginBottom)+username_selector.offsetHeight)+"px"
				}
            }
    }
}, false );
window.addEventListener("keyup", set_preview_video,true);



//Create Volume Control

function video_volume_change(){
    if(document.getElementById("player_demo") != null){
        player_demo.setVolume(+document.getElementById("volume_control").value)
    }
    localStorage.setItem('volume_storage',document.getElementById("volume_control").value)
	document.getElementById("volume").textContent = document.getElementById("volume_control").value;
}

let set_selector = document.querySelector(`[class="row w-100"]`) && document.getElementsByClassName("level").length < 2 ? document.getElementsByClassName("level")[0].parentNode : document.getElementById("main_content")
set_selector.insertAdjacentHTML('afterbegin', `<div id="demo_play_container" style="
    display: flex;
margin-top: 25px;
margin-left: 30px;
"><label id="volume_control_area" style="
    display: flex;
justify-content: flex-end;
    position: relative;
    align-items: baseline;
    margin-right: 42px;
    "><span style="/* position:absolute; */"><span style="
    position: absolute;
    z-index: -1;
    top: -22px;
    /* left: 3px; */
    color: #FFFFFF88;
">Volume</span><input type="range" id="volume_control" value="70" step="1" max="100"><span style="margin-left: 10px;    position: absolute;
    top: 5px;"><span id="volume" style="
    background: #00000088;
    padding: 3px;
    border: solid thin;
    border-radius: 5px;
    position: absolute;
    top: -10px;
    min-width: 25px;
    text-align: center;
">`+localStorage.getItem("volume_storage")+`</span></span></span></label>
<span style="
    display: flex;
    flex-direction: column;
    position: relative;
    top: -13px;
    margin-left: 25px;
    background: #111111b5;
    padding: 3px 7px 2px 7px;
    border-radius: 11px;
"><span>再生したい動画にカーソルを合わせてShiftキー:再生</span><span>再生中にEscapeキー:停止</span></span></div>
<style>
#volume_control {
  -webkit-appearance: none;
  width: 11rem;
  background: transparent;
}

#volume_control:focus {
  outline: none;
}

#volume_control::-webkit-slider-runnable-track {
  height: 1.5rem;
  margin: 0;
  width: 100%;
  cursor: pointer;
  background: #464646;
  background: linear-gradient(
    to bottom right,
    transparent 50%,
    #000000bb 50%
  );
}

#volume_control::-moz-range-track {
  height: 1.5rem;
  margin: 0;
  width: 100%;
  cursor: pointer;
  background: #464646;
  background: linear-gradient(
    to bottom right,
    transparent 50%,
     #000000bb 50%
  );
}


#volume_control::-webkit-slider-thumb {
  -webkit-appearance: none;
  height: 1.9rem;
  width: 0.5rem;
  background: #ffffff;
  border: 1px solid;
  margin-top: -3px;
  border-radius: 3px;
  cursor: pointer;
}



#volume_control::-moz-range-thumb {
  -webkit-appearance: none;
  height: 1.9rem;
  width: 0.5rem;
  background: #ffffff;
  border: 1px solid;
  border-radius: 3px;
  cursor: pointer;
  margin-top: 0;
}

#volume_control:focus::-moz-range-thumb {
  box-shadow: 0px 0px 7px 3px #0065c4;
}
#transparent_cover{
position:absolute;
cursor:pointer;
}
#player_demo{
    position: fixed;
    z-index: 103;
    width: 355px;
    height: 200px;
    bottom: 30px;
    right: 17px;
}
.loader,
.loader:before,
.loader:after {
  background: #ffffff;
  -webkit-animation: load1 1s infinite ease-in-out;
  animation: load1 1s infinite ease-in-out;
  width: 1em;
  height: 4em;
}
.loader {
left: 95%;
    top: -20px;
  color: #ffffff;
  text-indent: -9999em;
  z-index:1;
  position: absolute;
  font-size: 3px;
  -webkit-transform: translateZ(0);
  -ms-transform: translateZ(0);
  transform: translateZ(0);
  -webkit-animation-delay: -0.16s;
  animation-delay: -0.16s;
}
.loader:before,
.loader:after {
  position: absolute;
  top: 0;
  content: '';
}
.loader:before {
  left: -1.5em;
  -webkit-animation-delay: -0.32s;
  animation-delay: -0.32s;
}
.loader:after {
  left: 1.5em;
}
@-webkit-keyframes load1 {
  0%,
  80%,
  100% {
    box-shadow: 0 0;
    height: 4em;
  }
  40% {
    box-shadow: 0 -2em;
    height: 5em;
  }
}
@keyframes load1 {
  0%,
  80%,
  100% {
    box-shadow: 0 0;
    height: 4em;
  }
  40% {
    box-shadow: 0 -2em;
    height: 5em;
  }
}

</style>`)
document.getElementById("volume_control").addEventListener("input", video_volume_change);
document.getElementById("volume_control").setAttribute("value",localStorage.getItem('volume_storage'))
if(Phone_flag){document.getElementById("demo_play_container").style.display = "none"}




//Set Mouse EventListener
let timeline_flag = false
let user_timeline_flag = false
function get_img(event){
    const find_selector_word = ["timeline","mt-3","col"]
    for(let i=0;i<find_selector_word.length;i++){
        if(event.target.closest("[class*="+find_selector_word[i]+"]") && event.target.closest("[class*="+find_selector_word[i]+"]").querySelector("img[src*='i.ytimg.com']")){
			if(find_selector_word[i] == "timeline" && location.href.match("user")){
				timeline_flag = true
				user_timeline_flag = true
			}else if(find_selector_word[i] == "timeline"){
				timeline_flag = true
				user_timeline_flag = false
			}else{
				timeline_flag = false
				user_timeline_flag = false
			}
            return event.target.closest("[class*="+find_selector_word[i]+"]").querySelector("img[src*='i.ytimg.com']")
        }
    }
    return false
}

function mouseover_event(event) {
const hover_link = event.target.closest("[href*='movie/show/']")?event.target.closest("[href*='movie/show/']"):event.target.closest("[href*='edit?']")
if(hover_link){
if(hover_link.href){
        img_selector = get_img(event)
if(hover_link.closest("[style*='i.ytimg.com']")){
td_flag = hover_link.closest("[style*='i.ytimg.com']")
}else if(hover_link.querySelector("[style*='i.ytimg.com']")){
td_flag = hover_link.querySelector("[style*='i.ytimg.com']")
}else{
td_flag = false
}
if(hover_link.href.match("videoid=")){
    hover_request_videoid = hover_link.href.replace("https://typing-tube.net/movie/edit?videoid=","")
}else{
    hover_id = hover_link.href.match(/[0-9]+\.?[0-9]*/g)
}
}
}
}
function mouseout_event(event) {
    img_selector = false
    td_flag = false
    hover_id = humenID
    hover_request_videoid = request_videoid
}

function mouseclick_event(event){
if(event.shiftKey || event.ctrlKey || event.button == 2){
	humenID = 0
	hover_id = 0
	request_videoid = ""
	hover_request_videoid = ""
	demo_video_delete()

}
}

function hidden_delete(){
if(document.getElementById("player_demo") && document.getElementById("player_demo").offsetParent == null){
	humenID = 0
	hover_id = 0
	request_videoid = ""
	hover_request_videoid = ""
	demo_video_delete()
}
}

function eventlistener(){
    let typing_link = document.querySelectorAll("[href*='movie/show/']")
    let edit_link = document.querySelectorAll("[href*='edit?']")
    for(let n = 0; n < typing_link.length ; n++){
        typing_link[n].addEventListener("mouseout",mouseout_event,true)
		typing_link[n].addEventListener("mousedown",mouseclick_event,true)
    }
    for(let n = 0; n < edit_link.length ; n++){
        edit_link[n].addEventListener("mouseout",mouseout_event,true)
		edit_link[n].addEventListener("mousedown",mouseclick_event,true)
    }
window.addEventListener("mouseover",mouseover_event,true)
//window.addEventListener("click",hidden_delete,false)
}
eventlistener();