使ってみよう! Windows Live SDK/API

第23回 Windows Live フォト ギャラリー ── はてなフォトライフ プラグインの作成 Part II

この記事を読むのに必要な時間:およそ 12 分

Persist XML

Persist XMLはプラグイン固有の設定を保存するために使用します。XML文書の内容はプラグインが自由に決定でき,ShowConfigurationSettingsメソッド呼び出し時にLiveアプリケーションから渡されます。変更した内容の保存は,ShowConfigurationSettingsメソッドの戻り値をTrueとしたときのみLiveアプリケーションにより行われます。

Persist XMLはプラグインの全般的な設定を保存するために用意されているもので,ユーザーパスワードなど重要な情報の保存に使用してはいけません。本記事で作成するプラグインではユーザー名の保存に使用しています。

動画像のアップロード

アップロード処理を行うメソッドはPublishItemです。ユーザーが選択した動画像の個数の回数だけメソッドが呼ばれます。作成するプラグインでは,1回の呼び出しに対して以下の処理を行います。

  1. Session XMLから画像の情報を取得(画像形式,ファイル名,タイトルなど)
  2. 同様に PostURI・ユーザー名・パスワードを取得
  3. はてなフォトライフへ画像をアップロード

メソッドの引数と戻り値

PublishItemメソッドには以下の引数があります。

引数名 説明
parentWindow Liveアプリケーションのウィンドウハンドル。各アップロード処理に何かしらのウィンドウ表示が可能です。
mediaObjectId Liveアプリケーションが付けた動画像のID。Session XMLの<Item>要素id属性と一致しています。
stream アップロードする動画像のバイナリストリーム。
sessionXml ShowConfigurationSettingsメソッド内で編集されたSession XML。
publishProperties IPublishPropertiesオブジェクト。
callback 進行状況の通知およびユーザーによるキャンセル検出のためのIPublishProgressCallbackというInterfaceのオブジェクト。
cancelEvent ユーザーによるキャンセル検出するためのEventWaitHandleオブジェクト。

publishProperties,callback,cancelEventは今回使用しません。

戻り値はShowConfigurationSettingsメソッドと同じくBoolean型です。アップロードが成功した場合はTrueを返し,失敗した場合はFalseを返すようにします。Falseを返した場合もセッションのキャンセルにはならず,さらに動画像がある場合は続けてPublishItemメソッドが呼び出されます。

メソッドの実装

まず,引数のsessionXmlとmediaObjectIdから対象となる動画像の情報を参照します。sessionXmlの<Item>要素のid属性の値がmediaObjectIdと一致している要素がアップロードの対象です。ここでは<Item>要素の情報を使用して以下の処理を行います。

  • 動画・画像の判別
  • 拡張子からContent Type文字列の作成
  • タイトルまたはファイル名から写真名の決定

動画が選択されていた場合は処理を終了し,Content Type文字列は拡張子をみて決定することにします。また,アップロードする写真の名前はLive フォト ギャラリー上でタイトルが付けられていた場合それを利用し,ない場合はファイル名とします。

以上のコードは次のように書くことができます。

' XDocument へ変換
Dim session = XDocument.Parse(sessionXml.InnerXml)

' <Item id="mediaObjectId">要素取得
Dim item = (From e In session.<PhotoGalleryPublishSession>.<ItemSet>.<Item> _
            Where e.@id = mediaObjectId).First

' <PerceivedType>要素がimageの場合は処理を抜ける
If item.<PerceivedType>.Value <> "image" Then
    Return False
End If

' 拡張子から ContentType 文字列作成
Dim contentType As String
Select Case item.<OriginalFileExtension>.Value.ToLower
    Case ".jpg", ".jpeg"
        contentType = "image/jpeg"
    Case ".gif"
        contentType = "image/gif"
    Case ".png"
        contentType = "image/png"
    Case ".bmp"
        contentType = "image/bmp"
    Case Else
        Return False ' サポート外の拡張子
End Select

' 写真名にはタイトルまたはファイル名を使用する
Dim title As String
If item.<Title>.Value <> "" Then
    title = item.<Title>.Value
Else
    title = item.<OriginalFileName>.Value
End If

画像自体のデータはStreamで渡されていますので,Session XMLからPostURI・ユーザー名・パスワードを取得して,それらを作成済みの はてなフォトライフへアップロードするメソッドに渡せば処理は完了です。続きのコードは以下のようになります。

Try
    ' アップロード
    Dim params = session.<PhotoGalleryPublishSession>.<PublishParameters>
    PostPhoto(params.<UserName>.Value, params.<Password>.Value, params.<PostUri>.Value, title, contentType, stream)
    Return True
Catch webEx As WebException
    Return False
End Try

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp