X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mixi.el;h=a9e04ffdb40a027feda6f6e9f9dd00d1871c30ed;hb=6760587c1526fcfbb1f165c4d7152f13903141d6;hp=99e09e69c99e17029a0e1dbf6656002c572ebaae;hpb=6f1a2f40baf606b8ce379e1ff05e457c0c505eea;p=elisp%2Fmixi.git diff --git a/mixi.el b/mixi.el index 99e09e6..a9e04ff 100644 --- a/mixi.el +++ b/mixi.el @@ -45,6 +45,9 @@ ;; * mixi-get-messages ;; * mixi-get-introductions (broken) ;; * mixi-get-news +;; * mixi-get-releases +;; * mixi-get-echoes (limited) +;; * mixi-get-new-echoes (limited) ;; ;; APIs for posting: ;; @@ -52,6 +55,7 @@ ;; * mixi-post-topic ;; * mixi-post-comment ;; * mixi-post-message +;; * mixi-post-echo (limited) ;; ;; Utilities: ;; @@ -138,7 +142,7 @@ (autoload 'w3m-retrieve "w3m") (autoload 'url-retrieve-synchronously "url")) -(defconst mixi-revision "$Revision: 1.181 $") +(defconst mixi-revision "$Revision: 1.192 $") (defgroup mixi nil "API library for accessing to mixi." @@ -438,7 +442,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-logout () (mixi-retrieve "/logout.pl")) -(defconst mixi-login-form "
") +(defconst mixi-login-form "") (defmacro with-mixi-retrieve (url &rest body) `(with-current-buffer (get-buffer-create mixi-temp-buffer-name) @@ -857,7 +861,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-friend (friend) "Realize a FRIEND." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p friend) (with-mixi-retrieve (mixi-friend-page friend) (let ((case-fold-search t)) @@ -1054,12 +1058,16 @@ Increase this value when unexpected error frequently occurs." (signal 'wrong-type-argument (list 'mixi-friend-p friend))) (aset (cdr friend) 13 profile)) -(defmacro mixi-friend-list-page (&optional friend) - `(concat "/list_friend.pl?page=%d" - (when ,friend (concat "&id=" (mixi-friend-id ,friend))))) +(defun mixi-my-friend-list-page (&optional dummy) + (concat "/list_friend_simple.pl?page=%d")) + +(defun mixi-friend-list-page (friend) + (concat "/list_friend.pl?page=%d&id=" (mixi-friend-id friend))) (defconst mixi-friend-list-id-regexp "\\(.+\\)([0-9]+)

") (defconst mixi-friend-list-nick-regexp "\\(.+\\)¤µ¤ó([0-9]+)") @@ -1076,19 +1084,25 @@ Increase this value when unexpected error frequently occurs." (setq range (nth 0 friend-or-range))) (unless (or (null friend) (mixi-friend-p friend)) (signal 'wrong-type-argument (list 'mixi-friend-p friend))) - (let ((ids (mixi-get-matched-items (mixi-friend-list-page friend) - mixi-friend-list-id-regexp - range)) - (nicks (mixi-get-matched-items (mixi-friend-list-page friend) - mixi-friend-list-nick-regexp - range))) - (let ((index 0) - ret) - (while (< index (length ids)) - (setq ret (cons (mixi-make-friend (nth 0 (nth index ids)) - (nth 0 (nth index nicks))) ret)) - (incf index)) - (reverse ret))))) + (let (list-page list-nick-regexp) + (if (or (null friend) (equal friend mixi-me)) + (setq list-page 'mixi-my-friend-list-page + list-nick-regexp mixi-my-friend-list-nick-regexp) + (setq list-page 'mixi-friend-list-page + list-nick-regexp mixi-friend-list-nick-regexp)) + (let ((ids (mixi-get-matched-items (funcall list-page friend) + mixi-friend-list-id-regexp + range)) + (nicks (mixi-get-matched-items (funcall list-page friend) + list-nick-regexp + range))) + (let ((index 0) + ret) + (while (< index (length ids)) + (setq ret (cons (mixi-make-friend (nth 0 (nth index ids)) + (nth 0 (nth index nicks))) ret)) + (incf index)) + (reverse ret)))))) ;; Favorite. (defmacro mixi-favorite-list-page () @@ -1213,7 +1227,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-diary (diary &optional page) "Realize a DIARY." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p diary) (with-mixi-retrieve (or page (mixi-diary-page diary)) (let ((case-fold-search t)) @@ -1345,6 +1359,8 @@ Increase this value when unexpected error frequently occurs." (defconst mixi-new-diary-list-regexp "
\\([0-9]+\\)ǯ\\([0-9]+\\)·î\\([0-9]+\\)Æü \\([0-9]+\\):\\([0-9]+\\)
\\(.+\\) (\\(.*\\))
̾  Á° -\\(.*\\) - - - - -¥¿¥¤¥È¥ë -\\(.+\\) - - -ËÜ  Ê¸ -\\(.*\\) - - - -ºîÀ®Æü»þ -\\([0-9]+\\)·î\\([0-9]+\\)Æü \\([0-9]+\\):\\([0-9]+\\) -¾ÜºÙ¤ò¸«¤ë - -") + "
  • + +
    +
    \\(.+\\)\\([0-9]+\\)·î\\([0-9]+\\)Æü \\([0-9]+\\):\\([0-9]+\\)
    +

    \\(.*\\) +

    +
  • ") ;;;###autoload (defun mixi-search-diaries (keyword &optional range) @@ -1399,20 +1417,20 @@ Increase this value when unexpected error frequently occurs." (year (nth 5 (decode-time (current-time)))) (month (nth 4 (decode-time (current-time))))) (mapcar (lambda (item) - (let ((month-of-item (string-to-number (nth 3 item)))) + (let ((month-of-item (string-to-number (nth 4 item)))) (when (> month-of-item month) (decf year)) (setq month month-of-item) - (mixi-make-diary (mixi-make-friend (nth 8 item) (nth 0 item)) - (nth 7 item) + (mixi-make-diary (mixi-make-friend (nth 1 item) (nth 2 item)) + (nth 0 item) nil (encode-time - 0 (string-to-number (nth 6 item)) + 0 (string-to-number (nth 7 item)) + (string-to-number (nth 6 item)) (string-to-number (nth 5 item)) - (string-to-number (nth 4 item)) month year) - (nth 1 item) - (nth 2 item)))) + (nth 3 item) + (nth 8 item)))) items))) (defmacro mixi-post-diary-page () @@ -1421,7 +1439,7 @@ Increase this value when unexpected error frequently occurs." (defconst mixi-post-key-regexp "\\(ºîÀ®\\|½ñ¤­¹þ¤ß\\)¤¬´°Î»¤·¤Þ¤·¤¿¡£È¿±Ç¤Ë»þ´Ö¤¬¤«¤«¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢É½¼¨¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¾¯¡¹¤ªÂÔ¤Á¤¯¤À¤µ¤¤¡£

    ") + "\\(ºîÀ®\\|½ñ¤­¹þ¤ß\\)¤¬´°Î»¤·¤Þ¤·¤¿¡£È¿±Ç¤Ë»þ´Ö¤¬¤«¤«¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£

    ") ;; FIXME: Support photos. ;;;###autoload @@ -1511,7 +1529,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-community (community) "Realize a COMMUNITY." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p community) (with-mixi-retrieve (mixi-community-page community) (let ((case-fold-search t)) @@ -1780,7 +1798,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-topic (topic &optional page) "Realize a TOPIC." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p topic) (with-mixi-retrieve (or page (mixi-topic-page topic)) (if (re-search-forward mixi-topic-community-regexp nil t) @@ -1972,7 +1990,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-event (event &optional page) "Realize a EVENT." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p event) (with-mixi-retrieve (or page (mixi-event-page event)) (let ((case-fold-search t)) @@ -2354,7 +2372,7 @@ Increase this value when unexpected error frequently occurs." ;; FIXME: Split regexp to time, owner(id and nick) and contents. (defconst mixi-event-comment-list-regexp - "
    \\(\\|\\) + "
    \\(\\|\\) \\([0-9]+\\)ǯ\\([0-9]+\\)·î\\([0-9]+\\)Æü \\([0-9]+\\):\\([0-9]+\\)
    @@ -2837,25 +2855,22 @@ Increase this value when unexpected error frequently occurs." "&media_id=" (mixi-news-media-id ,news))) (defconst mixi-news-finished-regexp - "¿½¤·Ìõ¤´¤¶¤¤¤Þ¤»¤ó¤¬¡¢¤³¤Î¥Ë¥å¡¼¥¹¤Ï·ÇºÜ¤¬½ªÎ»¤·¤¿¤«¡¢URL¤¬´Ö°ã¤Ã¤Æ¤¤¤¤¤ë¤¿¤á¤´Í÷¤¤¤¿¤À¤±¤Þ¤»¤ó¡£") + "

    ¢¨¿½¤·Ìõ¤¢¤ê¤Þ¤»¤ó¤¬¡¢¤³¤Î¥Ë¥å¡¼¥¹¤Ï·ÇºÜ´ü´Ö¤¬½ªÎ»¤·¤¿¤«¡¢URL¤¬´Ö°ã¤Ã¤Æ¤¤¤ë¤¿¤á¤´Í÷¤¤¤¿¤À¤±¤Þ¤»¤ó¡£¾Ü¤·¤¯¤Ï¤³¤Á¤é¤ò¤´Í÷¤¯¤À¤µ¤¤¡£

    ") (defconst mixi-news-title-regexp - "\\(.+\\)\\( -\\)?") + "
    +

    \\(.+\\)

    ") (defconst mixi-news-media-time-regexp - "(\\(.+\\) - \\([0-9]+\\)·î\\([0-9]+\\)Æü \\([0-9]+\\):\\([0-9]+\\))") + "

    ¡Ê\\(.+\\) - \\([0-9]+\\)·î\\([0-9]+\\)Æü \\([0-9]+\\):\\([0-9]+\\)¡Ë

    ") (defconst mixi-news-content-regexp - " - + "
    \\(.+\\) -
    -\\(.* -\\)? - -\\(\\|
    \\)") ++ +\\(
    +
    \\|
    \\)") (defun mixi-realize-news (news) "Realize a NEWS." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p news) (with-mixi-retrieve (mixi-news-page news) (if (re-search-forward mixi-news-finished-regexp nil t) @@ -2984,14 +2999,9 @@ Increase this value when unexpected error frequently occurs." "&type=bn")) (defconst mixi-news-list-regexp - " -¡¦ -\\(.+\\) -\\(\\|\\) - - -\\(.+\\) -\\([0-9]+\\)·î\\([0-9]+\\)Æü \\([0-9]+\\):\\([0-9]+\\)") + "

    ¡¦ \\(.+\\)\"\"

    +\\(.+\\) +\\([0-9]+\\)·î\\([0-9]+\\)Æü \\([0-9]+\\):\\([0-9]+\\)") ;;;###autoload (defun mixi-get-news (category sort &optional range) @@ -3006,19 +3016,227 @@ Increase this value when unexpected error frequently occurs." (year (nth 5 (decode-time (current-time)))) (month (nth 4 (decode-time (current-time))))) (mapcar (lambda (item) - (let ((month-of-item (string-to-number (nth 6 item)))) + (let ((month-of-item (string-to-number (nth 4 item)))) (when (> month-of-item month) (decf year)) (setq month month-of-item) - (mixi-make-news (nth 2 item) (nth 1 item) (nth 5 item) + (mixi-make-news (nth 1 item) (nth 0 item) (nth 3 item) (encode-time - 0 (string-to-number (nth 9 item)) - (string-to-number (nth 8 item)) - (string-to-number (nth 7 item)) + 0 (string-to-number (nth 7 item)) + (string-to-number (nth 6 item)) + (string-to-number (nth 5 item)) month year) - (nth 3 item)))) + (nth 2 item)))) + items))) + +;; Release object. +(defun mixi-make-release (title time content) + "Return a release object." + (cons 'mixi-release (vector title time content))) + +(defmacro mixi-release-p (release) + `(eq (mixi-object-class ,release) 'mixi-release)) + +(defun mixi-release-title (release) + "Return the title of RELEASE." + (unless (mixi-release-p release) + (signal 'wrong-type-argument (list 'mixi-release-p release))) + (aref (cdr release) 0)) + +(defun mixi-release-time (release) + "Return the time of RELEASE." + (unless (mixi-release-p release) + (signal 'wrong-type-argument (list 'mixi-release-p release))) + (aref (cdr release) 1)) + +(defun mixi-release-content (release) + "Return the content of RELEASE." + (unless (mixi-release-p release) + (signal 'wrong-type-argument (list 'mixi-release-p release))) + (aref (cdr release) 2)) + +(defmacro mixi-release-list-page () + `(concat "/release_info.pl?page=%d")) + +(defconst mixi-release-list-regexp + " ¢£ \\(.+\\) +\\([1-9][0-9]+\\)\\.\\([0-9]+\\)\\.\\([0-9]+\\) + + + + + + +
    + + + + + +
    +\\(.+\\) +
    ") + +;;;###autoload +(defun mixi-get-releases (&optional range) + "Get releases." + (let ((items (mixi-get-matched-items (mixi-release-list-page) + mixi-release-list-regexp + range))) + (mapcar (lambda (item) + (mixi-make-release (nth 0 item) + (encode-time 0 0 0 + (string-to-number (nth 3 item)) + (string-to-number (nth 2 item)) + (string-to-number (nth 1 item))) + (nth 4 item))) + items))) + +;; Echo object. +(defvar mixi-echo-cache (make-hash-table :test 'equal)) +;; FIXME: Support parent. +(defun mixi-make-echo (owner post-time &optional content) + "Return an echo object." + (let ((owner (or owner (mixi-make-me)))) + (mixi-make-cache (list (mixi-friend-id owner) post-time) + (cons 'mixi-echo (vector nil owner post-time content)) + mixi-echo-cache))) + +(defconst mixi-echo-url-regexp + "view_echo\\.pl\\?id=\\([0-9]+\\)&post_time=\\([0-9]+\\)") + +(defun mixi-make-echo-from-url (url) + "Return an echo object from URL." + (when (string-match mixi-echo-url-regexp url) + (let ((owner-id (match-string 1 url)) + (post-time (match-string 2 url))) + (mixi-make-echo (mixi-make-friend owner-id) post-time)))) + +(defmacro mixi-echo-p (echo) + `(eq (mixi-object-class ,echo) 'mixi-echo)) + +(defmacro mixi-echo-page (echo) + `(concat "/view_echo.pl?id=" (mixi-friend-id (mixi-echo-owner ,echo)) + "&post_time=" (mixi-echo-post-time ,echo))) + +(defconst mixi-echo-owner-nick-regexp + "
    \\(.*\\)
    ") +(defconst mixi-echo-content-regexp + "
    \\(.+\\)
    ") + +(defun mixi-realize-echo (echo) + "Realize an ECHO." + ;; FIXME: Check an expiration of cache? + (unless (mixi-object-realized-p echo) + (with-mixi-retrieve (mixi-echo-page echo) + (let ((case-fold-search t)) + (if (re-search-forward mixi-echo-owner-nick-regexp nil t) + (mixi-friend-set-nick (mixi-echo-owner echo) + (match-string 1)) + (mixi-realization-error 'cannot-find-owner-nick echo)) + (if (re-search-forward mixi-echo-content-regexp nil t) + (mixi-echo-set-content echo (match-string 1)) + (mixi-realization-error 'cannot-find-owner-nick echo)))) + (mixi-object-touch echo))) + +(defun mixi-echo-owner (echo) + "Return the owner of ECHO." + (unless (mixi-echo-p echo) + (signal 'wrong-type-argument (list 'mixi-echo-p echo))) + (aref (cdr echo) 1)) + +(defun mixi-echo-post-time (echo) + "Return the post-time of ECHO." + (unless (mixi-echo-p echo) + (signal 'wrong-type-argument (list 'mixi-echo-p echo))) + (aref (cdr echo) 2)) + +(defun mixi-echo-content (echo) + "Return the content of ECHO." + (unless (mixi-echo-p echo) + (signal 'wrong-type-argument (list 'mixi-echo-p echo))) + (mixi-realize-echo echo) + (aref (cdr echo) 3)) + +(defun mixi-echo-set-content (echo content) + "Set the content of ECHO." + (unless (mixi-echo-p echo) + (signal 'wrong-type-argument (list 'mixi-echo-p echo))) + (aset (cdr echo) 3 content)) + +(defmacro mixi-echo-list-page (&optional friend) + `(concat "/list_echo.pl?page=%d" + (when ,friend (concat "&id=" (mixi-friend-id ,friend))))) + +(defconst mixi-echo-list-regexp + "") + +;;;###autoload +(defun mixi-get-echoes (&rest friend-or-range) + "Get echoes of FRIEND." + (when (> (length friend-or-range) 2) + (signal 'wrong-number-of-arguments + (list 'mixi-get-echoes (length friend-or-range)))) + (let ((friend (nth 0 friend-or-range)) + (range (nth 1 friend-or-range))) + (when (or (not (mixi-friend-p friend)) (mixi-friend-p range)) + (setq friend (nth 1 friend-or-range)) + (setq range (nth 0 friend-or-range))) + (unless (or (null friend) (mixi-friend-p friend)) + (signal 'wrong-type-argument (list 'mixi-friend-p friend))) + (let ((items (mixi-get-matched-items (mixi-echo-list-page friend) + mixi-echo-list-regexp + range))) + (mapcar (lambda (item) + (mixi-make-echo friend (nth 1 item))) + items)))) + +(defmacro mixi-new-echo-list-page () + `(concat "/recent_echo.pl?page=%d")) + +(defconst mixi-new-echo-list-regexp + "") + +;;;###autoload +(defun mixi-get-new-echoes (&optional range) + "Get new echoes." + (let ((items (mixi-get-matched-items (mixi-new-echo-list-page) + mixi-new-echo-list-regexp + range))) + (mapcar (lambda (item) + (mixi-make-echo (mixi-make-friend (nth 0 item)) (nth 1 item))) items))) +(defmacro mixi-post-echo-page () + `(concat "/add_echo.pl")) + +(defconst mixi-echo-post-succeed-regexp mixi-my-id-regexp) + +;;;###autoload +(defun mixi-post-echo (content &optional parent) + "Post an echo." + (unless (stringp content) + (signal 'wrong-type-argument (list 'stringp content))) + (unless (or (null parent) (mixi-echo-p parent)) + (signal 'wrong-type-argument (list 'mixi-echo-p parent))) + (let (fields post-key) + (with-mixi-retrieve (mixi-post-echo-page) + (if (re-search-forward mixi-post-key-regexp nil t) + (setq post-key (match-string 1)) + (mixi-post-error 'cannot-find-key))) + (setq fields `(("post_key" . ,post-key) + ("redirect" . "home") + ("body" . ,content))) + (when (mixi-echo-p parent) + (setq fields (cons `("parent_member_id" . ,(mixi-friend-id + (mixi-echo-owner parent))) + fields)) + (setq fields (cons `("parent_post_time" . ,(mixi-echo-post-time parent)) + fields))) + (with-mixi-post-form (mixi-post-echo-page) fields + (unless (re-search-forward mixi-echo-post-succeed-regexp nil t) + (mixi-post-error 'cannot-find-succeed))))) + (provide 'mixi) ;;; mixi.el ends here