C#에서 YouTube API 사용하기
YouTube가 제공하는 YouTube Data API를 이용하면, YouTube 상의 비디오를 검색하거나, 사용자 Subscription 정보, 코멘트 정보 데이타 등을 쉽게 가져올 수 있다. 또한 YouTube Analytics API를 이용하면 각종 비디오 View 통계 정보를 쉽게 핸들링 할 수 있으며, YouTube Player API를 통해 비디오를 Play할 수도 있다.
이 아티클에서는 가장 기본적인 예제로 YouTube 상에서 특정 검색어로 비디오를 검색하는 코드를 소개한다. YouTube API 웹사이트에서 API를 상세하고 소개하고 있으므로, 여기서는 어떻게 시작하는지를 소개하는데 촛점을 맞춘다.
이 아티클에서는 가장 기본적인 예제로 YouTube 상에서 특정 검색어로 비디오를 검색하는 코드를 소개한다. YouTube API 웹사이트에서 API를 상세하고 소개하고 있으므로, 여기서는 어떻게 시작하는지를 소개하는데 촛점을 맞춘다.
Step 1. YouTube API 라이브러리 설치
YouTube의 API는 기본적으로 REST를 지원하므로, 별도의 라이브러리 없이 HTTP 호출만으로 사용할 수 있다. 즉, HTTP GET, POST 등으로 YouTube API URL을 호출하고 JSON으로 리턴되는 데이타를 분석해서 사용하면 된다. 하지만, 구글에서 이미 .NET 개발자들을 위해 REST Call을 대신 해 주는 Wrapper 라이브러리를 만들어 두었으므로, 이 클라이언트 라이브러리 (Google APIs Client Library for .NET)를 사용하면 훨씬 편리하다.
Google APIs Client Library for .NET 를 다운로드하여 사용할 수도 있으나, NuGet에서 설치하는 것이 더 편리하다. VS에서 Package Manager Console를 열고, 다음과 같이 두 패키지를 다운로드한다.
Google APIs Client Library for .NET 를 다운로드하여 사용할 수도 있으나, NuGet에서 설치하는 것이 더 편리하다. VS에서 Package Manager Console를 열고, 다음과 같이 두 패키지를 다운로드한다.
PM> install-package Google.APIs
PM> install-package Google.APIs.YouTube.v3
PM> install-package Google.APIs.YouTube.v3
Step 2. Google API Key 생성
YouTube의 API를 사용하기 위해서는 Google API Console 사이트에서 (1) YouTube API를 사용할 것이라고 Enable 해주어야 하고, (2) (필요한 경우) 새로운 API Key를 생성해야 한다.
(1) Google API Console 사이트에 로그인하여 왼쪽 메뉴중 [APIs & auth] => [APIs]를 선택하고, [YouTube Data API]를 선택한 후, [Enable API] 버튼을 누른다.
(2) 다음 [Credentials] 메뉴를 누르고 [Public API access] 밑의 [Create New Key]를 눌러 새 키를 만든다. 용도에 따라 4가지 서로 다른 타입의 키를 만들 수 있는데, 여기서는 [Server key]를 선택한다.
(1) Google API Console 사이트에 로그인하여 왼쪽 메뉴중 [APIs & auth] => [APIs]를 선택하고, [YouTube Data API]를 선택한 후, [Enable API] 버튼을 누른다.
(2) 다음 [Credentials] 메뉴를 누르고 [Public API access] 밑의 [Create New Key]를 눌러 새 키를 만든다. 용도에 따라 4가지 서로 다른 타입의 키를 만들 수 있는데, 여기서는 [Server key]를 선택한다.
Step 3. YouTube API 라이브러리 사용
C#에서 YouTube API를 사용하기 위해서 YouTubeService 객체를 먼저 생성한다. 이 객체 생성시 Step2 에서 생성한 API Key를 지정해야 한다.
아래 예제에서 보이듯이, YouTubeService 객체가 생성되었으면, Search.List()를 호출하여 검색관련 Request (SearchResource.ListRequest) 객체를 생성한다. (주: Search.List()의 파라미터로 기본적으로 'snippet' 이라는 문자열을 전달한다 - API 참조).
다음 ListRequest 객체의 Q 속성에 유튜브에서 검색하고자 하는 텍스트를 지정한다. 그리고 MaxResults 속성을 지정하여 최대 검색 결과수를 지정한다. MaxResults를 지정하지 않으면 디폴트로 5개가 리턴되는데 이 최대값은 0 부터 50까지 지정할 수 있다.
이제 ListRequest객체가 설정되었으면, ListRequest객체의 ExecuteAsync (비동기 실행시) 혹은 Execute (동기 실행시) 메서드를 사용하여 요청을 전송한다. 이어 검색결과가 YouTube로부터 전송되어 오면 SerachListResponse 객체에 담기게 되고, 이 객체의 Items 속성을 엑세스하면 결과데이타를 얻을 수 있다. 각 Item의 Snippet.Title은 비디오의 Title을 의미하며, Id.VideoId는 해당 비디오의 Id를 의미한다.
아래 예제에서 보이듯이, YouTubeService 객체가 생성되었으면, Search.List()를 호출하여 검색관련 Request (SearchResource.ListRequest) 객체를 생성한다. (주: Search.List()의 파라미터로 기본적으로 'snippet' 이라는 문자열을 전달한다 - API 참조).
다음 ListRequest 객체의 Q 속성에 유튜브에서 검색하고자 하는 텍스트를 지정한다. 그리고 MaxResults 속성을 지정하여 최대 검색 결과수를 지정한다. MaxResults를 지정하지 않으면 디폴트로 5개가 리턴되는데 이 최대값은 0 부터 50까지 지정할 수 있다.
이제 ListRequest객체가 설정되었으면, ListRequest객체의 ExecuteAsync (비동기 실행시) 혹은 Execute (동기 실행시) 메서드를 사용하여 요청을 전송한다. 이어 검색결과가 YouTube로부터 전송되어 오면 SerachListResponse 객체에 담기게 되고, 이 객체의 Items 속성을 엑세스하면 결과데이타를 얻을 수 있다. 각 Item의 Snippet.Title은 비디오의 Title을 의미하며, Id.VideoId는 해당 비디오의 Id를 의미한다.
예제
async void btnSearch_Click(object sender, EventArgs e)
{
// YouTubeService 객체 생성
var youtube = new YouTubeService(new BaseClientService.Initializer()
{
ApiKey = "AIzaSyCe************************", // 키 지정
ApplicationName = "My YouTube Search"
});
// Search용 Request 생성
var request = youtube.Search.List("snippet");
request.Q = txtSearch.Text; //ex: "양희은"
request.MaxResults = 25;
// Search용 Request 실행
var result = await request.ExecuteAsync();
// Search 결과를 리스트뷰에 담기
foreach (var item in result.Items)
{
if (item.Id.Kind == "youtube#video")
{
listView1.Items.Add(item.Id.VideoId.ToString(), item.Snippet.Title, 0);
}
}
}
{
// YouTubeService 객체 생성
var youtube = new YouTubeService(new BaseClientService.Initializer()
{
ApiKey = "AIzaSyCe************************", // 키 지정
ApplicationName = "My YouTube Search"
});
// Search용 Request 생성
var request = youtube.Search.List("snippet");
request.Q = txtSearch.Text; //ex: "양희은"
request.MaxResults = 25;
// Search용 Request 실행
var result = await request.ExecuteAsync();
// Search 결과를 리스트뷰에 담기
foreach (var item in result.Items)
{
if (item.Id.Kind == "youtube#video")
{
listView1.Items.Add(item.Id.VideoId.ToString(), item.Snippet.Title, 0);
}
}
}
(Optional) VideoId 사용
위의 Step3에서 얻은 VideoId를 활용하는 간단한 예제로 살펴보자. 위의 Step3 예제에서 비디오 제목과 VideoId를 리스트뷰에 담았는데, 아래 예제는 리스트뷰에서 한 아이템이 더블클릭되었을 때, 해당 비디오의 VideoId를 가져와서 http://www.youtube.com/watch?v= 뒤에 비디오 Id를 추가하여 이를 브라우져에서 Play하는 코드이다. HTTP Url을 직접 Process.Start()의 파라미터로 전달하면, 디폴트 브라우져에서 해당 URL을 실행한다.
예제
// ListView의 한 아이템을 더블클릭 했을 때
private void listView1_DoubleClick(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
// YouTube 비디오 Play를 위한 URL 생성
string videoId = listView1.SelectedItems[0].Name;
string youtubeUrl = "http://youtube.com/watch?v=" + videoId;
// 디폴트 브라우져에서 실행
Process.Start(youtubeUrl);
}
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
// YouTube 비디오 Play를 위한 URL 생성
string videoId = listView1.SelectedItems[0].Name;
string youtubeUrl = "http://youtube.com/watch?v=" + videoId;
// 디폴트 브라우져에서 실행
Process.Start(youtubeUrl);
}
}