دسترسی به فایل‌های رسانه‌ای

پس‌از برقراری تماس برای فهرست کردن محتوای آلبوم یا کتابخانه عکس، برنامه شما باید به‌جای ذخیره کردن موارد رسانه‌ای برگردانده‌شده، شناسه‌های موارد رسانه‌ای را ذخیره کند. دلیلش این است که محتوای موارد رسانه‌ای ممکن است تغییر کند و پس‌از مدتی، نشانی‌های وب موجود در پاسخ منقضی می‌شوند. شناسه فایل رسانه‌ای به‌طور منحصربه‌فرد فایل رسانه‌ای را شناسایی می‌کند، مانند عکس یا ویدیو در کتابخانه کاربر.

توجه داشته باشید که برنامه‌تان نباید عکس یا ویدیو کاربر را برای مدت طولانی در حافظه نهان ذخیره کند، اما بسته به مورد استفاده‌تان، می‌توانید شناسه فایل رسانه‌ای را تا زمانی که لازم است ذخیره یا در حافظه نهان ذخیره کنید. همچنین باید توجه داشته باشید که دسترسی به داده‌های کاربر تحت نظارت تعهدات حریم خصوصی است.

گستره‌های مجوز لازم

برای دسترسی به موارد رسانه‌ای، برنامه‌تان باید حداقل یکی از گستره‌های مجوز زیر را درخواست کند. دسترسی به فایل‌های رسانه‌ای برگردانده‌شده در پاسخ به دامنه‌هایی که درخواست کرده‌اید بستگی دارد.

  • photoslibrary.readonly اجازه دسترسی به همه فایل‌های رسانه‌ای موجود در کتابخانه کاربر را می‌دهد
  • photoslibrary.readonly.appcreateddata فقط به فایل‌های رسانه‌ای که توسط برنامه ایجاد شده‌اند اجازه دسترسی می‌دهد

فایل‌های رسانه‌ای

‫mediaItem نمایشی از رسانه‌ای مانند عکس یا ویدیو است که در کتابخانه Google Photos بارگذاری شده است. این شیء در بالاترین سطح قرار دارد و ویژگی‌های آن می‌تواند براساس نوع رسانه زیربنایی متفاوت باشد.

جدول زیر ویژگی‌های mediaItem را فهرست می‌کند:

مشخصات
id شناسه دائمی و ثابتی که برای شناسایی شیء استفاده می‌شود.
description شرح فایل رسانه‌ای همان‌طور که در Google Photos دیده می‌شود.
baseUrl برای دسترسی به بایت‌های خام استفاده می‌شود. برای اطلاعات بیشتر، نشانی‌های وب پایه را ببینید.
productUrl

پیوندی به تصویر در Google Photos. این پیوند را توسعه‌دهنده نمی‌تواند باز کند، فقط کاربر می‌تواند آن را باز کند. نشانی‌های وب به فایل رسانه‌ای در کتابخانه اشاره می‌کنند. اگر نشانی وب از جستجوی آلبوم بازیابی شده باشد، به موردی در آلبوم اشاره می‌کند.

mimeType نوع فایل رسانه‌ای برای کمک به شناسایی آسان نوع رسانه (برای مثال: image/jpg).
filename نام فایل رسانه‌ای که در برنامه Google Photos به کاربر نشان داده می‌شود (در بخش اطلاعات مورد).
mediaMetadata بسته به نوع اصلی رسانه، مانند photo یا video، متفاوت است. برای کاهش بار داده، می‌توان از ماسک‌های فیلد استفاده کرد.
contributorInfo

این فیلد فقط زمانی پر می‌شود که فایل رسانه‌ای در آلبوم مشترک ایجادشده توسط این برنامه باشد و کاربر دامنه photoslibrary.sharing را اعطا کرده باشد.

حاوی اطلاعاتی درباره همیاری است که این فایل رسانه‌ای را اضافه کرده است. برای جزئیات بیشتر، به هم‌رسانی رسانه مراجعه کنید.

