読者です 読者をやめる 読者になる 読者になる

ぐりもんメモ

ニコニコ動画 Greasemonkey

ニコニコ大百科の掲示板を便利にするぐりもんの構想だけは固まっても品が全然できあがらないという体たらく。とりあえずNGID機能だけでもちゃっちゃと作りたいところ。覚え書き→ぐりもんメモ - なんとなく目記
それとは別に,作りたい物ができたのでメモ。動画再生画面で,その動画がマイリストに登録済みなら登録済みと表示するぐりもん。
実は既に存在する。→
ただ,このスクリプトにはいくつか問題点というか個人的に修正したい点がいくつか存在するので,それを直した物を作りたいなと。以下,修正したい点。

  • 動画再生ページを読み込む度にマイリストを取得している。
    • 前回の結果をキャッシュしておく。キャッシュの更新タイミングをどうするかが問題。
  • 複垢のマイリスト登録状況が分からない。
    • 任意のマイリストを指定して,そのマイリストへの登録状況を取得できるようにする。

追記

出かける予定だったのに友人が体調不良だとかでお出かけはお流れに。しょうがないからサクっと改善してみた。ほとんどオリジナルのスクリプトと同じです。

// ==UserScript==
// @name           nicovideo Show registrated message
// @namespace      http://d.hatena.ne.jp/gifnksm/
// @include        http://www.nicovideo.jp/watch/*
// ==/UserScript==

(new function() {
  var video_id = unsafeWindow.Video.id;
  var es = document.getElementById('mylist_add_group_id').getElementsByTagName('option');
  
  for (i = 0; i < es.length; i ++) {
    GM_xmlhttpRequest({
      method: 'GET',
      url: 'http://www.nicovideo.jp/mylist/' + es[i].value +
        '?rss=atom&nomemo=1&nothumbnail=1&nodescription=1&noinfo=1',
      onload: onload_generator(es[i].innerHTML, es[i].value, video_id)
    });
  }
  
  function onload_generator(mylist_name, mylist_code, video_id) {
    return function(req) {
      var e = document.getElementById('mylist_add_status');
      
      if (req.responseText.indexOf('watch/'+video_id) != -1) {
        if (e.innerHTML == '')
          e.innerHTML = '登録済み→'
        e.innerHTML += ' <a href="mylist/' + mylist_code + '">' + mylist_name + '</a> ';
      }
    }
  }
})();
変更点
  • 動画IDの取得方法をより確実な方法に変更。
  • マイリストの登録情報をHTMLではなくRSS(ATOM)から取得するように。これでアクセス制限はかからないはず。
  • キャッシュは未実装だけど個人的にはほとんどこれで満足。

追記の追記

外部のマイリストをチェックする機能も搭載しました。
チェックしたいマイリストのページへ行って,「右下の猿アイコンを右クリック→ユーザースクリプトコマンド→nicovideo Show registered message - toggle setting」で任意のマイリストを登録・登録解除ができます。

// ==UserScript==
// @name           nicovideo Show registrated message
// @namespace      http://d.hatena.ne.jp/gifnksm/
// @include        http://www.nicovideo.jp/watch/*
// @include        http://www.nicovideo.jp/mylist/*
// ==/UserScript==

var check_lists = eval(GM_getValue('check_lists', '[]'));
if(new RegExp('^http://www.nicovideo.jp/mylist/(\\d+)').test(location.href)) {
    var mylist_id = RegExp.$1;
    var mylist_title = document.getElementsByTagName('h1')[0].textContent;
    GM_registerMenuCommand('nicovideo Show registered message - toggle setting', function() {
        if(check_lists.some(function(list) { return list.id == mylist_id; })) {
            check_lists = check_lists.filter(function(list) { return list.id != mylist_id });
            alert('解除しました。');
        }
        else {
            check_lists.push({id: mylist_id, title: mylist_title});
            alert('登録しました。');
        }
        GM_setValue('check_lists', check_lists.toSource());
    });
}
else {
    var video_id = unsafeWindow.Video.id;
    var es = document.getElementById('mylist_add_group_id').getElementsByTagName('option');
    var message = document.getElementById('mylist_add_status');
    
    function checkMylist(mylist_name, mylist_id, video_id) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: 'http://www.nicovideo.jp/mylist/' + mylist_id +
                 '?rss=atom&nomemo=1&nothumbnail=1&nodescription=1&noinfo=1',
            onload: function(response) {
                if(response.responseText.indexOf('watch/'+video_id) != -1) {
                    if (message.innerHTML == '')
                        message.innerHTML = '登録済み→'
                    message.innerHTML += ' <a href="mylist/' + mylist_id + '">' + mylist_name + '</a> ';
                }
            }
        });
    }
    Array.forEach(es, function(opt) { checkMylist(opt.textContent, opt.value, video_id); });
    check_lists.forEach(function(list) { checkMylist(list.title, list.id, video_id); });
}