Greasy Fork

ニコニコ除ニコレポEx

ニコレポをフィルタリングします

当前为 2018-03-25 提交的版本,查看 最新版本

// ==UserScript==
// @name         ニコニコ除ニコレポEx
// @namespace    https://greasyfork.org/users/175598
// @description  ニコレポをフィルタリングします
// @match        http://www.nicovideo.jp/my/top
// @match        http://www.nicovideo.jp/my/top/*
// @match        http://www.nicovideo.jp/user/*
// @grant        none
// @author       Original by Fushihara,Modded by Boyu
// @license      Creative Commons Zero 1.0 Universal
// @version      2018.03.25
// ==/UserScript==
// Original by Fushihara:https://github.com/fushihara/nico-repo

(function(){
    var localStorageKey="niconicoRemoveNicorepoEx_modBoyu";
    // cssに付ける接頭語
    var classPrefix="niconicoRemoveNicorepoEx_modBoyu_";
    // バージョン数
    var nowVersion=180324;
    //切り替え出来る要素 contents={ contentId:{"userType","buttonLabel"} }
    //userType:1=ユーザーが 2=コミュニティが 3=チャンネルが
    var contents={};var contentIdlist=[];
    var contentsAdd=function(contentId,userType,buttonLabel){
        // contentIdが重複してる場合はアラートを出す
        if(contentId in contents){
            alert(`contentsIdが重複しています ${contentId}`);
        }else{
            contentIdlist.push(contentId);
            contents[contentId]={
                "userType"     :userType,
                "buttonLabel"  :buttonLabel
            };
        }
    };
    //追加出来るかどうか
    //参考:http://nicovideo.cdn.nimg.jp/uni/scripts/pages/my/nicorepo/message/ja-jp.js
    var init=function(){
        var initState;
        load();
        contentsAdd("nicovideo_user_video_upload"                        ,1,"動画を投稿"            );
        contentsAdd("nicovideo_user_video_kiriban_play"                  ,1,"再生数達成"            );
        contentsAdd("nicovideo_user_video_update_highest_rankings"       ,1,"ランキング達成"          );
        contentsAdd("nicovideo_user_video_live_introduce"                ,1,"生放送で紹介"           );
        contentsAdd("nicoad_user_advertised_video_announce"              ,1,"広告された"            );
        contentsAdd("nicoad_user_advertise_video"                        ,1,"広告した"             );
        contentsAdd("nicovideo_user_community_member_only_video_upload"  ,1,"コミュニティ専用動画を投稿"    );
        contentsAdd("nicoseiga_user_illust_upload"                       ,1,"イラストを投稿"          );
        contentsAdd("nicoseiga_user_illust_clip"                         ,1,"イラストをクリップ"        );
        contentsAdd("nicoseiga_user_manga_episode_upload"                ,1,"マンガを投稿"           );
        contentsAdd("nicoseiga_user_manga_content_favorite"              ,1,"マンガをお気に入り登録"      );
        contentsAdd("nicovideo_user_nicogame_upload"                     ,1,"ゲームを投稿"           );
        contentsAdd("nicovideo_user_nicogame_update"                     ,1,"ゲームを更新"           );
        contentsAdd("nicovideo_user_blomaga_upload"                      ,1,"記事を投稿"            );
        contentsAdd("nicovideo_user_solid_upload"                        ,1,"立体を投稿"            );
        contentsAdd("nicovideo_user_solid_distribute"                    ,1,"立体の配布データを公開"      );
        contentsAdd("nicovideo_user_solid_update"                        ,1,"立体の配布データを更新"      );
        contentsAdd("nicovideo_user_solid_favorite"                      ,1,"立体をお気に入り登録"       );
        contentsAdd("nicovideo_user_knowledge_upload"                    ,1,"ナレッジを投稿"          );
        contentsAdd("nicovideo_user_app_install"                         ,1,"アプリを開始"           );
        contentsAdd("nicovideo_user_stamp_obtain"                        ,1,"スタンプを取得"          );
        contentsAdd("nicovideo_user_followed_announce"                   ,1,"あなたをフォロー"         );
        contentsAdd("nicovideo_user_mylist_followed_announce"            ,1,"あなたのマイリストをフォロー"   );
        contentsAdd("nicovideo_user_mylist_add_video"                    ,1,"動画をマイリスト登録"       );
        contentsAdd("nicovideo_user_mylist_add_manga_episode"            ,1,"マンガをマイリスト登録"      );
        contentsAdd("nicovideo_user_mylist_add_book"                     ,1,"書籍をマイリスト登録"       );
        contentsAdd("nicovideo_user_mylist_add_blomaga_article"          ,1,"ブロマガをマイリスト登録"     );
        contentsAdd("nicovideo_user_temporary_mylist_add_video"          ,1,"動画をとりあえずマイリスト登録"  );
        contentsAdd("nicovideo_user_temporary_mylist_add_manga_episode"  ,1,"マンガをとりあえずマイリスト登録" );
        contentsAdd("nicovideo_user_temporary_mylist_add_book"           ,1,"書籍をとりあえずマイリスト登録"  );
        contentsAdd("nicovideo_user_temporary_mylist_add_blomaga_article",1,"ブロマガをとりあえずマイリスト登録");
      //contentsAdd("live_user_program_cas_onairs"                       ,1,"nicocasを開始"           );
      //contentsAdd("nicovideo_user_video_advertised_announce"           ,1,"広告された(旧式)"         );
      //contentsAdd("nicovideo_user_video_advertise"                     ,1,"広告した(旧式)"          );
        contentsAdd("live_user_program_onairs"                           ,2,"生放送を開始"           );
        contentsAdd("live_user_program_reserve"                          ,2,"生放送を予約"           );
        contentsAdd("nicovideo_community_level_raise"                    ,2,"レベル上昇"            );
        contentsAdd("nicovideo_user_community_info_add"                  ,2,"お知らせを追加"          );
        contentsAdd("nicovideo_user_community_video_add"                 ,2,"動画を追加"            );
        contentsAdd("live_channel_program_onairs"                        ,3,"生放送を開始"           );
        contentsAdd("live_channel_program_reserve"                       ,3,"生放送を予約"           );
        contentsAdd("nicovideo_channel_blomaga_upload"                   ,3,"記事を追加"            );
        contentsAdd("nicovideo_channel_info_add"                         ,3,"お知らせを追加"          );
        contentsAdd("nicovideo_channel_video_upload"                     ,3,"動画を追加"            );
        if(document.querySelector("#nicorepo") ){
            addToggleQ();
            initQ();
            setToggleArea(document.querySelector("#nicorepo>h3"));
            addStyle();
        }
    };
    //styleタグを追加。ここにどんどん追加していく
    var thisStyle;
    var addStyle=function(){
        var addElement;
        addElement=document.createElement("style");
        document.body.appendChild(addElement);
        thisStyle=document.styleSheets[document.styleSheets.length-1];
        //セーブされてるスタイル情報を適用する
        var contentStyles={};
        for (let Id of contentIdlist) {
            updateStyle(Id,GetcheckSave(Id));
        }
    };
    var updateStyle=function(Id,flag){
        thisStyle.insertRule("."+classPrefix+Id+`{display:${flag?"block":"none"};}`,thisStyle.rules.length);
    };
    //-----各ニコレポにクラス名を追加
    var initQ=function(){
        // ノードが追加された時にイベントを仕込む
        const observeTarget = document.querySelector("#MyPageNicorepoApp") || document.querySelector("#UserPageNicorepoApp");
        (new MutationObserver(mutationRecords =>
            mutationRecords.forEach(
                //m => {for(let n of m.addedNodes)if(n.nodeName === "SPAN")initializeOneLog(n);}
                ({target:t}) => {if(t.className === "log-body")initializeOneLog(t);}
            )
        )).observe(observeTarget,{childList:true,subtree:true});
    };
    var initializeOneLog = function(bodyElement){
        const baseElement = bodyElement.offsetParent;
        if(baseElement===null)return;
        // bodyからリンクを抽出して解析する
        for(let linkElement of bodyElement.querySelectorAll("a")){
            const searchResult=/[?&]_topic=([a-z_]+)/.exec(linkElement.search);
            if(searchResult && searchResult[1] in contents){
              //console.log("addedlog-body:"+searchResult[1]);
                baseElement.classList.add(classPrefix+searchResult[1]);
                return;
            }
        }
        console.log("ニコニコ除ニコレポ:新パターン:"+bodyElement.innerHTML);
    };
    //ローカルストレージ
    var checkSave={};
    var SetcheckSave=function(Id,flag){
        checkSave[Id]=flag;
    };
    var GetcheckSave=function(Id){
        return (Id in checkSave)?checkSave[Id]:true;
    };
    var save=function(){
        var savePat=JSON.stringify(checkSave);
        localStorage.setItem(localStorageKey,savePat);
    };
    var load=function(){
        var savePat={};
        savePat=localStorage.getItem(localStorageKey);
        savePat=JSON.parse(savePat);
        if(savePat!==null){
            checkSave=savePat;
        }
    };
    //トグルボタンで表示されるフィルタリング対象切り替えボタンのエレメントを返す
    var toggleArea;
    var setToggleArea=function(addTarget){
        toggleArea=document.createElement("div");
        setToggleButtons(toggleArea);
        setToggleSaveButton(toggleArea);
        toggleArea.style.setProperty("display","none");
        toggleArea.style.setProperty("font-weight","normal");
        toggleArea.style.setProperty("overflow","hidden");
        addTarget.appendChild(toggleArea);
    };
    var addElementArea=[];
    var setToggleButtons=function(toggleArea){
        const addElementAreainnerHTML={
            1:"ユーザーが… or ユーザーが投稿した動画が…",
            2:"コミュニティが…",
            3:"チャンネルが…",
            4:"それ以外の…"
        };
        for(var n=1;n<=4;n++){
            addElementArea[n]=document.createElement("div");
            addElementArea[n].innerHTML=addElementAreainnerHTML[n];
            addElementArea[n].style.setProperty("overflow","hidden");
            if(n!=4){
                toggleArea.appendChild(addElementArea[n]);
                
                var toggleUserType=document.createElement("button");
                toggleUserType.style.setProperty("float","right");
                toggleUserType.innerHTML="全て表示/非表示";
                toggleUserType.addEventListener("click",toggleUserTypeEventCreate(n));
                addElementArea[n].appendChild(toggleUserType);
            }
            addElementArea[n]=toggleArea.appendChild(document.createElement("div"));
            addElementArea[n].style.setProperty("overflow","hidden");
        }

        //~が…のチェックボックスを作る
        for(var Id of contentIdlist){
            var addElement=document.createElement("label");
            //今のcontentがチェック済みかどうかを調べる
            const isChecked = GetcheckSave(Id);

            addElement.innerHTML=`<input type=checkbox ${isChecked?"checked":""}>${contents[Id].buttonLabel}`;
            labelStyle(addElement,isChecked);
            //userType1~3は通常
            //userType4は非表示/非表示切り替え
            addElement.dataset.userType =contents[Id].userType;
            addElement.dataset.contentId=Id;
            addElement.addEventListener("click",function(e){
                if(e.target.nodeName!="INPUT"){return;}
                //セーブ時の為の変数を更新する
                SetcheckSave(e.target.parentNode.dataset.contentId,e.target.checked);
                updateStyle (e.target.parentNode.dataset.contentId,e.target.checked);
                //ラベルの外見を変える
                labelStyle(e.target.parentNode,e.target.checked);
                toggleSaveButton.disabled=false;
            });
            addElementArea[contents[Id].userType].appendChild(addElement);
        }
    };
    var toggleUserTypeEventCreate=function(userType){
        return function(e){
            var clickTargets=addElementArea[userType];
            clickTargets=clickTargets.querySelectorAll("label");
            if(clickTargets.length==0){return;}//無いとは思うけど、要素が無い時はそのまま返す
            var nextChecked=!clickTargets[0].querySelector("input").checked;
            for(var i=0;i<clickTargets.length;i++){
                //次の状態と今の状態が違う=クリックする
                if(clickTargets[i].querySelector("input").checked!==nextChecked){
                    //クリエイトイベント
                    var customEvent = document.createEvent("MouseEvents");
                    customEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                    clickTargets[i].dispatchEvent(customEvent);
                }
            }
          //console.log(clickTargets);
        };
    };
    var labelStyle=function(target,flag){
        target.style.setProperty("background",flag?"-webkit-gradient(linear, 0% 25%, 0% 100%, from(white), to(#1DFFFF))"
                                                  :"-webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255, 255, 255, 1)), color-stop(100%,rgba(143, 143, 143, 1)))");
        target.style.setProperty("line-height","2.0em");
        target.style.setProperty("color","black");
        target.style.setProperty("padding","1px 8px 1px 5px");
        target.style.setProperty("border-radius","10px");
        target.style.setProperty("display","block");
        target.style.setProperty("float","left");
        target.style.setProperty("margin","5px 3px");
        target.style.setProperty("","");
    };
    var toggleSaveButton;
    var setToggleSaveButton=function(toggleArea){
        toggleSaveButton=document.createElement("button");
        toggleSaveButton.innerHTML="設定保存";
        toggleSaveButton.style.setProperty("float","right");
        toggleSaveButton.addEventListener("click",function(){
            save();
            toggleSaveButton.disabled=true;
        });
        toggleSaveButton.disabled=true;
        toggleArea.appendChild(toggleSaveButton);
    };
    //トグルボタンそのものを作る
    var toggleButton;
    var addToggleQ=function(){
        //updateボタンを表示するかどうか
        let updateButton = `<span style="    display: inline;
    background: rgba(0, 0, 0, 0);
    width: auto;
    font-size: 11px;
    color: #f00;
    background-color: #fff;
    border-radius: 6px;
    padding: 0px 3px;
    font-weight: bold;">更新</span>`;
        toggleButton=document.createElement("a");
        toggleButton.href="";
        toggleButton.innerHTML=`<span></span>表示フィルタリング切り替え${GetShowUpdate()?updateButton:""}`;
        toggleButton.dataset.nowOpen="no";
        toggleButton.addEventListener("click",e => {
            e.preventDefault();
            SetShowUpdate();
            if(toggleButton.dataset.nowOpen=="no"){//今は閉じてる
                toggleArea.style.setProperty("display","block");
                toggleButton.dataset.nowOpen="yes";
            }else{//今は開いてる
                toggleArea.style.setProperty("display","none");
                toggleButton.dataset.nowOpen="no";
            }
        });
        document.querySelector("#nicorepo>h3").appendChild(toggleButton);
    };
    var GetShowUpdate = function(){
        const version = localStorage.getItem(`${localStorageKey}-last-click-version`) || 1;
        // 最後にクリックしたバージョンが、今のバージョンより前だったら表示する
        return (version < nowVersion);
    };
    var SetShowUpdate = function(){
        localStorage.setItem(`${localStorageKey}-last-click-version`,nowVersion);
    };
    init();
})();