[Google Photos Library API(V1)] JavaでPhotos Library APIを使う

Googleが提供しているPhotos Library APIをJavaで使ってみました。

***Photos Library APIとは***
Googleが提供しているAPIで、Googleフォトに関する操作ができます。

Google Photos Library APIの利用料金は無料です。
ただし、１日あたりのリクエスト数の上限があります。
|対象|制限|
|---|---|
|通常のリクエスト|10,000 リクエスト/日|
|メディアバイトにアクセスするリクエスト|75,000 リクエスト/日|

詳細は[公式ドキュメント](https://developers.google.com/photos/library/guides/api-limits-quotas?hl=ja)を参照ください。

**APIを使う上で気をつけて欲しい**のですが、
基本的に「Photos Library API」を使っての設定や更新の処理は、
<font color="red">同じGCP認証のAPIで実行して作成したアルバムやメディアアイテム(写真や動画)</font>
に対してのみになります。
（なお、Googleフォト上の情報を取得する場合はその限りではありません。）

スマホで撮影した写真や動画をAPIを使っていろいろ整理しようと試みましたが、
このようなAPIの性質のせいで思ったようなことができませんでした。
情報の取得はできますが、exif情報(撮影日は無し)も一部しか取れないようです。

|No||目次|
|---|---|---|
|1||[Photos Library APIを使用するための準備](#1-photos-library-apiを使用するための準備)|
||1|[プロジェクトの作成](#11-プロジェクトの作成)|
||2|[Photos Library APIの設定](#12-photos-library-apiの設定)|
||3|[OAuth2.0のクライアントIDを取得](#13-oauth20のクライアントidを取得)|
|2||[Photos Library APIを使ってみる](#2-photos-library-apiを使ってみる)|
||1|[googleライブラリの読み込み](#21-googleライブラリの読み込み)|
||2|[PhotosLibraryClientインスタンスを取得](#22-photoslibraryclientインスタンスを取得)|
||3|[プログラムの実行](#23-プログラムの実行)|
|3||[いろいろとAPIを叩いてみる](#3-いろいろとapiを叩いてみる)|
||1|[v1.albums](#31-v1albums)|
||2|[v1.mediaItems](#32-v1mediaitems)|
||3|[v1.sharedAlbums](#33-v1sharedalbums)|

# 1. Photos Library APIを使用するための準備
設定は下記から行います。
[⧉Google クラウド プラットフォーム](https://console.cloud.google.com/)

やることは大きく分けて下記の3つです。
[１.GCPプロジェクトの作成](#11-プロジェクトの作成)
[２.Photos Library APIの有効化](#12-photos-library-apiの設定)
[３.OAuth2.0のクライアントIDを取得](#13-oauth20のクライアントidを取得)

Photos Library APIはOAuthクライアントの使用のみサポートされています。

### 1.1. プロジェクトの作成
まずはGCPでプロジェクトを作成します。
詳細はこちらの記事を参照ください
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.1. プロジェクトの作成)](https://qiita.com/doran/items/3d43f776188b2281044c/#11-プロジェクトの作成)

### 1.2. Photos Library APIの設定
Photos Library APIを使えるようにします。
###### 1. メニューの 「APIとサービス」 -> 「ライブラリ」 を選択します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2fda7515-ffdf-11d7-4142-fed896cc8413.png">

###### 2. photos と入力して「Photos Library API」を検索します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e7249b4f-9b34-56dd-ce2a-afa0a9d30667.png">

###### 3. 「有効にする」ボタンを押して「Photos Library API」を使用可能にします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/5bfa3445-cbfb-e657-70b9-13392e7004e9.png">

### 1.3. OAuth2.0のクライアントIDを取得
同じ内容を下記の記事に掲載してますので、下記の記事を参照ください。
[⧉[Google Drive API v3] JavaでDrive APIを使う](https://qiita.com/doran/items/15b2c59adb410ddeeb8a/#13-apiを使用するためのキー取得)

# 2. Photos Library APIを使ってみる
### 2.1. googleライブラリの読み込み
Photos Library APIを使用するためにライブラリのパスを設定します。
私の環境はpom.xmlで下記を指定しています。
Javaのバージョンは21を使用しています。

```xml
<dependencies>
    <dependency>
        <groupId>com.google.photos.library</groupId>
        <artifactId>google-photos-library-client</artifactId>
        <version>1.7.3</version>
    </dependency>
    <dependency>
        <groupId>com.google.oauth-client</groupId>
        <artifactId>google-oauth-client-jetty</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>libraries-bom</artifactId>
            <version>26.34.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
```

### 2.2. PhotosLibraryClientインスタンスを取得

コード中の「JSONファイルのパス」は、
[⧉[Google Drive API v3] JavaでDrive APIを使う(1.3.2.1 認証情報の作成)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a/#1321-認証情報の作成)
で取得したJSONファイルのパスを指定してください。

コード中の「認証情報を保存するフォルダパス」は、
認証情報が保存されるフォルダのパスを指定してください。
このコードを実行するとOAuth同意画面が表示されます。
ユーザーが同意をすると認証情報を保存するフォルダにファイルが生成されます。
このファイルが存在した場合は、再度実行してもOAuth同意画面は表示されません。

コード中の「スコープ」は、
実行するAPIによって異なるので適時に変更してください。
途中でスコープを変更した場合は再度のOAuth同意が必要になるので
「認証情報を保存するフォルダパス」にあるファイルを削除するか、パスを変えてください。
```java
private static PhotosLibraryClient getPhotosLibraryClient() throws Exception{
    HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
    GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
    
    try(Reader reader = new InputStreamReader(new FileInputStream("JSONファイルのパス"))){
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory,reader);
        
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                transport, jsonFactory, clientSecrets, 
                Arrays.asList("スコープ"))
            .setDataStoreFactory(new FileDataStoreFactory(new java.io.File("認証情報を保存するフォルダパス")))
            .build();
        
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().build();
        Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
        UserCredentials credentials = UserCredentials.newBuilder()
                .setClientId(clientSecrets.getDetails().getClientId())
                .setClientSecret(clientSecrets.getDetails().getClientSecret())
                .setRefreshToken(credential.getRefreshToken())
                .build();

        PhotosLibrarySettings settings = PhotosLibrarySettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) 
                .build();
        return PhotosLibraryClient.initialize(settings);
    }
}
```

### 2.3. プログラムの実行
プログラムを動かします。
サンプルでは、ユーザーのGoogleフォトライブラリから
すべてのメディアアイテムの一覧を表示しています。

```java
public static void main(String[] args) throws Exception{
    try(PhotosLibraryClient client = getPhotosLibraryClient()){
          ListMediaItemsPagedResponse response = client.listMediaItems();
          for (MediaItem item : response.iterateAll()) {
            System.out.println(item);
          }
    }
}
```
# 3. いろいろとAPIを叩いてみる
いろいろなAPIを叩いてみます。

### 3.1. v1.albums
|メソッド|概要|記事|
|---|---|---|
|addEnrichment|指定したアルバムにエンリッチメントを追加|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバムにエンリッチメントを追加する](https://qiita.com/doran/items/25e4ef59ce82713baf8e)|
|batchAddMediaItems|指定したアルバムにメディアアイテム(写真や動画)を追加|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバムにメディアアイテム(写真や動画)を追加する](https://qiita.com/doran/items/d807708a45a8d7eca5f3)|	
|batchRemoveMediaItems|指定したアルバム内のメディアアイテム(写真や動画)を削除|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバム内のメディアアイテム(写真や動画)を削除する](https://qiita.com/doran/items/b3bb9e3fad87e714d019)|
|create|アルバムを作成|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバムを作成・更新する](https://qiita.com/doran/items/b5ecc7005f19fbf0a35a)|
|get|指定したアルバムの情報を取得|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバムを取得する](https://qiita.com/doran/items/97d74839322f76560f7e)|
|list|アルバム一覧を取得|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバムを取得する](https://qiita.com/doran/items/97d74839322f76560f7e)|
|patch|指定したアルバムを更新|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバムを作成・更新する](https://qiita.com/doran/items/b5ecc7005f19fbf0a35a)|
|share|指定したアルバムを共有|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバムを共有・共有解除する](https://qiita.com/doran/items/b15fe890e79d9b0d9d18)|
|unshare|指定したアルバムの共有を解除|[⧉[Google Photos Library API] JavaでGoogleフォトのアルバムを共有・共有解除する](https://qiita.com/doran/items/b15fe890e79d9b0d9d18)|
	
### 3.2. v1.mediaItems
|メソッド|概要|記事|
|---|---|---|
|batchCreate|メディアアイテム(写真や動画)を作成|[⧉[Google Photos Library API] JavaでGoogleフォトのメディアアイテム(写真や動画)を追加・更新する](https://qiita.com/doran/items/fd6ea924f8ce8071ce8c)|
|batchGet|指定した複数のメディアアイテム(写真や動画)の情報を取得|[⧉[Google Photos Library API] JavaでGoogleフォトのメディアアイテム(写真や動画)を取得する](https://qiita.com/doran/items/5dcddfb9ee7ff0fc7df1)|
|get|指定したメディアアイテム(写真や動画)の情報を取得|[⧉[Google Photos Library API] JavaでGoogleフォトのメディアアイテム(写真や動画)を取得する](https://qiita.com/doran/items/5dcddfb9ee7ff0fc7df1)|
|list|メディアアイテム(写真や動画)の一覧を取得|[⧉[Google Photos Library API] JavaでGoogleフォトのメディアアイテム(写真や動画)を取得する](https://qiita.com/doran/items/5dcddfb9ee7ff0fc7df1)|
|patch|メディアアイテム(写真や動画)を更新|[⧉[Google Photos Library API] JavaでGoogleフォトのメディアアイテム(写真や動画)を追加・更新する](https://qiita.com/doran/items/fd6ea924f8ce8071ce8c)|
|search|メディアアイテム(写真や動画)を検索|[⧉[Google Photos Library API] JavaでGoogleフォトのメディアアイテム(写真や動画)を検索する](https://qiita.com/doran/items/6c15f4134c2731e6328c)|
	
### 3.3. v1.sharedAlbums
|メソッド|概要|記事|
|---|---|---|
|get|指定した共有トークンの共有アルバムを取得|[⧉[Google Photos Library API] JavaでGoogleフォトの共有アルバムを取得する](https://qiita.com/doran/items/87a8eb4b7b808ab07a1e)|
|join|指定した共有アルバムに参加|[⧉[Google Photos Library API] JavaでGoogleフォトの共有アルバムに参加・退出する](https://qiita.com/doran/items/7798276ac819a551a044)|
|leave|指定した共有アルバムから退出|[⧉[Google Photos Library API] JavaでGoogleフォトの共有アルバムに参加・退出する](https://qiita.com/doran/items/7798276ac819a551a044)|
|list|共有アルバム一覧を取得|[⧉[Google Photos Library API] JavaでGoogleフォトの共有アルバムを取得する](https://qiita.com/doran/items/87a8eb4b7b808ab07a1e)|

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