Статьи

Отображение видео YouTube в PHP

В этой статье, состоящей из двух частей, мы узнаем, как работать с версией 3 API YouTube, и на этом пути мы создадим демонстрацию. Давайте начнем.

YouTube Logo

Что мы строим

Мы собираемся создать демонстрационную версию, которая позволит пользователю просматривать популярные видео на YouTube, искать видео, просматривать видео по категориям и выбирать видео для просмотра.

Я буду использовать Laravel 5 в качестве своего предпочтительного фреймворка и Vagrant для своей среды разработки. Конечный продукт будет выглядеть примерно так:

Final demo

Подготовка проекта

После установки Laravel 5 на свой компьютер установите google/apiclient :

 composer require google/apiclient 

Чтобы настроить новый проект на консоли разработчика Google, ознакомьтесь с этим кратким советом, чтобы начать работу.

Регистрация переменных среды

После получения наших учетных данных из консоли разработчиков Google нам необходимо зарегистрировать их в нашем приложении.

 // .env APP_DEBUG=true app_name='Your app name (optional)' client_id='Your client id' client_secret='Your client secret' api_key='Your developer key' 
 // config/google.php return [ 'app_name' => env('app_name'), 'client_id' => env('client_id'), 'client_secret' => env('client_secret'), 'api_key' => env('api_key') ]; 

Laravel автоматически загружает переменные среды из файла .env в корне папки нашего приложения. Теперь, когда мы настроили нашу конфигурацию, мы можем начать процесс входа в систему.

Вход и Авторизация

Прежде чем войти в систему с помощью API Google, нам нужно поговорить о областях и их важности для процесса авторизации.

Области применения

Области определяют уровень авторизации, предоставляемой приложению, поэтому обязательно запрашивайте только то, что вам нужно. API YouTube имеет четыре области действия:

  • https://www.googleapis.com/auth/youtube : управляйте своей учетной записью YouTube.
  • https://www.googleapis.com/auth/youtube.readonly : просмотр учетной записи YouTube.
  • https://www.googleapis.com/auth/youtube.upload : загружайте видео с YouTube и управляйте своими видео на YouTube.
  • https://www.googleapis.com/auth/youtubepartner-channel-audit : получить часть AuditDetails в ресурсе канала.

Для нашей демонстрации я собираюсь использовать только первую, и мы можем расширить ее в зависимости от потребностей нашего приложения. Подробнее об авторизации вы можете прочитать в документации .

 // app/Services/GoogleLogin.php namespace App\Services; class GoogleLogin { protected $client; public function __construct(\Google_Client $client) { $this->client = $client; $this->client->setClientId(\Config::get('google.client_id')); $this->client->setClientSecret(\Config::get('google.client_secret')); $this->client->setDeveloperKey(\Config::get('google.api_key')); $this->client->setRedirectUri(\Config::get('app.url') . "/loginCallback"); $this->client->setScopes([ 'https://www.googleapis.com/auth/youtube', ]); $this->client->setAccessType('offline'); } public function isLoggedIn() { if (\Session::has('token')) { $this->client->setAccessToken(\Session::get('token')); } if ($this->client->isAccessTokenExpired()) { \Session::set('token', $this->client->getRefreshToken()); } return !$this->client->isAccessTokenExpired(); } public function login($code) { $this->client->authenticate($code); $token = $this->client->getAccessToken(); \Session::put('token', $token); return $token; } public function getLoginUrl() { $authUrl = $this->client->createAuthUrl(); return $authUrl; } } 

После Google_Client экземпляра Google_Client с использованием наших учетных данных мы устанавливаем нужные области действия. Метод setAccessType дает нашему приложению возможность обновить токен, когда пользователя нет.