دریافت فایل رسانه‌ای

برای بازیابی فایل رسانه‌ای، mediaItems.get را بااستفاده از mediaItemId فراخوانی کنید. درخواست یک فایل رسانه‌ای را برمی‌گرداند.

mediaItem حاوی ویژگی‌هایی مانند شناسه، شرح، و نشانی وب است. اطلاعات اضافی در 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"
  }
}

پاسخ برای فایل رسانه‌ای ویدیویی به‌این‌صورت است. ویژگی ویدیو حاوی فراداده برای موارد ویدیو است.

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

جاوا

ویژگی عکس حاوی فراداده برای موارد عکس است.

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
}

دریافت چند فایل رسانه‌ای

برای بازیابی چند فایل رسانه‌ای با شناسه آن‌ها، mediaItems.batchGet را بااستفاده از mediaItemId فراخوانی کنید.

درخواست فهرستی از MediaItemResults را به‌ترتیب شناسه‌های فایل‌های رسانه‌ای ارائه‌شده در درخواست برمی‌گرداند. هر نتیجه حاوی MediaItem یا Status است (اگر خطایی وجود داشته باشد).

حداکثر تعداد فایل‌های رسانه‌ای که می‌توانید در یک تماس درخواست کنید ۵۰ است. فهرست فایل‌های رسانه‌ای نباید حاوی شناسه‌های تکراری باشد و نمی‌تواند خالی باشد.

استراحت

در اینجا درخواست 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
}

نشانی‌های وب پایه

نشانی‌های وب پایه در Google Photos Library API به شما امکان می‌دهند به بایت‌های موارد رسانه‌ای دسترسی پیدا کنید. بااستفاده از نشانی‌های وب پایه مختلف، برنامه‌تان می‌تواند فایل‌های رسانه‌ای را بارگیری کند یا فایل‌های رسانه‌ای را در برنامه‌تان نمایش دهد. نشانی‌های وب پایه رشته‌هایی هستند که وقتی آلبوم‌ها را فهرست می‌کنید یا به فایل‌های رسانه‌ای دسترسی پیدا می‌کنید در پاسخ گنجانده می‌شوند. این نشان‌ها به‌مدت ۶۰ دقیقه معتبر هستند و به پارامترهای اضافی نیاز دارند زیرا نمی‌توان از آن‌ها به‌همان صورت استفاده کرد.

نشانی‌های وب پایه مختلف عبارت‌اند از:

  • ‫baseUrl: دسترسی مستقیم به عکس، ریزعکس برای ویدیو، یا بارگیری بایت‌های ویدیو.
  • ‫coverPhotoBaseUrl: مستقیماً به عکس روی جلد آلبوم دسترسی پیدا کنید.
  • profilePictureBaseUrl: دسترسی مستقیم به عکس نمایه مالک mediaItem.

نشانی‌های وب پایه تصویر

در اینجا فهرستی از گزینه‌هایی که می‌توانید با نشانی‌های وب پایه تصویر استفاده کنید آورده شده است:

پارامتر
w، h

شرح

پارامترهای عرض، w و ارتفاع، h.

برای دسترسی به فایل رسانه‌ای تصویری، مثل عکس یا ریزعکس برای ویدیو، باید ابعادی را که می‌خواهید در برنامه‌تان نمایش داده شود مشخص کنید (تا تصویر بتواند با حفظ نسبت ابعادی به این ابعاد مقیاس‌بندی شود). برای انجام این کار، نشانی وب پایه را با ابعاد موردنیازتان به‌هم متصل کنید، همان‌طور که در مثال‌ها نشان داده شده است.

نمونه:

base-url=wmax-width-hmax-height

در اینجا مثالی برای نمایش فایل رسانه‌ای با عرض حداکثر ۲۰۴۸ پیکسل و ارتفاع حداکثر ۱۰۲۴ پیکسل آورده شده است:

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

