NicoMyTimeLineSmartView

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);