Просмотр содержимого библиотеки, альбомов и мультимедийных объектов

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

Google Photos Library API содержит несколько областей действия, которые используются для доступа к мультимедийным объектам и альбомам. Мультимедийные объекты, возвращаемые в результате различных вызовов, зависят от областей доступа, запрошенных разработчиком.

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

Обзор

Важная функция API – показывать список мультимедийных объектов, которые пользователь скопировал в Google Фото. Вы можете получить список объектов из определенного альбома или из всей библиотеки пользователя (представление по умолчанию в приложении "Google Фото").

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

При получении списка содержимого библиотеки и альбома возвращается список мультимедийных объектов. Дополнения, которые являются частью альбома, не включаются. Мультимедийные объекты описывают фотографии, видео и другие медиафайлы. Объект mediaItem содержит прямую ссылку на объект, ссылку на объект в Google Фото и другие метаданные. Дополнительную информацию можно найти в статьях Доступ к мультимедийным объектам и mediaItems.

Составляю список альбомов

Вы можете получить список альбомов пользователя с помощью метода albums.list.

REST

Вот пример такого запроса:

GET https://photoslibrary.googleapis.com/v1/albums

Запрос возвращает следующий результат:

{
  "albums": [
    {
      "id": "album-id",
      "title": "album-title",
      "productUrl": "album-product-url",
      "coverPhotoBaseUrl": "album-cover-base-url_do-not-use-directly",
      "coverPhotoMediaItemId": "album-cover-media-item-id",
      "isWriteable": "whether-you-can-write-to-this-album",
      "mediaItemsCount": "number-of-media-items-in-album"
    },
    ...
  ],
  "nextPageToken": "token-for-pagination"
}

Java

try {
  // Make a request to list all albums in the user's library
  // Iterate over all the albums in this list
  // Pagination is handled automatically
  ListAlbumsPagedResponse response = photosLibraryClient.listAlbums();

  for (Album album : response.iterateAll()) {
    // Get some properties of an album
    String id = album.getId();
    String title = album.getTitle();
    String productUrl = album.getProductUrl();
    String coverPhotoBaseUrl = album.getCoverPhotoBaseUrl();
    // The cover photo media item id field may be empty
    String coverPhotoMediaItemId = album.getCoverPhotoMediaItemId();
    boolean isWritable = album.getIsWriteable();
    long mediaItemsCount = album.getMediaItemsCount();
  }

} catch (ApiException e) {
  // Handle error
}

PHP

try {
    // Make a request to list all albums in the user's library
    // Iterate over all the albums in this list
    // Pagination is handled automatically
    $response = $photosLibraryClient->listAlbums();
    foreach ($response->iterateAllElements() as $album) {
        // Get some properties of an album
        $albumId = $album->getId();
        $title = $album->getTitle();
        $productUrl = $album->getProductUrl();
        $coverPhotoBaseUrl = $album->getCoverPhotoBaseUrl();
        // The cover photo media item id field may be empty
        $coverPhotoMediaItemId = $album->getCoverPhotoMediaItemId();
        $isWriteable = $album->getIsWriteable();
        $totalMediaItems = $album->getTotalMediaItems();
    }
} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

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

productUrl указывает на альбом в Google Фото, который может открыть пользователь.

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

Альбомы, созданные в аккаунте пользователя или добавленные в него, а также альбомы, которыми поделилось ваше приложение, содержат дополнительное свойство shareInfo. Подробнее об отправке медиафайлов…

У альбомов также может быть флаг isWriteable, указывающий, можно ли создавать в них объекты. Если параметр не возвращается, по умолчанию используется значение false. Это зависит от того, какие разрешения предоставлены вашему приложению, в том числе:

  • Кто создал альбом.
  • предоставлен ли к нему доступ;
  • какие области действия одобрил пользователь;

Если какой-либо из этих критериев изменится, пометка может быть снята. Подробнее о том, как создавать альбомы… Ответ также содержит объект nextPageToken. Подробнее о разбивке на страницы…

Ответ для пустых альбомов отличается тем, что для mediaItemsCount и coverPhotoMediaItemId по умолчанию задано значение 0 и они опущены в ответе REST. Обратите внимание, что coverPhotoBaseUrl указывает на изображение-плейсхолдер по умолчанию.

Вывод содержимого библиотеки

Вы можете получить список всех мультимедийных объектов из библиотеки Google Фото пользователя. Архивированные и удаленные объекты не учитываются. Вы можете получить список мультимедийных объектов, соответствующих определенным критериям, например содержанию, дате или другим свойствам, применив фильтры. Если пользователь не добавил в свою библиотеку объект, доступный на вкладке Общие в Google Фото, этот объект не будет включен в список.

