ひまつぶしがてら作ってみた
ソース
http://b.hatena.ne.jp/video を開いてるときにGreasemonkeyで http://ext.nicovideo.jp/api/getthumbinfo/hoge から各動画の再生数とか持ってくる.
下記のは古い,というかGistを使うようになった.https://gist.github.com/1583400
// ==UserScript== // @name test // @namespace http://d.hatena.ne.jp/karronoli // @description add nicovideo info to b.hatena.ne.jp/video // @include http://b.hatena.ne.jp/video // ==/UserScript== (function () { "use strict"; let nico_link = (function () { let tmp = document.evaluate( '//a[contains(@href, "nicovideo.jp/")][@class="entry-link"]', document, null, 7, null); return [tmp.snapshotItem(j) for each (j in (function (i) {while(i) yield --i})(tmp.snapshotLength))]; })(); nico_link.forEach(function (nl) { let [target] = nl.pathname.match(/[^\/]+$/); GM_xmlhttpRequest({ method: 'GET', url: 'http://ext.nicovideo.jp/api/getthumbinfo/' + target, data: '', onload: function(res) { let rt = res.responseText; let test = rt.match(/<(video_id)>(.+)<\/\1>/); if (!test || test[2] != target) return ; let info = { view_counter: rt.match(/<(view_counter)>(.+)<\/\1>/)[2], // comment_num: rt.match(/<(comment_num)>(.+)<\/\1>/)[2], length: rt.match(/<(length)>(.+)<\/\1>/)[2] }; nl.parentNode.innerHTML += '<div>' + [(<>{k} : {info[k]}</>) for (k in info)].join('<br />') + '</div>'; } }); }); })();
愚痴
- 配列内包の最初に書いたやつで後置のifを使いたかったからジェネレータは無限の数値列を返せるようにしたんだけど無限ループから返ってこなかった.使いかたおかしい?
- APIが複数個の動画リクエストできるようになって欲しい
- text/xmlじゃなくてapplication/xmlか,もしくはjson返して欲しい
- E4X使えたけど便利じゃない! insertBeforeとかに直接渡せない!! 変数定義部分でしか使えない?
- gihyoさん曰く,div作って,そのinnerHTMLにE4Xのを文字列化して渡す方法
http://gihyo.jp/dev/feature/01/greasemonkey/0002
- DOMノード → E4X XML or E4X XML → DOMノードの変換 とか ヒアドキュメントとか.
http://www.ne.jp/asahi/nanto/moon/2007/04/22/e4x-in-firefox.html
型変換も試したけど不恰好だったのでgihyoさんのマネした.E4Xは変数埋め込みができるヒアドキュメントとして使うものとして覚えた.