Доступ к медиа-элементам

После совершения вызовов для вывода списка содержимого библиотеки фотографий или альбома вместо сохранения возвращенных элементов мультимедиа ваше приложение должно сохранять идентификаторы элементов мультимедиа. Это связано с тем, что содержимое элементов мультимедиа может измениться, и через определенное время срок действия 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 элемента мультимедиа видео недоступен до тех пор, пока видео не будет обработано.

ОТДЫХ

Вот 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"
  }
}

Ява

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

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

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

ОТДЫХ

Вот запрос 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."
      }
    }
  ]
}

Ява

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-адреса в API библиотеки Google Фото позволяют вам получить доступ к байтам элементов мультимедиа. Используя различные базовые URL-адреса, ваше приложение может либо загружать элементы мультимедиа, либо отображать их в вашем приложении. Базовые URL-адреса — это строки, которые включаются в ответ при перечислении альбомов или доступе к элементам мультимедиа. Они действительны в течение 60 минут и требуют дополнительных параметров, поскольку их нельзя использовать как есть.

Различные базовые URL-адреса:

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

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

Вот список опций, которые вы можете использовать с URL-адресами базовых изображений:

Параметр
w , h

Описание

Параметры ширины, w и высоты, 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 пикселей и высотой 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 пикселей и высотой 720 пикселей без наложения кнопки воспроизведения:

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

Базовые URL-адреса движущихся фотографий

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

Параметр
dv

Описание

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

w , h , c и d

Описание

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