[Google Photos Library API] JavaでGoogleフォトのメディアアイテム(写真や動画)を取得する

Google Photos Library APIを使用して、
Googleフォトのメディアアイテム(写真や動画)を取得する方法
についてご紹介します。

:::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-レスポンスの内容)|
|3||[複数のメディアアイテムを取得](#3-複数のメディアアイテムを取得)|
||1|[スコープ](#31-スコープ)|
||2|[実行](#32-実行)|
||3|[レスポンスの内容](#33-レスポンスの内容)|

## 1. メディアアイテム一覧を取得
メディアアイテム(写真や動画)の一覧を取得します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
https://www.googleapis.com/auth/photoslibrary
https://www.googleapis.com/auth/photoslibrary.readonly
https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata
```
[⧉[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()){
        ListMediaItemsRequest.Builder builder = ListMediaItemsRequest.newBuilder();
        builder.setPageSize(10);
        ListMediaItemsPagedResponse response = client.listMediaItems(builder.build());
        
        for (MediaItem item : response.iterateAll()) {
            System.out.println(item);
        }
    }
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//photoslibrary.googleapis.com/v1/mediaItems
が実行されます。

#### 1.2.2. クエリパラメータ
ListMediaItemsRequest.Builderのsetメソッドにより、
クエリパラメータを追加できます。

build()メソッドでListMediaItemsRequestインスタンスを取得し、
listMediaItems()に渡します。

|メソッド|引数|説明|
|---|---|---|
|setPageSize|Integer|レスポンスで返すメディアイアテムの最大数<br>デフォルトは25、最大は100|
|setPageToken|String|結果の次のページを取得するための連続トークン|

### 1.3. レスポンスの内容
#### ListMediaItemsPagedResponse
|メソッド|戻り値|説明|
|---|---|---|
|iterateAll|Iterable\<[MediaItem](#mediaitem)\>|メディアアイテムリスト|
|getNextPageToken|String|メディアアイテムの次のセットを取得するためのトークン|

#### MediaItem
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|メディアアイテムID|
|getDescription|String|メディアアイテムの説明|
|getProductUrl|String|メディアアイテムの GoogleフォトURL|
|getBaseUrl|String|メディアアイテムのバイトへのURL|
|getMimeType|String|メディアアイテムのMIMEタイプ|
|getMediaMetadata|[MediaMetadata](#mediametadata)|メディアアイテムに関連するメタデータ|
|getContributorInfo|[ContributorInfo](#contributorinfo)|メディアアイテムを追加したユーザーの情報|
|getFilename|String|メディアアイテムのファイル名|

#### MediaMetadata
|メソッド|戻り値|説明|
|---|---|---|
|getCreationTime|Timestamp|メディアアイテムが最初に作成された時刻|
|getWidth|Long|メディアアイテムの元の幅（ピクセル単位）|
|getHeight|Long|メディアアイテムの元の高さ（ピクセル単位）|
|getPhoto|[Photo](#photo)|写真のメディアタイプのメタデータ|
|getVideo|[Video](#video)|動画のメディアタイプのメタデータ|

#### Photo
|メソッド|戻り値|説明|
|---|---|---|
|getCameraMake|String|写真を撮影したカメラのブランド|
|getCameraModel|String|写真を撮影したカメラのモデル|
|getFocalLength|Float|写真を撮影したカメラのレンズの焦点距離|
|getApertureFNumber|Float|写真を撮影したカメラレンズの絞りのf値|
|getIsoEquivalent|Integer|写真を撮影したカメラのISO|
|getExposureTime|Duration|写真が撮影されたときのカメラの絞りの露出時間|

#### Video
|メソッド|戻り値|説明|
|---|---|---|
|getCameraMake|String|動画を撮影したカメラのブランド|
|getCameraModel|String|動画を撮影したカメラのモデル|
|getFps|Double|動画のフレームレート|
|getStatus|[VideoProcessingStatus(enum)](#videoprocessingstatus)|動画の処理ステータス|

#### ContributorInfo
|メソッド|戻り値|説明|
|---|---|---|
|getProfilePictureBaseUrl|String|投稿者のプロフィール写真のURL|
|getDisplayName|String|表示名|

#### VideoProcessingStatus
|定義値|内容|
|---|---|
|UNSPECIFIED|動画の処理ステータスが不明|
|PROCESSING|動画の処理中|
|READY|動画の処理が完了し、表示できるようになった|
|FAILED|エラーが発生したため、動画を処理できなかった|

## 2. メディアアイテムを取得
指定したメディアアイテム(写真や動画)の情報を取得します。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
https://www.googleapis.com/auth/photoslibrary
https://www.googleapis.com/auth/photoslibrary.readonly
https://www.googleapis.com/auth/photoslibrary.readonly.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()){
        MediaItem response = client.getMediaItem("メディアアイテムID");
        System.out.println(response);
    }
}
```
#### 2.2.1. HTTPリクエスト
GET:　https:\//photoslibrary.googleapis.com/v1/mediaItems/{メディアアイテムID}
が実行されます。

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

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

## 3. 複数のメディアアイテムを取得
指定した複数のメディアアイテム(写真や動画)の情報を取得します。

[2. メディアアイテムを取得](#2-メディアアイテムを取得)が一つのメディアアイテムに対し、
こちらは複数のメディアアイテムを取得できます。
取得できるメディアアイテムの順番は取得時に指定した順番になります。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
https://www.googleapis.com/auth/photoslibrary
https://www.googleapis.com/auth/photoslibrary.readonly
https://www.googleapis.com/auth/photoslibrary.readonly.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()){
        BatchGetMediaItemsResponse response = client.batchGetMediaItems(Arrays.asList("メディアアイテムID"));
        for(MediaItemResult mediaItem : response.getMediaItemResultsList()) {
            System.out.println(mediaItem.getMediaItem());
        }
    }
}
```
#### 2.2.1. HTTPリクエスト
GET:　https:\//photoslibrary.googleapis.com/v1/mediaItems:batchGet
が実行されます。

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

### 2.3. レスポンスの内容
#### BatchGetMediaItemsResponse
|メソッド|戻り値|説明|
|---|---|---|
|getMediaItemResultsList|List\<[MediaItemResult](#mediaitemresult)|取得したメディアアイテムのリスト|

#### MediaItemResult
|メソッド|戻り値|説明|
|---|---|---|
|getStatus|[Status](#status)|エラー発生時のエラー情報|
|getMediaItem|[MediaItem](#mediaitem)|メディアアイテム情報|

#### Status
|メソッド|戻り値|説明|
|---|---|---|
|getCode|Integer|ステータス コード<br>[⧉ google.rpc.Codeの列挙値](https://cloud.google.com/apis/design/errors?hl=ja#handling_errors)|
|getMessage|String|デベロッパー向けのエラー メッセージ|
|getDetailsList|List\<com.google.protobuf.Any\>|エラーの詳細を保持するメッセージのリスト|

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