youtube data api v3 php搜索分页?

时间:2014-03-07 15:18:50

标签: youtube youtube-api youtube-data-api

我正在尝试使用youtube api v3 php搜索...

我第一次使用这个API我是初学者...

我有3个问题;

1)下面的搜索列表如何显示分页编号? (每50页结果)

2)视频持续时间如何显示在列表中? (3分20秒:秒)

3)如何订购viewCount

if ($_GET['q']) {
  require_once 'src/Google_Client.php';
  require_once 'src/contrib/Google_YoutubeService.php';
  $DEVELOPER_KEY = 'my key';

  $client = new Google_Client();
  $client->setDeveloperKey($DEVELOPER_KEY);
  $youtube = new Google_YoutubeService($client);

  try {
    $searchResponse = $youtube->search->listSearch('id,snippet', array(
      'q' => $_GET['q'],
      'maxResults' => 50,
      'type' => "video",
    ));

  foreach ($searchResponse['items'] as $searchResult) {

    $videos .= '<li style="clear:left"><img src="'.$searchResult['snippet']['thumbnails']['default']['url'].'" style="float:left; margin-right:18px" alt="" /><span style="float:left">'.$searchResult['snippet']['title'].'<br />'.$searchResult['id']['videoId'].'<br />'.$searchResult['snippet']['publishedAt'].'<br />'.$item['contentDetails']['duration'].'</span></li>';
}




$htmlBody .= <<<END
    <ul>$videos</ul>
END;
  } catch (Google_ServiceException $e) {
    $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>',
      htmlspecialchars($e->getMessage()));
  } catch (Google_Exception $e) {
    $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>',
      htmlspecialchars($e->getMessage()));
  }
}

2 个答案:

答案 0 :(得分:17)

1)下面的搜索列表如何显示分页编号? (每50页结果)

您需要编写自己的缓存逻辑来实现此功能,因为每个结果都会获得两个标记“NextPageToken”和“PreviousPageToken”,后续查询必须包含该标记号以获取下一页或上一页标记,如下所示。 / p>

因此,只要缓存中没有结果,您就应该发送nextpagetoken或上一页标记。

https://www.googleapis.com/youtube/v3/search?key=API_KEY&part=snippet&q=japan&maxResults=10&order=date&pageToken=NEXT_or_PREVIOUS_PAGE_TOKEN

特别是在每页需要50页并且显示3分页(例如,1,2,NEXT)的情况下,您需要两次获取结果。您将保留在缓存中的结果,以便从缓存中检索第1页和第2页结果。对于下一步,您确保通过发送nextPageToken再次查询谷歌。

因此,要显示分页1-n和每页50个结果,那么您需要对google api进行n-1个查询。但是,如果您每页显示10个结果,那么您可以单独查询50个结果,使用这些结果可以在检索到的结果的帮助下显示前5页(1-5),然后您应该再次发送下一页令牌,如上所述。

注意 - Google youtube api最多可提供50个结果。

2)如何在列表中显示视频时长? (3分20秒:秒)

Youtube API v3在简单的首次搜索响应时不会返回视频时长。要获得视频时长,我们需要再向youtube api拨打一次,如下所示。

https://www.googleapis.com/youtube/v3/videos?id=VIDEO_ID1%2CVIDEO_ID2&part=contentDetails&key=API_KEY(最多50个ID)

此问题在“http://code.google.com/p/gdata-issues/issues/detail?id=4294”中突出显示。我也在此处发布了我的答案。

因此,如果我们想要显示视频持续时间,那么我们每次都需要进行两次调用。

3)如何订购viewCount

触发以下查询,它将提供按查看次数排序的结果。

https://www.googleapis.com/youtube/v3/search?key=KEY&part=snippet&q=japan&maxResults=5&order=viewCount

详情请参阅 - https://developers.google.com/youtube/v3/docs/search/list#order

答案 1 :(得分:3)

与API V2相比,youTube API V3有点复杂。

对于上述问题,我的方法不是搜索结果,而是检索用户上传的视频。我相信这很有用

References

您在v3中创建分页的方式与v2中的方式不同,您可以在其中轻松调用

$youtube = "http://gdata.youtube.com/feeds/api/users/Qtube247/uploads?v=2&alt=jsonc&start-index=1&max-results=50";

在v3中,您需要拨打两到三个电话,第一个是获取频道详细信息,第二个电话是从我们获取频道播放列表ID的位置检索播放列表,最后检索单个视频数据。

我正在使用Php CURL

$youtube = “https://www.googleapis.com/youtube/v3/channels?part=snippet%2CcontentDetails%2Cstatistics&id=yourChannelIdgoeshere&key=yourApiKey”;

这里我们检索用户播放列表ID

$result = json_decode($return, true);
$playlistId=$result['items'][0]['contentDetails']['relatedPlaylists']['uploads'];

我们定义了pagetoken

$pageToken=’’;

每次用户点击控制按钮,我们从session []检索pagetoken并提供curl url,然后生成nextpagetoken或prevpagetoken。无论你输入什么网址,Api都知道要填充哪些列表。

if(isset($_REQUEST['ptk']) && $_REQUEST['ptk’]!==''){
$pageToken=$_REQUEST['ptk’];

}

这里我们检索用户播放列表

$ playlistItems =”https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&pageToken=”.$pageToken.”&maxResults=50&playlistId=$playlistId&key= yourApiKey”; 

如果用户有超过maxResult,我们应该有nextPageToken,例如用户有200个上传的视频,第一个pagetoken可能是 CDIQAA ,而nextttoken可能 CGQQAA 虽然之前可能 CDIQAQ ,但这样的事情不是一个数字。

这里我们保存了pagetoken

if(isset($result['nextPageToken'])) { $_SESSION[nextToken]=$result['nextPageToken'];
}

if(isset($result['prevPageToken'])) { $_SESSION[prevToken]=$result['prevPageToken'];
}

然后我们可以创建我们的控制按钮&lt;&gt;

$next=$_SESSION[nextToken];

$prev=$_SESSION[prevToken];

此处的控制按钮

<a href=”?ptk=<?php echo $prev?>” ><<prev</a>

<a href=”?ptk=<?php echo $next?>” >next>></a>

从这里当用户点击链接时,它会在会话变量中设置next或prev页面(转到上面看看这是如何工作的)

要获得视频时长,我们使用相同的Php curl

$videoDetails="https://www.googleapis.com/youtube/v3/videos?part=id,snippet,contentDetails,statistics,status&id=videoIdHere&key=yourApiKey";

$ videoData = json_decode($ return,true);

$ duration = $ videoData [&#39; items&#39;] [0] [&#39; contentDetails&#39;] [&#39; duration&#39;];

$ viewCount = $ videoData [&#39; items&#39;] [0] [&#39; statistics&#39;] [&#39; viewCount&#39;];

你可能会得到类似('PT2H34M25S')

的内容

我已回答问题Here,该问题向您展示如何转换持续时间数据

See Working Demo Here