2011-01-13

20 minutes blogging trail [2011-01-12 Wed]

今日もこのブログに書くことを考えながら過ごす20分の時間をスタートさせました。 例によってネタは「org-modeからblogger.comへ投稿できる」ということですが。

使っている道具を紹介します。

  • org-blogger.el
  • org2blogger.el
  • get-direct-url-in-picasa.py
  • getalbumid.py
  • upload-image-to-blogger-in-picasa.py

です。 なお、これらのpythonスクリプトは

  • gdata ライブラリ?

が先にインストールされてないと動作しません。 ま、インストールしたと言うことで。

使うための用意

まずは、albumidを取得して、次のアップロードに備えます。この作業は初回のみでOKです。 毎回行う必要はありません。

#!/usr/bin/python
import sys
import gdata.photos.service

#usage: in command.com like winXP, 
# > python get_albmid.py| nkf -s
# use "nkf -Wsd", if needed.

args = sys.argv
#args.pop(0)
email = "your@gmail.com"
password = "it's a nuts"
username='default'

gd_client = gdata.photos.service.PhotosService()
gd_client.email = email
gd_client.password = password
gd_client.source = 'exampleCo-exampleApp-1'
gd_client.ProgrammaticLogin()

albums = gd_client.GetUserFeed(user=username)
for album in albums.entry:
  print 'id:[%s] title:[%s] number of photos: %s' % (album.gphoto_id.text, album.title.text, album.numphotos.text)

を実行すると、

>get_albumid.py
id:[5555555555555555555] title:[Windows Live Writer] number of photos: 2
id:[1234567890123456789] title:[Chemical-X] number of photos: 18

というIDの数字と、アルバムのタイトルが出てきました。 アルバムは、picasa内で確認できるアルバムの数と同じです。

そして、特定のアルバムに画像を追加したいときに、この album id :1234567890123456789 (自分の"Chemical-X"なら) を次に使います。

画像の有無をチェック・無ければアップロード

ここで得たalbum id を使って、そのアルバムに画像を追加したいとします。

bloggerに執筆するときにはそれらをひとまとまりにしたい

というのが良くある考え方だと思います。 その時、 get-direct-url-in-picasa.pyをつかって、picasa上にその画像の有無を調べます。 画像があれば、picasa上のファイルへのdirect linkが得られるはずです。 もしpicasa上にその画像が無いと判断したら、 upload-image-to-blogger-in-picasa.pyをつかって、 最初に得たalbum id を指定して、画像をアップロードします。 そしてその画像のpicasa上でのdirect linkをget-direct-url-in-picasa.pyで得ます。

まずはget-direct-url-in-picasa.py の内容です。

#!/usr/bin/python2.5
# return the direct link (URL) of picture in picasa.

import sys # for argv
import gdata.photos.service
import gdata.media
import gdata.geo

argvs = sys.argv
argc = len(argvs)
if (argc != 3 ):
    print 'Usage: # python %s AlbumName FileName' % argvs[0]
    quit()

albumname = argvs[1]
filename = argvs[2]
album_id="1234567890123456789" # the albm_id fo "Chemical-X" was given by get_albumid.py

gd_client = gdata.photos.service.PhotosService()
gd_client.email = 'changeme@gmail.com'     # Set your Picasaweb e-mail address...
gd_client.password = 'secret word'  # ... and password
gd_client.source = 'api-sample-google-com'
gd_client.ProgrammaticLogin()



album_url = '/data/feed/api/user/%s/albumid/%s' % ('default', album_id)
photos = gd_client.GetFeed('/data/feed/api/user/%s/albumid/%s?kind=photo' % ('default', album_id))
for photo in photos.entry:
    if photo.title.text == filename :
        print photo.content.src,

続いて、upload-image-to-blogger-in-picasa.py の内容です。

#!/usr/bin/python2.5
# return the direct link (URL) of picture in picasa.

import sys # for argv
import gdata.photos.service
import gdata.media
import gdata.geo

argvs = sys.argv
argc = len(argvs)
if (argc != 2 ):
    print 'Usage: # python %s FileName' % argvs[0]
    quit()

filename = argvs[1]


