В первой части мы представили API-интерфейс YouTube и создали небольшую демонстрацию, в которой перечислены самые популярные видео на YouTube. В этой части мы расширим наше приложение, чтобы иметь функцию поиска, а также перечислим доступные категории на YouTube, чтобы позволить пользователю сузить область своих интересов. Давайте начнем.
Списки категорий
YouTube видео сгруппированы по категориям. Мы можем получить список категорий для определенной страны, используя их код ISO . Результат также может быть локализован с использованием необязательного параметра, такого как en_US
fr_FR
документации .
// app/Http/routes.php
Route::get('/categories', ['uses' => 'YouTubeAPIController@categories']);
// app/Http/Controllers/YouTubeAPIController.php
public function categories()
{
$youtube = \App::make('youtube');
$categories = $youtube->videoCategories->listVideoCategories('snippet', ['regionCode' => 'MA']);
dump($categories);
}
Как и прежде, первым параметром является part
Результат выглядит следующим образом.
Возвращаясь к нашей демонстрации, нам нужно использовать список категорий и дать пользователю возможность фильтровать список видео.
// app/Http/Controllers/YouTubeAPIController.php
public function videos()
{
$options = ['chart' => 'mostPopular', 'maxResults' => 16];
$regionCode = 'MA';
$selectedCategory = 0;
if (\Input::has('page')) {
$options['pageToken'] = \Input::get('page');
}
if (\Input::has('category')) {
$selectedCategory = \Input::get('category');
$options['videoCategoryId'] = $selectedCategory;
}
$youtube = \App::make('youtube');
$categories = $youtube->videoCategories->listVideoCategories('snippet', ['regionCode' => $regionCode])->getItems();
$videos = $youtube->videos->listVideos('id, snippet', $options);
return view('videos', ['videos' => $videos, 'categories' => $categories, 'selectedCategory' => $selectedCategory]);
}
Когда пользователь выбирает категорию, мы передаем идентификатор категории в качестве параметра методу videos. Это должно хорошо работать с нумерацией страниц, поэтому давайте посмотрим, как изменилась наша разметка.
// resources/views/videos.blade.php
{!! Form::open(['route' => 'videos', 'name' => 'formCategory', 'class' => 'form-inline']) !!}
<label for="category">Filter by category: </label>
<select name="category" id="category" class="form-control" onchange="this.form.submit()">
<option value="0">All</option>
@foreach($categories as $category)
<option value="{{ $category->getId() }}" @if($selectedCategory == $category->getId()) selected @endif>{{ $category['snippet']['title'] }}</option>
@endforeach
</select>
{!! Form::close() !!}
<!-- Pagination -->
<li @if($videos->getPrevPageToken() == null) class="disabled" @endif>
<a href="/videos?page={{$videos->getPrevPageToken()}}&category={{ $selectedCategory }}" aria-label="Previous">
<span aria-hidden="true">Previous «</span>
</a>
</li>
<li @if($videos->getNextPageToken() == null) class="disabled" @endif>
<a href="/videos?page={{$videos->getNextPageToken()}}&category={{ $selectedCategory }}" aria-label="Next">
<span aria-hidden="true">Next »</span>
</a>
</li>
Форма отправляется на событие изменения списка категорий, и мы обязательно передаем выбранную категорию вместе с жетоном страницы в навигации. Нулевая категория сбрасывает наш фильтр.
Поиск видео
Поиск является важным аспектом платформы YouTube, и мы должны включить эту функцию в нашу демонстрацию. Пользователь может искать и разбивать на страницы в списке результатов.
// app/Http/routes.php
Route::any('/search', ['as' => 'search', 'uses' => 'YouTubeAPIController@search']);
// app/Http/Controllers/YouTubeAPIController.php
public function search()
{
if (!\Input::has('query')) {
return view("search");
}
$options = ['maxResults' => 16, 'q' => \Input::get("query")];
if (\Input::has('page')) {
$options['pageToken'] = \Input::get('page');
}
$youtube = \App::make('youtube');
$videos = $youtube->search->listSearch("snippet", $options);
return view("search", ['videos' => $videos, 'query' => \Input::get('query')]);
}
Если параметр query
Вид практически идентичен видео.
// resources/views/search.blade.php
{!! Form::open(['route' => 'search', 'class' => 'form-inline']) !!}
<input type="text" name="query" class="form-control" style="width: 50%;" autofocus="true" value="{{ $query }}"/>
<input type="submit" class="btn btn-default" value="Search"/>
{!! Form::close() !!}
@if(isset($videos))
<ul class="list-unstyled video-list-thumbs row">
@foreach($videos as $video)
<li class="col-lg-3 col-sm-4 col-xs-6">
<a href="{{ URL::route('video', ['id' => $video->getId()->getVideoId()]) }}" title="{{ $video['snippet']['title'] }}" target="_blank">
<img src="{{ $video['snippet']['thumbnails']['medium']['url'] }}" alt="{{ $video['snippet']['title'] }}" class="img-responsive" height="130px" />
<h2 class="truncate">{{ $video['snippet']['title'] }}</h2>
<span class="glyphicon glyphicon-play-circle"></span>
</a>
</li>
@endforeach
</ul>
<nav class="text-center">
<ul class="pagination pagination-lg">
<li @if($videos->getPrevPageToken() == null) class="disabled" @endif>
<a href="/search?page={{$videos->getPrevPageToken()}}&query={{ $query }}" aria-label="Previous">
<span aria-hidden="true">Previous «</span>
</a>
</li>
<li @if($videos->getNextPageToken() == null) class="disabled" @endif>
<a href="/search?page={{$videos->getNextPageToken()}}&query={{ $query }}" aria-label="Next">
<span aria-hidden="true">Next »</span>
</a>
</li>
</ul>
</nav>
@else
<h2>No result.</h2>
@endif
Вы видите, что результат видео идентичен странице видео, за исключением того, что метод $video->getId()
Результаты API YouTube имеют доступ к массивам, поэтому вы можете работать с ними как с массивами, а не вызывать методы получения.
Ответ также содержит информацию о видеоканале, дате создания, качестве и т. Д. Вы можете использовать их для обогащения своей страницы.
Когда вы посещаете одну страницу видео на YouTube, вы видите список предложений на основе вашего текущего видео. Конечная точка поиска предлагает такую возможность через несколько вариантов:
// app/Http/Controllers/YouTubeAPIController.php
public function video($id)
{
$options = ['maxResults' => 1, 'id' => $id];
$youtube = \App::make('youtube');
$videos = $youtube->videos->listVideos('id, snippet, player, contentDetails, statistics, status', $options);
$relatedVideos = $youtube->search->listSearch("snippet", ['maxResults' => 16, 'type' => 'video', 'relatedToVideoId' => $id]);
if (count($videos->getItems()) == 0) {
return redirect('404');
}
return view('video', ['video' => $videos[0], 'relatedVideos' => $relatedVideos]);
}
В соответствии с документацией , вам нужно установить параметр type
video
Конечная точка поиска имеет множество параметров, таких как ограничение поиска определенным качеством, определенной категорией или определенным каналом и т. Д. Обязательно ознакомьтесь со списком доступных параметров в документации.
Расширение демо
Поскольку мы не можем охватить все в этом уроке, вы можете взять демо отсюда и начать расширять его новыми функциональными возможностями. Вы можете начать с отображения названий видеоканалов и ссылок под каждым элементом видео, а когда пользователь нажимает на ссылку, перенаправляет их на маршрут /channel/channel_id
Вы можете группировать видео по плейлистам и т. д.
Квоты и кеширование
Важной частью работы с API являются квоты. YouTube дает вам 50 000 000 единиц в день, и, как мы говорили ранее, единицы рассчитываются для каждого запроса и могут быть увеличены, когда вы запросите дополнительную информацию. Некоторые вызовы API стоят дороже, чем другие. Например, звонки на конечную точку поиска стоят 100 единиц. Кроме того, вы ограничены 3000 запросов / сек / пользователь.
Etags Caching
Если вы заметили на предыдущих скриншотах, у нас есть атрибут Etag, который маркирует текущее состояние результата объекта. Этот атрибут может быть отправлен внутри заголовков HTTP, как описано на странице спецификации HTTP, и если сущность изменилась, вы получите обновленную версию, в противном случае вы получите ответ 304 (не измененный). Подробнее об оптимизации и производительности вы можете прочитать в документации .
Вывод
В этой статье мы представили YouTube API v3 и создали демо-версию. API предлагает множество функций, таких как работа с пользовательскими действиями, списками воспроизведения, каналами, подписками и т. Д. Обязательно ознакомьтесь с руководством по началу работы, чтобы ознакомиться с ограничениями и возможностями.
Вы можете проверить финальную демонстрацию на Github , она включает в себя руководство по установке, чтобы вы начали. Если у вас есть какие-либо комментарии или вопросы, не стесняйтесь размещать их ниже, и я сделаю все возможное, чтобы ответить на них.