ハリウッドVFX業界就職の手引き

ハリウッドVFX業界就職の手引き
鍋潤太郎氏による、海外のVFX業界で働くための手引き。お薦めです。

2016年6月10日金曜日

Shotgunを使って見る その3

Shotgunを使ってみる、と題した連載の3回目です。今回はややテクニカルよりなお話をさせていただきます。過去2回にわたって、Shotgunを自分たちのワークフローにうまく乗せるには、ある程度APIを用いた開発が必要になる、というお話をいたしました。そこで今回と次回では、このAPIの使い方についてお話ししていきたいと思います。今回はこのブログでは初、Pythonプログラミングの基本知識を前提としますので、ご注意下さい。

APIのインストール

まずそのAPIですが、基本的にPythonのライブラリ・パッケージとして提供されています。以下のドキュメントにそのインストール方法が記載されています。

http://developer.shotgunsoftware.com/python-api/

簡単に言うとpip(Pythonのパッケージをダウンロード、インストールするためのツール)を使うのが最も良い方法のようですが、ネットーワークで外部にアクセスできない環境にインストールしたい場合は、GitHubからZip形式のファイルをダウンロードしてきて、任意の場所にインストールすることもできます。

https://github.com/shotgunsoftware/python-api/

GitHubは以前「プログラムを書いてみる その4」でもご紹介しましたが、クラウド上にGitというバージョン・コントロール・システムのリポジトリ(プログラムの履歴を含めたアーカイブのようなもの)を作れるようにしたもので、ここにあるShotgunのページからリポジトリ自体も直接クローニングすることができます。

認証手続き

Shotgun APIを利用するには、Shotgunにアクセスするための認証手続きをスクリプトに埋め込んでおく必要があります。この認証手続きはユーザー・アカウントを使うものと、アプリケーション・キーという鍵文字列を使う方法がありますが、ここではアプリケーション・キーを使う方法をご説明します(理由は後ほどご説明します)。

まず、皆さんが契約しているShotgunのページに行くと、ページの一番右上にご自分のユーザー・アカウントのアイコンが表示されているプルダウン・メニューがありますので、それをクリックして"Scripts"という項目を選んで下さい。表示されたページにある"+ Script"というボタンをクリックすると、新しいアプリケーション・キーを作成することができます。名前には作成するツールと同じ名前を付ければいいでしょう。スクリプトを追加すると、"Application Key"という項目に長めの16進数の文字列が表示されます。これは後ほど必要になりますので、ページを開いたままにしておいて下さい。

Pythonスクリプトを記述するためのエディタやIDEを立ち上げ、コードを書き始めます。Shotgun APIは基本的にShotgunクラスのインスタンスを作成し、そのメソッドを実行することで利用可能です。

import shotgun_api3 as sgapi

sg = sgapi.Shotgun('https://xxx.shotgunstudio.com',
    'apiTest',
    '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef')

Shotgunクラスのインスタンスを作成するときに、ご自分のShotgunサイトのURL、スクリプトの名前、そして先ほどShotgunに追加したスクリプトのアプリケーション・キーをコピー&ペーストします。ドキュメントにはキーワード引数で指定するよう(script_name, api_key)書いてあるかと思いますが、URL, スクリプト名、アプリケーション・キーの順で指定すれば、キーワード引数でなくても大丈夫です。

データベースへのアクセス

Shotgun APIを使う場合、次の2通りの使い方がおそらく最も多い利用法でしょう。
  1. Shotgunのデータベースに対してクエリを発行し、CRUDを実行する。
  2. サムネイルやムービーなどのファイルをアップロードする。
まず1番目のケースですが、Shotgunのデータベースに対して、情報を追加したり、検索したり、変更したり、または削除したりといった基本動作を行います。これらの動作の頭文字(Create, Read, Update, Delete)をとって、これをCRUDと呼びます。CRUDを実行するには、その条件などを文字列やハッシュなどにしたクエリと呼ばれる命令文をデータベースに渡してやることで実行します。Shotgunから情報を引き出す場合、少なくともそのデータ・タイプとフィールドをあらかじめ特定しておく必要があります。

データ・タイプはドキュメントを見るとわかりますが、例えばショットはShot、アップロードしたムービーなどのバージョン・データはVersionなど、比較的わかりやすい名前になっています。それに対して、フィールド名はドキュメントを一瞥しただけでは全てはわかりませんし、Shotgunのウェブアプリケーションに表示される名前もAPIでアクセスできるそれとは異なるため、分かりにくくなっています。簡単に調べる方法としては、各データ・タイプのメイン・ページに行き、サムネイルの右隣にカーソルを持っていくと表示されるConfigure fieldsをクリックします。ウィンドウが開いて左側にフィールドの一覧が表示されますが、そのフィールド名にカーソルを持っていくと、右側に表示される名前が、実際にAPIでアクセスできるフィールド名です。