شرح

پارامتر برش، c.

اگر می‌خواهید تصویر را دقیقاً به ابعاد طول و عرضی که مشخص کرده‌اید برش دهید، نشانی وب پایه را با پارامتر اختیاری -c و پارامترهای اجباری w و h به‌هم متصل کنید.

اندازه (به پیکسل) باید در محدوده [۱، ۱۶۳۸۳] باشد. اگر عرض یا ارتفاع تصویر از اندازه درخواست‌شده بیشتر باشد، تصویر کوچک می‌شود و برش می‌خورد (نسبت ابعادی حفظ می‌شود).

نمونه:

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

در این مثال، برنامه فایل رسانه‌ای را نمایش می‌دهد که دقیقاً ۲۵۶ پیکسل عرض و ۲۵۶ پیکسل ارتفاع دارد، مثل ریزعکس:

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، baseUrl را با پارامتر بارگیری ویدیو، dv الحاق کنید.

پارامتر dv نسخه تراتبدیل‌شده با کیفیت بالا از ویدیو اصلی را درخواست می‌کند. این پارامتر با پارامترهای w و h سازگار نیست.

نشانی‌های وب پایه برای بارگیری ویدیو ممکن است چند ثانیه طول بکشد تا بایت‌ها را برگرداند.

قبل‌از استفاده از این پارامتر، بررسی کنید که فیلد mediaMetadata.status فایل رسانه‌ای READY باشد. درغیراین‌صورت، اگر پردازش فایل رسانه‌ای شما تمام نشده باشد ممکن است خطا دریافت کنید.

نمونه:

base-url=dv

مثال زیر نحوه بارگیری بایت‌های ویدیو را نشان می‌دهد:

https://lh3.googleusercontent.com/p/AF....BsdZ=dv
‫w،‏ h،‏ c، و d

شرح

برای دسترسی به ریزعکس ویدیو، از هرکدام از پارامترهای نشانی وب پایه تصویر استفاده کنید.

به‌طور پیش‌فرض، همه ریزعکس‌های ویدیو شامل هم‌پوشانی دکمه بازپخش هستند. برای برداشتن این هم‌پوشانی، پارامتر -no را ببینید.

نمونه:

برای مثال، به جدول نشانی‌های وب پایه تصویر مراجعه کنید.

no

شرح

هم‌پوشانی برداشتن ریزعکس، پارامتر no.

اگر می‌خواهید ریزعکس ویدیویی را بدون هم‌پوشانی دکمه بازپخش بازیابی کنید، نشانی وب پایه را با پارامتر no الحاق کنید.

پارامتر no باید با حداقل یکی از پارامترهای نشانی وب پایه تصویر استفاده شود.

نمونه:

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

مثال زیر ریزعکس ویدیویی را نشان می‌دهد که دقیقاً ۱۲۸۰ پیکسل عرض و ۷۲۰ پیکسل ارتفاع دارد و شامل هم‌پوشانی دکمه بازپخش نیست:

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

نشانی‌های وب پایه عکس حرکتی

عکس‌های حرکتی هم عناصر عکس و هم عناصر ویدیو را دربرمی‌گیرند. می‌توانید از پارامترهای نشانی‌های وب پایه تصویر یا نشانی‌های وب پایه ویدیو برای درخواست‌های عکس متحرک baseUrl استفاده کنید.

پارامتر
dv

شرح

برای بازیابی عنصر ویدیویی فایل رسانه‌ای عکس حرکتی، از پارامتر dv استفاده کنید، همان‌طور که برای بارگیری از نشانی‌های وب پایه ویدیو استفاده می‌کنید.

‫w،‏ h،‏ c، و d

شرح

برای بازیابی عنصر عکس از فایل رسانه‌ای عکس حرکتی، از قالب نشانی‌های وب پایه تصویر استفاده کنید.