Чтобы получить мультимедийный объект, вызовите mediaItems.list.

REST

Вот пример такого запроса:

GET https://photoslibrary.googleapis.com/v1/mediaItems
Content-type: application/json
Authorization: Bearer oauth2-token
{
  "pageSize": "100",
}

GET-запрос возвращает следующий ответ:

{
  "mediaItems": [
    ...
  ],
  "nextPageToken": "token-for-pagination"
}

Java

try {
  // Make a request to list all media items in the user's library
  // Iterate over all the retrieved media items
  // Pagination is handled automatically
  ListMediaItemsPagedResponse response = photosLibraryClient.listMediaItems();
  for (MediaItem item : response.iterateAll()) {
    // Get some properties of a media item
    String id = item.getId();
    String description = item.getDescription();
    String mimeType = item.getMimeType();
    String productUrl = item.getProductUrl();
    String filename = item.getFilename();
  }
} catch (ApiException e) {
  // Handle error
}

PHP

try {
    // Make a request to list all media items in the user's library
    // Iterate over all the retrieved media items
    // Pagination is handled automatically
    $response = $photosLibraryClient->listMediaItems();
    foreach ($response->iterateAllElements() as $item) {
        // Get some properties of a media item
        /* @var $item \Google\Photos\Library\V1\MediaItem */
        $id = $item->getId();
        $description = $item->getDescription();
        $mimeType = $item->getMimeType();
        $productUrl = $item->getProductUrl();
        $filename = $item->getFilename();
    }
} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

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

Вывод содержимого альбома

Чтобы получить список всех мультимедийных объектов в альбоме, добавьте поле albumId в поисковый запрос. Подробнее о albumId рассказывается в статьях Listing albums (Как получить список альбомов) и Listing shared albums (Как получить список общих альбомов). Если albumId недействителен, возвращается ошибка Bad Request. Если идентификатор действителен, но альбом не существует для аутентифицированного пользователя, возвращается ошибка Not Found. Дополнительную информацию об обработке ошибок можно найти в статьях Советы по повышению производительности и Рекомендации.

REST

Вот пример такого запроса:

POST https://photoslibrary.googleapis.com/v1/mediaItems:search
Content-type: application/json
Authorization: Bearer oauth2-token
{
  "pageSize": "100",
  "albumId": "album-id"
}

Запрос POST возвращает следующий ответ:

{
  "mediaItems": [
    ...
  ],
  "nextPageToken": "token-for-pagination"
}

Java

try {
  // Make a request to list all media items in an album
  // Provide the ID of the album as a parameter in the searchMediaItems call
  // Iterate over all the retrieved media items
  SearchMediaItemsPagedResponse response = photosLibraryClient.searchMediaItems(albumId);

  for (MediaItem item : response.iterateAll()) {
    // ...
  }

} catch (ApiException e) {
  // Handle error
}

PHP

try {
    // Make a request to list all media items in an album
    // Provide the ID of the album as a parameter in the searchMediaItems call
    // Iterate over all the retrieved media items
    $response = $photosLibraryClient->searchMediaItems(['albumId' => $albumId]);
    foreach ($response->iterateAllElements() as $item) {
        // ...
    }
} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

Ответ содержит объект nextPageToken и список мультимедийных объектов. В отличие от списка объектов библиотеки, объекты медиа возвращаются в том порядке, в котором они расположены в альбоме. Подробнее: mediaItems и Разбивка на страницы. Пользователь может изменить заказ в интерфейсе Google Фото.

Если задан параметр albumId, вы не сможете применить фильтр при получении списка контента альбома. В противном случае возникнет ошибка Bad Request.

Получение списка общих альбомов

Вы можете получить список всех альбомов, которыми поделился пользователь или к которым ему был предоставлен доступ. Это похоже на вкладку "Общие" в приложении "Google Фото".

Общие альбомы, которые пользователь добавил в свою библиотеку Google Фото, также возвращаются при вызове listing albums. Чтобы получить список общих альбомов, выполните следующий вызов в Library API:

REST

Вот пример такого запроса:

GET https://photoslibrary.googleapis.com/v1/sharedAlbums

Запрос возвращает следующий результат:

{
  "sharedAlbums": [...]
  "nextPageToken": "token-for-pagination"
}

Java

try {
  // Make a request to list all albums that have been shared by the user
  // Iterate over all the albums in this list
  // Pagination is handled automatically
  ListSharedAlbumsPagedResponse response = photosLibraryClient.listSharedAlbums();

  for (Album album : response.iterateAll()) {
    // ..
  }

} catch (ApiException e) {
  // Handle error
}