また、以下のコードを実行すると、各データ・タイプのフィールドをすべてリストアップできます。

fields = sg.schema_field_read('Shot', None)

for key in fields.keys():
    print key

ちなみに、fields[key]には、そのフィールドの詳細な情報(データ型やデフォルト値など)がディクショナリの形式で入っています。

データ・タイプと取得したいフィールドが何かわかったら、find_oneメソッドを使ってデータを検索することができます。find_oneメソッドはその名の通り、条件にあったデータの最初の1つを取得する、というものです。例えば、ある特定のショットの情報を取得したい場合は、以下のようなコードになります。

shot = sg.find_one(
    'Shot',
    [['project', 'is', proj], ['sg_sequence', 'is', seq], ['code', 'is', 'sh001']],
    ['id', 'sg_shot_in', 'sg_shot_out', 'image'])

最初の引数は取得したいデータのタイプで、2番目は検索条件をリストで指定します。各検索条件はさらにリストになっており、クエリ文を入れて様々な検索をすることができます。この例では"is"というクエリ文を入れていますが、これは条件にぴったり一致するもののみを探す、という意味です。3番目が検索した結果得られたデータのどのフィールドの情報が欲しいかをリストで指定します。このメソッドでは、これらのフィールドの値がフィールド名をキーにしたディクショナリになって返されますが、この指定ががない場合でも、最低そのデータのIDだけは返されます。

IDとはそれぞれのデータ・タイプにおいてユニークな番号で、すべてのデータがこれを持っています。したがってIDさえあれば、基本それだけで検索を行うことが可能です。また、検索条件のところで"project"と"sg_sequence"というフィールドを指定していますが、これらのフィールドに指定された値はIDを含んだそれぞれのデータ・タイプのディクショナリです。したがって、この例にあるショットの検索をかけるためには、あらかじめProjectとSequenceのデータを取得しておく必要があります。

ファイルのアップロード

今度は2番目のケースとして、ファイルのアップロードを行います。Shotgunではウェブ・アプリケーションを使って、サムネイルやムービー・ファイルをアップロードすることができますが、APIでも同様のことを行うことができます。これを利用すれば、例えばコンポジターが連番イメージをファイル・サーバーの共有エリアにアップロードしたら、自作のスクリプトにサーバーを定期的に巡回させ、発見した連番イメージをrvio(Shotgun付属のコマンドライン・ツール)などでムービーに変換し、それをShotgunにアップロードさせる、などといった一連の操作を自動化することができます。

sg.upload_thumbnail('Shot', 24, '/data/images/thumbnail.jpg')

まずサムネイルのアップロードですが、基本これだけです。upload_thumbnailというまんまのメソッドがありますので、それを使います。引数にはサムネイルをアップロードしたいデータのタイプ、ID、そしてサムネイル・ファイルへのパスです。

ver = sg.create(
    'Version',
    {'project': 5, 'entity': seq, 'code': 'ver001', 'sg_status_list': 'na'})

sg.upload('Version', ver['id'], '/data/movies/preview.mp4', 'sg_uploaded_movie')

ムービーをアップロードしたい場合は、少し手順を踏む必要があります。ムービー・ファイルはVersionというタイプのデータに紐づけられて管理されますので、まずそれを作る必要があります。これにはcreateメソッドを使います。"entity"というフィールドがありますが、これにはVersion自体が紐づけられるデータを指定します。ここで指定しているseqはSequenceタイプのデータのディクショナリです。Versionタイプのデータが作成されたら、そのデータに対してムービー・ファイルをアップロードします。アップロードできるムービーのフォーマットはかなり幅広いものに対応していますが、最終的には720pのH.264フォーマットに変換されて保存されます。

APIの使いどころ

APIの最大のメリットは、Shotgunのアカウントが必要とされない、ということです。Shotgunにアクセスできる環境にあって、アプリケーション・キーさえあれば、誰でもShotgunから情報を引き出したり、書き込んだりしたりすることができます。そのため、Shotgunの機能を限定的にしか使わない、例えば現場のアーティストなど、コーディネーターによってタスクのスケジューリングなどは管理されており、Shotgunにアクセスする必要があるのは、そのデータベースからフレーム・レンジなどの情報を引き出したり、アセットをパブリッシュした時にその情報をShotgunに転送したりするだけなどであれば、そうしたことはAPIを使って作ったツールなどで行い、アカウントはマネージャーやコーディネーターなどの管理職と、Pipeline TDなどの開発者のみに割り当てれば、リーズナブルに使うことができます。いきなりフタッフの数全員分のアカウントを購入するのがためらわれるようであれば、そのようなやり方をするのもアリでしょう。

Shotgunの開発ツールには他に、ウェブ・アプリケーション上で発生したイベントにコールバックを設定し、特定の動作をさせるイベント・ハンドラと呼ばれる機能があります。次回は、このイベント・ハンドラについてお話ししたいと思います。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。