フォト ライブラリまたはアルバムのコンテンツをリストする呼び出しを実行した後、アプリケーションでは、返されたメディア アイテムを保存するのではなく、メディア アイテムの ID を保存する必要があります。これは、メディア アイテムのコンテンツが変更され、一定の時間が経過するとレスポンスに含まれる URL が期限切れになるためです。メディア アイテム ID によって、ユーザーのライブラリ内にある写真や動画などのメディア アイテムを一意に識別できます。
アプリケーションでユーザーの写真や動画を長期間キャッシュに保存しないでください。ただし、ユースケースによっては、必要に応じてメディア アイテム ID を保存またはキャッシュに保存できます。また、ユーザーデータにアクセスする場合はプライバシーに関する義務が適用される点に注意してください。
必要な認可スコープ
メディア アイテムにアクセスするには、以下の承認スコープのうち少なくとも 1 つをアプリでリクエストする必要があります。レスポンスで返されるメディア アイテムへのアクセス権は、リクエストしたスコープによって異なります。
photoslibrary.readonly
を使用すると、ユーザーのライブラリ内のすべてのメディア アイテムにアクセスできます。photoslibrary.readonly.appcreateddata
では、アプリによって作成されたメディア アイテムにのみアクセスできます
メディア項目
mediaItem
は、Google フォト ライブラリにアップロードされた写真や動画などのメディアを表します。これは最上位のオブジェクトであり、基盤となるメディアタイプによってプロパティが異なる場合があります。
次の表に、mediaItem
のプロパティを示します。
プロパティ | |
---|---|
id |
オブジェクトを識別するために使用される、永続的に変わらない ID。 |
description |
Google フォト内に表示されるメディア アイテムの説明。 |
baseUrl |
未加工のバイト列にアクセスするために使用されます。詳細については、ベース URL をご覧ください。 |
productUrl |
Google フォト内の画像へのリンク。デベロッパーがこのリンクを開くことはできず、ユーザーのみが開くことができます。URL はライブラリ内のメディア アイテムを参照します。URL がアルバム検索から取得された場合は、アルバム内のアイテムを参照します。 |
mimeType |
メディアのタイプを簡単に識別するためのメディア アイテムのタイプ(例: image/jpg )。 |
filename |
Google フォト アプリでユーザーに表示されるメディア アイテムのファイル名(アイテムの情報セクション内)。 |
mediaMetadata |
メディアの基盤となるタイプ(photo や video など)によって異なります。ペイロードを減らすためにフィールド マスクを使用できます。 |
contributorInfo |
このフィールドに値が設定されるのは、このアプリで作成された共有アルバム内にメディア アイテムが存在し、ユーザーが このメディア アイテムを追加した投稿者に関する情報が設定されます。詳しくは、メディアの共有をご覧ください。 |
メディア アイテムを取得する
メディア アイテムを取得するには、mediaItemId
を使用して mediaItems.get を呼び出します。リクエストは単一のメディア アイテムを返します。
mediaItem
には、ID、説明、URL などのプロパティが含まれます。photo
または video
に含まれる追加情報は、ファイル内のメタデータに基づきます。プロパティがすべて存在するとは限りません。ContributorInfo
には、共有アルバム内のアイテムのメタデータが含まれます。このフィールドは、ユーザーが photoslibrary.sharing
認可スコープを付与した共有アルバムのコンテンツをリストする場合にのみ含まれます。
メディア アイテムが動画の場合、はじめに動画ファイルを処理する必要があります。mediaItem
には、動画ファイルの処理状態を記録する status
フィールドが mediaMetadata
内に含まれています。新しくアップロードされたファイルはまず値 PROCESSING
の videoProcessingStatus
を返し、その後 READY
になって使用できるようになります。動画のメディア アイテムの baseUrl
は、動画が処理されるまで使用できません。
GET リクエストは次のようになります。
GET https://photoslibrary.googleapis.com/v1/mediaItems/media-item-id Content-type: application/json Authorization: Beareroauth2-token
写真メディア アイテムに対するレスポンスは次のようになります。photo プロパティには、写真アイテムのメタデータが含まれます。
{
"id": "media-item-id ",
"description": "item-description ",
"productUrl": "url-to-open-in-google-photos ",
"baseUrl": "base-url_do-not-use-directly ",
"mimeType": "mime-type-of-media ",
"filename": "item-filename ",
"mediaMetadata": {
"width": "media-item-width ",
"height": "media-item-height ",
"creationTime": "media-item-creation-time ",
"photo": {
"cameraMake": "make-of-the-camera ",
"cameraModel": "model-of-the-camera ",
"focalLength": "focal-length-of-the-camera-lens ",
"apertureFNumber": "aperture-f-number-of-the-camera-lens ",
"isoEquivalent": "iso-of-the-camera ",
"exposureTime": "exposure-time-of-the-camera-aperture "
}
},
"contributorInfo": {
"profilePictureBaseUrl": "profile-picture-base-url_do-not-use-directly ",
"displayName": "name-of-user "
}
}
動画メディア アイテムに対するレスポンスは次のようになります。video プロパティには、動画アイテムのメタデータが含まれます。
{
"id": "media-item-id ",
"description": "item-description ",
"productUrl": "url-to-open-in-google-photos ",
"baseUrl": "base-url_do-not-use-directly ",
"mimeType": "mime-type-of-media ",
"filename": "item-filename ",
"mediaMetadata": {
"width": "media-item-width ",
"height": "media-item-height ",
"creationTime": "media-item-creation-time ",
"video": {
"cameraMake": "make-of-the-camera ",
"cameraModel": "model-of-the-camera ",
"fps": "frame-rate-of-the-video ",
"status": "READY"
},
},
"contributorInfo": {
"profilePictureBaseUrl": "profile-picture-base-url_do-not-use-directly ",
"displayName": "name-of-user "
}
}
photo プロパティには、写真アイテムのメタデータが含まれます。
try {
// Get a media item using its ID
String mediaItemId = "...";
MediaItem item = photosLibraryClient.getMediaItem(mediaItemId);
// Get some properties from the retrieved media item
String id = item.getId();
String description = item.getDescription();
String baseUrl = item.getBaseUrl();
String productUrl = item.getProductUrl();
// ...
if (item.hasMediaMetadata()) {
// The media item contains additional metadata, such as the height and width
MediaMetadata metadata = item.getMediaMetadata();
long height = metadata.getHeight();
long width = metadata.getWidth();
Timestamp creationTime = metadata.getCreationTime();
// ...
if (metadata.hasPhoto()) {
// This media item is a photo and has additional photo metadata
Photo photoMetadata = metadata.getPhoto();
String cameraMake = photoMetadata.getCameraMake();
String cameraModel = photoMetadata.getCameraModel();
float aperture = photoMetadata.getApertureFNumber();
int isoEquivalent = photoMetadata.getIsoEquivalent();
// ...
}
}
if (item.hasContributorInfo()) {
// A user has contributed this media item to a shared album
ContributorInfo contributorInfo = item.getContributorInfo();
String profilePictureBaseUrl = contributorInfo.getProfilePictureBaseUrl();
String displayName = contributorInfo.getDisplayName();
}
} catch (ApiException e) {
// Handle error
}
video プロパティには、動画アイテムのメタデータが含まれます。
try {
// Get a media item using its ID
String mediaItemId = "...";
MediaItem item = photosLibraryClient.getMediaItem(mediaItemId);
// Get some properties from the retrieved media item
String id = item.getId();
String description = item.getDescription();
String baseUrl = item.getBaseUrl();
String productUrl = item.getProductUrl();
// ...
if (item.hasMediaMetadata()) {
// The media item contains additional metadata, such as the height and width
MediaMetadata metadata = item.getMediaMetadata();
long height = metadata.getHeight();
long width = metadata.getWidth();
Timestamp creationTime = metadata.getCreationTime();
// ...
if (metadata.hasVideo()) {
// This media item is a video and has additional video metadata
Video videoMetadata = metadata.getVideo();
VideoProcessingStatus status = videoMetadata.getStatus();
if (status.equals(VideoProcessingStatus.READY)) {
// This video media item has been processed
String cameraMake = videoMetadata.getCameraMake();
String cameraModel = videoMetadata.getCameraModel();
double fps = videoMetadata.getFps();
// ...
}
}
}
if (item.hasContributorInfo()) {
// A user has contributed this media item to a shared album
ContributorInfo contributorInfo = item.getContributorInfo();
String profilePictureBaseUrl = contributorInfo.getProfilePictureBaseUrl();
String displayName = contributorInfo.getDisplayName();
}
} catch (ApiException e) {
// Handle error
}
photo プロパティには、写真アイテムのメタデータが含まれます。
try {
// Get a media item using its ID
$mediaItemId = "...";
$item = $photosLibraryClient->getMediaItem($mediaItemId);
// Get some properties from the retrieved media item
$id = $item->getId();
$description = $item->getDescription();
$baseUrl = $item->getBaseUrl();
$productUrl = $item->getProductUrl();
// ...
$metadata = $item->getMediaMetadata();
if (!is_null($metadata)) {
// The media item contains additional metadata, such as the height and width
$height = $metadata->getHeight();
$width = $metadata->getWidth();
$creationTime = $metadata->getCreationTime();
// ...
$photoMetadata = $metadata->getPhoto();
if (!is_null($photoMetadata)) {
// This media item is a photo and has additional photo metadata
$cameraMake = $photoMetadata->getCameraMake();
$cameraModel = $photoMetadata->getCameraModel();
$aperture = $photoMetadata->getApertureFNumber();
$isoEquivalent = $photoMetadata->getIsoEquivalent();
// ...
}
}
$contributorInfo = $item->getContributorInfo();
if (!is_null($contributorInfo)) {
// A user has contributed this media item to a shared album
$profilePictureBaseUrl = $contributorInfo->getProfilePictureBaseUrl();
$displayName = $contributorInfo->getDisplayName();
}
} catch (\Google\ApiCore\ApiException $e) {
// Handle error
}
video プロパティには、動画アイテムのメタデータが含まれます。
try {
// Get a media item using its ID
$mediaItemId = "...";
$item = $photosLibraryClient->getMediaItem($mediaItemId);
// Get some properties from the retrieved media item
$id = $item->getId();
$description = $item->getDescription();
$baseUrl = $item->getBaseUrl();
$productUrl = $item->getProductUrl();
// ...
$metadata = $item->getMediaMetadata();
if (!is_null($metadata)) {
// The media item contains additional metadata, such as the height and width
$height = $metadata->getHeight();
$width = $metadata->getWidth();
$creationTime = $metadata->getCreationTime();
// ...
$videoMetadata = $metadata->getVideo();
if (!is_null($videoMetadata)) {
// This media item is a video and has additional video metadata
if (VideoProcessingStatus::READY == $videoMetadata->getStatus()) {
// This video media item has been processed
$cameraMake = $videoMetadata->getCameraMake();
$cameraModel = $videoMetadata->getCameraModel();
$fps = $videoMetadata->getFps();
// ...
}
}
}
$contributorInfo = $item->getContributorInfo();
if (!is_null($contributorInfo)) {
// A user has contributed this media item to a shared album
$profilePictureBaseUrl = $contributorInfo->getProfilePictureBaseUrl();
$displayName = $contributorInfo->getDisplayName();
}
} catch (\Google\ApiCore\ApiException $e) {
// Handle error
}
複数のメディア アイテムを取得する
ID を指定して複数のメディア アイテムを取得するには、mediaItemId
を使用して mediaItems.batchGet
を呼び出します。
リクエストには、リクエストで指定されたメディア アイテム ID の順序で MediaItemResults
のリストが返されます。各結果には MediaItem
が含まれます。エラーが発生した場合は Status
が含まれます。
1 回の呼び出しでリクエストできるメディア アイテムは最大で 50 個です。メディア アイテムのリストに重複した ID を含めることはできません。また、リストを空にすることもできません。
次の GET リクエストでは複数のメディア アイテムにアクセスしています。得られた結果にはアクセスが成功したアイテムと失敗したアイテムが混在しています。各メディア アイテムの識別子を、新しい mediaItemIds
クエリ パラメータとしてリクエストの一部として指定します。
GET https://photoslibrary.googleapis.com/v1/mediaItems:batchGet?mediaItemIds=media-item-id &mediaItemIds=another-media-item-id &mediaItemIds=incorrect-media-item-id Content-type: application/json Authorization: Beareroauth2-token
GET リクエストは次のレスポンスを返します。
{
"mediaItemResults": [
{
"mediaItem": {
"id": "media-item-id ",
...
}
},
{
"mediaItem": {
"id": "another-media-item-id ",
...
}
},
{
"status": {
"code": 3,
"message": "Invalid media item ID."
}
}
]
}
try {
// List of media item IDs to retrieve
List<String> mediaItemIds = Arrays
.asList("MEDIA_ITEM_ID", "ANOTHER_MEDIA_ITEM_ID", "INCORRECT_MEDIA_ITEM_ID");
// Get a list of media items using their IDs
BatchGetMediaItemsResponse response = photosLibraryClient
.batchGetMediaItems(mediaItemIds);
// Loop over each result
for (MediaItemResult result : response.getMediaItemResultsList()) {
// Each MediaItemresult contains a status and a media item
if (result.hasMediaItem()) {
// The media item was successfully retrieved, get some properties
MediaItem item = result.getMediaItem();
String id = item.getId();
// ...
} else {
// If the media item is not set, an error occurred and the item could not be loaded
// Check the status and handle the error
Status status = result.getStatus();
// ...
}
}
} catch (ApiException e) {
// Handle error
}
try {
// List of media item IDs to retrieve
$mediaItemIds = ["MEDIA_ITEM_ID", "ANOTHER_MEDIA_ITEM_ID", "INCORRECT_MEDIA_ITEM_ID"];
// Get a list of media items using their IDs
$response = $photosLibraryClient->batchGetMediaItems($mediaItemIds);
// Loop over each result
foreach ($response->getMediaItemResults() as $itemResult) {
// Each MediaItemresult contains a status and a media item
$mediaItem = $itemResult->getMediaItem();
if(!is_null($mediaItem)){
// The media item was successfully retrieved, get some properties
$id = $mediaItem->getId();
// ...
} else {
// If the media item is null, an error occurred and the item could not be loaded
}
}
} catch (\Google\ApiCore\ApiException $e) {
// Handle error
}
ベース URL
Google Photos Library API に含まれるベース URL を使用すると、メディア アイテムのバイト列にアクセスできます。アプリはさまざまなベース URL を使用して、メディア アイテムをダウンロードしたり、アプリ内でメディア アイテムを表示したりできます。ベース URL は、アルバムの一覧を取得するとき、またはメディア アイテムにアクセスしたときにレスポンスに含まれる文字列です。60 分間有効であり、そのままでは使用できず、追加のパラメータが必要です。
さまざまなベース URL は次のとおりです。
baseUrl
: 動画の写真やサムネイルに直接アクセスしたり、動画のバイトをダウンロードしたりできます。coverPhotoBaseUrl
: アルバムのカバー写真に直接アクセスできます。profilePictureBaseUrl
:mediaItem
のオーナーのプロフィール写真に直接アクセスします。
画像のベース URL
画像のベース URL で使用できるオプションは次のとおりです。
パラメータ | |
---|---|
w 、h |
説明 幅( 画像のメディア アイテム(写真、動画のサムネイルなど)にアクセスするには、アプリケーションで表示する予定のサイズを指定する必要があります(これにより、アスペクト比を維持しながら画像をこのサイズに拡大または縮小できます)。これを行うには、例に示すように、必要なサイズをベース URL に連結します。 例:
幅 2,048 ピクセル以下、高さ 1,024 ピクセル以下のメディア アイテムを表示する例を次に示します。 https://lh3.googleusercontent.com/p/AF....VnnY=w2048-h1024 |
c |
説明 切り抜き、 指定した幅と高さで正確なサイズに画像を切り抜くには、オプションの サイズ(ピクセル単位)は 1 ~ 16, 383 の範囲内である必要があります。画像の幅または高さがリクエストしたサイズを超える場合、画像は縮小され、切り取られます(縦横比は維持されます)。 例:
この例では、アプリケーションはサムネイルなど、幅 256 ピクセル、高さ 256 ピクセルのメディア アイテムを表示します。 https://lh3.googleusercontent.com/p/AF....VnnY=w256-h256-c |
d |
説明 ダウンロード 位置情報のメタデータを除くすべての Exif メタデータを保持する画像をダウンロードする場合は、ベース URL に 例:
この例では、アプリケーションは位置情報のメタデータを除くすべてのメタデータを含む画像をダウンロードします。 https://lh3.googleusercontent.com/p/Az....XabC=d |
動画のベース URL
動画のベース URL で使用できるオプションは次のとおりです。
パラメータ | |
---|---|
dv |
説明 動画 dv パラメータは、元の動画の高品質のコード変換版をリクエストします。このパラメータは、w パラメータと h パラメータとは互換性がありません。 動画ダウンロードのベース URL がバイトを返すまでに数秒かかることがあります。 このパラメータを使用する前に、メディア アイテムの 例:
次の例は、動画のバイト数をダウンロードする方法を示しています。 https://lh3.googleusercontent.com/p/AF....BsdZ=dv |
w 、h 、c 、d |
説明 動画のサムネイルにアクセスするには、画像のベース URL パラメータのいずれかを使用します。 デフォルトでは、すべての動画のサムネイルに再生ボタンのオーバーレイが表示されます。このオーバーレイを削除するには、-no パラメータを参照してください。 例: 例については、画像ベース URL の表をご覧ください。 |
no |
説明 サムネイル オーバーレイ削除の 再生ボタンのオーバーレイなしで動画のサムネイルを取得するには、ベース URL に no パラメータを連結します。 no パラメータは、少なくとも 1 つの画像のベース URL パラメータとともに使用する必要があります。 例:
次の例では、幅 1,280 px、高さ 720 px で、再生ボタンのオーバーレイを含まない動画サムネイルを表示します。 https://lh3.googleusercontent.com/p/AF....VnnY=w1280-h720-no |
モーション フォトのベース URL
モーション フォトには、写真と動画の両方の要素が含まれています。モーション フォトの baseUrl
リクエストには、画像のベース URL または動画のベース URL のパラメータを使用できます。
パラメータ | |
---|---|
dv |
説明 モーション フォトのメディア アイテムの動画要素を取得するには、動画のベース URL からダウンロードする場合と同様に、 |
w 、h 、c 、d |
説明 モーション フォト メディア アイテムの写真要素を取得するには、画像のベース URL の形式を使用します。 |