Контроллер входа

 // app/Http/routes.php Route::get('/login', ['uses' => 'GoogleLoginController@index', 'as' => 'login']); Route::get('/loginCallback', ['uses' => 'GoogleLoginController@store', 'as' => 'loginCallback']); 
 // app/Http/Controllers/GoogleLoginController.php class GoogleLoginController extends Controller { public function index(\App\Services\GoogleLogin $ga) { if ($ga->isLoggedIn()) { return \Redirect::to('/'); } $loginUrl = $ga->getLoginUrl(); return "<a href='{$loginUrl}'>login</a>"; } public function store(\App\Services\GoogleLogin $ga) { // User rejected the request if(\Input::has('error')){ dd(\Input::get('error')); } if (\Input::has('code')) { $code = \Input::get('code'); $ga->login($code); return \Redirect::to('/'); } else { throw new \InvalidArgumentException("Code attribute is missing."); }//else } } 

Метод GoogleLoginController@index проверит, вошел ли пользователь в систему и, если да, перенаправит его на домашнюю страницу. В противном случае мы генерируем новый URL для входа.

После прохождения фазы авторизации Google перенаправит пользователя на URL-адрес обратного вызова, определенный в консоли разработчика Google с параметром code. Этот код используется в обмен на токен.

Листинг видео

Класс Google_Service_YouTube — это наша дверь в API YouTube. Он обеспечивает доступ ко всем данным YouTube. Класс принимает экземпляр Google_Client в качестве параметра. Имеет смысл создать провайдера, связывающего нашу реализацию, чтобы нам не приходилось повторять один и тот же код везде. Вы можете прочитать больше о поставщиках услуг в документации .

 php artisan make:provider YouTubeServiceProvider 

Эта команда создаст новый класс в нашей папке app/Providers . Нам нужно добавить нашего поставщика услуг в список поставщиков внутри config/app.php .

 // config/app.php 'providers' => [ 'App\Providers\YouTubeServiceProvider', ] 
 // app/Providers/YouTubeServiceProvider.php public function register() { $app = $this->app; $this->app->bind('GoogleClient', function () { $googleClient = new \Google_Client(); $googleClient->setAccessToken(\Session::get("token")); return $googleClient; }); $this->app->bind('youtube', function () use ($app) { $googleClient = \App::make('GoogleClient'); $youtube = new \Google_Service_YouTube($googleClient); return $youtube; }); } 

Конечная точка https://www.googleapis.com/youtube/v3/videos возвращает список видео, доступ к которому можно получить с помощью нашего класса YouTube через $youtube->videos .

 // app/Http/Controllers/YouTubeAPIController.php public function videos() { $youtube = \App::make('youtube'); $videos = $youtube->videos->listVideos('snippet', ['chart' => 'mostPopular']); dump($video); } 

Videos Screenshot

Первый параметр метода listVideos называется part и он определяет информацию, содержащуюся в результате. Вы можете добавить statistics чтобы получить данные о количестве голосов, лайках и т. Д. Подробнее о параметре part мы поговорим позже в этой статье. Подробнее о поддерживаемых значениях можно прочитать в документации .

Второй параметр должен содержать фильтр для видео. В этом случае мы получаем самые популярные видео на YouTube. Вы также можете запросить понравившиеся или не понравившиеся видео и т. Д. Вы можете узнать больше о фильтрах в документации .

 // app/Http/Controllers/YouTubeAPIController.php public function videos() { $options = ['chart' => 'mostPopular', 'maxResults' => 16]; if (\Input::has('page')) { $options['pageToken'] = \Input::get('page'); } $youtube = \App::make('youtube'); $videos = $youtube->videos->listVideos('id, snippet', $options); return view('videos', ['videos' => $videos]); } 

