6

背景:我想看看我是如何使用我的谷歌照片空间的,我用 Python 编写了一个小脚本,它使用谷歌照片 API 来检索我的所有相册及其内容(使用https://developers.google.com/photos /library/reference/rest/v1/mediaItems/search)。文件信息不存在,但使用mediaItem baseUrl(记录的https://developers.google.com/photos/library/reference/rest/v1/mediaItems#MediaItem)我可以执行HEAD请求并content-length从标题中获取。这似乎适用于照片,但视频的大小被严重低估了。我的猜测是 Google 相册已准备好流式传输视频,但并未发送整个视频信息。

问题:有没有什么方法可以检索存储在 Google 相册上的视频的文件大小,而不必下载整个视频?该应用程序确实知道文件大小,但这似乎在 API 中不可用。有没有办法发送一些请求头来获取文件大小?

额外信息:我正在使用 Python 和httplib2.Http()我的HEAD请求(很高兴使用请求模块或任何其他替代方案)。

这是从 API 检索到的信息,这个视频文件有 100MB 多一点(绝对不是 30k):

{
  "id": "XYZ",
  "productUrl": "https://photos.google.com/lr/photo/XYZ",
  "baseUrl": "https://lh3.googleusercontent.com/lr/ABC",
  "mimeType": "video/mp4",
  "mediaMetadata": {
    "creationTime": "2018-11-27T03:43:27Z",
    "width": "1920",
    "height": "1080",
    "video": {
      "fps": 120,
      "status": "READY"
    }
  },
  "filename": "VID_20181126_174327.mp4"
}

HEAD这些是从请求中收到的标头baseUrl

{
  "access-control-expose-headers": "Content-Length",
  "etag": "\"v15ceb\"",
  "expires": "Fri, 01 Jan 1990 00:00:00 GMT",
  "cache-control": "private, max-age=86400, no-transform",
  "content-disposition": "inline;filename=\"VID_20181126_174327.jpg\"",
  "content-type": "image/jpeg",
  "vary": "Origin",
  "x-content-type-options": "nosniff",
  "date": "Wed, 08 May 2019 17:39:42 GMT",
  "server": "fife",
  "content-length": "31652",
  "x-xss-protection": "0",
  "alt-svc": "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"",
  "status": "200",
  "content-location": "https://lh3.googleusercontent.com/lr/ABC"
}

谢谢。

4

2 回答 2

2

照片 API 文档提到,对于视频,API 返回的是baseUrl指视频的缩略图而不是视频本身,您必须附加=dvbaseUrl才能实际接收视频。从我的实验中还可以看出content-length,从该端点返回的结果是准确的:

import requests

baseUrl = "https://lh3.googleusercontent.com/lr/AF..."
# just the thumbnail's size
requests.head(baseUrl,allow_redirects=True).headers['content-length']
# the entire video's size
requests.head(baseUrl + "=dv",allow_redirects=True).headers['content-length']
于 2021-02-28T21:52:22.363 回答
0

这是来自 OP 的错误语言,但我认为转换为Python cURL 调用是一项简单的任务。

我成功地使用下面的函数来检索 Google Photos 图像和视频文件的大小,baseUrl方法是使用从API检索到的文件调用它:

function retrieve_remote_file_size($url){
     $ch = curl_init($url);

     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     curl_setopt($ch, CURLOPT_HEADER, TRUE);
     curl_setopt($ch, CURLOPT_NOBODY, TRUE);

     $data = curl_exec($ch);
     $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);

     curl_close($ch);
     return $size;
}

来源

请注意(与上面链接中的“警告”baseUrl相反)我不需要指定宽度/高度或下载参数baseUrl即可使用此功能。

于 2019-09-12T12:12:34.820 回答