YouTube Java API入门

在本教程中,我将介绍Google的YouTube API ,该API可让您使用YouTube的功能来启用应用程序。 YouTube是“杀手级”互联网应用程序之一,其流量占互联网总流量的很大一部分。

在开始之前,请确保您已阅读《 API概述指南》 。 我们将主要处理Data API ,它使您可以执行YouTube网站上的许多操作(搜索视频,检索标准供稿,查看相关内容等)。

该API有多种编程语言,我们将在本教程中使用Java。 阅读Java Developer's Guide以获得第一个想法。 还要为Google Data API JavaDoc页面添加书签。

让我们准备开发环境。 首先,从相应的下载部分下载GData Java客户端 。 我将在本教程中使用1.41.2版本 。 请注意,还有一个版本2,但根据站点的情况,它是实验性的,与版本1不兼容。

解压缩压缩文件,找到文件夹“ gdata \ java \ lib”,并将以下JAR包含到应用程序的类路径中:

  • 数据客户端1.0.jar
  • gdata-youtube-2.0.jar
  • gdata-core-1.0.jar
  • gdata-media-1.0.jar

接下来,我们必须照顾依赖性。 依赖包列表可以在这里找到。

  • 包含JavaMail API以提供媒体支持。 可以在这里下载。 需要“ mail.jar”。
  • GData客户端还在内部使用Google Collections Library 。 我下载了1.0最终版本 。 需要“ google-collect-1.0.jar”。

确保上述所有JAR文件都包含在项目的类路径中。

请注意,所有公共提要都是只读的,不需要任何身份验证。 另一方面,已验证的操作是那些包括检索私人供稿(例如用户的收件箱供稿)以及写入,上载,更新和删除操作的操作。 您将需要注册开发人员密钥才能执行经过身份验证的操作。 但是,本教程不需要密钥。

现在基础架构已经准备就绪,让我们来谈谈API。 我们将使用的主要类是YouTubeService类。 这使您可以执行与浏览YouTube网页时类似的搜索查询。 每个查询均由YouTubeQuery实例表示。 每个查询的结果(如果有)以VideoFeed对象的形式出现。

从每个提要中,可以检索许多VideoEntry对象。 从VideoEntry中,我们提取一个YoutTubeMediaGroup对象。 您可以将此类想象为媒体信息的占位符(请参阅“ Media RSS”规范 )。 然后,我们检索相应的MediaPlayer ,最后检索播放器URL。 我们还可以通过MediaThumbnail类获取有关随附缩略图的信息。

让我们开始使用代码。 首先,我们创建两个模型类,这些类将用于保存有关提要和视频的信息。 第一个称为YouTubeMedia,它包含媒体内容URL和媒体内容类型。 第二个名为YouTubeVideo,其中包含有关特定视频的所有信息(URL,嵌入式播放器URL,缩略图和YoutTubeMedia实例)。 这些的源代码如下:

