web-dev-qa-db-fra.com

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

Nous avons besoin d'une liste de vidéos par nom de chaîne de YouTube (à l'aide de l'API).

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

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

Ci-dessous un lien direct de canaux

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

Ou

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

Nous avons maintenant 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=UC7Xayrf2k0NzizSS4WuDNQhttps://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. Par conséquent, je ne pense pas que fournir un paramètre d'utilisateur aiderait ...

133
Rajendra Dewani

Vous devez consulter la API de données YouTube . Vous y trouverez une documentation sur la manière d'accéder à l'API. Vous pouvez également trouver bibliothèques clientes .

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 une JSON avec les identifiants et les détails de la vidéo, et vous pourrez construire l'URL de votre vidéo comme suit:

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

Tout d’abord, vous devez obtenir l’identifiant de la playlist 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 paramètre forUsername={username} ou spécifier mine=true pour obtenir le vôtre (vous devez d'abord vous authentifier). Inclure part=contentDetails pour voir les listes de lecture.

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

Dans le résultat, "relatedPlaylists" inclura les playlists "likes" et "uploads". Saisissez cet identifiant de playlist "upload". Notez également que "id" est votre identifiant de canal pour référence future. 

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

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

Il suffit de déposer dans la playlistId!

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

78
jambrose

Voici une vidéo de Google Developers montrant comment répertorier toutes les vidéos d'une chaîne dans v3 de l'API YouTube.

Il y a deux étapes:

  1. Interrogez les chaînes pour obtenir l'identifiant "uploads". par exemple 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
47
virtualmic

Essayez avec 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 votre nom de chaîne et "q" comme vous pouvez donner votre clé de recherche Word.

7
Nagaraja

Pour obtenir la liste des chaînes:

Obtenir la liste des chaînes par forUserName :

_ { https://www.googleapis.com/youtube/v3/channels?part=snippet,contentDetails,statistics&forUsername=Apple&key=

Obtenir la liste des chaînes par id de chaîne :

_ { https://www.googleapis.com/youtube/v3/channels/?part=snippet,contentDetails,statistics&id=UCE_M8A5yxnLfW0KghEeajjw&key=

Obtenir les sections de canal:

_ { https://www.googleapis.com/youtube/v3/channelSections?part=snippet,contentDetails&channelId=UCE_M8A5yxnLfW0KghEeajjw&key=

Pour obtenir les playlists:

Obtenir les listes de lecture par Identifiant de chaîne :

_ { https://www.googleapis.com/youtube/v3/playlists?part=snippet,contentDetails&channelId=UCq-Fj5jknLsUf-MWSy4_brA&maxResults=50&key=

Get Playlists by Identifiant de chaîne avec pageToken :

_ { https://www.googleapis.com/youtube/v3/playlists?part=snippet,contentDetails&channelId=UCq-Fj5jknLsUf-MWSy4_brA&maxResults=50&key= & pageToken = CDIAA

Pour obtenir PlaylistItems:

Obtenir la liste PlaylistItems par PlayListId :

_ { https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,contentDetails&maxResults=25&playlistId=PLHFlHpPjgk70Yv3kxQvkDEO5n5t5Q5n5tMQia5I&key=

Pour obtenir des vidéos:

Obtenir la liste des vidéos par ID vidéo :

_ { https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=YxLCwfA1cLw&key=

Obtenir la liste des vidéos par plusieurs vidéos id :

_ { https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=YxLCwfA1cLw,Qgy6LaO3SB0,7yPJXGO2Dcw&key= _

Obtenir liste de commentaires

Obtenir la liste de commentaires par ID vidéo :

_ { https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&videoId=el } _ **** kQak & key = A ********** k

Obtenir la liste de commentaires par ID de chaîne :

_ { https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&channelId=U } _ ***** Q & key = AI ******** k

Obtenir la liste des commentaires par allThreadsRelatedToChannelId :

_ { https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&allThreadsRelatedToChannelId=UC } ***** ntcQ & key = AI ***** k

Ici, toutes les api sont Get approche.

Sur la base de l'identifiant de canal, nous ne pouvons pas obtenir toutes les vidéos directement, c'est le point important ici.

Pour l'intégration https://developers.google.com/youtube/v3/quickstart/ios?ver=Swift } _

7
iOS

Vous trouverez ci-dessous une alternative Python ne nécessitant aucun package spécial. En fournissant l'identifiant de canal, il retourne 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
7
Stian

Juste en trois étapes:

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

  2. Chaînes: 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}

4
sacred

Grâce aux références partagées ici et ailleurs, j'ai créé un script/outil en ligne que l'on peut utiliser pour obtenir toutes les vidéos d'une chaîne.

Il combine les appels d'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 demandes effectuées à la fois, vous évitant ainsi d'enfreindre les règles de l'API YouTube. Partager des extraits raccourcis, puis un lien vers le code complet. J'ai contourné la limite de 50 résultats maximum par appel en utilisant la valeur nextPageToken fournie dans la réponse pour extraire 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 obtenu une liste de base des vidéos, y compris id, titre, date de publication et similaire. Mais pour obtenir plus de détails sur chaque vidéo, comme la vue compte et aime, il faut passer des appels API à 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 version live ici . (Edit: lien de github fixe)

4
Nikhil VJ

Comme chaque personne qui répond à cette question a des problèmes en raison de la limite de vidéo de 500, voici une solution alternative utilisant youtube_dl dans Python 3. De plus, no clé API est nécessaire.

  1. Installez youtube_dl: Sudo pip3 install youtube-dl
  2. Découvrez l'identifiant de votre chaîne cible . L'ID va commencer par UC. Remplacez le C pour Channel par U pour Upload (c.-à-d. UU ...), il s’agit de la playlist upload.
  3. Utilisez la fonctionnalité playlist downloader de youtube-dl. Idéalement, vous ne voulez PAS télécharger toutes les vidéos de la liste de lecture 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['entries'] if 'A Closer Look' in vid['title']]
    print(sum('Trump' in vid['title'] for vid in vids), '/', len(vids))
3
xjcl

À l'aide de l'API version 2, obsolète, l'URL pour les téléchargements (du canal UCqAEtEr0A0Eo2IVcuWBfB9g) est la suivante:

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

Il existe une API version 3.

2
Als

Voici le code qui renverra tous les identifiants vidéo sous votre chaîne

<?php 
    $baseUrl = 'https://www.googleapis.com/youtube/v3/';
    // https://developers.google.com/youtube/v3/getting-started
    $apiKey = 'API_KEY';
    // If you don't know the channel ID see below
    $channelId = 'CHANNEL_ID';

    $params = [
        'id'=> $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);

Note: Vous pouvez obtenir l'identifiant du canal à l'adresse https://www.youtube.com/account_advanced après connexion.

2
Mihir Bhatt

Exemple de solution en Python. Aide tirée de cette vidéo: video Comme beaucoup d'autres réponses, l'identifiant de téléchargement doit d'abord être récupéré à partir de l'identifiant du canal.

 importer urllib.request 
 importer json 
 
 key = "YOUR_YOUTUBE_API_v3_BROWSER_KEY" 
 
 # Liste des canaux: indiquez si vous êtes collage de l'identifiant ou du nom d'utilisateur du canal - "id" ou "forUsername" 
 ytids = [["bbcnews", "forUsername"], ["UCjq4pjKj9X4W9i7UnYShpVg", "id"] "
 
 newstitles = [] 
 pour ytid, ytparam in ytids: 
 urld = "https://www.googleapis.com/youtube/v3/channels?part=contentDetails&"+ytparam+"=" + ytid + "& key =" + key 
 avec urllib.request.urlopen (urld) sous la forme d'url: 
 datad = json.loads (url.read ()) 
 uploadsdet = datad ['items'] 
 # Obtenir l'identifiant de téléchargement de l'identifiant de canal 
 uploadid = uploadsdet [0] ['contentDetails'] ['relatedPlaylists'] ['uploads'] 
 
 #retrieve list 
 urld = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&maxResults=50&playlistId="+uploadid+"&uploadid+"&key="&key="+key .] avec urllib.request.urlopen (urld) comme url: 
 datad = json .loads (url.read ()) 
 
 pour les données dans datad ['items']: 
 ntitle = data ['snippet'] ['title'] 
 nlink = data ['contentDetails'] ['videoId'] 
 newstitles.append ([nlink, ntitle]) 
 
 pour le lien, titre en début de liste: 
 print (lien, titre) 
1
Ananth

Récemment, j'ai dû récupérer toutes les vidéos d'une chaîne et, selon la documentation des développeurs 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 objet Google_Service_YouTube.

Vous devez donc récupérer les informations du canal pour récupérer la liste de diffusion "uploads" contenant toutes les vidéos téléchargées par le canal: https://developers.google.com/youtube/v3/docs/channels/list

Si vous êtes nouveau avec cette API, je vous recommande vivement de transformer l'échantillon de code de l'extrait de code par défaut en un exemple complet.

Ainsi, le code de base pour récupérer toutes les vidéos d'une chaîne 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 '<pre>' . print_r($yt->getVideosFromChannelName('CHANNEL_NAME'), true) . '</pre>';
0
Glastis

Les liens téléchargés à partir du canal youtube, ne préserve pas la structure de répertoires. Donc, j'ai écrit un code pour que cela se produise. Utilisez ceci une fois que vous téléchargez les vidéos de la manière acceptée ci-dessus. `

def play_vid(channel):
    yset = dict()
    temp = []
    link = channel + '/playlists'
    first = urlopen(link)
    bs = BeautifulSoup(first.read(), 'html.parser')
    for i in bs.find_all('a', {'class':'yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-Ellipsis yt-ui-Ellipsis-2'}):
        print('Creating list for the playlist: ', i.get_text())
        link = 'https://www.youtube.com'+i.get('href')
#         print(link)
        first = urlopen(link)
        bsp = BeautifulSoup(first.read(), 'html.parser')
        res=bsp.find_all('a',{'class':'pl-video-title-link'})
        for l in res:
            temp.append(l.get_text().replace(" ", "").strip())
        yset[i.get_text()]=temp
        temp=[]
    print("Done!!")
    return yset



checking = play_vid('https://www.youtube.com/user/NinjaTraderLLC')


'''for me /media/shivam/BIG/ninja is the folder where i've previously downloaded all the videos from channel'''    
downloaded = [file for file in os.listdir('/media/shivam/BIG/ninja/') if os.path.isfile('/media/shivam/BIG/ninja/'+file)]

hash_table = dict()
for i in downloaded:
    hash_table[i.replace(" ", "")] = i

for i in scraped.keys():

    if os.path.isdir('/media/shivam/BIG/ninja/'+ i):
        pass
    else:
        os.mkdir('/media/shivam/BIG/ninja/'+ i)
    minn = 1000
    mov = ""

    for j in scraped[i]:
        for k in hash_table.keys():
            if nltk.edit_distance(j, k) < minn:
                minn = nltk.edit_distance(j, k)
                mov = k
        minn = 1000
        print("Moving ",mov, "for  channel: ",j)
        shutil.copy('/media/shivam/BIG/ninja/'+ hash_table[mov], '/media/shivam/BIG/ninja/'+ i +'/'+hash_table[mov])

`

0
shivam13juna