8

我正在尝试使用 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()));
  }
}
4

2 回答 2

19

1)如何在搜索列表下方显示页码?(每页 50 结果)

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

因此,每当缓存中没有结果时,您应该发送 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 再次查询 google。

因此,要显示分页 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

于 2014-05-03T03:29:07.587 回答
3

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

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

参考

在 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。无论您向 url 提供什么,Api 都知道要填充哪组列表。

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

}

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

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

如果用户有超过maxResult,我们应该有nextPageToken,例如用户上传了200个视频,第一个pagetoken可能是CDIQAA,下一个pagetoken可能是CGQQAA,而previous可能是CDIQAQ,类似这样的东西不是数字。

这里我们保存pagetoken

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

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

然后我们可以创建我们的控制按钮<>

$next=$_SESSION[nextToken];

$prev=$_SESSION[prevToken];

控制按钮在这里

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

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

从这里当用户单击链接时,它会在会话变量中设置下一个或上一个页面(向上查看这是如何工作的)

为了获得视频时长,我们使用相同的 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['items'][0]['contentDetails']['duration'];

$viewCount = $videoData['items'][0]['statistics']['viewCount'];

你可能会得到这样的东西('PT2H34M25S')

我在这里回答了一个问题,它向您展示了如何转换持续时间数据

在此处查看工作演示

于 2014-11-14T13:12:07.883 回答