Greasy Fork is available in English.

NicoMyTimeLineSmartView

ニコレポから不要な通知を非表示化するスクリプト

// ==UserScript==
// @name         NicoMyTimeLineSmartView
// @namespace    http://tampermonkey.net/
// @version      0.7.6
// @description  ニコレポから不要な通知を非表示化するスクリプト
// @author       You
// @match        *://www.nicovideo.jp/my/top
// @match        *://www.nicovideo.jp/my/top/all
// @match        *://www.nicovideo.jp/my/top/myself
// @match        *://www.nicovideo.jp/my/top/user
// @match        *://www.nicovideo.jp/my/top/ch
// @match        *://www.nicovideo.jp/my/top/com
// @match        *://www.nicovideo.jp/my/top/mylist
// @grant        none
// @require      //ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// ==/UserScript==

(function ($) {
    //===================================
    // タイムラインの要素監視と縮小化
    //===================================
    $(function(){
        // 監視対象を定義
        var targetTimelines =  document.getElementsByClassName('nicorepo-page')[0];
        console.log("タイムラインの親要素監視開始");
        var timelineMO = new MutationObserver(createTimeLine);

        function createTimeLine(){
            // ニコレポの縮小処理
            nicorepoViewItems(false);
            console.log("タイムラインの監視開始");

            var targetTimeline =  document.getElementsByClassName('NicorepoTimeline')[0];
            var itemMO = new MutationObserver(addTimeLineItem);

            // 【さらに読み込む】で要素が監視対象に追加された場合に実行される処理
            function addTimeLineItem(){
                nicorepoViewItems(false);
            }

            // NicorepoTimelineへの要素の追加の監視を開始
            itemMO.observe(targetTimeline, {childList:true});
        }

        // NicorepoTimelineへの要素の追加の監視を開始
        timelineMO.observe(targetTimelines, {childList:true});
    });

    function nicorepoViewItems(isChanged){
        // 表示設定を取得
        var videoPostReport = $("#videoPostReport").prop("checked");
        var illustrationPostReport = $("#illustrationPostReport").prop("checked");
        var adReport = $("#adReport").prop("checked");
        var mylistReport = $("#mylistReport").prop("checked");
        var clipReport = $("#clipReport").prop("checked");
        var mangaReport = $("#mangaReport").prop("checked");
        var liveReport = $("#liveReport").prop("checked");
        var blomagaReport = $("#blomagaReport").prop("checked");
        var rankingReport = $("#rankingReport").prop("checked");
        var playcountReport = $("#playcountReport").prop("checked");
        var channelArticleReport = $("#channelArticleReport").prop("checked");
        var channelVideoReport = $("#channelVideoReport").prop("checked");
        var channelLiveReservationReport = $("#channelLiveReservationReport").prop("checked");
        var channelLiveReport = $("#channelLiveReport").prop("checked");

        // ニコレポの要素を取得
        var timeLine = $(".NicorepoTimeline");
        var timeLineItems = $('.NicorepoTimelineItem');

        // 表示・非表示処理
        $.each(timeLineItems,function(index,val){
            // ニコレポのlog-body要素を取得
            var checkElement = $(this).find(".log-body");
            // ニコレポのlog-bodyの内容を取得
            var text = checkElement.text();

            if(text.match(/動画を投稿しました。/)){
                // 動画投稿
                viewItem(videoPostReport, $(this));

            }else if(text.match(/イラストを投稿しました。/)){
                // イラスト投稿
                viewItem(illustrationPostReport, $(this));

            }else if(text.match(/ニコニ広告しました。/)){
                // ニコニコ広告
                viewItem(adReport, $(this));

            }else if(text.match(/動画を登録しました。/)){
                // 動画のマイリスト登録
                viewItem(mylistReport, $(this));

            }else if(text.match(/イラストをクリップしました。/)){
                // イラストのクリップ登録
                viewItem(clipReport, $(this));

            }else if(text.match(/マンガをお気に入りしました。/)){
                // マンガのお気に入り追加
                viewItem(mangaReport,$(this));

            }else if(text.match(/生放送.*を開始しました。/)){
                // コミュニティ生放送の開始
                viewItem(liveReport, $(this));

            }else if(text.match(/記事を投稿しました。/)){
                // ブロマガの投稿
                viewItem(blomagaReport,$(this));

            }else if(text.match(/ランキングで/)){
                viewItem(rankingReport,$(this));

            }else if(text.match(/再生を達成しました。/)){
                viewItem(playcountReport,$(this))

            }else if(text.match(/チャンネル.*に記事が追加されました。/)){
                // チャンネル記事
                viewItem(channelArticleReport,$(this));

            }else if(text.match(/チャンネル.*動画が追加されました。/)){
                // チャンネル動画
                viewItem(channelVideoReport,$(this));

            }else if(text.match(/チャンネル.*で.*に生放送が予約されました。/)){
                // チャンネル生放送の予約
                viewItem(channelLiveReservationReport,$(this));

            }else if(text.match(/チャンネル.*で生放送が開始されました。/)){
                // チャンネル生放送の開始
                viewItem(channelLiveReport,$(this));

            }else{
                // その他(非表示)
                viewItem(false, $(this));
            }
        });
    };

    // 表示・非表示処理
    function viewItem(viewFlag,element){
        if(viewFlag){
            // 表示処理
            element.css("display","");
        }else{
            // 非表示処理
            element.css("display","none");
        }
    }

    // string型をBoolean型に変換する関数
    function strToBool(boolStr){
        if(boolStr == null || boolStr == "undefined"){
            return false;
        }
        return boolStr.toLowerCase() === "true";
    }

    // ニコレポの表示設定
    $("body").append("<div id='config'></div>");
    $("#config").append("<div id='configTitle'><label>ニコレポの表示設定</label><label id='reapplication'>🔃</label></div>");
    $("#config").append("<div><details id='userReport'><summary>ユーザ</summary><ul id='viewUserConfig'></lu></details></div>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='videoPostReport'>動画投稿</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='illustrationPostReport'>イラスト投稿</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='adReport'>広告</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='mylistReport'>マイリスト登録</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='clipReport'>イラストのクリップ</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='mangaReport'>マンガのお気に入り</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='liveReport'>生放送開始</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='blomagaReport'>ブロマガの投稿</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='rankingReport'>ランキング</label></li>");
    $("#viewUserConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='playcountReport'>再生数</label></li>");
    $("#config").append("<div><details id='channelReport'><summary>チャンネル</summary><ul id='channelConfig'></ul></details></div>");
    $("#channelConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='channelArticleReport'>チャンネル記事</label></li>");
    $("#channelConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='channelVideoReport'>チャンネル動画</label></li>");
    $("#channelConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='channelLiveReservationReport'>チャンネル生放送予約</label></li>");
    $("#channelConfig").append("<li><label><input type='checkbox' class='configCheckbox' id='channelLiveReport'>チャンネル生放送開始</label></li>");
    $("#config").css({"position":"fixed", "top":"300px", "right":"0px", "width":"150px",
                      "padding":"0.5em 1em", "margin":"2em 0", "background":"#FFF",
                      "border":"solid 3px #6091d3", "font-weight":"bold", "border-radius":"10px"});

    // ユーザ・チャンネルの折り畳みの状態適用
    var userReportState = strToBool(window.localStorage.getItem("userReportState"));
    var channelReportState = strToBool(window.localStorage.getItem("channelReportState"));
    $("#userReport").prop("open",userReportState);
    $("#channelReport").prop("open",channelReportState);

    // 保存済みの表示設定の取得
    // ユーザ
    var videoPostReport = window.localStorage.getItem("videoPostReport");
    var illustrationPostReport = window.localStorage.getItem("illustrationPostReport");
    var adReport = window.localStorage.getItem("adReport");
    var mylistReport = window.localStorage.getItem("mylistReport");
    var clipReport = window.localStorage.getItem("clipReport");
    var mangaReport = window.localStorage.getItem("mangaReport");
    var liveReport = window.localStorage.getItem("liveReport");
    var blomagaReport = window.localStorage.getItem("blomagaReport");
    var rankingReport = window.localStorage.getItem("rankingReport");
    var playcountReport = window.localStorage.getItem("playcountReport");

    // チャンネル
    var channelArticleReport = window.localStorage.getItem("channelArticleReport");
    var channelVideoReport = window.localStorage.getItem("channelVideoReport");
    var channelLiveReservationReport = window.localStorage.getItem("channelLiveReservationReport");
    var channelLiveReport = window.localStorage.getItem("channelLiveReport");

    if(videoPostReport == null || illustrationPostReport == null || adReport == null
       || mylistReport == null || clipReport == null || liveReport == null || blomagaReport == null
       || mangaReport == null || rankingReport == null || playcountReport == null
       || channelArticleReport == null || channelVideoReport == null
       || channelLiveReservationReport == null || channelLiveReport == null){

        // 保存された要素がどれか1つでもnullの場合、Trueを設定
        videoPostReport = true;
        illustrationPostReport = true;
        adReport = true;
        mylistReport = true;
        clipReport = true;
        mangaReport = true;
        liveReport = true;
        blomagaReport = true;
        rankingReport = true;
        playcountReport = true;
        channelArticleReport = true;
        channelVideoReport = true;
        channelLiveReservationReport = true;
        channelLiveReport = true;
    }else{
        // 保存された要素をBooleanに変換
        videoPostReport = strToBool(videoPostReport);
        illustrationPostReport = strToBool(illustrationPostReport);
        adReport = strToBool(adReport);
        mylistReport = strToBool(mylistReport);
        clipReport = strToBool(clipReport);
        mangaReport = strToBool(mangaReport);
        liveReport = strToBool(liveReport);
        blomagaReport = strToBool(blomagaReport);
        rankingReport = strToBool(rankingReport);
        playcountReport = strToBool(playcountReport);
        channelArticleReport = strToBool(channelArticleReport);
        channelVideoReport = strToBool(channelVideoReport);
        channelLiveReservationReport = strToBool(channelLiveReservationReport);
        channelLiveReport = strToBool(channelLiveReport);
    }

    // ニコレポの表示設定の適用
    $("#videoPostReport").prop("checked", videoPostReport);
    $("#illustrationPostReport").prop("checked", illustrationPostReport);
    $("#adReport").prop("checked", adReport);
    $("#mylistReport").prop("checked", mylistReport);
    $("#clipReport").prop("checked",clipReport);
    $("#mangaReport").prop("checked",mangaReport);
    $("#liveReport").prop("checked", liveReport);
    $("#blomagaReport").prop("checked",blomagaReport);
    $("#rankingReport").prop("checked",rankingReport);
    $("#playcountReport").prop("checked",playcountReport);
    $("#channelArticleReport").prop("checked", channelArticleReport);
    $("#channelVideoReport").prop("checked", channelVideoReport);
    $("#channelLiveReservationReport").prop("checked", channelLiveReservationReport);
    $("#channelLiveReport").prop("checked", channelLiveReport);

    // 表示設定の変更及びニコレポへの反映処理
    $("input.configCheckbox").change(function(){
        // 表示設定の内容をlocalStorageへ保存
        window.localStorage.setItem("videoPostReport", $("#videoPostReport").prop("checked"));
        window.localStorage.setItem("illustrationPostReport", $("#illustrationPostReport").prop("checked"));
        window.localStorage.setItem("adReport", $("#adReport").prop("checked"));
        window.localStorage.setItem("mylistReport", $("#mylistReport").prop("checked"));
        window.localStorage.setItem("clipReport", $("#clipReport").prop("checked"));
        window.localStorage.setItem("mangaReport", $("#mangaReport").prop("checked"));
        window.localStorage.setItem("liveReport", $("#liveReport").prop("checked"));
        window.localStorage.setItem("blomagaReport",$("#blomagaReport").prop("checked"));
        window.localStorage.setItem("rankingReport",$("#rankingReport").prop("checked"));
        window.localStorage.setItem("playcountReport",$("#playcountReport").prop("checked"));
        window.localStorage.setItem("channelArticleReport", $("#channelArticleReport").prop("checked"));
        window.localStorage.setItem("channelVideoReport", $("#channelVideoReport").prop("checked"));
        window.localStorage.setItem("channelLiveReservationReport", $("#channelLiveReservationReport").prop("checked"));
        window.localStorage.setItem("channelLiveReport", $("#channelLiveReport").prop("checked"));

        // ニコレポの表示・非表示処理
        nicorepoViewItems(true);
    });

    // 設定の再適用
    $("#reapplication").on("click",function(){
        // ニコレポの表示・非表示処理
        nicorepoViewItems(true);
    });

    // ユーザの折り畳みの情報保持
    $("#userReport").on("click",function(){
        var userReportState = $("#userReport").prop("open") == false;
        window.localStorage.setItem("userReportState",userReportState);
    });

    // チャンネルの折り畳み情報保持
    $("#channelReport").on("click",function(){
        var channelReportState = $("#channelReport").prop("open") == false;
        window.localStorage.setItem("channelReportState",channelReportState);
    });
})(jQuery);