ニコニコ動画の視聴履歴記録ブックマーク

「この動画見たっけ?」ってなってしまうのがよくあるので。
ブラウザの履歴では古いの切れてしまうので、ブラウザのローカルストレージに記録していくように。
整形もクソもないコードだけども自分のバックアップ用に

ChromeのTampermonkeyにて実行
nicovideo.jp以下のURLを対象に実行し、一度踏んだsmナンバーのURLは赤く表示されるようになる。

// @match        https://www.nicovideo.jp/*
// @grant        none
// ==/UserScript==

(function () {

    function ora() {

        var i = 0;
        var allLinks = document.getElementsByTagName('a');

        var getjson = localStorage.getItem('nico_url');

        if (getjson == null){

            alert("nico_urlの初期化");
            localStorage.setItem('nico_url', "");
            getjson = localStorage.getItem('nico_url');
            /*
           var aa = [];
           var aobj = {
               'sm35133988': 'true'
            }


            aa.push(aobj); //古いデータを挿入

            var setjson = JSON.stringify(aobj);
            localStorage.setItem('nico_url', setjson);

            getjson = localStorage.getItem('nico_url');
            */
        }

        var strjson = getjson.split(',');

        var obj = [];
        obj = JSON.stringify(JSON.parse(getjson||"null"));


        /*
var array = [];
var obja = {
  'sm11111': 'true'
};
array.push(obj);

var setjson = JSON.stringify(obja);
localStorage.setItem('nico_url', setjson);
*/


        for (i = 0; i < allLinks.length; i++)
        {

            var href = allLinks[i].href;

            if (href.match('watch/sm') ) {

                //var test = href.replace(href.referrer, '');
                var test = href.split("?");
                allLinks[i].href = test[0];

                //文字列sm切り取り
                var test2 = test[0].split("watch/");

                //            alert(test2[1]);
                //          alert(getjson);
                var result = getjson.match(test2[1]);

//↓新版の解説文等が薄いので黒くする しかし旧版だと未読リンクの青も染めてしまうのでタグ名検出するべき
// allLinks[i].style.cssText = "color:black !important;";

                //alert(typeof(strjson));
                //alert(strjson[]);
                //var sasa = test2[1];
                //alert(Object.keys(strjson)); //キーが序数である
                if (result != null ){

                    //allLinks[i].style.color = "black";
                    //allLinks[i].style.color = "red";



                        //白めなニューページのユーザーページ用
                    //var redlinks = allLinks[i].getElementsByClassName("VideoMediaObject-bodyTitle");
                    //var redlinks = allLinks[i].getElementsByClassName("MediaObjectTitle VideoMediaObject-title MediaObjectTitle_fixed2Line");
                    var redlinks = allLinks[i].getElementsByClassName("NC-MediaObjectTitle NC-VideoMediaObject-title NC-MediaObjectTitle_fixed2Line");
                    if (0 < redlinks.length){
                    redlinks[0].style.cssText = "color:red !important;";

                    }else{
                        //新マイページ
                        redlinks = allLinks[i].getElementsByClassName("NicorepoItem-contentDetailTitle");
                        if (0 < redlinks.length){
                            redlinks[0].style.cssText = "color:red !important;";
                        }else{
                        //現用ページ
                        allLinks[i].style.cssText = "color:red !important;";

                        }

                    }

                    //var da = obj[result]; 時刻をどう取り出すか
                    //allLinks[i].insertAdjacentHTML ("afterend", " " + getjson[result]);
                    //allLinks[i].insertAdjacentHTML ("afterend", '<button type=button onclick="dee('+result+')">削除</button>');

                }
            }

        } //For

    }




    //URL取得と記録 動画内ページ移動では辿り着いていない

    function recs (){
      //  alert("url");
    var url = location.href ;
    //  alert("url");
    if (url.match('watch/sm')){

        var getjson = localStorage.getItem('nico_url');

        if (getjson == null){

            alert("nico_urlの初期化");
            localStorage.setItem('nico_url', "");
            getjson = localStorage.getItem('nico_url');
            /*
           var aa = [];
           var aobj = {
               'sm35133988': 'true'
            }


            aa.push(aobj); //古いデータを挿入

            var setjson = JSON.stringify(aobj);
            localStorage.setItem('nico_url', setjson);

            getjson = localStorage.getItem('nico_url');
            */
        }



        var obj = JSON.parse(getjson || "null");
        var test2 = url.split("watch/");

        //matchは?を正規表現記号とするので\をつける
        if (test2[1].match(/\?/)){
            var test3 = test2[1].split("?");
            test2[1] = test3[0];
        }


        var nico_id = test2[1];
        var result = getjson.indexOf(test2[1]);

        if (result < 0 ){

            var now = new Date();
            var year = now.getFullYear(); //年
            var month = now.getMonth()+1; //月
            var day = now.getDate(); //日

            var hour = now.getHours(); //年
            var minute = now.getMinutes()+1; //月


            var dates = year + "年" + month + "月" + day + "日 " + hour + ":" + minute;


            var a = [];
            var add={[nico_id]: dates};

            if (getjson == ""){
            }else{
                a=obj; //古いデータを挿入

            }
            a.push(add); //新データを追加

            console.log(a);
            var setitem = JSON.stringify(a);

            localStorage.setItem('nico_url', setitem);


        }

    }
    }



    ora();
    recs();



    window.onunload = function(){
//
//alert("a");
   };


    if (location.href.match("https://www.nicovideo.jp/my")){
        window.addEventListener("scroll",ora);
    }else{
        //mo.disconnect();
    }

    if (location.href.match("https://www.nicovideo.jp/user/")){
        window.addEventListener("scroll",ora);
    }else{
        //mo.disconnect();
    }

    if (location.href.match("https://www.nicovideo.jp/mylist/")){
        window.addEventListener("scroll",ora);
    }else{
        //mo.disconnect();
    }



    if (location.href.match("https://www.nicovideo.jp/watch/")){
//alert("a");
        window.addEventListener("click",recs); //クリック時に行うチェック

            window.addEventListener("scroll",recs); //自動ジャンプの応急処置……?

        window.addEventListener("scroll",ora); //動画ページはリフレッシュが入って赤字が上書きされる(もしや原宿スタイルの干渉?)
    }else{
        //mo.disconnect();
    }



}) ();

○現在確認できているバグ&仕様

  • 基本的にスクリプト実行トリガーとしてマウススクロールで検知実行するようにしている。

  • 極稀にローカルストレージに保存された配列データの書式が狂い、保存されなくなる。→一度成功したケースを保存しておき、書式の差異を確認して全体置換することで解決可能

  • 動画再生ページ内の「シリーズ」や「マイリスト」にあるURLは、条件不明ながら赤色に染められてしまう事がある

  • 動画再生ページではスクロールで実行する事が前提となっており、自動ジャンプなどで飛んだ場合は記録されないこともある。



この記事が気に入ったらサポートをしてみませんか?