2007/08/28

Common Lisp でニコニコ動画ダウンローダー

ニコニコ動画ダウンローダー を Common Lisp で。
手頃な url-decode が見つからなかったので、hunchentoot を使ってしまいました。何かいいのがないのかしら。

(eval-when (:load-toplevel :compile-toplevel :execute)
(require :drakma)
(use-package :drakma)
(require :hunchentoot) ; for url-decode
(require :series))

(defun get-video (video-id)
(let ((parameters (with-open-file (in (merge-pathnames #p".nicovideo.lisp" (user-homedir-pathname)))
(read in)))
(cookie-jar (make-instance 'cookie-jar)))
(http-request "https://secure.nicovideo.jp/secure/login?site=niconico"
:method :post
:parameters parameters
:cookie-jar cookie-jar)
(http-request (format nil "http://www.nicovideo.jp/watch/~a" video-id)
:cookie-jar cookie-jar)
(cl-ppcre:register-groups-bind ((#'hunchentoot:url-decode url))
("(?:^|&)url=([^&]+)"
(http-request (format nil "http://www.nicovideo.jp/api/getflv?v=~a" video-id)
:cookie-jar cookie-jar))
(with-open-stream (in (http-request url :cookie-jar cookie-jar :want-stream t))
(with-open-file (out (concatenate 'string video-id ".flv")
:direction :output :if-exists :supersede :element-type '(unsigned-byte 8))
(series:collect-stream out (series:scan-stream in #'read-byte) #'write-byte))))))

#| ~/.nicovideo.lisp は次のようなファイル
(("mail" . "user@example.com")
("password" . "password"))
|#

;;(get-video "sm927967")

0 件のコメント: