// ==UserScript==
// @name youtube channel video fliter/search demo
// @description Simpler to find songs and singing videos in the vtuber streaming channel.
// @namespace ytb_channel_video_fliter
// @author Covenant
// @version 1.0.5
// @license MIT
// @homepage
// @match https://www.youtube.com/channel/*/videos*
// @match https://www.youtube.com/channel/*/streams*
// @match https://www.youtube.com/c/*/videos*
// @match https://www.youtube.com/c/*/streams*
// @match https://www.youtube.com/@*/videos*
// @match https://www.youtube.com/@*/streams*
// @match https://www.youtube.com/user/*/videos*
// @match https://www.youtube.com/user/*/streams*
// @match https://www.youtube.com/feed/subscriptions*
// @icon data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///8AEiP//xIj//8SI///EyP//xIj//8SI///EiP//xIj//8SI///EyP//xIj//8SI///EiP//xIj//////8AEiP//wAc7v8AHO7/AB3v/wAc7v8AHO7/ABzu/wAc7v8AHO7/ABzu/wAd7/8AHe//ABzu/wAc7/8AHe//EiP//xIj//8SI////////09V//+6uv////////////9PVf//z87///////+ysv//EiP//5ub////////0tH//xIj//8SI///EiP///////9PVf///////xIj////////T1X///////8SI////////5qZ////////EiP//xIj//8TI///EiP//xIj////////T1X///////8TI////////09V////////EiP///////+amf/////////////S0f//EiP//xIj//8SI////////09V////////EiL///////9PVf////////////+6uv//EiP//7q6///v8P//0tH//xIj//8SI///EyP///////8SI///EiP//xIj//8SI///EiP///////8SI///EiP//xIj//8SI///EiP//xIj//8SI///EiP//////////////////xIj//8SI///EiP//xMj////////EiP//xIj//8SI///EiP//xIj//8SI///EiP//9nZ//8SI///EiP//xMj//8SI///EiP//xIj//8SI///EiP//xIj//8SI///EiP//xIj//8SI///EiL//9na//////////////////////////////////////////////////////////////////////////////////////////////////+r5/b/AAAA//372P//////R5K5/wAAAP/IiWb//////26v1f8AAAD/rGZE////////////////////////////qub1/wAAAP/+/Nj/qub2/wAAAP//////AAAA//782P8TcJ3//vzY/wAAAP///////////////////////////6rm9f8AAAD//vzY/6rm9v8AAAD//////wAAAP/+/Nj/AAAA//////8AAAD///////////////////////////9ur9b/AAAA/+PFov//////R5K6/wAAAP/JiWb//////wAAAP//////AAAA////////////////////////////AAAA//+p7/8AAAD/////////////////////////////////////////////////////////////////bq7V/wxKf///////rGZE/+PFov//////////////////////////////////////////////////////gAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @connect
// @run-at document-end
// @noframes
// ==/UserScript==
var div_fixed;
var btn_print;
var input_sec;
var input_word;
var p_console_log;
var panel_ytb=GM_getValue('panel_ytb',true);
var is_enable=GM_getValue('is_enable',true);
function create_style(textContent,id,class_name){
let style=create_node("style",class_name,true,document.body);
style.type='text/css';
style.id=id;
style.textContent=textContent;
return style;
}
const font_family_panel_important="font-family: 'Noto Sans Mono','Noto Mono','Cascadia Mono','Consolas','DroidSans_Mono','Courier New','symbol_emoji','color_emoji','Noto Sans CJK JP','Meiryo','Yu Gothic','Microsoft JhengHei','old_emoji',sans-serif !important;";
const font_family_default="font-family: 'Noto Sans','Segoe UI','Roboto_2','color_emoji','Noto Sans CJK JP','Meiryo','Yu Gothic','Microsoft JhengHei','old_emoji',sans-serif;";
const font_face_default=`
@font-face{font-family: 'color_emoji';src: local('Twemoji Mozilla'),/*url('file:///C:/Program Files/Mozilla Firefox/fonts/TwemojiMozilla.ttf'),*/local('Noto Color Emoji'),local('Segoe UI Emoji'),local('Apple Color Emoji');
@font-face{font-family: 'symbol_emoji';src: local('Segoe UI Symbol');}\n@font-face{font-family: 'old_emoji';src: local('Noto Color Emoji');}
@font-face{font-family: 'DroidSans_Mono';src: local('DroidSansMono');}\n@font-face{font-family: 'Cutive_Mono';src: local('Cutive Mono');}
@font-face{font-family: 'Roboto_2';src: local('Roboto');}\n@font-face{font-family: 'Noto_Serif';src: local('NotoSerif');}\n@font-face{font-family: 'Dancing_Script';src: local('DancingScript');}\n`;
var style_font_face=create_style(font_face_default,"gm_font_face_ytb_channel_video_fliter_demo",["user_gm_font_face","css_ytb_channel_video_fliter_demo"]);
var style_user_css=create_style(".user_input_fixed,.user_btn_panel_fixed,.p_console_log{"+font_family_panel_important+"font-weight: 300;}\n","gm_user_css_ytb_channel_video_fliter_demo",["user_gm_css","css_ytb_channel_video_fliter_demo"]);
style_user_css.textContent+=`input.user_input_fixed{width: auto;max-width: 95%;border-radius: 0.5rem;padding: 0.25em;}
.user_input_fixed,.user_btn_panel_fixed{font-size: 120%;}
.input_font_family{min-width: 90%;}\ndiv.div_br{width: 100%;}
.user_div_fixed_ytb{position:fixed !important;z-index: 65535;top: 30%;right: 0px;font-size: 1.5rem;}
.user_div_fixed_ytb{background: #00000033;display: flex;justify-content: flex-end;flex-wrap: wrap;min-width: 32rem;}\ndiv.div_br{width: 100%;}
.user_btn_margin{margin-right: 2px;margin-left: 3px;margin-top: 1px;margin-bottom: 1px;padding-left: 5px;padding-right: 5px;}
.user_btn_panel_fixed{min-width: 5em;min-height: 1em;max-height: 2em;}
.display_none,#gm_css.display_none{display: none !important;}\n.display_none_fixed_ytb{display: none;}\n`;
function create_div(class_name,is_appendChild,node,refNode){
let div=create_node("div",class_name,is_appendChild,node,refNode);
div.style.backgroundSize='contain';
div.style.backgroundRepeat='no-repeat';
div.lang='ja';
return div;
}
function create_btn(innerText,class_name,is_appendChild,node,refNode){
let btn=create_node_text("button",innerText,class_name,is_appendChild,node,refNode);
return btn;
}
function create_input(placeholder,class_name,is_num,is_appendChild,node,refNode){
let input=create_node("Input",class_name,is_appendChild,node,refNode);
input.placeholder=placeholder;
input.type="text";
input.title=placeholder;
if(is_num)input.size="15";
if(is_num)input.setAttribute("maxlength", "10");
if(is_num)input.setAttribute("oninput","this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\\..*?)\\..*/g, '$1');");
return input;
}
function create_node(tagname,class_name,is_appendChild,node,refNode){
let element=document.createElement(tagname);
if(Array.isArray(class_name)){
for(let i=0; i<class_name.length; i++){element.classList.add(class_name[i]);}
}else if(typeof class_name==='string'){element.classList.add(class_name);}
if(is_appendChild){node.appendChild(element);}else{node.insertBefore(element, refNode);}
return element;
}
function create_node_text(tagname,innerText,class_name,is_appendChild,node,refNode){
let element = create_node(tagname,class_name,is_appendChild,node,refNode);
element.innerText=innerText;
element.lang='ja';
return element;
}
function fn_url(url){
let obj_url=new URL(url);
let params=obj_url.searchParams;
//let params=new URLSearchParams(obj_url.search);
return [obj_url,params];
}
function console_log_tmp(text,bool){
let div_log=p_console_log;
div_log.innerHTML+=text+" ";
if(bool){div_log.innerHTML=text;}
}
//console.log("break");
function fn_btn_print(){//press button
try{
var video=document.querySelectorAll('ytd-rich-item-renderer');
var results=0;
for(let i = 0; i < video.length; i++){
let is_overlay_exist=true;
let ytd_overlay_time=video[i].querySelectorAll('ytd-thumbnail-overlay-time-status-renderer');
if(ytd_overlay_time.length>0){
if(ytd_overlay_time[0].getAttribute("overlay-style").search(new RegExp("LIVE", "i"))!=-1){
continue;//配信中(feed/subscriptions)
}
}else{/**/
is_overlay_exist=false;
}
var ary_time=is_overlay_exist?video[i].querySelectorAll('span#text')[0].innerText.split(':'):["NaN"];
var video_name=video[i].querySelectorAll('a>#video-title')[0].innerText;
var time=0;
var max_len;
if(ary_time.length==1){//NaN
//console_log_tmp("NaN",false);
video[i].classList.remove("display_none");//配信予定, ytb_shorts
}else if(ary_time.length==3){//hour
time=time+parseInt(ary_time[0])*3600+parseInt(ary_time[1])*60+parseInt(ary_time[2]);
}else{
time=time+parseInt(ary_time[0])*60+parseInt(ary_time[1]);
}
//btn_print.innerHTML=btn_print.innerHTML+time+" ";
if(input_sec.value==''){max_len=86400;}else{max_len=parseInt(input_sec.value)*60;}
//
if(is_enable)video[i].id="gm_css";//dev
if(time<max_len&&video_name.search(new RegExp(input_word.value, "i"))!=-1){
video[i].classList.remove("display_none");
results++;
}else{
video[i].classList.add("display_none");
}
}
btn_print.innerText="検索("+results+"本の動画)";
}catch(e){
console_log_tmp(e.message,true);
}finally{}
}
function fn_check_ui(){
if(document.querySelectorAll('ytd-rich-item-renderer').length==0){//UI check
btn_print.innerHTML="Exception";
}
}
(function() {
'use strict';
div_fixed=create_div(["user_div_fixed_ytb"],false,document.body,document.body.firstChild);
if(panel_ytb){div_fixed.classList.remove("display_none_fixed_ytb");}else{div_fixed.classList.add("display_none_fixed_ytb");}
GM_registerMenuCommand('💬show input;', () => {
panel_ytb=!panel_ytb;
GM_setValue('panel_ytb', panel_ytb);
if(panel_ytb){div_fixed.classList.remove("display_none_fixed_ytb");}else{div_fixed.classList.add("display_none_fixed_ytb");}
});
GM_registerMenuCommand("enable #css"+(is_enable?"✔️":"❌"), () => {
is_enable=!is_enable;
GM_setValue('is_enable', is_enable);
});
//
input_sec=create_input("最大映像時間(分)/Maximum video time (minutes)",["user_input_fixed",'user_tool'],true,true,div_fixed);
btn_print=create_btn("検索",["user_btn_panel_fixed","user_btn_margin",'user_tool'],true,div_fixed);
create_div("div_br",true,div_fixed);
p_console_log=create_node("p","p_console_log",true,div_fixed);
input_word=create_input("抽出条件の指定",["user_input_fixed",'user_tool'],false,true,div_fixed);
btn_print.addEventListener('click',() => {
fn_btn_print();
});
//
window.setTimeout(( () => fn_check_ui() ), 3000);////UI check need delay
})();
/*20221031
video=document.querySelectorAll('#items>ytd-grid-video-renderer');
video[i].querySelectorAll('div.badge-style-type-live-now-alternate')
video[i].querySelectorAll('span#text')
video[i].querySelectorAll('a#video-title')
//
document.querySelectorAll('#items>ytd-grid-video-renderer')
*/