NicoNicoPlaylist mod改造

まえおき

firefoxでニコニコの動画をプレイリスト(キュー)に放り込んで自動的に連続再生してくれるgreasemonkeyスクリプトがありまして。

http://userscripts.org/scripts/show/50639

ただ、自分はボカ路地を取り込んで再生するのが普段のスタイルなので、外部サイトから一括プレイリスト取り込みできないのでは使い物にならない。

そこで、ボカ路地ほか外部サイトでもページ内のニコニコへのリンクぜんぶ追加できるように改造しました。

改造の内容

この機能を担当しているpushAllVideos()メソッドでは、ニコニコ内で利用する場合、aタグを総ナメにして、class="video"のもののみを取得するようにしている。
でも外部サイトではclass="video"と設定されてるとは限らない。

たぶんこれは重複(タイトル文字列とサムネイル、両方にaタグで同じ動画へのリンクが張られてる)の排除が目的。

なので、classは見ずに、重複排除を別の形で行うようにしました。

適用の仕方

  1. グリモンのインストールについては省略。
  2. 「ユーザースクリプトの管理」で、プレイリスト取込の対象にしたい(小窓を表示させたい)サイトを追加する。
  3. 「ユーザースクリプトの編集」で、pushAllVideosメソッド内部の記述を以下のように入れ替える。

この改造はバージョン1.8.1をベースにしています。NicoNicoPlaylist modのバージョンがら更新されてたら、処理が変わってる可能性もあるので要確認。

before
                       this.clone();
                       var as=$x("//a[contains(concat(' ',normalize-space(@class),' '),'
video ')]");
                       if(chPage) as=as.concat($x("//a[contains(normalize-space(@class),'community_video')]"));
                       else if(dicPage) as=as.concat($x("//a[@rel='nofollow']"));
                       for(var i=0, len=as.length; i<len; i++){
                               var a=as[i],m,title,t;
                               if(a.className.indexOf("noadd")>-1) continue;
                               if(m=a.href.match(URL.WATCH_REGEXP)){
                                       if(dicPage) title=a.textContent;
                                       else title=(t=a.innerHTML.match(/<span[^>]*?>(.*?)<\/span>/))?
t[1]:a.innerHTML;
                                       this.playlist.push(new Video(m[1],title));
                               }
                       }

after
                       this.clone();
                       var as=$x("//a");
                       var list=[];
                       if(chPage) as=as.concat($x("//a[contains(normalize-space(@class),'community_video')]"));
                       else if(dicPage) as=as.concat($x("//a[@rel='nofollow']"));
                       for(var i=0, len=as.length; i<len; i++){
                               var a=as[i],m,title,t;
                               if(a.className.indexOf("noadd")>-1) continue;
                               if(m=a.href.match(URL.WATCH_REGEXP)){
                                       if(dicPage) title=a.textContent;
                                       else title=(t=a.innerHTML.match(/<span[^>]*?>(.*?)<\/span>/))?
t[1]:a.innerHTML;
                                       list[m[1]] = title;
                               }
                       }
                       for (var id in list) playlist.push(new Video(id,list[id]));

おまけ

本家NicoNicoPlaylistをベースにした改造もしてみたので必要にあわせてどうぞ。
function全体差し替え。

               pushAllVideos: function () {
                       var as = document.getElementsByTagName("a");
                       var videos = [];
                       var list = [];
                       for (var i = 0, len = as.length; i < len; i++) {
                               var a = as[i];
                               if (!a.href) continue;
                               var m;
                               if (m = a.href.match(NicoNico.WATCH_PAGE_REGEXP)) list[m[1]] = a.innerHTML;
                       }
                       for (var id in list) videos.push({ id: id, title: list[id] });
                       var videoId = this.getPageVideoId();
                       if (videoId) {
                               var self = this;
                               var thisVideo = new Video(videoId);
                               thisVideo.getRelatedVideos(function (videoId, title) {
                                       videos.push({ id: videoId, title: title });
                               }, function () {
                                       self.pushVideos(videos);
                               });
                       } else {
                               this.pushVideos(videos);
                       }
               },