存取媒體項目

呼叫列出相片庫或相簿內容後,而不是儲存傳回的媒體項目,應用程式應儲存媒體項目的 ID。這是因為媒體項目的內容可能會變更,並在一段時間後變更,回應中包含的網址會失效。媒體項目 ID 是用來識別特定媒體項目,例如使用者媒體庫中的相片或影片。

請注意,應用程式不應長時間快取使用者的相片或影片,但視您的用途而定,您可以視需要儲存或快取媒體項目 ID。您也應注意,使用者資料的存取權受隱私權義務規範。

必要的授權範圍

如要存取媒體項目,應用程式必須至少要求下列其中一個授權範圍。回應中傳回的媒體項目存取權取決於您要求的範圍。

  • photoslibrary.readonly 允許存取使用者資料庫中的所有媒體項目
  • photoslibrary.readonly.appcreateddata 僅允許存取應用程式建立的媒體項目

媒體項目

mediaItem 是媒體的表示法,例如已上傳至 Google 相簿相片庫的相片或影片。這是頂層物件,其屬性可能會依基礎媒體類型而不同。

下表列出 mediaItem 屬性:

屬性
id 用於識別物件的永久固定 ID。
description 在 Google 相簿中顯示的媒體項目說明。
baseUrl 用於存取原始位元組。詳情請參閱「基本網址」一節。
productUrl

Google 相簿中的圖片連結。開發人員無法只開啟這個連結,網址會指向資源庫中的媒體項目。如果網址是從專輯搜尋中擷取,會指向相簿中的項目。

mimeType 方便識別媒體類型 (例如 image/jpg) 的媒體項目類型。
filename 媒體項目在 Google 相簿應用程式中向使用者顯示的名稱 (位於項目的資訊專區中)。
mediaMetadata 視媒體的基礎類型而定,例如 photovideo。如要減少酬載,可以使用欄位遮罩。
contributorInfo

只有在媒體項目是屬於此應用程式建立的共享相簿,且使用者已授予 photoslibrary.sharing 範圍時,系統才會填入這個欄位。

包含新增此媒體項目的著作人相關資訊。詳情請參閱「分享媒體」。

取得媒體項目

如要擷取媒體項目,請使用 mediaItemId 呼叫 mediaItems.get。這個要求會傳回單一媒體項目。

mediaItem 包含 ID、說明和網址等屬性。photovideo 內的其他資訊是以檔案中的中繼資料為基礎。可能不會顯示所有屬性。ContributorInfo 包含共享相簿中項目的中繼資料。只有在使用者已授予 photoslibrary.sharing 授權範圍的共享相簿列出內容時,才會納入這個欄位。

如果媒體項目是影片,就必須先處理影片檔案。mediaItem 包含 mediaMetadata 內的 status 欄位,用於說明影片檔案的處理狀態。新上傳的檔案會先傳回值為 PROCESSINGvideoProcessingStatus,然後才是 READY 使用。影片媒體項目的 baseUrl 在影片處理完成之前無法使用。

REST

以下是 GET 要求:

GET https://photoslibrary.googleapis.com/v1/mediaItems/media-item-id
Content-type: application/json
Authorization: Bearer oauth2-token

相片媒體項目的回應如下所示。相片屬性包含相片項目的中繼資料。

{
  "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"
  }
}

影片媒體項目的回應如下所示。影片屬性包含影片項目的中繼資料。

{
  "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"
  }
}

Java

相片屬性包含相片項目的中繼資料。

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
}

影片屬性包含影片項目的中繼資料。

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
}

PHP

相片屬性包含相片項目的中繼資料。

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
}

影片屬性包含影片項目的中繼資料。

  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 清單。如果發生錯誤,每項結果都會包含 MediaItemStatus

一次呼叫最多能要求的媒體項目數量上限為 50 個。媒體項目清單不得包含重複的 ID 且不得空白。

REST

以下 GET 要求會顯示成功且未成功存取媒體項目。在要求中將每個媒體項目 ID 指定為新的 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: Bearer oauth2-token

GET 要求會傳回下列回應:

{
  "mediaItemResults": [
    {
      "mediaItem": {
        "id": "media-item-id",
        ...
      }
    },
    {
      "mediaItem": {
        "id": "another-media-item-id",
        ...
      }
    },
    {
      "status": {
        "code": 3,
        "message": "Invalid media item ID."
      }
    }
  ]
}

