| 이 프로젝트의 개발은 전적으로 커뮤니티가 자금을 지원합니다. 지원하기 위해 기부하는 것을 고려하십시오! |

YouTubeexPlode는 YouTube 비디오, 재생 목록 및 채널의 메타 데이터에 대한 인터페이스를 제공하고 비디오 스트림 및 닫는 캡션 트랙을 해결하고 다운로드하는 라이브러리입니다. 추상화 계층 뒤에,이 라이브러리는 원시 페이지 데이터를 긁어 내고 역 엔지니어링 된 내부 엔드 포인트를 악용하여 작동합니다.
이 도서관의 내부 작업에 관심이 있습니까? 리버스 엔지니어링 YouTube 기사를 참조하십시오.
확장 패키지 :
이 프로젝트 또는 해당 소스 코드를 사용하여 어떤 목적 및 모양 또는 형태로든 귀하는 다음 모든 진술에 암시 적 계약을 부여합니다.
전쟁과 도움을받을 수있는 방법에 대해 자세히 알아 보려면 여기를 클릭하십시오. 우크라이나에게 영광을! ??
dotnet add package YoutubeExplode 
YouTubeexPlode는 단일 진입 점 ( YoutubeClient 클래스)을 통해 기능을 노출시킵니다. 이 클래스의 인스턴스를 만들고 Videos , Playlists , Channels 및 Search 속성에서 제공된 작업을 사용하여 요청을 보내십시오.
YouTube 비디오와 관련된 메타 데이터를 검색하려면 Videos.GetAsync(...) 를 호출하십시오.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
// You can specify either the video URL or its ID
var videoUrl = "https://youtube.com/watch?v=u_yIGGhubZs" ;
var video = await youtube . Videos . GetAsync ( videoUrl ) ;
var title = video . Title ; // "Collections - Blender 2.80 Fundamentals"
var author = video . Author . ChannelTitle ; // "Blender"
var duration = video . Duration ; // 00:07:20 모든 YouTube 비디오에는 컨테이너, 비디오 품질, 비트 전송률, 프레임 속도 및 기타 매개 변수가 다른 여러 스트림이 있습니다. 또한 스트림은 콘텐츠를 기반으로 3 가지 범주로 더 나뉩니다.
경고 : muxed 스트림에는 오디오와 비디오가 모두 포함되어 있지만 이러한 스트림은 품질이 제한되어 있습니다 (최대 720p30). 사용 가능한 최고 품질로 비디오를 다운로드하려면 최고의 오디오 전용 및 비디오 전용 스트림을 개별적으로 해결 한 다음 Mux를 함께 해결해야합니다. youtubeexplode.converter 패키지를 사용하여 ffmpeg를 사용하여 muxing 프로세스를 수행 할 수 있습니다.
경고 : MUXED 스트림은 YouTube에서 더 이상 사용되지 않으며 모든 비디오에 대해 사용할 수있는 것은 아닙니다. 가능하면 제공되는 오디오 전용 및 비디오 전용 스트림을 사용하여 수동으로 Muxing을 수행하지 마십시오.
Videos.Streams.GetManifestAsync(...) 호출하여 특정 비디오에 사용 가능한 모든 스트림을 나열하는 매니페스트를 요청할 수 있습니다.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var videoUrl = "https://youtube.com/watch?v=u_yIGGhubZs" ;
var streamManifest = await youtube . Videos . Streams . GetManifestAsync ( videoUrl ) ;매니페스트가 얻어지면 스트림을 통해 필터링하고 관심있는 것을 식별 할 수 있습니다.
using YoutubeExplode ;
using YoutubeExplode . Videos . Streams ;
// ...
// Get the highest bitrate audio-only stream
var streamInfo = streamManifest . GetAudioOnlyStreams ( ) . GetWithHighestBitrate ( ) ;
// ...or the highest quality MP4 video-only stream
var streamInfo = streamManifest
. GetVideoOnlyStreams ( )
. Where ( s => s . Container == Container . Mp4 )
. GetWithHighestVideoQuality ( ) 마지막으로, Videos.Streams.GetAsync(...) 사용하여 지정된 메타 데이터로 표시되는 실제 스트림을 해결하거나 Videos.Streams.DownloadAsync(...) 가있는 파일로 직접 다운로드 할 수 있습니다.
// ...
// Get the actual stream
var stream = await youtube . Videos . Streams . GetAsync ( streamInfo ) ;
// Download the stream to a file
await youtube . Videos . Streams . DownloadAsync ( streamInfo , $ "video. { streamInfo . Container } " ) ;경고 : 스트림 메타 데이터의
Url속성을 사용하여 기본 컨텐츠에 액세스 할 수 있지만, 그렇게하려면 일련의 신중하게 제작 된 HTTP 요청이 필요합니다.Videos.Streams.GetAsync(...)또는Videos.Streams.DownloadAsync(...)대신 사용하는 것이 좋습니다.
폐쇄 된 캡션은 미디어 스트림과 유사한 방식으로 다운로드 할 수 있습니다. 사용 가능한 닫는 캡션 트랙 목록을 얻으려면 Videos.ClosedCaptions.GetManifestAsync(...) 호출하십시오.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var videoUrl = "https://youtube.com/watch?v=u_yIGGhubZs" ;
var trackManifest = await youtube . Videos . ClosedCaptions . GetManifestAsync ( videoUrl ) ;그런 다음 특정 트랙의 메타 데이터를 검색하십시오.
// ...
// Find closed caption track in English
var trackInfo = trackManifest . GetByLanguage ( "en" ) ; 마지막으로 Videos.ClosedCaptions.GetAsync(...) 사용하여 트랙의 실제 내용을 얻으십시오.
// ...
var track = await youtube . Videos . ClosedCaptions . GetAsync ( trackInfo ) ;
// Get the caption displayed at 0:35
var caption = track . GetByTime ( TimeSpan . FromSeconds ( 35 ) ) ;
var text = caption . Text ; // "collection acts as the parent collection" Videos.ClosedCaptions.DownloadAsync(...) 사용하여 srt 파일 형식의 폐쇄 캡션 트랙을 다운로드 할 수도 있습니다.
// ...
await youtube . Videos . ClosedCaptions . DownloadAsync ( trackInfo , "cc_track.srt" ) ; Playlists.GetAsync(...) 호출하여 YouTube 재생 목록과 관련된 메타 데이터를 얻을 수 있습니다.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var playlistUrl = "https://youtube.com/playlist?list=PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6" ;
var playlist = await youtube . Playlists . GetAsync ( playlistUrl ) ;
var title = playlist . Title ; // "First Steps - Blender 2.80 Fundamentals"
var author = playlist . Author . ChannelTitle ; // "Blender" 재생 목록에 포함 된 비디오를 얻으려면 Playlists.GetVideosAsync(...) :
using YoutubeExplode ;
using YoutubeExplode . Common ;
var youtube = new YoutubeClient ( ) ;
var playlistUrl = "https://youtube.com/playlist?list=PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6" ;
// Get all playlist videos
var videos = await youtube . Playlists . GetVideosAsync ( playlistUrl ) ;
// Get only the first 20 playlist videos
var videosSubset = await youtube . Playlists . GetVideosAsync ( playlistUrl ) . CollectAsync ( 20 ) ;전체 목록이로드되기를 기다리지 않고 동영상을 반복적으로 열거 할 수도 있습니다.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var playlistUrl = "https://youtube.com/playlist?list=PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6" ;
await foreach ( var video in youtube . Playlists . GetVideosAsync ( playlistUrl ) )
{
var title = video . Title ;
var author = video . Author ;
} YouTube에 보내는 요청 수를 정확하게 제어 해야하는 경우 Playlists.GetVideoBatchesAsync(...) 사용하십시오.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var playlistUrl = "https://youtube.com/playlist?list=PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6" ;
// Each batch corresponds to one request
await foreach ( var batch in youtube . Playlists . GetVideoBatchesAsync ( playlistUrl ) )
{
foreach ( var video in batch . Items )
{
var title = video . Title ;
var author = video . Author ;
}
}참고 : 재생 목록 ID를 제작하여 음악 믹스, 인기있는 채널 업로드, 좋아하는 비디오 등과 같은 특수 자동 생성 재생 목록을 가져올 수 있습니다. 자세한 내용은이 참조를 참조하십시오.
Channels.GetAsync(...) 메소드 :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLg" ;
var channel = await youtube . Channels . GetAsync ( channelUrl ) ;
var title = channel . Title ; // "Blender" Channels.GetByUserAsync(...) 사용하여 사용자 이름 또는 프로파일 URL별로 채널 메타 데이터를 얻을 수도 있습니다.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/user/BlenderFoundation" ;
var channel = await youtube . Channels . GetByUserAsync ( channelUrl ) ;
var id = channel . Id ; // "UCSMOQeBJ2RAnuFungnQOxLg" 슬러그 또는 레거시 사용자 정의 URL로 채널 메타 데이터를 얻으려면 Channels.GetBySlugAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/c/BlenderFoundation" ;
var channel = await youtube . Channels . GetBySlugAsync ( channelUrl ) ;
var id = channel . Id ; // "UCSMOQeBJ2RAnuFungnQOxLg" 핸들 또는 사용자 정의 URL별로 채널 메타 데이터를 얻으려면 Channels.GetByHandleAsync(...) 사용하십시오.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/@BeauMiles" ;
var channel = await youtube . Channels . GetByHandleAsync ( channelUrl ) ;
var id = channel . Id ; // "UCm325cMiw9B15xl22_gr6Dw" 채널에서 업로드 한 비디오 목록을 얻으려면 Channels.GetUploadsAsync(...) :
using YoutubeExplode ;
using YoutubeExplode . Common ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLg" ;
var videos = await youtube . Channels . GetUploadsAsync ( channelUrl ) ; Search.GetResultsAsync(...) 메소드를 호출하여 검색 쿼리를 실행할 수 있습니다. 각 검색 결과는 비디오, 재생 목록 또는 채널을 나타낼 수 있으므로 해당 사례를 처리하려면 패턴 일치를 적용해야합니다.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
await foreach ( var result in youtube . Search . GetResultsAsync ( "blender tutorials" ) )
{
// Use pattern matching to handle different results (videos, playlists, channels)
switch ( result )
{
case VideoSearchResult video :
{
var id = video . Id ;
var title = video . Title ;
var duration = video . Duration ;
break ;
}
case PlaylistSearchResult playlist :
{
var id = playlist . Id ;
var title = playlist . Title ;
break ;
}
case ChannelSearchResult channel :
{
var id = channel . Id ;
var title = channel . Title ;
break ;
}
}
} 결과를 특정 유형으로 제한하려면 Search.GetVideosAsync(...) , Search.GetPlaylistsAsync(...) 또는 Search.GetChannelsAsync(...) 사용하십시오.
using YoutubeExplode ;
using YoutubeExplode . Common ;
var youtube = new YoutubeClient ( ) ;
var videos = await youtube . Search . GetVideosAsync ( "blender tutorials" ) ;
var playlists = await youtube . Search . GetPlaylistsAsync ( "blender tutorials" ) ;
var channels = await youtube . Search . GetChannelsAsync ( "blender tutorials" ) ; 재생 목록과 마찬가지로 Search.GetResultBatchesAsync(...) 호출하여 결과를 배치로 열거 할 수도 있습니다.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
// Each batch corresponds to one request
await foreach ( var batch in youtube . Search . GetResultBatchesAsync ( "blender tutorials" ) )
{
foreach ( var result in batch . Items )
{
switch ( result )
{
case VideoSearchResult videoResult :
{
// ...
}
case PlaylistSearchResult playlistResult :
{
// ...
}
case ChannelSearchResult channelResult :
{
// ...
}
}
}
} 사전 승인 된 YouTube 계정에 해당하는 쿠키를 제공하여 개인 비디오 및 재생 목록에 액세스 할 수 있습니다. 이를 위해 IReadOnlyList<Cookie> 받아들이는 생성자를 사용하여 YoutubeClient 인스턴스를 만듭니다.
using YoutubeExplode ;
// Perform authentication and extract cookies
var cookies = .. . ;
// Cookie collection must be of type IReadOnlyList<System.Net.Cookie>
var youtube = new YoutubeClient ( cookies ) ;실제로 인증을 수행하려면 WebView와 같은 내장 브라우저를 사용하여 사용자를 YouTube 로그인 페이지로 탐색하고 로그인 한 다음 브라우저에서 쿠키를 추출 할 수 있습니다.
YouTubeexPlode 의 "폭발"은 문자열을 나누는 PHP 함수의 이름에서 비롯됩니다 explode(...) . 이 라이브러리의 개발을 시작할 때 내가 읽은 대부분의 참조 소스 코드는 PHP로 작성되었으므로 이름에 대한 영감을 얻었습니다.