ExtendScriptでcloudファイルにアクセスする(Photoshop、Illustrator)

ExtendScript

今回ExtendScriptからAdobe CCストレージへのアクセスになります。ご存じの通りExtendScriptは古いタイプのECMAでクラウドへのアクセスとかどうするんかという感じもしますがそもそもAdobeのアプリケーションは立ち上がった時点で内部的にユーザー認証もクラウドへのアクセスも終わっているはずなので何か簡単にできる方法があるのではないかと思い調べてみました。
ちなみにAdobe CCストレージですが別に存在するAdobe CC Librariesとは別で前者が純粋にクラウドストレージ内にファイルを保存するためのシステムなら後者は保存したデータをライブラリーとして保存して互換性のある他のアプリケーションからも直ぐに開けるものでデータの共有にとても便利なシステムです。これに関してはクラウドにアクセスするAPIも公開されています。過去に実際に試してみた記事もあるのでよかったら見てください。
それでAdobe CCストレージのアクセスですが今回結論から言うとクラウド内の単体のファイルのアクセスや保存自体はできたのですがクラウド内のファイルをあれこれ検索したりフォルダーを自在に作ったりという完全なアクセスはできませんでした。

IllustratorとPhotoshopで異なる

まずIllustratorにはクラウドアクセスのためのapp.openCloudDocumentやdocument.saveToCloudメソッドがあります。Photoshopにはこれらのメソッドは存在しません。と言うわけでcloud関連っぽいプロパティ、メソッドは以下のようになります。

Photoshop

  • document.cloudDocument

    クラウドドキュメントの場合trueを返す。

  • app.cloudWorkAreaDirectory

    おそらくクラウドドキュメント用に使うローカルの一時的なファイル置き場のディレクトのパスだと思われ。

Illustrator

  • document.cloudPath

    クラウドファイルストレージ上のファイルパスでしょう。

  • document.saveToCloud

    クラウド上にドキュメントを保存するためのメソッド。

  • document.isCloudDocument

    ドキュメントがクラウドドキュメントならtrueを返す。

  • app.openCloudDocument

    クラウドドキュメントを開くためのメソッド

  • app.openCloudLibraryAssetForEditing

    おそらくCC librariesから開くためのメソッドと思われる。今回のCCストレージと直接関係ないので注意。

  • app.setThumbnailOptionsForCloudLibrary

    おそらくCC libraries用のサムネイル画像をセットするメソッドですがとりあえず今回は直接関係ないです。

同じExtendScriptなのにシステムが違うの?と思われた方もいるかもしれませんがどうやら違うみたいです。ただどちらのアプリケーションでも単体ファイルの開く、保存はできます。

Illustratorでアクセスする

まずIllustratorですが親切にもapp.openメソッドとは別にapp.openCloudDocumentという専用のメソッドがあります。これを使えばクラウドにアクセスできるのはわかるのですが引数のファイルパスに悩みます。一応cloudPathプロパティもあるのですがこれでいいのかと不安になるような文字列がこんな感じで返ってきます。
“{“cloud_id”:”urn:aaid:sc:AP:00000000000000000000000″,”local_id”:”urn:uid:local:00000000000000″,”path”:”/cloud-content/art.aic”,”display_name”:”art.aic”}”
これはこれでクラウドにアクセスするための共通の値なのでしょうが結論から言うと今回Illustratorではここまで複雑な値を渡す必要はありません。documentのfullNameプロパティのfullNameプロパティからアクセスに必要なファイルパスを引っ張れます。例えばartと言うファイル名でクラウドのトップのディレクトリに保存されていましたら以下のようになります。
“/ribon.aic”
aiでなくaic拡張子なのはクラウドだらかでしょう。Photoshopの場合psdで無くpsdcになります。

恐ろしいくらい簡単です。ただしクラウドのストレージからその他のファイルを探すgetFilesのようなメソッドが見当たらなかったので事前にクラウドファイルがどのようなファイル名でどの階層に保存されているか知っている上でパスを指定しないといけません。
保存も同じように実行できます。

今回newOneと言うファイル名で保存しています。拡張子は必要なく、保存後aicとして保存されました。

Photoshopでクラウドファイルを開く

Photoshopですが専用のAPIメソッドが存在しません。ただ開く場合は既存のapp.openでも開けますが当初は資料が何もないのでとりあえずScriptEventListenerでコードの調査をしました。ちなみにMacだとセキュリティ上の理由でScriptEventListenerのプラグインが動かずもうわからん感じだったのでScriptEventListenerはWindowsで使いました。

tsukuda.psdcというのは私のファイルのファイル名なので深く気にしないでください。とりあえずクラウド上の開きたい対象のファイルを置き換えてください。ファイルパスですがおそらく”cloud-content”のファイルパスが頭につくとローカルではなくクラウドのストレージを調べるようになっているのでしょう。Windowsの場合”/c/cloud-content/repo:”のファイルパスがついていても開けるのですがMacだと開けませんでした。WindowsのScriptEventListeneだとファイルパスは”/c/cloud-content/repo:~/cloud-content/tsukuda.psdc”と出てきたのでOS間の違いには注意してください。

Photoshopでクラウドファイル保存する

こちらも専用のAPIらしきものは見当たらず、結果としてはScriptEventListeneから取得したコードを使い、以下のようになりました。

中身を覗くとpathだけでなくlocal_idやらdisplay_nameやらpreferenceと普段見慣れない値も渡しています。先ほどIllustrator側のcloudPathで見た値と同じような感じですね。おそらくクラウド用に特殊なオプションを渡しているのでしょうが通常APIでこのようなオブジェクトは見当たらなかったのでおそらくScriptEventListeneのコードを使うしかないでしょう。ちなみにこれらのデータですがlocal_idは”/Users/username/Library/Application Support/Adobe/ACPLocal/(何かIDの番号)@AdobeID/00000000-0000-0000-0000-000000000000/rendition”内に各クラウドストレージのファイルがurn/aaid/sc/AP/(何かのlocal_id)の名前のフォルダーとサムネイルが保存されています。なのでこのフォルダーを調べれば事前に各ファイルのlocal_idの調査も可能ではあるとは思います。またどうフォルダー内のcloud-contentフォルダー内にはあらゆるクラウドファイルがファイル名のフォルダーとその中にサムネイルも一緒に保存されています。このフォルダーリストを調べればクラウドのファイルも調べらるのかと思いましたがクラウド内のディレクトリの構造は再現されていていません。クラウドストレージ内にimgフォルダーがあってその中にファイルがいくつか保存されていてもこのcloud-contentフォルダー内にはimgフォルダーは見当たらなかった。結局この辺りのファイルのアクセスも保存のオプションもわからずじまいでした。

UXP

結論から言うとできませんでした。
保存にしても開くにしてもbatchPlayをAlchemistと標準機能のアクション通知機能を使って調べてもローカルファイルにアクセスする通りのコードしか出てきませんでした。しかも通常ローカルにアクセスする場合Entry型のオブジェクトを渡すのですがクラウドの場合これでアクセスするのかどうかも不明。本家APIが対応するのも不明ですし対応したとしてもかなり長い時間がかかりそうなのでしばらくはできないと考えた方が良さそうです。

とりあえずこういう共通の仕様を作れそうなコアな部分を異なる土台を各種アプリケーション毎に作るのは本当にやめてほしいですがUXPになってもこの傾向は続きそうです。
ちなみに今回の記事ですがこれで終わりと思いきや次があります。
次回はCloudLibraryAssetです。

Beer 寄付してサイトを応援する。