ニコニコ動画のマイリストページに埋め込まれている情報(DOM)
ニコニコ動画の再生ページに埋め込まれている情報 | Web scratch のマイリストページ版みたいなものです。
マイリストにもAPIがありますが(ニコニコ動画のAPIまとめ | Web scratch )マイリストページにいるならば、わざわざAPI叩かなくてもいろんな情報が取得できます。
なんでわざわざDOMから情報を取ってるかというと、変更の影響を受けにくかったりするからです。
ここでのマイリストは人が公開してるマイリストのこと。
my Mylist.groupList id (number): マイリストID user_id (number): マイリストのユーザーID name (string): マイリストのタイトル description (string): マイリスト説明文 public (boolean): true // 公開状況 default_sort (number): 1 (1-17) create_time (number): UNIX時間(util.unix2で戻せる) update_time (number): UNIX時間 icon_id (number): 0 sort_order (number): 0 my.currentItems [0]...配列 item_type (number): 0 item_id (string): 接頭辞がない動画番号(常時) description (string): マイリスト登録者による説明文 item_data video_id (string): 接頭辞がある動画番号(sm数字) title (string): 動画タイトル thumbnail_url (string): サムネイルURL first_retrieve (number): 投稿日時(UNIX時間) update_time (number): 更新日時(UNIX時間) view_counter (string): 再生数 mylist_counter (string): マイリスト数 num_res (string): コメント数 group_type (string): default length_seconds (string): 再生時間(秒) deleted (string): 0 (削除状態0-3?) last_res_body (string): 最近のコメント(文字列) watch_id (string): 接頭辞なしの動画番号(コミュ、マイメモリー以外だと接頭辞がある) watch (number): 0 create_time (number): マイリスト登録日時(UNIX時間) update_time (number): マイリスト更新日時(UNIX時間)
Firebugなどから、console.dir(my)などして構造を確認しておくといいです。
DOMから動画情報を取得するのを少しだけ手助けする関数群を置いておきます。(思ったより役に立たない)
(function () {
var w = unsafeWindow;
Mylist = {
// マイリストの属性
/*
Mylist.groupListのツリー
id (number): マイリストID
user_id (number): マイリストのユーザーID
name (string): マイリストのタイトル
description (string): マイリスト説明文
public (boolean): true // 公開状況
default_sort (number): 1 (1-17)
create_time (number): UNIX時間(util.unix2で戻せる)
update_time (number): UNIX時間
icon_id (number): 0
sort_order (number): 0
*/
// Mylist.groupList - my.CurrentGroupのコピー
groupList: function () {
return w.my.currentGroup;
},
/*
my.currentItemsのツリー
item_type (number): 0
item_id (string): 接頭辞がない動画番号(常時)
description (string): マイリスト登録者による説明文
item_data
video_id (string): 接頭辞がある動画番号(sm数字)
title (string): 動画タイトル
thumbnail_url (string): サムネイルURL
first_retrieve (number): 投稿日時(UNIX時間)
update_time (number): 更新日時(UNIX時間)
view_counter (string): 再生数
mylist_counter (string): マイリスト数
num_res (string): コメント数
group_type (string): default
length_seconds (string): 再生時間(秒)
deleted (string): 0 (削除状態0-3?)
last_res_body (string): 最近のコメント(文字列)
watch_id (string): 接頭辞なしの動画番号(コミュ、マイメモリー以外だと接頭辞がある)
watch (number): 0
create_time (number): マイリスト登録日時(UNIX時間)
update_time (number): マイリスト更新日時(UNIX時間)
*/
// Mylist.itemList - my.currentItemsのコピー
itemList : function(){
return w.my.currentItems;
},
}
// utility関数群
utils = {
playlength : transPlaylength,
unix2 : unixTodate,
clone : clone,
}
// 再生時間を分秒に変換
function transPlaylength(length){
return (length / 60).toFixed(2).toString().split(".").join("分") + "秒";
}
// 10桁の数字(UNIXTIME)から2009/10/1 00:00形式で返す
function unixTodate(x){
var t=new Date(x*1000);
return t.getFullYear() + "/" + fillZero(t.getMonth() + 1) + "/" + fillZero(t.getDate()) + " " + fillZero(t.getHours()) + ":" + fillZero(t.getMinutes()) + ":" + fillZero(t.getSeconds());
}
// http://d.hatena.ne.jp/javascripter/20080514/1210791575
// 先頭を0で埋める デフォルト2桁
function fillZero(num , digit){
var n = (digit) ? digit : 2;// デフォルト値
var zero=new Array(n).join('0');//0をn-1文字分つなげた文字列を作る。n==4だと'000'
var str=zero+num;//zeroとthisをくっつけた文字列を作る。
var result=str.substr(-n);//strの後ろから、n文字分の文字列を取ってくる。
return result;
}
// オブジェクトのコピーのコピーを作成
function clone(obj){
return (typeof uneval == "function") ? eval(uneval(obj)) : false;
}
})();
どんな風に使うかというと、上の関数群を読み込んで使用します。
DOMへのアクセスをするものと少しのutility関数群から構成されています。
再生時間を分秒に直したり、UNIX時間で格納されている時間を2009/10/1 00:00形式に直したりするだけです。
// ==UserScript==
// @name Nico mylist Test
// @namespace https://efcl.info/
// @include http://www.nicovideo.jp/mylist/*
// @require http://gist.github.com/raw/239541/1dab27439133948bd6309f4ba959921a8ce938b9/NicoMylistDom.js
// ==/UserScript==
var t = Mylist.itemList();// DOM my.currentItemsにアクセス
var cpObj = utils.clone(t);// オブジェクトのコピー作成(元の値を残す)
console.log(cpObj.length)
for(var i =0,l =cpObj.length;i<l;i++){
console.log(i + " : " + cpObj[i].item_data.title + "投稿日 : "+ utils.unix2(cpObj[i].item_data.first_retrieve))
}
cpObj[i-1].item_data.title = "buzz";//コピーしたものを書き換える
console.log(t[i-1].item_data.title)// 元のDOMには影響ない
上の関数群のテスト例です。インストールしてマイリストページに行くとコンソールに例が表示されるので参考にどうぞ
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。