[Google Photos Library API] JavaでGoogleフォトのアルバムを作成・更新する

Google Photos Library API(Java)を使用して、
Googleフォトのアルバムを作成・更新・削除する方法
についてご紹介します。

アルバムはGoogleフォトアプリのアルバムタブから確認することができます。
<img width="380" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/ff71eb04-5b88-8d7b-6be6-acc531d4ee15.png">

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Photos Library API(V1)] JavaでPhotos Library APIを使う](https://qiita.com/doran/items/8695e6007765ab5b382c)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[アルバムを作成](#1-アルバムを作成)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[アルバムを更新](#2-アルバムを更新)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|

## 1. アルバムを作成
アルバムを作成します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
https://www.googleapis.com/auth/photoslibrary
https://www.googleapis.com/auth/photoslibrary.appendonly
https://www.googleapis.com/auth/photoslibrary.sharing
```
[⧉[Google Photos Library API(V1)] JavaでPhotos Library APIを使う(2.2. PhotosLibraryClientインスタンスを取得)](https://qiita.com/doran/items/8695e6007765ab5b382c#22-photoslibraryclientインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    try(PhotosLibraryClient client = getPhotosLibraryClient()){
        Album.Builder builder = Album.newBuilder();
        builder.setTitle("アルバムタイトル");
        
        Album response = client.createAlbum(builder.build());
        System.out.println(response);
    }
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//photoslibrary.googleapis.com/v1/albums
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
Album.Builderのsetメソッドにより、リクエストボディを追加できます。
build()メソッドでAlbumインスタンスを取得し、
createAlbum()に渡します。

|メソッド|引数|説明|
|---|---|---|
|setId|String|アルバムID|
|setTitle|String|アルバムのタイトル|
|setCoverPhotoMediaItemId|String|カバー写真に関連付けられているメディアアイテムID|

### 1.3. レスポンスの内容
#### Album
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|アルバムID|
|getTitle|String|アルバムの名前|
|getProductUrl|String|アルバムのGoogleフォトURL|
|getIsWriteable|Boolean|アルバム内にメディアアイテムを作成できるか|
|getShareInfo|[ShareInfo](#shareinfo)|共有アルバムに関する情報|
|getMediaItemsCount|Long|アルバム内のメディアアイテム数|
|getCoverPhotoBaseUrl|String|カバー写真のバイトへのURL|
|getCoverPhotoMediaItemId|String|カバー写真に関連付けられているメディアアイテムID|

#### ShareInfo
|メソッド|戻り値|説明|
|---|---|---|
|getSharedAlbumOptions|[SharedAlbumOptions](#sharedalbumoptions)|メディアアイテムの追加やコメントを許可するか|
|getShareableUrl|String|共有のGoogleフォトアルバムへのリンク|
|getShareToken|String|共有アルバムへの参加、共有アルバムからの退出、または詳細の取得に使用するトークン|
|getIsJoined|Boolean|ユーザーがアルバムに参加しているか|
|getIsOwned|Boolean|ユーザーがアルバムを所有しているか|
|getIsJoinable|Boolean|ユーザーがアルバムに参加できるか|

#### SharedAlbumOptions
|メソッド|戻り値|説明|
|---|---|---|
|getIsCollaborative|Boolean|共有アルバムで共同編集者にメディアアイテムの追加を許可するか|
|getIsCommentable|Boolean|共有アルバムで共同編集者がアルバムにコメントを追加できるようにするか|

## 2. アルバムを更新
指定したアルバムを更新します。

更新できるアルバムは、Photos Library APIで作成したアルバムのみになります。

### 2.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
https://www.googleapis.com/auth/photoslibrary.edit.appcreateddata
```
[⧉[Google Photos Library API(V1)] JavaでPhotos Library APIを使う(2.2. PhotosLibraryClientインスタンスを取得)](https://qiita.com/doran/items/8695e6007765ab5b382c#22-photoslibraryclientインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行

```java
public static void main(String[] args) throws Exception{
    try(PhotosLibraryClient client = getPhotosLibraryClient()){
        Album.Builder builder = Album.newBuilder();
        builder.setId("アルバムID");
        builder.setTitle("タイトル名");
        FieldMask.Builder fbuilder = FieldMask.newBuilder();
        fbuilder.addPaths("title");
        
        Album response = client.updateAlbum(builder.build(),fbuilder.build());
        System.out.println(response);
    }
}
```
#### 2.2.1. HTTPリクエスト
PATCH:　https:\//photoslibrary.googleapis.com/v1/albums/{アルバムID}
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

#### 2.2.3. リクエストボディ
Album.Builderのsetメソッドにより、リクエストボディを追加できます。
build()メソッドでAlbumインスタンスを取得し、
updateAlbum()に渡します。

|field|メソッド|引数|説明|
|---|---|---|---|
|-|setId|String|【必須】アルバムID|
|title|setTitle|String|アルバムの名前|
|coverPhotoMediaItemId|setCoverPhotoMediaItemId|String|カバー写真に関連付けられているメディアアイテムID|

更新したいフィールドをFieldMask.Builderのsetメソッドにより追加します。
更新可能なフィールドは「title」と「coverPhotoMediaItemId」のみです。
build()メソッドでFieldMaskインスタンスを取得し、updateAlbum()に渡します。

|メソッド|引数|説明|
|---|---|---|
|addPaths|String|【必須】更新するフィールド|

### 2.3. レスポンスの内容
#### Album
[1.3. レスポンスの内容(Album)](#album)と同じです。

<br>
<br>
おしまい。。