API YouTube pour récupérer toutes les vidéos sur une chaîne

Nous avons besoin d’une liste de vidéos par nom de chaîne de YouTube (en utilisant l’API).

Nous pouvons obtenir une liste de chaînes (uniquement le nom du canal) en utilisant l’API ci-dessous:

https://gdata.youtube.com/feeds/api/channels?v=2&q=tendulkar 

Ci-dessous, un lien direct des canaux

 https://www.youtube.com/channel/UCqAEtEr0A0Eo2IVcuWBfB9g 

Ou

 WWW.YouTube.com/channel/HC-8jgBP-4rlI 

Maintenant, nous avons besoin de vidéos du canal >> UCqAEtEr0A0Eo2IVcuWBfB9g ou HC-8jgBP-4rlI.

Nous avons essayé

https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&User=UC7Xayrf2k0NZiz3S04WuDNQ https://gdata.youtube.com/feeds/api/videos?v=2&uploader=partner&q=UC7Xayrf2k0NZiz3S04WuDNQ

Mais ça n’aide pas.

Nous avons besoin de toutes les vidéos postées sur la chaîne. Les vidéos téléchargées sur un canal peuvent provenir de plusieurs utilisateurs. Je ne pense donc pas que fournir un paramètre utilisateur serait utile …

Vous devez regarder l’ API de données YouTube . Vous y trouverez de la documentation sur la manière d’accéder à l’API. Vous pouvez également trouver des bibliothèques client .

Vous pouvez également faire les demandes vous-même. Voici un exemple d’URL qui récupère les dernières vidéos d’un canal:

 https://www.googleapis.com/youtube/v3/search?key={your_key_here}&channelId={channel_id_here}&part=snippet,id&order=date&maxResults=20 

Après cela, vous recevrez un JSON avec les identifiants vidéo et les détails, et vous pouvez construire votre URL de vidéo comme ceci:

 http://www.youtube.com/watch?v={video_id_here} 

Tout d’abord, vous devez obtenir l’ID de la liste de lecture qui représente les téléchargements de l’utilisateur / canal:

https://developers.google.com/youtube/v3/docs/channels/list#try-it

Vous pouvez spécifier le nom d’utilisateur avec le forUsername={username} ou spécifier mine=true pour obtenir le vôtre (vous devez d’abord vous authentifier). Inclure part=contentDetails pour voir les playlists.

GET https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername=jambrose42&key={YOUR_API_KEY}

En conséquence, "relatedPlaylists" inclura des listes de lecture "likes" et "uploads" . Prenez ce "upload" ID de playlist. Notez également que "id" est votre channelID pour référence future.

Ensuite, obtenez une liste de vidéos dans cette liste de lecture:

https://developers.google.com/youtube/v3/docs/playlistItems/list#try-it

Il suffit de laisser tomber la playlistId!

GET https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId=UUpRmvjdu3ixew5ahydZ67uA&key={YOUR_API_KEY}

Voici une vidéo de Google Developers montrant comment répertorier toutes les vidéos d’un canal dans la v3 de l’API YouTube.

Il y a deux étapes:

  1. Canaux de requête pour obtenir l’identifiant “uploads”. https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
  2. Utilisez cet identifiant “uploads” pour interroger PlaylistItems afin d’obtenir la liste des vidéos. Par exemple, https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50

Essayez comme suit: Cela peut vous aider.

https://gdata.youtube.com/feeds/api/videos?author=cnn&v=2&orderby=updated&alt=jsonc&q=news

Ici auteur comme vous pouvez spécifier le nom de votre chaîne et “q” comme vous pouvez donner votre mot-clé de recherche.

Vous trouverez ci-dessous une alternative Python ne nécessitant aucun paquet spécial. En fournissant l’identifiant du canal, il renvoie une liste de liens vidéo pour ce canal. Veuillez noter que vous avez besoin d’une clé API pour que cela fonctionne.

 import urllib import json def get_all_video_in_channel(channel_id): api_key = YOUR API KEY base_video_url = 'https://www.youtube.com/watch?v=' base_search_url = 'https://www.googleapis.com/youtube/v3/search?' first_url = base_search_url+'key={}&channelId={}&part=snippet,id&order=date&maxResults=25'.format(api_key, channel_id) video_links = [] url = first_url while True: inp = urllib.urlopen(url) resp = json.load(inp) for i in resp['items']: if i['id']['kind'] == "youtube#video": video_links.append(base_video_url + i['id']['videoId']) try: next_page_token = resp['nextPageToken'] url = first_url + '&pageToken={}'.format(next_page_token) except: break return video_links 

