RubyでEvernoteにJPEG画像付きノートをアップロード

前回サンプルコードでノートのアップロードが出来るところまで確認できたので、次のステップではサンプルコードを色々と弄ってみることに。
目標はこの辺りで。

アップロードするサンプル画像は手元にあった適当な写真からこれを選んだw

固定のEvernoteロゴ画像添付を、任意に選択可能に

まずは固定で “enlog.png” を設定しているところを可変にすることに。
あまり深く考えず、コマンド引数から取得するのが一番楽かな〜

ということで、ファイル名を指定している箇所を適当に書き換える

if (ARGV.size < 2)
  puts "Arguments:  <username> <password>"
  exit(1)
end

username = ARGV[0]
password = ARGV[1]

まずはコマンド引数を取得する箇所を変更

if (ARGV.size < 3)
  puts "Arguments:  <username> <password> <filename>"
  exit(1)
end

username = ARGV[0]
password = ARGV[1]
filename = ARGV[2]

この後、123行目辺りで filename を固定に設定しているところも書き換えて、ひとまずファイルを変更するのは簡単にできるように( ´ ▽ ` )ノ

PNG画像以外にも対応出来るように(とりあえずJPEG)

で、実際にファイルの情報辺りを設定している124行目以降を確認して、必要な場所をそれぞれ追加していきます。

filename = "enlogo.png"
image = File.open(filename, "rb") { |io| io.read }
hashFunc = Digest::MD5.new
hashHex = hashFunc.hexdigest(image)

data = Evernote::EDAM::Type::Data.new()
data.size = image.size
data.bodyHash = hashHex
data.body = image

resource = Evernote::EDAM::Type::Resource.new()
resource.mime = "image/png"
resource.data = data
resource.attributes = Evernote::EDAM::Type::ResourceAttributes.new()
resource.attributes.fileName = filename

まずは、resource.mimeについて。
ファイルを任意に指定出来る様にしているので、ここも自動で設定できるようにしたいところ。 ということで mime-types を使って適当に取得することに。

rubygemsなので、環境に合わせて(mime-typesが無ければ)、必要に応じてインストールします。

$ sudo gem install mime-types

Terminal.appでインストールすればスグに使えるはず。

require "digest/md5"
require "rubygems"
require "mime/types"

ファイル先頭で、MD5辺りのライブラリを読み込んでいるところに “rubygems” と “mime/types” を追加。

mime_type = MIME::Types.type_for(filename).to_s
base_name = File.basename(filename)
resource = Evernote::EDAM::Type::Resource.new()
resource.mime = mime_type
resource.data = data
resource.attributes = Evernote::EDAM::Type::ResourceAttributes.new()
resource.attributes.fileName = base_name

次に、実際にリソース情報を設定している箇所で、適時必要な情報を設定するように。
具体的には、事前に mime_type を取得しておいて、resource.mime に設定。
ついでに resource.attributes.fileName に base_name を取得して設定するように。

その他、ノートの中身で en-media でもMIMEタイプを設定しているので、それは次で合わせて変更します。

ノートの中身を任意に書き換える

note.title = "Test note from ENTest.rb"
note.content = '<?xml version="1.0" encoding="UTF-8"?>' +
  '<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">' +
  '<en-note>Here is the Evernote logo:<br/>' +
  '<en-media type="image/png" hash="' + hashHex + '"/>' +
  '</en-note>'

変更前のノートの中身は、ほとんど固定で設定するだけなので、とりあえず内容を適当に設定するように変更。実際のノートの中身について、適当にここまでで取得している情報を入れるように変更できれば、後は適当に色々情報収集を追加するだけで対応出来るようになるはず!

note.title = "Test note from ENTest.rb (#{base_name})"
note.content = '<?xml version="1.0" encoding="UTF-8"?>' +
  '<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">' +
  '<en-note>FileName: ' + base_name +
  '<br/>MimeType: ' + mime_type +
  '<br/>MD5Digest: ' + hashHex + 
  '<br/>' +
  '<en-media type="' + mime_type +'" hash="' + hashHex + '"/>' +
  '</en-note>'

とりあえず note.title に 先ほどのリソース情報でも変更していた base_name を入れることに。
で、note.content にも適当に情報を入れるようにしたいのだけど…

正直、あまり情報そのものが無いので、base_name, mime_type の他にとりあえず hashHex を設定することに。

結果

でもって、前回同様にTerminalから実行して見て、Web版のSandbox環境でアップロードされたことを確認します。

無事アップロード完了!
ちゃんとノートの中身とかも反映できてる!!( ´ ▽ ` )g

最後にここまでの変更一式のDiffはこちら。

--- EDAMTest.rb.orig    2011-11-03 21:27:40.000000000 +0900
+++ EDAMTest.rb 2011-11-03 21:38:41.000000000 +0900
@@ -11,6 +11,8 @@
 #

 require "digest/md5"
+require "rubygems"
+require "mime/types"

 # Add the Thrift & Evernote Ruby libraries to the load path.
 # This will only work if you run this application from the ruby/sample/client
@@ -30,13 +32,14 @@
 require "Evernote/EDAM/note_store"
 require "Evernote/EDAM/limits_constants.rb"

-if (ARGV.size < 2)
-  puts "Arguments:  <username> <password>"
+if (ARGV.size < 3)
+  puts "Arguments:  <username> <password> <filename>"
   exit(1)
 end

 username = ARGV[0]
 password = ARGV[1]
+filename = ARGV[2]

 #
 # NOTE: You must change the consumer key and consumer secret to the 
@@ -120,7 +123,7 @@
 puts "Creating a new note in the default notebook: #{defaultNotebook.name}"
 puts

-filename = "enlogo.png"
+#filename = "enlogo.png"
 image = File.open(filename, "rb") { |io| io.read }
 hashFunc = Digest::MD5.new
 hashHex = hashFunc.hexdigest(image)
@@ -130,18 +133,23 @@
 data.bodyHash = hashHex
 data.body = image

+mime_type = MIME::Types.type_for(filename).to_s
+base_name = File.basename(filename)
 resource = Evernote::EDAM::Type::Resource.new()
-resource.mime = "image/png"
+resource.mime = mime_type
 resource.data = data
 resource.attributes = Evernote::EDAM::Type::ResourceAttributes.new()
-resource.attributes.fileName = filename
+resource.attributes.fileName = base_name

 note = Evernote::EDAM::Type::Note.new()
-note.title = "Test note from ENTest.rb"
+note.title = "Test note from ENTest.rb (#{base_name})"
 note.content = '<?xml version="1.0" encoding="UTF-8"?>' +
   '<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">' +
-  '<en-note>Here is the Evernote logo:<br/>' +
-  '<en-media type="image/png" hash="' + hashHex + '"/>' +
+  '<en-note>FileName: ' + base_name +
+  '<br/>MimeType: ' + mime_type +
+  '<br/>MD5Digest: ' + hashHex + 
+  '<br/>' +
+  '<en-media type="' + mime_type +'" hash="' + hashHex + '"/>' +
   '</en-note>'
 note.resources = [ resource ]