🐥

YoutubeAPIを利用して検索ワードから動画情報を取得する(Java)

2023/06/01に公開

目次

  1. 概要
  2. YoutubeAPIのAPIkeyを取得する。
  3. 実装

概要

YoutubeAPIなるものがあるらしいので、どのような流れで情報を取得するのか試してみます。
今回は検索ワードから動画を検索するsearchAPIを試してみますが、動画をアップロードしたり、更新したりといったこともAPIで可能なようです。
cf.リファレンス https://developers.google.com/youtube/v3/docs?hl=ja

YoutubeAPIのAPIkeyを取得する。

下記の手順でYoutubeAPIのkeyを取得します。
※無料枠がいくらかあるみたいですが、アクセス毎に従量課金のため公開する場合は注意が必要です。

  1. GoogleCloudにアクセスし、新規プロジェクトを作成します。
  2. APIとサービスを選択
  3. 認証情報を選択
    API Key欄をメモ

実装

1. サンプルコードの取得

手軽に使えるサンプルコードがリファレンスにありましたので、そのまま利用してみます。
ライブラリの管理をMavenで行っていました。コールメソッドや、レスポンスクラスも用意されています。
propertyファイルに取得したAPI Keyを記載します。
https://developers.google.com/youtube/v3/code_samples/java?hl=ja#search_by_keyword

サンプルコードではビデオID、タイトル、サムネイル画像URLを出力しているようです。

2. Webサイトに埋め込み

サンプルコードを少し拝借し、検索ワードからタイトルとサムネイル画像をリストで表示できるようにしてみました。(ソースコードは一番下に記載)

3. 最後に

コーポレートサイトで、アップロードした動画を自動更新にしてみるといったことはできるかもしれません。
皆さんもどうか試してみてください。

ご覧いただきありがとうございます。

ソースコード

Search.java(検索ワードから動画情報のレスポンスを返却)
package com.google.api.services.samples.youtube.cmdline.youtube_cmdline_search_sample;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;

import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.model.SearchListResponse;
import com.google.api.services.youtube.model.SearchResult;

public class Search {
	/** Global instance properties filename. */
	private static String PROPERTIES_FILENAME = "youtube.properties";

	/** Global instance of the HTTP transport. */
	private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

	/** Global instance of the JSON factory. */
	private static final JsonFactory JSON_FACTORY = new JacksonFactory();

	/** Global instance of the max number of videos we want returned (50 = upper limit per page). */
	private static final long NUMBER_OF_VIDEOS_RETURNED = 25;

	/** Global instance of Youtube object to make all API requests. */
	private static YouTube youtube;

	Search() {

	}

	public SearchListResponse doSearch(String queryTerm) {

		// Read the developer key from youtube.properties
		Properties properties = new Properties();
		try {
			InputStream in = Search.class.getResourceAsStream("/" + PROPERTIES_FILENAME);
			properties.load(in);

		} catch (IOException e) {
			System.err.println("There was an error reading " + PROPERTIES_FILENAME + ": " + e.getCause()
					+ " : " + e.getMessage());
			System.exit(1);
		}

		try {
			/*
			 * The YouTube object is used to make all API requests. The last argument is required, but
			 * because we don't need anything initialized when the HttpRequest is initialized, we override
			 * the interface and provide a no-op function.
			 */
			youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() {
				public void initialize(HttpRequest request) throws IOException {
				}
			}).setApplicationName("youtube-cmdline-search-sample").build();

			// Get query term from user.
//			String queryTerm = getInputQuery();

			YouTube.Search.List search = youtube.search().list("id,snippet");
			/*
			 * It is important to set your API key from the Google Developer Console for
			 * non-authenticated requests (found under the Credentials tab at this link:
			 * console.developers.google.com/). This is good practice and increased your quota.
			 */
			String apiKey = properties.getProperty("youtube.apikey");
			search.setKey(apiKey);
			search.setQ(queryTerm);
			/*
			 * We are only searching for videos (not playlists or channels). If we were searching for
			 * more, we would add them as a string like this: "video,playlist,channel".
			 */
			search.setType("video");
			/*
			 * This method reduces the info returned to only the fields we need and makes calls more
			 * efficient.
			 */
			search.setFields("items(id/kind,id/videoId,snippet/title,snippet/thumbnails/default/url)");
			search.setMaxResults(NUMBER_OF_VIDEOS_RETURNED);
			SearchListResponse searchResponse = search.execute();

			List<SearchResult> searchResultList = searchResponse.getItems();

			if (searchResultList != null) {
//				prettyPrint(searchResultList.iterator(), queryTerm);
//				return searchResultList.iterator();
				return searchResponse;
				
			}
			return null;
		} catch (GoogleJsonResponseException e) {
			System.err.println("There was a service error: " + e.getDetails().getCode() + " : "
					+ e.getDetails().getMessage());
		} catch (IOException e) {
			System.err.println("There was an IO error: " + e.getCause() + " : " + e.getMessage());
		} catch (Throwable t) {
			t.printStackTrace();
		}
		return null;

	}
	
	  /*
	   * Returns a query term (String) from user via the terminal.
	   */
	  private static String getInputQuery() throws IOException {

	    String inputQuery = "";

	    System.out.print("Please enter a search term: ");
	    BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
	    inputQuery = bReader.readLine();

	    if (inputQuery.length() < 1) {
	      // If nothing is entered, defaults to "YouTube Developers Live."
	      inputQuery = "YouTube Developers Live";
	    }
	    return inputQuery;
	  }