gd_client = gdata.photos.service.PhotosService()
gd_client.email = 'changeme@gmail.com'     # Set your Picasaweb e-mail address...
gd_client.password = 'secret password'  # ... and password
gd_client.source = 'upload-image-to-blogger-in-picasa'
gd_client.ProgrammaticLogin()
album_id="1234567890123456789" # the albm_id fo "Chemical-X" was given by get_albumid.py


album_url = '/data/feed/api/user/%s/albumid/%s' % ('default', album_id)
photo = gd_client.InsertPhotoSimple(album_url, filename, filename, filename, content_type='image/png')
print photo.content.src,

これで、画像がもともとpicasa上にあってもなくてもどちらの場合だったとしても、 処理後には、picasa上のurlを取得できたことになります。

それを使って、org2blogger.elでは、エクスポートしたhtml無いでの画像リンク先を変更するという作業を行います。 以下、org2blogger.el.

(setq get-url-script-name "pathto/org2blogger/get-direct-url-in-picasa.py")
(setq upload-image-script-name "pathto/elisp/org2blogger/upload-image-to-blogger-in-picasa.py")
(setq image-file-path "l:/0mine/org/images/")
(setq blog-name "Chemical-X")
(setq albumid "1234567890123456789") ; given by get_albumid.py for "Chemical-X")

(defun replace-links-with-upload-image-url ()
  (interactive)
  (while (re-search-forward "^<img src=\"images/\\(.*\.png\\)\"  alt=\"\\(.*\.png\\)\" />" nil t)
      (setq local-image-file-name (buffer-substring-no-properties (match-beginning 1) (match-end 1)))

      ;check the blog already has the image file or not.
      (setq uploaded-img-url 
            (chomp (get-uploaded-img-url get-url-script-name blog-name local-image-file-name)))
      (message "Match file name: %s" uploaded-img-url)
      (if (string-equal uploaded-img-url "")
                                        ;if the blog does not have the image, upload the image firstly, and receive the URL.
                                        ;if the blog has the image, just receive the URL.
          (progn
            ;upload image file-name
            ;get uploaded file name (direct URL) again.

            (setq uploaded-img-url
                  (shell-command-to-string (concat upload-image-script-name " " image-file-path local-image-file-name)))
            (message "uploaded-img-url:%s" uploaded-img-url)
;           (setq uploaded-img-url 
;                 (chomp (get-uploaded-img-url get-url-script-name blog-name local-image-file-name)))
            )
        )

      ;replace the line with htmlized-img-url string.
      ;Delete line
      ;The equivalent of ‘kill-line’ (‘C-k’) but without kill ring side effects:
      (delete-region (line-beginning-position) (line-end-position))

      (insert (htmlized-img-url uploaded-img-url))
      )
;  (message "matched string: %s" match-string)
)


(defun get-uploaded-img-url (script-name blog-name file-name)
      (shell-command-to-string (concat script-name " "
                                       blog-name " "
                                        file-name)))


(defun chomp (str)
      "Chomp leading and tailing whitespace from STR."
      (let ((s (if (symbolp str) (symbol-name str) str)))
        (replace-regexp-in-string "\\(^[[:space:]\n]*\\|[[:space:]\n]*$\\)" "" s)))

(defun htmlized-img-url (uploaded-img-url)
  (concat "<a "
          "onblur=\"try {parent.deselectBloggerImageGracefully();} catch(e) {}\" "
          "href=\"" uploaded-img-url "\">"
          "<img "
          "style=\"display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;\" "
          "src=\"" uploaded-img-url "\" "
          "border=\"0\" "
          "alt=\"\" "
          "/>"
          "</a>"
          )
  )

置換し終わったhtmlをorg-googlecl.elのorg-googlecl-blog関数を使ってblogger.comへ投稿します。 org-modeで書いたテキスト内で、

M-x org-googlecl-blog

してみてください。 世界が変わって見えましたか?

終わりに

これで画像を含むorg-mode の文章も、全自動でblogger.comへ投稿できるようになりました。 org-mode でblogger.comへ投稿するすてきなemacsライフを。

35分かかりましたね。まぁ、いいや。 このシリーズはこれでおしまいです。

0 件のコメント:

コメントを投稿

Related Posts: