La YouTube Data API v3 ha dejado de estar en fase beta por lo que he realizado algunas pruebas en PHP para cuando vaya a implementar esta versión en mi plugin Youtube Channel Gallery. Mi intención es hacer otra prueba con JavaScript, más adelante, para valorar cuál es la opción más interesante para integrar en mi plugin.
La principales características de esta prueba con la YouTube Data API v3 son:
- Mostrar vídeos de una playlist, subidos por un usuario, favoritos, marcados como me gusta y el resultado de una búsqueda.
- En lugar de usar OAuth, he usado la API key directamente ya que no he planteado hacer accesos que requieran autorización.
- He implementado paginación usando los atributos prevPageToken nextPageToken.
- Control de los vídeos privados para que funcione con resultados en los que aparezcan vídeos privados. Se mostrará la miniatura del vídeo con un icono superpuesto que advierte de que es un vídeo privado.
El código del PHP de la demo es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
<?php // url $url = 'https://www.googleapis.com/youtube/v3/'; //key $key = 'key=' . 'my_api_key'; //defaults $_POST['resource'] = isset( $_POST['resource'] ) ? $_POST['resource'] : 'playlistItems'; $_POST['resource_param'] = isset( $_POST['resource_param'] ) ? $_POST['resource_param'] : 'PLD428BE966FF3B1E9'; $_POST['maxResults'] = isset( $_POST['maxResults'] ) ? $_POST['maxResults'] : '8'; $_POST['pageToken'] = isset( $_POST['pageToken'] ) ? $_POST['pageToken'] : ''; $_POST['page'] = isset( $_POST['page'] ) ? $_POST['page'] : '0'; $_POST['title'] = isset( $_POST['title'] ) ? $_POST['title'] : ''; $_POST['description'] = isset( $_POST['description'] ) ? $_POST['description'] : ''; $channels_type = array( 'likes', 'favorites', 'uploads' ); //resource if ( in_array( $_POST['resource'], $channels_type ) || $_POST['resource'] == 'playlistItems' ) { $resource = 'playlistItems?'; } else { $resource = 'search?'; } //Required parameters $part = 'part=snippet&'; //Main resource parameter: playlistId / q //------------------------------- //playlists ID if ( $_POST['resource'] == 'playlistItems' ) { // Playlist ID $resource_param = 'playlistId=' . $_POST['resource_param'] . '&'; } //user likes, favorites or uploads ID if ( in_array( $_POST['resource'], $channels_type ) ) { $user_resource = 'channels?'; $user_part = 'part=contentDetails&'; $user_name = 'forUsername=' . $_POST['resource_param'] . '&'; $user_fields = 'fields=items(contentDetails)&'; $user_str_datos = file_get_contents( $url . $user_resource . $user_part . $user_name . $user_fields . $key ); $user_datos = json_decode( $user_str_datos, true ); $resource_param = 'playlistId=' . $user_datos["items"][0]["contentDetails"]["relatedPlaylists"][$_POST['resource']] . '&'; } //search query if ( $_POST['resource'] == 'search' ) { $resource_param = 'q=' . urlencode( $_POST['resource_param'] ) . '&type=video&'; } //Optional parameters $maxResults = 'maxResults=' . $_POST['maxResults'] . '&'; if ( empty( $_POST['pageToken'] ) ) { $pageToken = ''; } else { $pageToken = 'pageToken=' . $_POST['pageToken'] . '&'; } $fields = 'fields=items(snippet),nextPageToken,prevPageToken,pageInfo'; $request = $url . $resource . $part . $resource_param . $maxResults . $pageToken . $key ; $str_datos = file_get_contents( $request ); $datos = json_decode( $str_datos, true ); //Video gallery //------------------------------- $youtube_videos = ''; //gallery title if ( $_POST['resource'] == 'search' ) { $gallery_title = $_POST['resource_param']; }else { $gallery_title = $datos["items"][0]["snippet"]["channelTitle"]; } $youtube_videos .= '<h2>' . $gallery_title . '</h2>'; //gallery $youtube_videos .= '<ul>'; foreach ( $datos["items"] as $items ) { $youtube_videos .= '<li>'; //video id if ( $_POST['resource'] == 'search' ) { $videoId = $items["id"]["videoId"]; } else { $videoId = $items["snippet"]["resourceId"]["videoId"]; } //check private thumbnail videos if ( !isset( $items["snippet"]["thumbnails"] ) && $items["snippet"]["title"] == 'Private video' ) { //get private thumbnail videos $thumbnail_url = 'https://i1.ytimg.com/vi/' . $items["snippet"]["resourceId"]["videoId"] . '/default.jpg'; $video_state = 'private'; } else { $thumbnail_url = $items["snippet"]["thumbnails"]["default"]["url"]; $video_state = 'public'; } //thumbnail $youtube_videos .= '<div class="' . $video_state . '"><a href="https://www.youtube.com/watch?v=' . $videoId . '"><img src="' . $thumbnail_url . '"></a></div>'; //title if ( !empty( $_POST['title'] ) ) { $youtube_videos .= '<h3><a href="https://www.youtube.com/watch?v=' . $videoId . '">' . $items["snippet"]["title"] . '</a></h3>'; } //description if ( !empty( $_POST['description'] ) ) { $youtube_videos .= '<p>' . $items["snippet"]["description"] . '</p>'; } $youtube_videos .= '</li>'; } $youtube_videos .= '</ul>'; //Pagination //------------------------------- //previous page link $youtube_videos .= '<div class="pagination">'; $youtube_videos .= '<div>'; if ( isset( $datos["prevPageToken"] ) ) { $youtube_videos .= '<a data-prev="' .$datos["prevPageToken"]. '" class="prev-button">Previous</a>'; } $youtube_videos .= '</div>'; //current and total pages $youtube_videos .= '<div>'; $current_page = $_POST['page']; $total_pages = ceil( $datos["pageInfo"]["totalResults"] / $datos["pageInfo"]["resultsPerPage"] ); $youtube_videos .= $current_page . '/' . $total_pages; $youtube_videos .= '</div>'; //next page link $youtube_videos .= '<div>'; if ( isset( $datos["nextPageToken"] ) ) { $youtube_videos .= '<a data-next="' .$datos["nextPageToken"]. '" class="next-button">Next</a>'; } $youtube_videos .= '</div>'; $youtube_videos .= '</div>'; echo $youtube_videos; ?> |