如何使用ETag为V3的Youtube数据API?

问题描述 投票:5回答:4

我建立的延伸,这让很多的请求。我工作的特点是显示的时间,将采取观看播放列表中的总长度。由于尺寸1000的播放列表,我必须做出40名的请求,只是为了找到此信息(在时间限制50个视频,第一个呼叫到/ V3 / playlistItems为VideoID的年代,第二次呼叫/ V3 /视频中的时间信息的数组) 。据我所知道的,只是一个播放列表,我失去了600配额。每页的负荷。我知道,没什么可调动起来,因为我每一天允许配额5000万,但我想早点优化。这也是一个速度问题。它需要一个固体分半钟只得到播放列表的长度。

现在,ETag的。出于某种原因,每次我作出视频或playlistItems YouTube的数据API的请求,我得到了一个全新的Etag(大多数时候,我曾在那里返回相同的ETag的情况下),无论播放列表(我没有试过私人播放列表,并没有这样做的OAuth还)。我假设的原因是什么某处改变播放列表,从而导致新的Etag非常快。看法? PlaylistItems甚至没有回报的看法!

这里有一个通心粉播放列表例如API调用。该ETag是总是不同的!我应该如何使用他们,如果他们不工作?他们是具体的,有没有办法的视频变化的要求之间的长度。 API密钥被省略,因为你可以使自己的API密钥。

```
Playlist Items, give me video id's, page tokens, and Etag for playlist for items 100-150
https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails&maxResults=50&playlistId=PLF-hTvh6KCehzImlI2pAKsOFPR62QZTv-&fields=etag%2Citems%2FcontentDetails%2CnextPageToken%2CprevPageToken&key={YOUR_API_KEY}&pageToken=CGQQAA

Videos, give me durations and Etag for these video ids
https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=SswxpqGX1F0,3Hy5BuFTBbI,ZnlW1fSXZZM,8sb_YOrReZ4,6IN_mupBjh8,VzoqsRLY5Qk,5m8H9YrPvPA,JdRbtGdR68E,hEzPBiYPsDU,bJuioKFYv-c,1N8O8OOG2_U,QDgqSL8nU5U,gP4gB45Z52M,pI1oB2y9c0M,WZGn5Vh_mc4,A0KpbS5WjSU,b0yoIOX8Bk0,5Y7iQt7vtOE,qIijCwjUApQ,RgHjqvznjxg,QzceROWtn5o,8z0VnMQFGR8,5olHoTWB1Hw,vz0T59Ql7fQ,LhktiZYQraU,WIuuZOD9ahI,rwEHW6GRH1Q,FjT1BpKvfgo,FRZL2yaZyZk,U5-vjCDwDUU,b21Lj9bfDWc,yox3-U7r_i8,rXJ5ph83Vrs,nXrk2finMcA,VfagTkQWHuI,K_ZaRAtZQOg,_JIcREsn9pU,y9WGvudeDAM,O08jNtrieI4,9UkEzW1AY7Y,jOaBdnYsobg,y7dSbhc-8h0,IfpPiCGcF8g,2rTRmb9nKbY,bHgv3A26O6Y,hFQmV-zvcbM,Osc4y45oQxw,GHusS6Yd5A8,T2Z3CuUWUQc,OPV-DopMqxs&fields=etag%2Citems%2FcontentDetails%2Fduration&key={YOUR_API_KEY}
```

我想缓存此数据。我想制作播放列表的视频总数额外的开始请求,因为这是一些直接相关的时间播放列表的总长度。但是,这感觉就像许多逻辑。什么视频添加/删除?多少?如果它被添加到开始的时候,我想优化,我要第一个50个视频ID与我的缓存的视频ID持续时间比较。如果它是在中间的某个地方改变了我必须继续查询。也许缓存别的东西来简化这个过程?多个播放列表可以有相同的视频,播放列表可以有相同的视频不止一次,我不知道。也许有各地的查询整个播放列表,也许我应该只是缓存到/ V3 /视频呼叫没有办法。事情是,我想优化调用/ V3 / playlistItems因为是漫长的(注意到3倍的时间/ V3 /视频)。

我的主要问题是:我怎么缓存优化获得播放列表的长度,我怎么做,这是怎么回事用的ETag?

javascript caching etag youtube-data-api
4个回答
3
投票

我想出如何来缓存数据,前一段时间,对不起!

您可以对/播放列表的调用get无论是在播放列表中的项目总数,加的eTag变化当且仅当播放列表本身的改变,这就是我想要的。我只希望如果基的播放列表改变,使新的请求。

到/ playlistItems的调用总是产生一个新的ETAG,无论变化的。我觉得这个端点是为临时查询找出视频的元数据,因为它涉及到一个播放列表,而不是静态的数据查找。播放列表是非常灵活,我认为YouTube的决定不缓存,因为调用此数据/ playlistItems往往根据具体情况逐案。很可能他们的后台自动生成一个ETAG,但实际上不保存任何此端点。

所以,这些都是获得的播放列表,加上缓存的总时间长度的步骤:

  1. 获得播放列表ID
  2. 在高速缓存查找ETAG按播放列表ID
  3. 呼叫/播放列表与在If-None-Match头的eTag(即使ETAG为空应该工作)
  4. 如果API返回304,使用高速缓存的播放列表的长度 如果API返回200,保存在高速缓存中的新ETAG 你可以做更多的缓存!
  5. 呼叫/播放列表与ID playlistItems(所有的pageTokens)
  6. 查找在缓存中的每个视频ID获取视频长度 高速缓存被定义为videoId:videoLength的字典 如果没有找到videoLength,添加视频ID为videos阵列 如果videoLength被发现,添加到lengths阵列
  7. 呼叫/视频与所有未在高速缓存高达发现50种元素的视频ID的 之后可以做右/ playlistItems打电话或当所有的呼叫都做了,我认为这是确定偷懒,现在和每次通话后立即做 你也可以使用缓存ETag的视频通话和保存,以检查长度没有变化,但你得打个电话每每个视频的API。我不知道,但我认为这是过度优化。不过可能需要调试时,请记住,视频长度可以通过YouTube的编辑工具改变
  8. (7续)对于在响应中的每个视频,缓存视频长度在字典中作为videoId:videoLength对,然后添加长度为lengths阵列
  9. 减少lengths阵列划分为持续时间moment.js对象
  10. 通过ETAG关键保存播放列表缓存长度的格式化字符串
  11. 返回播放列表的长度的格式化字符串

Here is the implementation on my github


2
投票

的eTag不会改变每一个要求。但是,你得到不同的ETag的特定量的具体要求。原因是,响应内部的一些元素更改其顺序,因此,算法创建ETAG产生不同的ETag。只要两个响应具有完全相同的内容元素的顺序相同的eTag将再次相同。我录了一堆要求,准确地得出了上述结论。测试与由ID和部分= brandingSettings,片段信道请求。如果您选择有很多在模具响应嵌套元素的多个部分,你会得到更多不同的组合,因此不同的ETag。


0
投票

当您运行相同的查询和内容没有改变,YouTube数据API返回一个总是变化的Etag。因此,它看起来像的eTag执行坏了。

但是,事实上,不是这样的。如果您在请求中提供了一个先前接收的Etag,则YouTube数据API将正常运行。它将识别的eTag,将与未修改的HTTP状态304回答。


0
投票

我发现,ETAG正常工作,只有当你使用“部分= ID”,不使用“的maxResults = NN”。否则以API每次调用返回新ETAG。

© www.soinside.com 2019 - 2024. All rights reserved.