Java

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
}

PHP

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
}

基礎網址

Google Photos Library API 中的基準網址可讓您存取媒體項目的位元組。應用程式可以使用各種基準網址下載媒體項目,或在應用程式中顯示媒體項目。基本網址會在您列出相簿或存取媒體項目時,包含在回應中。效期為 60 分鐘,且需要其他參數,因此無法直接使用。

常見的網址如下:

  • baseUrl:直接存取相片、影片縮圖或下載影片位元組。
  • coverPhotoBaseUrl:直接存取相簿的封面相片。
  • profilePictureBaseUrl:直接存取 mediaItem 擁有者的個人資料相片。

映像檔基礎網址

以下是可以與映像檔基本網址搭配使用的選項清單:

參數
wh

說明

寬度、w 和高度、h 參數。

如要存取圖片媒體項目 (例如相片或影片縮圖),您必須指定預期在應用程式中顯示的尺寸 (這樣才能將圖片縮放為這些尺寸,同時保留顯示比例)。方法是將基準網址與所需維度串連起來,如範例所示。

例如:

base-url=wmax-width-hmax-height

以下示範如何顯示寬度不超過 2048 像素且高度不超過 1024 像素的媒體項目:

https://lh3.googleusercontent.com/p/AF....VnnY=w2048-h1024
c

說明

裁剪 c 參數。

如要將圖片裁剪為您指定的確切寬度和高度尺寸,請用選用的 -c 參數和必要的 wh 參數串連基本網址。

大小 (以像素為單位) 應在 [1, 16383] 這個範圍內。如果圖片的寬度或高度超過要求的大小,系統會縮小圖片並裁剪 (維持顯示比例)。

例如:

base-url=wmax-width-hmax-height-c

在本範例中,應用程式會顯示寬度正好為 256 px x 256 px 的媒體項目,例如縮圖:

https://lh3.googleusercontent.com/p/AF....VnnY=w256-h256-c
d

說明

下載 d 參數。

如要下載保留所有 Exif 中繼資料 (位置中繼資料除外) 的圖片,請使用 d 參數將基準網址串連在一起。

例如:

base-url=d

在本範例中,應用程式會下載具有所有中繼資料的圖片 (位置中繼資料除外):

https://lh3.googleusercontent.com/p/Az....XabC=d

影片基礎網址

以下是可以與影片基本網址搭配使用的選項清單:

參數
dv

說明

如要存取影片 mediaItem 的位元組,請將下載影片 dv 參數串連 baseUrl

dv 參數會要求原始影片的高畫質轉碼版本。該參數與 wh 參數不相容。

影片下載的基礎網址最多可能需要幾秒才能傳回位元組。

使用這個參數前,請先檢查媒體項目的 mediaMetadata.status 欄位是否為 READY。否則,如果媒體項目尚未處理完成,您可能會收到錯誤訊息。

例如:

base-url=dv

以下範例說明如何下載影片的位元組:

https://lh3.googleusercontent.com/p/AF....BsdZ=dv
whcd

說明

如要存取影片縮圖,請使用任何圖片基本網址參數

根據預設,所有影片縮圖都會重疊顯示播放按鈕。如要移除這個疊加層,請參閱 -no 參數。

例如:

如需示例,請參閱映像檔基本網址表格

no

說明

移除縮圖重疊:no 參數。

如果想擷取影片縮圖時沒有重疊的播放按鈕,請用 no 參數將基本網址串連起來。

no 參數必須至少與其中一個圖片基本網址參數搭配使用。

例如:

base-url=wmax-width-hmax-height-no

以下範例顯示的影片縮圖寬度是 1280 px,高度為 720 px,且未重疊顯示播放按鈕:

https://lh3.googleusercontent.com/p/AF....VnnY=w1280-h720-no

動態相片基礎網址

動態相片同時包含相片和影片元素。您可以使用圖片基本網址影片基本網址中的參數來處理動態相片 baseUrl 要求。

參數
dv

說明

如要擷取動態相片媒體項目的影片元素,請使用 dv 參數,就像從影片基本網址下載一樣。

whcd

說明

如要擷取動態相片媒體項目的相片元素,請使用圖片基本網址的格式。