PHP

try {
    // Make a request to list all albums that have been shared by the user
    // Iterate over all the albums in this list
    // Pagination is handled automatically
    $response = $photosLibraryClient->listSharedAlbums();
    foreach ($response->iterateAllElements() as $album) {
        // ...
    }
} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

Список альбомов включен в sharedAlbums. Подробнее о том, как получить список альбомов… Ответ также содержит объект nextPageToken. Подробнее о разбивке на страницы…

Альбомы, созданные и опубликованные вашим приложением, содержат дополнительное свойство shareInfo. Подробнее об обмене медиаконтентом…

Список альбомов, созданных приложением

Вы можете получить список альбомов, созданных вашим приложением, если в следующих вызовах для параметра excludeNonAppCreatedData задано значение true:

REST

Ниже приведен GET-запрос для получения списка всех альбомов из библиотеки Google Фото пользователя, созданных только вашим приложением:

GET https://photoslibrary.googleapis.com/v1/albums?excludeNonAppCreatedData=true
Content-type: application/json
Authorization: Bearer oauth2-token

Ниже приведен GET-запрос, который позволяет получить список всех общих альбомов из библиотеки Google Фото пользователя, созданных только вашим приложением.

GET https://photoslibrary.googleapis.com/v1/sharedAlbums?excludeNonAppCreatedData=true
Content-type: application/json
Authorization: Bearer oauth2-token

Java

try {
  // Make a request to list all albums that have been created by your app
  boolean excludeNonAppCreatedData = true;

  // Iterate over all the albums in this list
  // Pagination is handled automatically
  ListAlbumsPagedResponse response = photosLibraryClient.listAlbums(excludeNonAppCreatedData);

  for (Album album : response.iterateAll()) {
    // ..
  }

} catch (ApiException e) {
  // Handle error
}

try {
  // Make a request to list all shared albums that have been created by your app
  boolean excludeNonAppCreatedData = true;

  // Iterate over all the albums in this list
  // Pagination is handled automatically
  ListSharedAlbumsPagedResponse response =
      photosLibraryClient.listSharedAlbums(excludeNonAppCreatedData);

  for (Album album : response.iterateAll()) {
    // ..
  }

} catch (ApiException e) {
  // Handle error
}

PHP

try {
    // Make a request to list all albums that have been created by your app
    $response = $photosLibraryClient->listAlbums(['excludeNonAppCreatedData' => true]);

    // Iterate over all the albums in this list
    // Pagination is handled automatically
    foreach ($response->iterateAllElements() as $album) {
        // ...
    }
} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

try {
    // Make a request to list all shared albums that have been created by your app
    $response = $photosLibraryClient->listSharedAlbums(['excludeNonAppCreatedData' => true]);

    // Iterate over all the albums in this list
    // Pagination is handled automatically
    foreach ($response->iterateAllElements() as $album) {
        // ...
    }
} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

Разбивка на страницы для REST

Чтобы повысить производительность, методы, возвращающие большое количество результатов (например, методы списка), могут разбивать ответ на страницы. Максимальное количество результатов на каждой странице задается параметром pageSize.

Для вызовов mediaItems:search и mediaItems:list размер страницы по умолчанию составляет 25 элементов. Мы рекомендуем этот размер страницы, поскольку он обеспечивает баланс между размером ответа и заполняемостью. Максимальный размер страницы для запросов на поиск и получение списка мультимедийных объектов – 100 объектов.

Рекомендуемый размер страницы по умолчанию при выводе списка альбомов – 20 альбомов, максимум – 50 альбомов.

Если количество доступных результатов больше размера страницы, ответ включает nextPageToken, что указывает вашему приложению на то, что с сервера нужно получить больше результатов.

Пример

В последующих запросах необходимо добавлять nextPageToken в параметр pageToken, как показано в примере ниже. Укажите pageToken вместе с другими параметрами, необходимыми для операции, в теле запроса или в качестве параметра запроса.

Запрос 1

{
  "pageSize": "5",
  "filters": { … }
}

Ответ 1

{
  "mediaItem": [ … ],
  "nextPageToken": "next-page-token"
}

Запрос 2

{
  "pageSize": "5",
  "filters": { … },
  "pageToken": "page-token"
}

Ответ 2

{
  "mediaItem": [ … ],
  "nextPageToken": "next-page-token"
}

Повторяйте эти действия, пока не закончатся объекты nextPageToken.

Параметр nextPageToken действителен только для одного запроса. Если какие-либо параметры изменены, ранее использованный параметр nextPageToken не должен использоваться в том же запросе.