Posts Tagged ‘ニコニコ動画’
ニコニコ動画の検索履歴を保存するGreasemonkey
今のニコニコだと好きな動画を探すときに、特定の検索をして探すって感じの場合が多くなってきた気がするので、検索履歴を保存して表示できるGreasemonkeyを書いてみました。
検索画面の右上の方にボタンが出るようになるので、それをクリックすると検索した履歴が表示されます。
検索履歴は検索キーだけではなくてsort方法によっても別々に保存されます。
また、検索キーの横にある☆マークをクリックすることで、その検索キーを常に上の方に表示して、自動的に削除されないようにします。(お気に入り機能)
お気に入りではない検索キーは100個ぐらいで自動的に削除されます。
コード内容
これを書き始めたときSandbox Patternを試してみたくて書いてたので、あんまり見ない書き方をしてると思う。
それぞれ必要な部品をモジュールhistory,templeteとして定義して、必要な時に
Sandbox(“history”, function(box) { … }) という感じで使うというような書き方になってる。
またニコニコ動画見てるGreasemonkeyのOAuth対応版
2010.8月末にTwitterのBASIC認証が終わったので、今までのまたニコぐりもんは動かなくなっていると思います。
なのでOAuth認証に対応してるまたニコニコ見てるを作ってみました。(作ったのは結構前だけどね)
使用方法
まずはニコニコ動画の動画ページでステータスバーのGreasemonkeyアイコンを右クリック→ユーザースクリプトコマンドからOAuth認証をする必要があります。 
コマンドを実行するとOAuth認証のパネルが出てくるので、ボタンからTwitterへ行きOAuth認証してPINコードをコピーしてテキストエリアに入力すると準備完了です。
認証済みだったら動画タイトル部分にまたニコのボタンが出るので、それをクリックしてコメントを入力してまたボタンを押せばTwitterへ投稿できます。(nico.msのURLを使って投稿します。
オリジナルの機能としてはコメント入力欄の右側に文字数のカウンターが付いてるぐらいです。
- mataniconicomiteru for Greasemonkey
- http://userscripts.org/scripts/show/83795
動画がカクカクになるのでFlash Player 10.1からダウングレード
H.264動画のハードウェアアクセラレーションなどに対応したAdobe Flash Player 10.1がリリースされていますが、ニコニコ動画などで動画カクカクになってしまいまともに使えなくなったので10.0系にダウングレードしました。
昔のバージョンにダウングレードする方法
- Adobe – Adobe Web PlayerからFlash Player Uninstaller*をダウンロードして、現在のFlash Palyerをアンインストールする
- Archived Flash Player versionsから昔のFlash Player 10をダウンロードする。(普通の人はdebugger versionsでない方)
- ダウンロードしたzipを解凍すると10r45_2フォルダの中にflashplayer10r45_2_win.exe (IE以外) とflashplayer10r45_2_winax.exe (IE用) があるのでインストールすれば旧バージョンへ戻せる。
10.1にはセキュリティのアップデートも含まれているので、旧バージョンに戻すのはあまり良くないことです。
Adobeのアップデートはこういうことがあるので、セキュリティのアップデートはメジャー?アップデートに含めて欲しくないな。
- Flash Playerをアンインストールして旧バージョンに戻す方法 – GIGAZINE
- http://gigazine.net/index.php?/news/comments/20081023_flash_player_uninstall/
Greasemonkeyでサイト既存CSSの影響を受けないポップアップパネルを作る方法
Greasemonkeyは各サイトでユーザースクリプトを実行できて便利ですが、ある要素を挿入したときにそれがサイトに元々書いてあるCSSの影響を受けてしまうことがあります。
一つのサイトならまだしもhttp*で動くようなものだと対応仕切れないのでiframeを使いサイトに書いてあるCSSの影響を受けないパネルを作る。
iframeの中はそのサイトにあるCSSの影響を受けないので、iframe内にGreasemonkeyで表示したいものを置けば影響を受けないものが作成できる。
makeFrameというのが今回の主題。
makeFrame(gotFrame1);
makeFrame(gotFrame2);
function gotFrame1(iframe, win, doc) {
iframe.height = "350";
iframe.width = "500";
iframe.style.position = "fixed";
iframe.style.bottom = iframe.style.left = "0";
doc.body.innerHTML += "Frame1ですね。"
}
function gotFrame2(iframe, win, doc) {
iframe.height = "350";
iframe.width = "500";
iframe.style.position = "fixed";
iframe.style.bottom = iframe.style.right = "0";
iframe.style.backgroundColor = "#ddd";
doc.body.innerHTML += "Frame2ですよ。"
}
// Creates a new iframe and attaches it to the DOM, waits for it to load, tests
// that we did not hit https://bugzilla.mozilla.org/show_bug.cgi?id=295813 nor
// https://bugzilla.mozilla.org/show_bug.cgi?id=388714 (and retries otherwise),
// to finally call the provided done callback, passing the iframe, its window
// and document. (The optional name parameter, if provided, will be used to name
// the iframe in window.frames, or be created as "pane-1" onwards, otherwise.)
/*
var cacllback = function(iframe, win, doc){
}
makeFrame(cacllback);
makeFrame(cacllback , "frameName");
makeFrame(cacllback , "frameName" , true);// debug mode
*/
function makeFrame(callback/*(iframeTag, window, document)*/, name, debug) {
function testInvasion() {
iframe.removeEventListener("load", done, true);
var message = ((new Date) - load.start) + "ms passed, ";
try { // probe for security violation error, in case mozilla struck a bug
var url = unsafeWindow.frames[framename].location.href;
message += url == "about:blank" ? "but we got the right document." : "and we incorrectly loaded " + url;
if (debug) console.log(message);
done();
}
catch(e) {
if (console && console.error && console.trace) {
console.error(e);
console.trace();
}
if (debug) console.log(message + "and our iframe was invaded. Trying again!");
document.body.removeChild(iframe);
makeFrame(callback, name);
}
}
function done() {
clearTimeout(load.timeout);
if (debug) console.log("IFrame %x load event after %d ms", framename, (new Date) - load.start);
var win = unsafeWindow.frames[framename];
var doc = iframe.contentWindow.document;
// 苦し紛れのエスケープ
var esframeName = "'"+framename+"'";
// 自分自身のiframeを閉じるボタン
var xImg = doc.createElement("img");
xImg.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAATElEQVQoka2RSQ4AIAgD+f+jp96M0aq49AgdUiB0qZCkONQ/EBAwDOrrU7A1uZqN2hodtNwRqNdz0VOg62+jzuDUcVzkf+/I6h28UQHjW25Gob5AIAAAAABJRU5ErkJggg=="
xImg.setAttribute("onclick", "parent.document.getElementsByName("+esframeName+")[0].style.display='none';");
xImg.setAttribute("style","background-color:red;border:3px;position:fixed;top:0px;right:0px");
doc.body.appendChild(xImg);
callback(iframe, win, doc);
}
var iframe = document.createElement("iframe");
var framename = iframe.name = typeof name != "undefined" ? name : ("pane" + (makeFrame.id = (makeFrame.id || 0) - 1));
iframe.setAttribute("style", "overflow:auto;z-index:18999; border:0; margin:0; padding:0;top:auto; right:auto; bottom:auto; left:auto;background-color:#fff");
iframe.src = "about:blank";
iframe.addEventListener("load", done, true);
var frames = makeFrame.data || {};
var load = frames[framename] || {
start: new Date,
sleepFor: 400
};
load.timeout = setTimeout(testInvasion, load.sleepFor);
load.sleepFor *= 1.5;
frames[framename] = load;
makeFrame.data = frames;
document.body.appendChild(iframe);
}
makeFrame関数は(callback ,[フレームのname , debugモード])という引数なので、gotFrame1という関数(callback)を引数にしてmakeFrameを読んでいる。 callbackには(iframe, iframeのwindow, iframeのdocument)が入ってるいるので、iframeのstyleをいじればパネルの色やサイズ、表示する場所などを指定できる。 上記のソースだと左下にframe1、右下にframe2が表示できる。
元ネタからの改良点
- パネルを閉じるボタンの追加
それぞれのパネル右上に表示されているxボタンは、パネルを閉じるボタンとして機能している。 innerHTMLが+になってるのはiframe内にxボタンを追加しているため。
- Flashより上部に表示
パネルなのでFlashがあってもその上に表示できるようにした方が動作的にはいいと思うのでCSSを少し修正した。
要素をFlashより上部する方法は以前書いたFlashよりも前面にポップアップを表示するかFirefox 3.6でFlashの上に position: fixed; な要素を表示できなくなった件 – なんとなく目記を見るといい。
Firefox3.6では挙動が変わったので注意。
Flashより上に表示するには”position: fixed; overflow: auto;”とした要素であり、以下の条件を満たす必要がある。
- 透過でない(Opacityを使わない or 背景色を無指定にしない)
- CSS3?(-moz-)系のstyleを使わない。(-moz-box-shadowなどは陰の部分だけFlashより後ろに表示されてしまう
角丸border-radiusなどは要素に適応されるので要素全体がFlashより後ろに表示される。)
このmakeFrameを使ったサンプルGreasemonkeyとして
ニコニコ動画再生ページからその動画のマイリストコメントをパネル上で参照できる
- Nico MylistComments for Greasemonkey
- http://userscripts.org/scripts/show/72319
を作ってみた。
元ネタ(元ネタのサンプルはtypoがあるので、そのままだと動かない)
- HTML Injection Tips – greasemonkey – GitHub
- http://wiki.github.com/Martii/greasemonkey/html-injection-tips
ニコニコ動画とflvplayer_wrapperの履歴
以前、書いたものをちょっと修正しただけのものなので、意味がおかしい文が混じっている可能性があるので注意
****
flvplayer_wrapper
http://files.getdropbox.com/u/132475/flvplayer_wrapper_mod.zip
使用用途と方法が特殊なため簡単に説明。
flvplayer_wrapperはニコニコ動画の旧プレイヤーをオーバーライドして、旧プレイヤーに新しい機能を追加 することを目的としたソフトウェアです。
旧プレイヤーは2009年7月に開発終了の宣言が出て( http://www.nicovideo.jp/?p=about_player )、
新プレイヤーに切り替わったため、現在は上記のURLのように旧プレイヤーが使用できる一部動画のみで動作する。
使用方法はニコニコ動画のプレイヤーの代わりにflvplayer_wrapperをブラウザ上で呼び出さないといけないため、
プロキシソフトであるProxomitron(オミトロン http://site.halfmoon.jp/movielist/29.html ) や NicoCache_nlといったWebページを書き換えるソフトが必要となります。
具体的な使用方法はwiki( http://wrapper.wiki.zoho.com/ )やreadme.txtにまとめてあるため割愛させていただきます。
既に設定をしてある状態で配布している Proxomitron、
いわゆる設定済flvplayer_wrapper( http://site.halfmoon.jp/movielist/90.html )を使用しているユーザが数千人程度いると思われます。
(1)作ろうと思ったきっかけ
flvplayer_wrapper modとは、名前のように2ちゃんねるで開発されていたflvplayer_wrapperという原型となったソフトがあり、
その公開されていたソースを元に現在の大部分を完成させたflvplayer_wrapper customがありました。
2ちゃんねるでflvplayer_wrapper customの制作者が開発を終了するとの知らせと、同時期にNicoCacheのスレに おいて
簡単なflvplayer_wrapper customの改変方法が書いてあったのが、flvplayer_wrapper modを開発しようとしたきっかけです。
つまり、flvplayer_wrapper modはflvplayer_wrapper customの公開されていたソースコードが元となっています。
flvplayer_wrapperは何人かの制作者によって勝手に受け継がれて作られているので、総称してflvplayer_wrapper と呼ばれている。
flvplayer_wrapperはmingというphpのFLASHを生成するためのライブラリが使われており、中身はAS2がほとんどとなっています。
2008年7月11日に初めてflvplayer_wrapperをさわり始めた当初は、プログラミングもほとんどやったことがなかったので、
少しだけかじっていたjavascriptの知識を元に手探りで改変とニコニコ動画の仕様変更へと対応していました。
そのため、2ちゃんねるの掲示板上での動作報告やアドバイスなどがなかったら、保持していくことはなかったと思います。
(2)工夫点や苦労した点
flvplayer_wrapperはニコニコ動画のプレイヤーにオーバーライドするという仕様上、ニコニコ動画のプレイヤーの
変更に影響を受けやすいため、頻繁に行われていた仕様変更に対応することに多くの時間を費やしました。
ニコニコ動画のプレイヤーをデコンパイルした結果を比較しながら、どこがどのように変更したかを確認したから、
flvplayer_wrapperにそれを落とす作業が多く、その中で新しく便利な追加機能を加えていきました。
特にニコニコ動画でユーザーニコ割が導入された際はかなり大きな変更があり、なおかつ当時はプログラミング知識もあまりなかったため、かなり苦戦してユーザーニコ割へ対応した覚えがある。
また、flvplayer_wrapperは機能の多さと画面の広さを維持したいという思いがあったため、UIにいくつかのパターンを用意したり( http://is.gd/1YI7C )、
プレイヤーを最大化した上でのユーザーニコ割の表示に動画自体の邪魔にならないようにするなどの工夫をした。
ここでも、2ちゃんねるのオミトロンスレでのUIイメージの提供などの協力があったためできたと思います。
flvplayer_wrapperは自分単独で作成したものではありませんが、2008年7月11日から旧プレ イヤーの保持が終了されている現在までに渡って、自分が一番多くの時間を使って関わったソフトウェアである。
nicocache_nlを使用すれば、誤魔化しながらもswfでも動かしたり延命できるかもしれません。
(nicocache_nlには新型用にコンパイルされたswfを旧型(wrapper等)でも動くように変換するソフトが付いているので、
それを利用する。詳しくはNicoCache_nlのreadme.txtやwiki等を参照)
- FrontPage – NicoCache_nl
- http://nicolist.net/nicocache_nl/wiki/
http://files.getdropbox.com/u/132475/flvplayer_wrapper_mod.zip
(0)使用用途と方法
使用用途と方法が特殊なため先に説明させていただきます。
flvplayer_wrapperはニコニコ動画の旧プレイヤーをオーバーライドして、旧プレイヤーに新しい機能を追加することを目的としたソフトウェアです。
旧プレイヤーは2009年7月に開発終了の宣言が出て( http://www.nicovideo.jp/?p=about_player )、
新プレイヤーに切り替わったため、現在は上記のURLのように旧プレイヤーが使用できる一部動画のみで動作する。
使用方法はニコニコ動画のプレイヤーの代わりにflvplayer_wrapperをブラウザ上で呼び出さないといけないため、
プロキシソフトであるProxomitron(オミトロン http://site.halfmoon.jp/movielist/29.html ) や NicoCache_nlといったWebページを
書き換えるソフトが必要となります。
具体的な使用方法はwiki( http://wrapper.wiki.zoho.com/ )やreadme.txtにまとめてあるため割愛させていただきます。
既に設定をしてある状態で配布しているProxomitron、
いわゆる設定済flvplayer_wrapper( http://site.halfmoon.jp/movielist/90.html )を使用しているユーザが数千人程度いると思われます。
(1)作ろうと思ったきっかけ
flvplayer_wrapper modとは、名前のように2ちゃんねるで開発されていたflvplayer_wrapperという原型となったソフトがあり、
その公開されていたソースを元に現在の大部分を完成させたflvplayer_wrapper customがありました。
2ちゃんねるでflvplayer_wrapper customの制作者が開発を終了するとの知らせと、同時期にNicoCacheのスレにおいて
簡単なflvplayer_wrapper customの改変方法が書いてあったのが、flvplayer_wrapper modを開発しようとしたきっかけです。
つまり、flvplayer_wrapper modはflvplayer_wrapper customの公開されていたソースコードが元となっています。
flvplayer_wrapperは何人かの制作者によって勝手に受け継がれて作られているので、総称してflvplayer_wrapperと呼ばれている。
flvplayer_wrapperはmingというphpのFLASHムービーを生成するためのライブラリが使われており、中身はAS2がほとんどとなっています。
2008年7月11日に初めてflvplayer_wrapperをさわり始めた当初は、プログラミングもほとんどやったことがなかったので、
少しだけかじっていたjavascriptの知識を元に手探りで改変とニコニコ動画の仕様変更へと対応していました。
そのため、2ちゃんねるの掲示板上での動作報告やアドバイスなどがなかったら、このプロダクトを保持していくことはなかったと思います。
(2)がんばった点や苦労した点
flvplayer_wrapperはニコニコ動画のプレイヤーにオーバーライドするという仕様上、ニコニコ動画のプレイヤーの
変更に影響を受けやすいため、頻繁に行われていた仕様変更に対応することに多くの時間を費やしました。
ニコニコ動画のプレイヤーをデコンパイルした結果を比較しながら、どこがどのように変更したかを確認したから、
flvplayer_wrapperにそれを落とす作業が多く、その中で新しく便利な追加機能を加えていきました。
特にニコニコ動画でユーザーニコ割が導入された際はかなり大きな変更があり、なおかつ当時はプログラミング知識もあまりなかったため、かなり苦戦してユーザーニコ割へ対応した覚えがある。
また、flvplayer_wrapperは機能の多さと画面の広さを維持したいという思いがあったため、UIにいくつかのパターンを用意したり(
http://is.gd/1YI7C )、
プレイヤーを最大化した上でのユーザーニコ割の表示に動画自体の邪魔にならないようにするなどの工夫をした。
ここでも、2ちゃんねるのオミトロンスレでのUIイメージの提供などの協力があったためできたと思います。
flvplayer_wrapperは自分単独で作成したプロダクトではありませんが、2008年7月11日から旧プレイヤーの保持が終了されている現在までに渡って、自分が一番多くの時間を使って関わったものである。
Jetpackで何かを作ってみる(作り方など
最近Jetpackをいじり始めたので、何かを作りながら作り方を学んでみる。
- Copy shorten URL with is.gd
クリックするとクリップボードに今のURLを短縮したものがコピーされる。
いわゆるクリップボード機能&ステータスバーに挿入を使ってみたかった。 - LDR_StatusBar_Notify
LDRの未読件数をステータスバーに表示
LivedoorReader StatusBar Notify
http://d.hatena.ne.jp/zuzu_sion/20090520/1242900564
を現在のバージョンで動くように修正しただけです。
昔のバージョンではimportがなかったり、Jetpackが大文字でも動いてたらしい。 - clipboard_display
クリップボードの内容をステータスバーに表示。
いわゆるクリップボード機能を使ってm(ry
クリップボードが変更した際に知らせてくれるようなAPIはなかったのでintervalで回してるだけ。 - Nico_make_volume_corrections
ニコニコ動画で再生開始時にSettingで決めたボリュームにする。
manifestで設定画面が簡単に作れるのはいい感じ。
いわゆるGreasemonkey的なものなJetpack
サイトの範囲を指定するのにはpageModsを使用する
Labs/Jetpack/JEP/17 – MozillaWiki
unsafeWindowはwrappedJSObjectを使っちゃってるが、javascript:プロトコルでブックマークレット的にやる方がよいです。
これがXPCNativeWrapperとunsafeWindowの間でデータを送受信する | へびにっき 参考になります。
JetpackのAPIは
プロファイルフォルダ\extensions\jetpack@labs.mozilla.com\content\js
のjsを読むと何があるか分かる。
解説はLabs/Jetpack/JEPs – MozillaWikiを見て、検索をかける(たいていの場合まめ畑がかかります)
azu さんのjetpackに関するメモに返信 に自分がメモったことに対してteramakoさんからの指摘が書いてあります。
今Jetpackでどんなことがどのようにできるのかが何となく書いてあります。
- Jetpack – MDC
- https://developer.mozilla.org/ja/Jetpack
簡素だがAPI解説がまとまってる
- Jetpack APIリファレンス | Screw-Axis
- http://screw-axis.com/jetpack/jetpack-api-referencejetpack-api-reference/
ちょこっと古いけどわかりやすい - [Jetpack] – Cli@
- http://d.hatena.ne.jp/efcl/searchdiary?word=%2a%5bJetpack%5d
- なんかリンクいろいろ
- 30分で作るJetpack Feature (1) 概要 – JavaScriptとかPerlとかPHPとかさくらとか勉強する
- http://d.hatena.ne.jp/lesamoureuses/20090715/1247637734
チュートリアル
JetpackにはSlideBarという機能もあるが今回全く触れてない。
All-in-One Sidebarみたいなものを使えるらしい。
ニコニコ動画のマイリストページに共起タグクラウドを表示するGreasemonkey
- ニコニコ動画の検索ページに共起タグクラウドを表示するChrome用ユーザスクリプト作ってみた – あたご型護衛艦日記
- http://d.hatena.ne.jp/aTaGo/20100112/1263285275
という便利なものがあったので公開マイリストページにもタグクラウドを表示するGreasemonkeyを書いてみた。
// ==UserScript==
// @name Mylist TagCloud
// @namespace http://efcl.info/
// @include http://www.nicovideo.jp/mylist/*
// ==/UserScript==
evalInPage(function(){
var as = my.currentItems
var ids = "";
if(as.length > 1){
insertcallback();
for(var i = 0; i < as.length; i++){
var smid = as[i].item_data.video_id;
ids += smid + "+";
}
//console.log(ids);
var uri = "http://nicotag.sakura.ne.jp/getcollocationtag.php?smid=" + ids + "&rand=" + Math.floor(Math.random()*1000);;
calljsonp(uri);
}
function calljsonp(uri){
var scr = document.createElement('script');
scr.type = "text/javascript";
scr.src = uri;
document.body.appendChild(scr);
}
function insertcallback(){
var callscr = document.createElement('script');
callscr.type = "text/javascript";
callscr.text = ''
+ 'function callback(val){'
+ 'var footer = document.querySelectorAll("div#SYS_box_mylist_body");'
+ 'var foot = footer[0];'
+ 'var div = document.createElement("div");'
+ 'div.innerHTML = val;'
+ 'foot.parentNode.insertBefore(div, foot);'
+ '}';
document.body.appendChild(callscr);
}
})
function evalInPage(fun) {
location.href = "javascript:void (" + fun + ")()";
}
JSONPでしか取得できないような気がしたので、ほぼそのままな感じ。
確かめてないけどChromeでも動くかも。
ニコニコ動画のマイリストページに埋め込まれている情報(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 http://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には影響ない上の関数群のテスト例です。インストールしてマイリストページに行くとコンソールに例が表示されるので参考にどうぞ
ニコニコ動画のAPIまとめ
ニコニコのマイリスト周りにAPIがいろいろ増えていたので、列挙してみる。
使い方は http://res.nimg.jp/js/nicoapi.js をよく読む。
見方としては
分別
メソッド名
URL(http://www.nicovideo.jp/api/foo/bar という感じで使う)
クエリー(それぞれの要素を&でつなげて指定)
返ってくるもの
という感じで書いている。
- Cathode Music: ニコニコ動画(9)APIを纏めた
- http://tewi.blogspot.com/2009/11/9api.html
も併せて読む。
書き方の一例(testという名前のマイリストを新規作成する)
Nico make mylist ←のブックマークレットをニコニコ動画上のトークンがあるページで実行する
var token = NicoAPI.token;
location.href = “http://www.nicovideo.jp/api/mylistgroup/add?name=test&description=&public=1&default_sort=1&icon_id=0&token=”+token;
APIのURLに引数となるクエリーを&区切りでつなげていったURLにアクセスすると正否を表すjsonが返ってくる。
書き込み権限が必要なAPIにはtokenも必要となる。
tokenはNicoAPI.token = “xxxxx-xxxxx-xxxxxxxxxxxx”という感じでページに埋め込まれているので、
Greasemonkeyからならvar token = unsafeWindow.NicoAPI.token で取得できるはず。
基本的に返ってくるものはjson形式
適当にパラメータの説明
- item_typeは0であることがほとんどらしい。動画が0、静画が5。
- item_idは接頭辞のない数字だけの動画番号を指定する
- id_listは id_list[0][]=item_id という感じのパラメータになる
NicoAPI.Deflist
とりあえずマイリスト
list
とりあえずマイリストの一覧を取得
"/api/deflist/list"
jsonフォーマットで返ってくる
add
とりあえずマイリストに追加
"/api/deflist/add",
{ "item_type": item_type,
"item_id": item_id,
"description": description }
item_typeは接頭辞のない数字だけの動画番号を指定する
update
とりあえずマイリストを更新
"/api/deflist/update",
{ "item_type": item_type,
"item_id": item_id,
"description": description }
remove
とりあえずマイリストから削除
"/api/deflist/delete",
{ "id_list": id_list }
move
とりあえずマイリストから移動
"/api/deflist/move"
{ "target_group_id": target_group_id,
"id_list": id_list }
copy
とりあえずマイリストからコピー
"/api/deflist/copy"
{ "target_group_id": target_group_id,
"id_list": id_list }
NicoAPI.MylistGroup
マイリスト
list
jsonフォーマットでマイリスト一覧を取得
マイリストの名前やidなど(中身はNicoAPI.Mylistで)
"/api/mylistgroup/list"
get
指定したマイリストIDの詳細を取得
listに含まれてるのと同じ内容?
"/api/mylistgroup/get"
{ "group_id": group_id }
add
マイリストを新規作成
"/api/mylistgroup/add"
{ "name": name,
"description": description,
"public": is_public,// 0:非公開 1:公開
"default_sort": default_sort,
"icon_id": icon_id }
update
マイリスト情報を更新
"/api/mylistgroup/update",
{ "name": name,
"description": description,
"public": is_public,
"default_sort": default_sort,
"icon_id": icon_id }
remove
マイリストを削除する
"/api/mylistgroup/delete",
{ "group_id": group_id }
sort
マイリストのソートの実行
マイリスト情報の"default_sort"で指定したソート法でソートし直す
"/api/mylistgroup/sort"
{ "group_id_list": group_id_list }
icon_idの指定
左から順に0,1,2,3となっていて 数字で指定
default_sortのソート法の指定
| ソート方法 | ID |
| 登録が古い順 | 0 |
| 登録が新しい順 | 1 |
| メモ昇順 | 2 |
| メモ降順 | 3 |
| タイトル昇順 | 4 |
| タイトル降順 | 5 |
| 投稿が新しい順 | 6 |
| 投稿が古い順 | 7 |
| 再生が多い順 | 8 |
| 再生が少ない順 | 9 |
| コメントが新しい順 | 10 |
| コメントが古い順 | 11 |
| コメントが多い順 | 12 |
| コメントが少ない順 | 13 |
| マイリスト登録が多い順 | 14 |
| マイリスト登録が少ない順 | 15 |
| 時間が長い順 | 16 |
| 時間が短い順 | 17 |
NicoAPI.Mylist
マイリストの動画操作
list
指定したマイリストの動画一覧を取得
"/api/mylist/list",
{ "group_id": group_id }
add
指定したマイリストの動画を加える
"/api/mylist/add",
{ "group_id": group_id,
"item_type": item_type,
"item_id": item_id,
"description": description }
update
指定したマイリストの動画情報を更新
"/api/mylist/update",
{ "group_id": group_id,
"item_type": item_type,
"item_id": item_id,
"description": description }
remove
指定したマイリストの動画を削除
"/api/mylist/delete",
{ "group_id": group_id,
"id_list": id_list }
id_listの形式
function make_id_list(item_type, item_id) {
var id_list = {};
id_list[item_type] = jQuery.makeArray(item_id);
return id_list;
}
move
指定したマイリストの動画を別のマイリストに移動
"/api/mylist/move",
{ "group_id": group_id,
"target_group_id": target_group_id,
"id_list": id_list }
例)
http://www.nicovideo.jp/api/deflist/move?id_list%5B0%5D%5B%5D=動画番号&target_group_id=マイリスト番号&token=トークン
指定したマイリストの動画を別のマイリストにコピー
copy
"/api/mylist/copy",
{ "group_id": group_id,
"target_group_id": target_group_id,
"id_list": id_list }NicoAPI.Watchitem
ウォッチリスト
list
ウォッチリストの一覧を取得
"/api/watchitem/list"
watchitem配列にウォッチリストに登録したユーザー名やIDが入っている
exist
ウォッチリストのitem確認
"/api/watchitem/exist",
{ "item_type": item_type,
"item_id": item_id }
add
ウォッチリストに加える
"/api/watchitem/add",
{ "item_type": item_type,
"item_id": item_id }
remove
ウォッチリストから削除する
"/api/watchitem/delete",
{ "id_list": id_list }
NicoAPI.Mymemory
マイメモリー
list
マイメモリーに入れている動画一覧を取得
"/api/mymemory/list"
remove
マイメモリーからid_listで指定した動画を削除
"/api/mymemory/delete",
{ "id_list": id_list }
NicoAPI.Friendlist
フレンドリスト
list
"/api/friendlist/list",
{ "sort": options.sort,
"order": options.order,
"offset": options.offset,
"count": options.count }
remove
"/api/friendlist/delete",
{ "target_user_id": target_user_id }
NicoAPI.Mylistcomment
マイリストコメント
list
"/api/mylistcomment/list"
{ "item_type": item_type,
"item_id": item_id }
nicoapi.jsには書いてないので、この指定方法が正しいか分からない。
json形式でマイリストが返ってくる
実際にこのAPIを叩くと
{“mylistcomment”:[],”status”:”ok”}
のような空が返ってきてしまう。正しく取得する方法があればお知らせ下さい。
例) sm9 のマイリストコメントを取得 http://www.nicovideo.jp/api/mylistcomment/list?item_type=0&item_id=1173108780 item_typeは0でないといけないらしい。(動画が0で、静画が5だそうです) item_idには接頭辞のない動画番号を指定。
例)Greasemonkeyからマイリストコメントのコメントを取得
getMylistcomments(function(res){
console.log(res)
});
function getMylistcomments(callback){
var itemId = document.getElementsByName("thread_id")[0].value;
GM_xmlhttpRequest( {
method : 'GET',
url : "http://www.nicovideo.jp/api/mylistcomment/list?item_type=0&item_id=" + itemId,
headers : {
'User-Agent' : 'Mozilla/5.0 Greasemonkey; Nico MylistComments'
},
onload : function (res) {
var jsObject = JSON.parse(res.responseText);
var l = jsObject.mylistcomment.length;
var result = [];
if (jsObject.status == "ok" && l > 0) {
for(var i =0;i<l;i++){
result.push(jsObject.mylistcomment[i].description)
}
callback(result)
}
}
});
}
remove
"/api/mylistcomment/delete",
{ "item_type": item_type,
"item_id": item_id,
"comment_user_id": comment_user_id }
静画関係のAPIはこちらを見た方がよいです。
- ニコ動マイリスト系APIまとめ – あたご型護衛艦日記
- http://d.hatena.ne.jp/aTaGo/20100811/1281552243
FirebugのDOMタブが壊れた(競合)
最近になってFirebugのDOMタブで要素をクリックしてもその下の要素が展開されなくなったので、何かのアドオンと競合してるのかを調べてみたら、FxIFというEXIFを見るためのアドオンが原因だと分かった。
FxIFを外すか、過去のバージョンにするかで回避できた。
もう一つ、こっちは競合というわけではないけど、ニコニコ動画がリニューアルしてからマイリストにアクセスするとFirefoxが固まってフリーズするようになってしまった。
こちらの原因はIt’s All Text!というテキストエリアをエディタで編集するアドオンを外す事で解消された。
多分JavaScriptで動的に表示させるようになったのが要因になって、変な動作をするようになったのかな。