//	  /*
//	   * Prints out all SearchResults in the Iterator. Each printed line includes title, id, and
//	   * thumbnail.
//	   *
//	   * @param iteratorSearchResults Iterator of SearchResults to print
//	   *
//	   * @param query Search query (String)
//	   */
//	  private static void prettyPrint(Iterator<SearchResult> iteratorSearchResults, String query) {
//
//	    System.out.println("\n=============================================================");
//	    System.out.println(
//	        "   First " + NUMBER_OF_VIDEOS_RETURNED + " videos for search on \"" + query + "\".");
//	    System.out.println("=============================================================\n");
//
//	    if (!iteratorSearchResults.hasNext()) {
//	      System.out.println(" There aren't any results for your query.");
//	    }
//
//	    while (iteratorSearchResults.hasNext()) {
//
//	      SearchResult singleVideo = iteratorSearchResults.next();
//	      ResourceId rId = singleVideo.getId();
//
//	      // Double checks the kind is video.
//	      if (rId.getKind().equals("youtube#video")) {
//	        Thumbnail thumbnail = singleVideo.getSnippet().getThumbnails().get("default");
//
//	        System.out.println(" Video Id" + rId.getVideoId());
//	        System.out.println(" Title: " + singleVideo.getSnippet().getTitle());
//	        System.out.println(" Thumbnail: " + thumbnail.getUrl());
//	        System.out.println("\n-------------------------------------------------------------\n");
//	      }
//	    }
//	  }
	}

index.java(出力処理)ひとまず直出力しています。
		SearchListResponse searchResponse = new SearchListResponse();

		try {
			String queryTerm = "ヒカキン";
			Search aaa = new Search();
			searchResponse = aaa.doSearch(queryTerm);

		} catch (Exception e) {
			e.printStackTrace();
		}

		//出力処理
		List<SearchResult> searchResultList = searchResponse.getItems();
		Iterator<SearchResult> iteratorSearchResults = searchResultList.iterator();

		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>SampleServlet</title>");
		out.println("<link rel='stylesheet' type='text/css' href='/test/style.css'>");
		out.println("</head>");
		out.println("<body>");
		out.println("<main>");
		out.println("<div class='video_area'>");

		while (iteratorSearchResults.hasNext()) {

			SearchResult singleVideo = iteratorSearchResults.next();
			ResourceId rId = singleVideo.getId();

			// Double checks the kind is video.
			if (rId.getKind().equals("youtube#video")) {
				Thumbnail thumbnail = singleVideo.getSnippet().getThumbnails().get("default");

				//	        System.out.println(" Video Id" + rId.getVideoId());
				//	        System.out.println(" Title: " + singleVideo.getSnippet().getTitle());
				//	        System.out.println(" Thumbnail: " + thumbnail.getUrl());
				//	        System.out.println("\n-------------------------------------------------------------\n");
				out.println("<div class='video'>");
				out.println("<div>");
				out.println(singleVideo.getSnippet().getTitle());
				out.println("</div>");
				out.println("<div>");
				out.println(" <img src='"+thumbnail.getUrl()+"'>");
				out.println("</div>");
				out.println("</div>");
			}
		}

		out.println("</div>");
		out.println("<h1>HelloServlet</h1>");
		out.println("</main>");
		out.println("</body>");
		out.println("</html>");
	}

Discussion