package com.javacodegeeks.youtube.model;public class YouTubeMedia {private String location;private String type;public YouTubeMedia(String location, String type) {super();this.location = location;this.type = type;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public String getType() {return type;}public void setType(String type) {this.type = type;} }
package com.javacodegeeks.youtube.model;import java.util.List;public class YouTubeVideo {private List<String> thumbnails;private List<YouTubeMedia> medias;private String webPlayerUrl;private String embeddedWebPlayerUrl;public List<String> getThumbnails() {return thumbnails;}public void setThumbnails(List<String> thumbnails) {this.thumbnails = thumbnails;}public List<YouTubeMedia> getMedias() {return medias;}public void setMedias(List<YouTubeMedia> medias) {this.medias = medias;}public String getWebPlayerUrl() {return webPlayerUrl;}public void setWebPlayerUrl(String webPlayerUrl) {this.webPlayerUrl = webPlayerUrl;}public String getEmbeddedWebPlayerUrl() {return embeddedWebPlayerUrl;}public void setEmbeddedWebPlayerUrl(String embeddedWebPlayerUrl) {this.embeddedWebPlayerUrl = embeddedWebPlayerUrl;}public String retrieveHttpLocation() {if (medias==null || medias.isEmpty()) {return null;}for (YouTubeMedia media : medias) {String location = media.getLocation();if (location.startsWith("http")) {return location;}}return null;}}

最后,介绍了YouTubeManager类。 它可用于执行搜索查询,并返回YouTubeVideo模型类的实例以及所有相关信息。 它还会创建适当的嵌入式Web播放器URL 。 这是该类的代码:

package com.javacodegeeks.youtube;import java.net.URL;
import java.util.LinkedList;
import java.util.List;import com.google.gdata.client.youtube.YouTubeQuery;
import com.google.gdata.client.youtube.YouTubeService;
import com.google.gdata.data.media.mediarss.MediaThumbnail;
import com.google.gdata.data.youtube.VideoEntry;
import com.google.gdata.data.youtube.VideoFeed;
import com.google.gdata.data.youtube.YouTubeMediaContent;
import com.google.gdata.data.youtube.YouTubeMediaGroup;
import com.javacodegeeks.youtube.model.YouTubeMedia;
import com.javacodegeeks.youtube.model.YouTubeVideo;public class YouTubeManager {private static final String YOUTUBE_URL = "http://gdata.youtube.com/feeds/api/videos";private static final String YOUTUBE_EMBEDDED_URL = "http://www.youtube.com/v/";private String clientID;public YouTubeManager(String clientID) {this.clientID = clientID;}public List<YouTubeVideo> retrieveVideos(String textQuery, int maxResults, boolean filter, int timeout) throws Exception {YouTubeService service = new YouTubeService(clientID);service.setConnectTimeout(timeout); // millisYouTubeQuery query = new YouTubeQuery(new URL(YOUTUBE_URL));query.setOrderBy(YouTubeQuery.OrderBy.VIEW_COUNT);query.setFullTextQuery(textQuery);query.setSafeSearch(YouTubeQuery.SafeSearch.NONE);query.setMaxResults(maxResults);VideoFeed videoFeed = service.query(query, VideoFeed.class);  List<VideoEntry> videos = videoFeed.getEntries();return convertVideos(videos);}private List<YouTubeVideo> convertVideos(List<VideoEntry> videos) {List<YouTubeVideo> youtubeVideosList = new LinkedList<YouTubeVideo>();for (VideoEntry videoEntry : videos) {YouTubeVideo ytv = new YouTubeVideo();YouTubeMediaGroup mediaGroup = videoEntry.getMediaGroup();String webPlayerUrl = mediaGroup.getPlayer().getUrl();ytv.setWebPlayerUrl(webPlayerUrl);String query = "?v=";int index = webPlayerUrl.indexOf(query);String embeddedWebPlayerUrl = webPlayerUrl.substring(index+query.length());embeddedWebPlayerUrl = YOUTUBE_EMBEDDED_URL + embeddedWebPlayerUrl;ytv.setEmbeddedWebPlayerUrl(embeddedWebPlayerUrl);List<String> thumbnails = new LinkedList<String>();for (MediaThumbnail mediaThumbnail : mediaGroup.getThumbnails()) {thumbnails.add(mediaThumbnail.getUrl());}   ytv.setThumbnails(thumbnails);List<YouTubeMedia> medias = new LinkedList<YouTubeMedia>();for (YouTubeMediaContent mediaContent : mediaGroup.getYouTubeContents()) {medias.add(new YouTubeMedia(mediaContent.getUrl(), mediaContent.getType()));}ytv.setMedias(medias);youtubeVideosList.add(ytv);}return youtubeVideosList;}}

为了测试我们的类,并提供一个示例案例,我们创建以下简单的测试类:

package com.javacodegeeks.youtube.test;import java.util.List;import com.javacodegeeks.youtube.YouTubeManager;
import com.javacodegeeks.youtube.model.YouTubeVideo;public class YouTubeTester {public static void main(String[] args) throws Exception {String clientID = "JavaCodeGeeks";String textQuery = "java code";int maxResults = 10;boolean filter = true;int timeout = 2000;YouTubeManager ym = new YouTubeManager(clientID);List<YouTubeVideo> videos = ym.retrieveVideos(textQuery, maxResults, filter, timeout);for (YouTubeVideo youtubeVideo : videos) {System.out.println(youtubeVideo.getWebPlayerUrl());System.out.println("Thumbnails");for (String thumbnail : youtubeVideo.getThumbnails()) {System.out.println("\t" + thumbnail);}System.out.println(youtubeVideo.getEmbeddedWebPlayerUrl());System.out.println("************************************");}}}

可以从此处下载本教程的Eclipse项目,包括依赖库。

请享用!

相关文章 :
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  • SmartGWT入门,提供出色的GWT界面
  • 带有Spring和Maven教程的JAX–WS
  • 使用Spring使用Java发送电子邮件– GMail SMTP服务器示例
  • Java教程和Android教程列表

翻译自: https://www.javacodegeeks.com/2010/05/getting-started-with-youtube-java-api.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql在mac上的坑

默认端口3306&#xff1f; 正确答案&#xff1a;3307 转载于:https://www.cnblogs.com/dudream/p/5375551.html

ServletContext图解

servlet之间共享数据资源&#xff01; 转载于:https://www.cnblogs.com/felixzh/p/4615902.html

C语言怎么输出百分号%

规律&#xff1a;printf函数中&#xff0c;当出现多个%时&#xff0c;由左至右&#xff0c;每两个%结合输出一个% #include <stdio.h> #include <stdlib.h> #include <math.h> int main() {int c 52;printf("% \n %% \n %%% \n %%%% \n %%%%% \n %%%%…

入侵Jasper以获取JSP页面的对象模型

为了对我的JSP进行一些检查和统计分析&#xff0c;我需要一个包含在其中的元素的类似于DOM的层次模型。 但是&#xff0c;解析JSP页面并不是一件容易的事&#xff0c;最好留给它一个出色的工具-Tomcat&#xff0c;Jetty&#xff0c;GlassFish以及其他所有工具都可以使用Jasper …

Linux自动化安装cobbler

1介绍 1.1 PXE PXE技术与RPL技术不同之处为RPL是静态路由&#xff0c;PXE是动态路由。RPL是根据网卡上的ID号加上其他记录组成的一个Frame&#xff08;帧&#xff09;向服务器发出请求。而服务器中已有这个ID数据&#xff0c;匹配成功则进行远程启动。PXE则是根据服务器端收到的…

iOS9适配系列教程

https://github.com/ChenYilong/iOS9AdaptationTips 转载于:https://www.cnblogs.com/zsw-1993/p/4879118.html

C语言形参

形参和实参区别 形参出现在函数定义中&#xff0c;在整个函数体内都可以使用&#xff0c;离开该函数则不能使用。实参出现在主调函数中&#xff0c;进入被调函数后&#xff0c;实参变量也不能使用。 形参和实参的功能是作数据传送。发生函数调用时&#xff0c;主调函数把实参…

避免延迟的JPA集合

Hibernate&#xff08;实际上是JPA&#xff09;具有集合映射&#xff1a; OneToMany&#xff0c; ManyToMany&#xff0c; ElementCollection。 所有这些默认情况下都是惰性的。 这意味着集合是List或Set接口的特定实现&#xff0c;其中包含对持久会话的引用&#xff0c;并且只…

2016年,我的和自己谈谈

2016年过去三分之一了&#xff0c;现在谈规划晚点但总比没想法强。想了半天还是从这个方面着手吧&#xff1a; 一.升级改造自己的办公学习环境&#xff1a; 给自己的电脑加内存&#xff0c;加SSD&#xff0c;再添置一个显示器&#xff0c;换上心仪已久的cherry青轴键盘&#xf…

C语言的四舍五入实现

习题3-2 高速公路超速处罚 (15 分) 按照规定&#xff0c;在高速公路上行使的机动车&#xff0c;达到或超出本车道限速的10%则处200元罚款&#xff1b;若达到或超出50%&#xff0c;就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。 输入格式: 输入在一行中…

ACTGame项目

项目地址&#xff1a;https://github.com/alonecat06/ACTGame游戏地址&#xff1a;http://pan.baidu.com/s/1hqD3IYw 项目是一个自制单机动作游戏demo&#xff0c;方向是手游&#xff0c;使用Unity5&#xff0c;5月中开工至今。 做这个项目&#xff0c;是为加深自己对Unity的理…

Xuggler教程:帧捕获和视频创建

注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 到目前为止&#xff0c;在我们的Xuggler教程系列中&#xff0c;我们已经对视频处理的Xuggler进行了介绍&#xff0c;并讨论了转码和媒体修改 。 在本教程中&#xff0c;我们将看到如何解码视频和捕获帧&#xf…

面向对象-原型对象

创建对象 Js中可以用构造函数模式创建对象&#xff0c;如&#xff1a; function Person(name, age, job) {this.name name;this.age age;this.job job;this.sayName function () {alert(this.name);}}var person1 new Person("Nicholas", 29, "aa");v…

索引类型

1.B树索引 在Oracle中是通用索引&#xff0c;是创建索引时的默认索引。B树索引可以是单列索引&#xff0c;也可以是组合/复合索引。B树索引最多可以包括22列。 2.位图索引 位图索引时决策支持系统&#xff08;DSS&#xff09;和数据仓库的理想选择&#xff0c;它们不应该用于事…

C语言条件运算符

先看一个error error: lvalue required as left operand of assignment| i 0 ? X 1.0 : X * x;修改后 i 0 ? (X 1.0) : (X * x);也就是说条件运算符可以执行语句&#xff0c;当是赋值语句时要加括号规定优先级&#xff0c;不然会干扰程序判断。 因为条件运算符作为三目…

EJB 3.0注入和查找简介

介绍 Enterprise JavaBeans Specification v。3.0引入了简化的&#xff0c;基于注释的API&#xff0c;用于EJB注入和查找。 EJB 3.0现在是POJO&#xff0c;可以使用简单的注释将其注入其他组件&#xff08;例如EJB和Servlet&#xff09;。 EJB 3.0是Java EE 6的许多其他基于POJ…

SignalR + MVC5 简单示例

SignalR MVC5 简单示例 原文:SignalR MVC5 简单示例本文和前一篇文章很类似&#xff0c;只不过是把 SignalR 应用在了 MVC 中 新建项目&#xff0c;选择 MVC 模板 安装 SignalR Install-Package Microsoft.AspNet.SignalR 在项目中添加文件夹 Hubs 在 Hubs 文件夹中添加 Sign…

Java内存模型–快速概述和注意事项

在计算中&#xff0c; 内存模型描述了线程如何通过内存进行交互&#xff0c;或更一般地&#xff0c;它指定了为分段内存或分页内存平台生成代码时允许编译器进行的假设。 在给定程序和该程序的执行跟踪的情况下&#xff0c;它实质上描述了执行跟踪是否是该程序的合法执行。 Jav…

6-7 统计某类完全平方数 (20 分)

本题要求实现一个函数&#xff0c;判断任一给定整数N是否满足条件&#xff1a;它是完全平方数&#xff0c;又至少有两位数字相同&#xff0c;如144、676等。 函数接口定义&#xff1a; int IsTheNumber ( const int N );其中N是用户传入的参数。如果N满足条件&#xff0c;则该…

C#中数组、ArrayList和List三者的区别(转) ,加修改

在C#中数组&#xff0c;ArrayList&#xff0c;List都能够存储一组对象&#xff0c;那么这三者到底有什么样的区别呢。 数组 数组在C#中最早出现的。在内存中是连续存储的&#xff0c;所以它的索引速度非常快&#xff0c;而且赋值与修改元素也很简单。 <span style"font…