Python版ニコニコ動画ライブラリを試しに公開してみる

※あくまで試験的に公開しています

まぁありきたりというか、なんというかなんですけどニコニコ動画の自分用ライブラリを以前から作っていました。公開してもよかったんですけど、需要があるかわかんないし、まとまってないですし、ニコニコ動画的にもこういうライブラリをつかってごにゃごにゃするのはちょっと・・・という感じらしいので公開してませんでした。

なんですけど、公開されてるライブラリもありますし、せっかくなんで試験的に公開しておけばなんかの役に立つかな、と思いまして。使ってくれる人が多かったりすれば、まとめなおしてCodeReposに突っ込むかもしれません。

ダウンロードしてみる奇特な方はどうぞ

nicovideo.zip

必要なもの

 code
  1.     easy_install mechanize
  2.     easy_install lxml
  3.  

使い方

python code
  1. import nicovideo as n
  2. client = n.NicoClient("mail", "pass", cookie_file="")
  3.  
  4. print "nickname: %s" % client.nickname
  5.  
  6. client.video("sm9").download(with_comments=True)
  7.  
  8. print "search"
  9. for video in client.video_search("test", by=n.SEARCH_KEYWORD, sort=n.SORT_POSTED_AT, order=n.ORDER_DESC)[:10]:
  10.   print video.title
  11.  
  12. print "ranking"
  13. for video in client.video_ranking(by=n.RANKING_MYLIST, span=n.RANKING_DAILY, category="all")[:10]:
  14.   print video.title
  15.  
  16. print "new arrival"
  17. for video in client.video_newarrival()[100:110]:
  18.   print video.title
  19.  
  20. print "mylist"
  21. for video in client.video_mylist(2792158)[100:110]:
  22.   print video.title
  23.  
  24. print "random"
  25. for video in client.video_random():
  26.   print video.title
  27.  

こんな感じです。ニコニコ動画に負荷をかけないように、各httpリクエストの間に最低1秒待つので遅いです。ですが、できるかぎり情報はlazyにとりに行くようになっています。たとえば、video_searchでかえってくるVideoはidとタイトルの情報のみもっていて、その他の情報(lengthなど)にアクセスすると自動的にメタ情報を取りにいきます。メタ情報は

python code
  1. print client.video("sm9").meta
  2. # =>
  3. description レッツゴー!陰陽師(フルコーラスバージョン)
  4. tags {'#text': '', u'tag': [u'\u9670\u967d\u5e2b', u'\u30ec\u30c3\u30c4\u30b4\u30fc\uff01\u9670\u967d\u5e2b', u'\u516c\u5f0f', u'\u904b\u55b6\u516c\u8a8d\u52d5\u753b', u'\u3053\u306e\u52d5\u753b\u306e\u3046\uff50\u4e3b\u306fnicovideo', u'\u97f3\u697d', u'\u4f1d\u8aac\u306esm9', u'\u03b2\u6642\u4ee3\u306e\u82f1\u96c4', u'\u5439\u3044\u305f\u3089\u6210\u4ecf', u'\u30de\u30a4\u30ea\u30b9\uff15\uff10\u4e07\u796d\u308a\u4f1a\u5834']}
  5. file_type flv
  6. comment_num 2618200
  7. l 320
  8. is_premium 0
  9. thread_id 1173108780
  10. view_counter 3839233
  11. link http://www.smilevideo.jp/view/9/350170
  12. nickname name
  13. user_id 00000
  14. title 新・豪血寺一族 -煩悩解放 - レッツゴー!陰陽師
  15. url http://smile-clb42.nicovideo.jp/smile?v=9.0468
  16. posted_at 2007-03-06 00:33:00
  17. video_id sm9
  18. thumb_type video
  19. watch_url http://www.nicovideo.jp/watch/sm9
  20. first_retrieve 2007-03-06 00:33:00
  21. mylist_counter 49956
  22. length 00:05:20
  23. thumbnail_url http://tn-skr.smilevideo.jp/smile?i=9
  24. ms http://msg.nicovideo.jp/10/api/
  25. time 1207225894
  26. done true
  27. #text
  28. last_res_body 1人だけじゃね
  29.  

こんな感じのがとれます。基本的にthubnail APIからとってきて適当に型変換しています。thumbnail APIでの情報に加えて、file_typeなんかが付け加えられます。file_typeもちゃんと判別するのでflvでもmp4でもswfでももちろんちゃんとダウンロードできます。

ほかにもclient.video_newarrival()[100:110]とすると、自動的に何ページ目かを計算してそのページからhttpアクセスしてとりにいきます。

あと、ちょっとダウンロード中の表示がリッチな感じです。

ちょっと設計について

基本的に、NicoClientを拡張して機能を実装します。拡張方法はNicoClientExtensionクラスを拡張したクラスを定義する、以上です。これでNicoClientに自動的にクラス名をunderscoreしたメソッドが生えます。

たとえばVideoNicoClientExtensionです。

python code
  1. class Video(NicoClientExtension):
  2.   URL_WATCH = NicoClient.URL_BASE + "watch/%s"
  3.   URL_API_GET_FLV = NicoClient.URL_BASE + "api/getflv/%s"
  4.   URL_API_GET_THUMB_INFO = NicoClient.URL_BASE + "api/getthumbinfo/%s"
  5.  
  6.   FILE_TYPE_RE = re.compile(".*/smile\?([a-z]{1})\=.*")
  7.  
  8.   def __init__(self, client, id, meta = None):
  9.     self.client = client
  10.     self.id = id
  11.     self.meta = meta or {}
  12.  
  13. # ...
  14.  

という定義でclient.videoというメソッドが生えるという設計になっています。メタクラスにはこういう使い方があります。検索機能も、新着も、気まぐれも全部NicoClientExtensionとして実装されています。

問題点

  • まとまってません。1ファイルに適当につめこんでいます。
  • 全然テストしてません。
  • sm9(陰陽師)が消されると動かなくなります

こんな感じです。

07.27.08/12am

About

Author:yuin(http://inforno.net/)

文学部文化学科卒という生粋の文系趣味プログラマ。

主にRuby、Javascript、PHP、JAVA,Python,C,Scala,Schemeなどを使っています。今はPythonな感じかもしれない。今後作曲活動なども復活するかもしれない。

Pages