Этот метод говорит сам за себя. Параметр страницы предназначен для разбиения на страницы, как мы увидим далее.

 // resources/views/videos.blade.php <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="http://youtube.com/watch?v={{ $video->getId() }}" title="{{ $video['snippet']['title'] }}" target="_blank"> <img src="{{ $video['snippet']['thumbnails']['medium']['url'] }}" alt="{{ $video['snippet']['title'] }}" /> <h2 class="truncate">{{ $video['snippet']['title'] }}</h2> </a> </li> @endforeach </ul> <ul class="pagination pagination-lg"> <li @if($videos->getPrevPageToken() == null) class="disabled" @endif> <a href="/videos?page={{$videos->getPrevPageToken()}}" aria-label="Previous"> <span aria-hidden="true">Previous &laquo;</span> </a> </li> <li @if($videos->getNextPageToken() == null) class="disabled" @endif> <a href="/videos?page={{$videos->getNextPageToken()}}" aria-label="Next"> <span aria-hidden="true">Next &raquo;</span> </a> </li> </ul> 

Наш взгляд очень прост — мы выводим только заголовок видео, миниатюру и ссылку. Наш ответ API также содержит лайки, антипатии, количество просмотров и т. Д., Поэтому вы можете использовать их, чтобы обогатить свою страницу с помощью специальной разметки. Ссылки на страницы дают пользователю возможность перемещаться по видео. Возможно, вы заметили, что это делается с помощью токенов, а не обычного параметра страницы.

При нажатии на видео вы будете перенаправлены на просмотр видео на YouTube с использованием идентификатора. Почему бы не получить информацию о видео и создать страницу, содержащую проигрыватель вместе с дополнительной информацией о видео?

Одиночная страница видео

Получение одного видео — это всего лишь вопрос указания опции для той же конечной точки из ранее. Поскольку результатом является один элемент, мы устанавливаем для параметра maxResults значение 1 и удаляем атрибут chart поскольку он не имеет отношения к данному запросу.

 // app/Http/routes.php Route::get('/video/{id}', ['uses' => 'YouTubeAPIController@video', 'as' => 'video']); 
 // 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); if(count($videos->getItems()) == 0){ return redirect('404'); } return view('video', ['video' => $videos[0]]); } 

Video

Поскольку это страница с одним элементом, я попытался извлечь как можно больше информации, используя параметр part . Если элемент не существует, мы перенаправляем пользователя на страницу 404 не найдена. В противном случае мы визуализируем наш вид первым элементом в списке.

 // resources/views/video.blade.php <div class="row"> <h2>{{ $video["snippet"]["title"] }}</h2> </div> <div class="row"> <iframe type='text/html' src='http://www.youtube.com/embed/{{ $video->getId() }}' width='100%' height='500' frameborder='0' allowfullscreen='true'></iframe> </div> <div class="row"> (<span>{{ $video["statistics"]["likeCount"] }} <i class="glyphicon glyphicon-thumbs-up"></i></span>) (<span>{{ $video["statistics"]["dislikeCount"] }} <i class="glyphicon glyphicon-thumbs-down"></i></span>) (<span>{{ $video["statistics"]["favoriteCount"] }} <i class="glyphicon glyphicon-heart"></i></span>) (<span>{{ $video["statistics"]["commentCount"] }} <i class="glyphicon glyphicon-bullhorn"></i></span>) </div> <hr/> <div class="row"> <p>{{ $video["snippet"]["description"] }}</p> </div> 

Поскольку мы запросили API YouTube для части player , мы можем напрямую получить к нему доступ, используя $video['player']['embedHtml'] , но если вы хотите настроить размеры проигрывателя, вы можете создать его, используя идентификатор видео, как мы это делали в нашем примере.

Стоит отметить одну вещь: каждый запрос имеет стоимость одного звонка, а когда вы запрашиваете фрагмент, статистику и т. Д., Вы складываете новые расходы. Вы можете прочитать больше о квотах и ​​стоимости в документации .

Video

Завершение

В этой первой части мы представили API YouTube и создали небольшую демонстрацию для запроса списка самых популярных видео на YouTube со ссылками на страницы и страницей для просмотра одного видео. В следующей части мы будем изучать категории видео и функции поиска, так что следите за обновлениями. Вы можете проверить окончательный результат на Github , и если у вас есть какие-либо вопросы или комментарии, вы можете опубликовать их ниже.