En trois étapes:

  1. Abonnements: liste -> https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=50&mine=true&access_token= {oauth_token}

  2. Canaux: liste -> https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id= {channel_id} & key = {YOUR_API_KEY}

  3. PlaylistItems: list -> https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId= {playlist_id} & key = {YOUR_API_KEY}

Grâce aux références partagées ici et ailleurs, j’ai créé un script / outil en ligne permettant d’obtenir toutes les vidéos d’un canal.

Il combine les appels API à youtube.channels.list , playlistItems , videos . Il utilise des fonctions récursives pour que les rappels asynchrones exécutent l’itération suivante lors de l’obtention d’une réponse valide.

Cela permet également de limiter le nombre réel de requêtes effectuées simultanément, vous évitant ainsi de violer les règles de l’API YouTube. Partage d’extraits de code raccourcis, puis un lien vers le code complet. J’ai limité la limite de 50 résultats par appel en utilisant la valeur nextPageToken fournie dans la réponse pour récupérer les 50 résultats suivants, etc.

 function getVideos(nextPageToken, vidsDone, params) { $.getJSON("https://www.googleapis.com/youtube/v3/playlistItems", { key: params.accessKey, part: "snippet", maxResults: 50, playlistId: params.playlistId, fields: "items(snippet(publishedAt, resourceId/videoId, title)), nextPageToken", pageToken: ( nextPageToken || '') }, function(data) { // commands to process JSON variable, extract the 50 videos info if ( vidsDone < params.vidslimit) { // Recursive: the function is calling itself if // all videos haven't been loaded yet getVideos( data.nextPageToken, vidsDone, params); } else { // Closing actions to do once we have listed the videos needed. } }); } 

Cela a donné une liste de base des vidéos, y compris l'identifiant, le titre, la date de publication et similaire. Mais pour obtenir plus de détails sur chaque vidéo, comme le nombre de vues et les préférences, il faut passer des appels API aux videos .

 // Looping through an array of video id's function fetchViddetails(i) { $.getJSON("https://www.googleapis.com/youtube/v3/videos", { key: document.getElementById("accesskey").value, part: "snippet,statistics", id: vidsList[i] }, function(data) { // Commands to process JSON variable, extract the video // information and push it to a global array if (i < vidsList.length - 1) { fetchViddetails(i+1) // Recursive: calls itself if the // list isn't over. } }); 

Voir le code complet ici , et la version live ici . (Modifier: lien github fixe)

Voici le code qui retournera tous les identifiants vidéo sous votre canal

  $channelId, 'part'=> 'contentDetails', 'key'=> $apiKey ]; $url = $baseUrl . 'channels?' . http_build_query($params); $json = json_decode(file_get_contents($url), true); $playlist = $json['items'][0]['contentDetails']['relatedPlaylists']['uploads']; $params = [ 'part'=> 'snippet', 'playlistId' => $playlist, 'maxResults'=> '50', 'key'=> $apiKey ]; $url = $baseUrl . 'playlistItems?' . http_build_query($params); $json = json_decode(file_get_contents($url), true); $videos = []; foreach($json['items'] as $video) $videos[] = $video['snippet']['resourceId']['videoId']; while(isset($json['nextPageToken'])){ $nextUrl = $url . '&pageToken=' . $json['nextPageToken']; $json = json_decode(file_get_contents($nextUrl), true); foreach($json['items'] as $video) $videos[] = $video['snippet']['resourceId']['videoId']; } print_r($videos); 

Remarque : Vous pouvez obtenir l’identifiant du canal sur https://www.youtube.com/account_advanced après vous être connecté.

En utilisant l’API version 2, qui est obsolète, l’URL des téléchargements (du canal UCqAEtEr0A0Eo2IVcuWBfB9g) est la suivante:

https://gdata.youtube.com/feeds/users/UCqAEtEr0A0Eo2IVcuWBfB9g/uploads

Il existe une version API 3.

Comme toute personne répondant à cette question a des problèmes à cause de la limite de 500 vidéos, voici une solution alternative utilisant youtube_dl dans Python 3 . De plus, aucune clé API n’est nécessaire .

  1. Installez youtube_dl: sudo pip3 install youtube-dl
  2. Découvrez l’ID de canal de votre canal cible . L’identifiant va commencer avec UC. Remplacez le C pour Channel avec U pour Upload (UU …), ceci est la playlist de téléchargement .
  3. Utilisez la fonctionnalité de téléchargement de playlist de youtube-dl. Idéalement, vous ne voulez PAS télécharger toutes les vidéos de la liste de lecture qui est la valeur par défaut, mais uniquement les métadonnées.

Exemple (avertissement – prend des dizaines de minutes):

 import youtube_dl, pickle # UCVTyTA7-g9nopHeHbeuvpRA is the channel id (1517+ videos) PLAYLIST_ID = 'UUVTyTA7-g9nopHeHbeuvpRA' # Late Night with Seth Meyers with youtube_dl.YoutubeDL({'ignoreerrors': True}) as ydl: playd = ydl.extract_info(PLAYLIST_ID, download=False) with open('playlist.pickle', 'wb') as f: pickle.dump(playd, f, pickle.HIGHEST_PROTOCOL) vids = [vid for vid in playd['ensortinges'] if 'A Closer Look' in vid['title']] print(sum('Trump' in vid['title'] for vid in vids), '/', len(vids)) 

Récemment, j’ai dû récupérer toutes les vidéos d’un canal et, selon la documentation du développeur YouTube: https://developers.google.com/youtube/v3/docs/playlistItems/list

 function playlistItemsListByPlaylistId($service, $part, $params) { $params = array_filter($params); $response = $service->playlistItems->listPlaylistItems( $part, $params ); print_r($response); } playlistItemsListByPlaylistId($service, 'snippet,contentDetails', array('maxResults' => 25, 'playlistId' => 'id of "uploads" playlist')); 

$service est votre object Google_Service_YouTube .

Vous devez donc extraire des informations du canal pour récupérer la liste de lecture “uploads” qui contient toutes les vidéos téléchargées par la chaîne: https://developers.google.com/youtube/v3/docs/channels/list

Si cette API est nouvelle, je vous recommande fortement de transformer l’exemple de code de l’extrait par défaut en exemple complet.

Le code de base pour récupérer toutes les vidéos d’un canal peut être:

 class YouTube { const DEV_KEY = 'YOUR_DEVELOPPER_KEY'; private $client; private $youtube; private $lastChannel; public function __construct() { $this->client = new Google_Client(); $this->client->setDeveloperKey(self::DEV_KEY); $this->youtube = new Google_Service_YouTube($this->client); $this->lastChannel = false; } public function getChannelInfoFromName($channel_name) { if ($this->lastChannel && $this->lastChannel['modelData']['items'][0]['snippet']['title'] == $channel_name) { return $this->lastChannel; } $this->lastChannel = $this->youtube->channels->listChannels('snippet, contentDetails, statistics', array( 'forUsername' => $channel_name, )); return ($this->lastChannel); } public function getVideosFromChannelName($channel_name, $max_result = 5) { $this->getChannelInfoFromName($channel_name); $params = [ 'playlistId' => $this->lastChannel['modelData']['items'][0]['contentDetails']['relatedPlaylists']['uploads'], 'maxResults'=> $max_result, ]; return ($this->youtube->playlistItems->listPlaylistItems('snippet,contentDetails', $params)); } } $yt = new YouTube(); echo '
' . print_r($yt->getVideosFromChannelName('CHANNEL_NAME'), true) . '

';

Comme l’indique la documentation ( lien ), vous pouvez utiliser le type de ressource de canal et la liste d’opérations pour obtenir toutes les vidéos dans un canal. Cette opération doit être effectuée en utilisant l’argument ‘id de canal’.