Доступ к медиафайлам

После вызова метода для получения списка мультимедийных объектов в библиотеке фото или альбоме приложение должно сохранять не сами мультимедийные объекты, а их идентификаторы. Это связано с тем, что содержимое медиаобъектов может измениться, и через определенное время срок действия URL-адресов, включенных в ответ, истекает. Идентификатор объекта мультимедиа уникально идентифицирует объект мультимедиа, например фотографию или видео, в библиотеке пользователя.

Обратите внимание, что приложение не должно кешировать фотографии и видео пользователей на длительное время, но в зависимости от ситуации вы можете хранить или кешировать идентификатор медиаобъекта столько, сколько необходимо. Также следует помнить, что доступ к пользовательским данным регулируется обязательствами по обеспечению конфиденциальности.

Необходимые области авторизации

Чтобы получить доступ к мультимедийным объектам, ваше приложение должно запросить хотя бы одну из следующих областей авторизации. Доступ к мультимедийным объектам, возвращенным в ответе, зависит от запрошенных вами областей действия.

  • photoslibrary.readonly позволяет получить доступ ко всем мультимедийным объектам в библиотеке пользователя.
  • photoslibrary.readonly.appcreateddata разрешает доступ только к мультимедийным объектам, созданным в приложении.

Мультимедийные объекты

mediaItem – это представление медиафайла, например фотографии или видео, загруженного в библиотеку Google Фото. Это объект верхнего уровня, свойства которого могут различаться в зависимости от типа медиаконтента.

В таблице ниже перечислены свойства mediaItem.

Свойства
id Постоянный идентификатор, используемый для идентификации объекта.
description Описание мультимедийного объекта, как оно выглядит в Google Фото.
baseUrl Используется для доступа к необработанным байтам. Подробнее о базовых URL…
productUrl

Ссылка на изображение в Google Фото. Разработчик не может открыть эту ссылку, она доступна только пользователю. URL указывают на мультимедийный объект в библиотеке. Если URL был получен в результате поиска по альбому, он указывает на объект в альбоме.

mimeType Тип мультимедийного объекта, который позволяет легко определить тип медиаконтента (например, image/jpg).
filename Название файла мультимедийного объекта, которое показывается пользователю в приложении "Google Фото" (в разделе с информацией об объекте).
mediaMetadata Зависит от типа медиафайла, например photo или video. Чтобы уменьшить полезную нагрузку, можно использовать маски полей.
contributorInfo

Это поле заполняется, только если мультимедийный объект находится в общем альбоме, созданном этим приложением, и пользователь предоставил область действия photoslibrary.sharing.

Содержит информацию о пользователе, который добавил этот мультимедийный объект. Подробнее об отправке медиафайлов…

Как получить мультимедийный объект

Чтобы получить мультимедийный объект, вызовите mediaItems.get, используя mediaItemId. Запрос возвращает один мультимедийный объект.

Объект mediaItem содержит свойства, такие как идентификатор, описание и URL. Дополнительная информация в photo или video основана на метаданных файла. Некоторые свойства могут отсутствовать. ContributorInfo содержит метаданные объектов, которые входят в общий альбом. Это поле включается только при получении списка объектов в общем альбоме, для которого пользователь предоставил область авторизации photoslibrary.sharing.

Если мультимедийный объект является видео, то сначала должен быть обработан видеофайл. Объект mediaItem содержит поле status внутри объекта mediaMetadata, которое описывает статус обработки видеофайла. Для нового загруженного файла возвращается videoProcessingStatus со значением PROCESSING, а затем – READY. Поле baseUrl для мультимедийного объекта видео недоступно, пока видео не будет обработано.

REST

Пример GET-запроса:

GET https://photoslibrary.googleapis.com/v1/mediaItems/media-item-id
Content-type: application/json
Authorization: Bearer oauth2-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"
  }
}

Java

Свойство 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
}

PHP

Свойство 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
}

Получение нескольких мультимедийных объектов

Чтобы получить несколько мультимедийных объектов по их идентификаторам, вызовите mediaItems.batchGet, используя mediaItemId.

Запрос возвращает список мультимедийных объектов MediaItemResults в том порядке, в котором идентификаторы мультимедийных объектов были указаны в запросе. Каждый результат содержит MediaItem или Status, если произошла ошибка.

Максимальное количество мультимедийных объектов, которое можно запросить за один вызов, – 50. Список мультимедийных объектов не должен содержать повторяющиеся идентификаторы и не может быть пустым.

