棚からパルチャギ

日々の雑記、ニュース拾いとか

2008. 10. 03

拡張マイリスト (0.9.1)
ということで、ネタがあったので更新したわけですがニコニコ動画(秋)対応です。
今回は結構デザインが変わっていたので微妙に面倒だったというか、 id属性が削除されていたりとかレイアウト的に結構キツキツだったりとかで、なかなかグリモン泣かせの改変でした。

10/1更新分の0.9.0からちょっと表示の調整が入っています。ちょっぴり忘れていたんですが、要望いただいたのでSeaHorse版も。スクリーンショットがRC2のままですねー。

2008. 03. 17

SeaHorse版 拡張マイリスト (0.8.1_sh)
flvplayer_wrapperと併用すると登録に失敗するとの報告をもらったので修正。

動画タイトルの取得に失敗すると登録されないというのは以前にもあって、タイトル部分のHTMLを書き換えてしまうような仕組みがあると共存が難しかったりします。 この手の機能を作る場合は、あまり元の構造を崩さないように作ってもらえると嬉しいかもですね。 あと、たまに登録ボタンが複数表示されることがあったので、ついでに修正しています。
SeaHorse版 拡張マイリスト
SleipnirのSeaHorseが、Greasemonkeyとどの程度互換性があるのか気になったので、需要無視で作ってみたりとか。 簡単な動作検証していないので、一応人柱版ということで。

SeaHorse(SleipnirScript?)では、画像の読み込み完了までスクリプトが実行されないので、 ニコニコ動画のように画像数が多い場合は、なかなかリストが表示されないかもしれないです。 データはSQLiteのデータベースとして保存されるので、コピーするだけで他の環境に移動できるのはGreasemonkey版よりも便利。

SeaHorse用に変更が必要なところはGM_setValue()なんかの専用処理だけで、 基本的にはクロスブラウザを意識していなかったJavaScriptコードを修正するのがメインだった気がします。 Firefoxの恵まれた環境に比べると、IEでの開発やデバッグはいろいろと面倒ですねー。
Greasemonkey→SeaHorse移植時の変更点
とりあえず変更したところをメモ。
SeaHorseに合わせたというよりも、Internet Explorerで動作することを考慮しなさすぎバカスという感じでした。


