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 ...
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}
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}
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:
https://www.googleapis.com/youtube/v3/channels?id={channel Id}&key={API key}&part=contentDetails
https://www.googleapis.com/youtube/v3/playlistItems?playlistId={"uploads" Id}&key={API key}&part=snippet&maxResults=50
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.
Pour obtenir la liste des chaînes:
Obtenir la liste des chaînes par forUserName :
Obtenir la liste des chaînes par id de chaîne :
Obtenir les sections de canal:
Pour obtenir les playlists:
Obtenir les listes de lecture par Identifiant de chaîne :
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 :
Pour obtenir des vidéos:
Obtenir la liste des vidéos par ID vidéo :
Obtenir la liste des vidéos par plusieurs vidéos id :
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 } _
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
Juste en trois étapes:
Abonnements: liste -> https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=50&mine=true&access_token= {oauth_token}
Chaînes: liste -> https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id= {channel_id} & key = {YOUR_API_KEY}
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 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)
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.
Sudo pip3 install youtube-dl
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))
À 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.
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.
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)
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'));
Où $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>';
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])
`