REST

Ниже приведен 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: 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
}

Базовые URL

Базовые URL в Google Photos Library API позволяют получить доступ к байтам медиаобъектов. С помощью различных базовых URL приложение может скачивать мультимедийные объекты или показывать их в своем интерфейсе. Базовые URL – это строки, которые включаются в ответ, когда вы запрашиваете список альбомов или доступ к мультимедийным объектам. Они действительны в течение 60 минут и требуют дополнительных параметров, поскольку их нельзя использовать в исходном виде.

Ниже приведены базовые URL.

  • baseUrl: прямой доступ к фото, значку видео или скачиванию видео.
  • coverPhotoBaseUrl – прямая ссылка на обложку альбома.
  • profilePictureBaseUrl – прямой доступ к фото профиля владельца mediaItem.

Базовые URL изображений

Ниже приведен список параметров, которые можно использовать с базовыми URL изображений.

Параметр
w, h

Описание

Параметры width (w) и height (h).

Чтобы получить доступ к мультимедийному объекту, например фотографии или значку видео, необходимо указать размеры, которые вы планируете использовать в своем приложении. Это позволит масштабировать изображение до этих размеров с сохранением соотношения сторон. Для этого объедините базовый URL с нужными параметрами, как показано в примерах.

Примеры:

base-url=wmax-width-hmax-height

Вот пример того, как показать мультимедийный объект шириной не более 2048 пкс и высотой не более 1024 пкс:

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

Описание

Параметр кадрирования c.

Если вы хотите обрезать изображение до точных размеров ширины и высоты, которые вы указали, объедините базовый URL с необязательным параметром -c вместе с обязательными параметрами w и h.

Размер (в пикселях) должен быть в диапазоне [1, 16383]. Если ширина или высота изображения превышает запрошенный размер, изображение уменьшается и обрезается (с сохранением соотношения сторон).

Примеры:

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

В этом примере приложение показывает мультимедийный объект размером ровно 256 x 256 пикселей, например значок:

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

Описание

Параметр скачивания d.

Если вы хотите скачать изображение, сохранив все метаданные Exif, кроме метаданных о местоположении, объедините базовый URL с параметром d.

Примеры:

base-url=d

В этом примере приложение скачивает изображение со всеми метаданными, кроме географических метаданных:

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

Базовые URL видео

Ниже приведен список параметров, которые можно использовать с базовыми URL видео.

Параметр
dv

Описание

Чтобы получить доступ к байтам видео mediaItem, объедините baseUrl с параметром скачивания видео dv.

Параметр dv запрашивает перекодированную версию исходного видео в высоком качестве. Этот параметр несовместим с параметрами w и h.

Базовым URL для скачивания видео может потребоваться несколько секунд, чтобы вернуть байты.

Прежде чем использовать этот параметр, убедитесь, что поле mediaMetadata.status мультимедийного объекта имеет значение READY. В противном случае, если обработка мультимедийного объекта не завершена, может возникнуть ошибка.

Примеры:

base-url=dv

В примере ниже показано, как скачать байты видео.

https://lh3.googleusercontent.com/p/AF....BsdZ=dv
w, h, c и d

Описание

Чтобы получить доступ к значку видео, используйте любой из параметров базового URL изображения.

По умолчанию на все значки видео накладывается кнопка воспроизведения. Чтобы удалить это наложение, используйте параметр -no.

Примеры:

Примеры приведены в таблице базовых URL изображений.

no

Описание

Параметр no удаляет оверлей значка.

Если вы хотите получить значок видео без наложения кнопки воспроизведения, объедините базовый URL с параметром no.

Параметр no должен использоваться по крайней мере с одним из параметров базового URL изображения.

Примеры:

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

В следующем примере показан значок видео размером 1280 x 720 пикселей без кнопки воспроизведения:

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

Базовые URL фото с движением

Фото с движением содержат как фото-, так и видеоэлементы. Для запросов baseUrl фото с движением можно использовать параметры из базовых URL изображений или базовых URL видео.

Параметр
dv

Описание

Чтобы получить видеоэлемент мультимедийного объекта "фото с движением", используйте параметр dv, как при скачивании с базовых URL видео.

w, h, c и d

Описание

Чтобы получить фотоэлемент мультимедийного объекта фото с движением, используйте формат для базовых URL изображений.