1. Object のプロパティ列挙で、最後に「,」つけてるとNG
var Hoge = { foo = 1, bar = 'fuga', // ←最後に「,」があるとNG }

2. イベントハンドラの設定方法を変更
attachEvent()を使用する。第一引数も微妙に違うのでたまに忘れる。
- obj.addEventListener("click", onClinkHandler, false); + obj.attachEvent("onclick", onClinkHandler);

3. setAttribute()で設定できないプロパティがある
「.」でアクセスする。classとかstyleとかcolspanとか。
- obj.setAttribute('class', 'hoge'); - obj.setAttribute('style', 'border:none; color:red'); - obj.setAttribute('colspan', '4'); + obj.className = 'hoge'; + obj.style.cssText = 'border:none; color:red'; + obj.colSpan = 4;

4. イベントハンドラでthisが参照できない
applyとか使う。thisで参照したいobjectをローカル変数に保存してから渡してもいいみたい。

5. toSource() が使えない
シリアライズを実装する必要がある。 CodeReposのObject.toSourceとか、 小飼弾氏のunevalとかを参考にしてみる。 後者は複数行のstringに非対応っぽいので、ちょっと修正が必要。こんなのでいいのかな。
var name2uneval = { 'boolean':uneval_asis, 'number': uneval_asis, 'string': function(o){ return '\'' + o.toString().replace(/[\\\"\']/gm, function(m0){ return '\\' + m0; }).replace(/\r\n|\n/gm, "\\n") + '\''; }, 'undefined': function(o){ return 'undefined' }, 'function':uneval_asis };

6. document.evaluate() が使えない
XPathで検索できないので別の方法で頑張る。 JavaScript-XPathという手段も。

7. メモリリークする
「IE 循環参照 メモリリーク」とかで検索すると結構ヒットする問題。 一晩放置するとメモリ消費量が1GB超えたりとか大変なことになっていたので、いろいろと対応。 ほとんどリークしないようにはしたつもり。

8. windowオブジェクトは暗黙のthisとして存在しないので明記する
window.setInterval(...);

9. Greasemonkey API
GM_setValue/GM_getValue しか使っていないのでSQLiteでなんとかなるかなーと思っていたら、 既にAPI一式のラッパーライブラリを作っている方が。 互換性は微妙とは書いてあるけど、GM_setValue/GM_getValueについては今のところ問題なし。一番使われてそうなGM_xmlhttpRequestはどうなんだろう。

10. ファイルのエンコードはShift JIS
コメントや文字列に日本語を使っている場合は注意。

2008. 03. 10

拡張マイリスト バグ修正とか
メールフォームから指摘をいただいたんですが、コメント欄に改行されない長い文字列(URLなど)を入力すると、 編集・削除ボタンが表示されなくなって元にも戻せなくなるという不具合を修正しました。

本当は適切な位置で改行させるようにしたかったんですが、元の文字列も維持しつつwbrを挿入したりする処理がかなり泥臭くなってしまったので、 overflow:auto でスクロールバーを表示するようにして誤魔化対応しました。 コメント欄については簡単なメモにしか使っていなかったので、完全に想定外でした…。

あとは、1件目に登録された動画にコメントが保存されないバグがあったのでついでに修正。 原因は恥ずかしくて言えない。 SP1のレイアウト変更で表示が崩れていたのもこっそりと修正済みです。


word-breakとかoverflowとかのスタイル指定は、実は知らなかったのでIRCで教えてもらったりでした。不勉強すぐる。

2008. 01. 23

拡張マイリストFix
動画タイトルの取得に失敗する可能性があるので、XPathの記述をちょこっと修正しました。

今回は以下のような指摘をいただきまして…

するとあることに気がつきました。
ある動画に限ってタイトルがうまく表示されないようなのです。

実は前からGreasemonkeyスクリプトに興味があった私はこれはいい機会!と思ってソースを拝見してみました。

原因はどうやら、タイトル文字の取得方法にありそうです。

Andre's garden: ニコニコ動画拡張マイリストをHackしてみた
実はこの現象、自分の環境(*1)では再現しないのと、 //input[@name=\'m_title\'] というXPathも対応するノードが存在しないので修正コードが動作しなかったりと、微妙に謎だったりするのですが…。

一応件名取得は class="video" な<a>タグのテキストをFIRST_ORDERED_NODE_TYPEで先頭のものだけ取得しているので、 うp主コメントのリンクで誤爆することはないはずなんですが、実際videoクラスのaタグが複数存在することは想定外だったので、 確かにタイトル文字列の取得には問題ないとは言えなさそうです。 ということで、h1で囲まれたリンクのみを対象にしてみたので同様の誤爆は今後発生しないかと思われます。

既にタイトルが動画ID等になってしまっている方はお手数ですが修正版に更新してから、再度動画の登録をお願いします。 その際にどの動画で正しく取得できなかったのか教えていただけると嬉しいです。 ちなみに今回指摘のあったすばらしき新世界をヴァイオリンで弾いてみたは素晴らしい動画でした。 andreryuさん、ありがとうございます(感謝するところが違う><)

(*1) WinXP+Firefox(2.0.0.11)+Greasemonkey(0.7.20070607.0/0.7.20080121.0)

2008. 01. 05

ニコニコ動画に拡張マイリスト(ry
よしよし動画とニコニコ生放送対応。最近の流れに全然追いついてないw
ニコニコ側の仕様が固まってきたので、いちいち追加しないでも対応できるようにそのうち書き換えます。 正月休み(無職だけど)は、これのネットワーク対応するつもりが、ちょっと遊びすぎてしまった。。。

(追記) そもそも仕様変更で動画タイプの画像が表示されてなかったので、とりあえずグラビア動画も含めて共通化されたっぽいURL等に修正。すっきり。 アメーバビジョンは動画が見つからないので未検証です。 あと、キャッシュでスクリプトが更新されないことが多かったので、.htaccessで無効化しました。

  [ 1 | 2 ]