Viele YouTube API-Tutorials, die ich gesehen habe, sind ziemlich abenteuerlich und umständlich. Das liegt zum Teil daran, dass sich die Authentifizierung ein wenig geändert hat aber zum Teil auch wieder daran, dass die anderen Blogger es nicht besser wussten oder Abhängigkeiten (Dependencies) nicht über Maven bezogen haben.
Die Kommunikation mit YouTube ist dank der Google Data APIs ein Kinderspiel. Alles was man braucht ist ein Developer Key (über das YouTube API Dashboard zu bekommen) und schon kann es losgehen!
Hinweis: Möchte man nur Daten vom YouTube-Service abrufen, dann kann man auch ohne Angabe des Developer Keys loslegen.
Beispiel-Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package com.mycompany.youtube; import com.google.gdata.client.youtube.YouTubeService; import com.google.gdata.data.TextConstruct; import com.google.gdata.data.youtube.VideoEntry; import java.net.URL; public class App { public static void main(String[] args) throws Exception { // Set up YouTube-Service // Obtain a developer key here: https://code.google.com/apis/youtube/dashboard/ // Note that you no longer need to provide a Client ID with YouTube API requests. String appName= "appname"; String developerKey = "topsecret"; YouTubeService service = new YouTubeService(appName, developerKey); // Construct Request-URL String videoId = "MwnlZdKqwHA"; // http://www.youtube.com/watch?v=MwnlZdKqwHA String videoUrl = "http://gdata.youtube.com/feeds/api/videos/"+videoId; URL requestUrl = new URL(videoUrl); // Display video information VideoEntry entry = service.getEntry(requestUrl, VideoEntry.class); TextConstruct title = entry.getTitle(); System.out.println(title.getPlainText()); // Mr Toast - Cloud Gazing (High Quality, HD) } } |
Maven-Konfigurationsdatei: pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany</groupId> <artifactId>youtube</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>youtube</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <repositories> <repository> <id>mandubian-mvn</id> <url>http://mandubian-mvn.googlecode.com/svn/trunk/mandubian-mvn/repository</url> </repository> <repository> <id>google-api-services</id> <url>http://mavenrepo.google-api-java-client.googlecode.com/hg</url> </repository> </repositories> <dependencies> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.5</version> </dependency> <dependency> <groupId>com.google.gdata</groupId> <artifactId>gdata-youtube-2.0</artifactId> <version>1.41.5</version> <type>jar</type> </dependency> </dependencies> </project> |
Vielen Dank an Carsten Baum für die Unterstützung!
Häufige Fehler
java.lang.NoClassDefFoundError: javax/mail/MessagingException
Lösung:
1 2 3 4 5 | <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.5</version> </dependency> |
java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet
1 2 3 4 5 | <dependency> <groupId>com.google.collections</groupId> <artifactId>google-collections</artifactId> <version>1.0-rc5</version> </dependency> |
Weiterführende Links
YouTube Developer’s Guide: Java
YouTube API v2.0 – Authentication
Client Library Downloads, Sample Code and Tutorials
Best Practices
Anstatt die YouTube-Links alle im ausführenden Code zusammen zu bauen, sollte man die Generierung der Links lieber einer seperaten Klasse (die String Templates verwendet) überlassen. Eine solche Klasse könnte so aussehen:
GoogleDataApiLinks.java
1 2 3 4 5 6 7 8 9 10 | import java.net.MalformedURLException; import java.net.URL; public class GoogleDataApiLinks { public static URL getVideoUrl(String videoId) throws MalformedURLException { String videoUrl = String.format("http://gdata.youtube.com/feeds/api/videos/%s", videoId); return new URL(videoUrl); } } |
Im ausführenden Code könnte man dann folgenden Aufruf machen:
// Construct Request-URL URL requestUrl = GoogleDataApiLinks.getVideoUrl("MwnlZdKqwHA"); |
Zum Abschluss noch ein Beispiel mit ein paar mehr Link-Einträgen:
GoogleDataApiLinks.java (erweitert)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import java.net.MalformedURLException; import java.net.URL; public class GoogleDataApiLinks { public static final String GOOGLE_DATA_INTRODUCTION = "http://www.youtube.com/watch?v=ADos_xW4_J0"; public static final String GOOGLE_DEVELOPERS_PLAYLISTS = "http://www.youtube.com/user/GoogleDevelopers/videos?view=1"; // https://gdata.youtube.com/feeds/api/users/_x5XG1OV2P6uZZ5FSM9Ttw/playlists?v=2 public static URL getPlayListsUrl(String userId) throws MalformedURLException { String url = String.format("https://gdata.youtube.com/feeds/api/users/%s/playlists?v=2", userId); return new URL(url); } // https://gdata.youtube.com/feeds/api/users/GoogleDevelopers/playlists?v=2 @Deprecated public static URL getPlayListsUrlByUserName(String userName) throws MalformedURLException { String url = String.format("https://gdata.youtube.com/feeds/api/users/%s/playlists?v=2", userName); return new URL(url); } // https://gdata.youtube.com/feeds/api/playlists/B83C613AA955A350 public static URL getPlayListUrl(String playListId) throws MalformedURLException { String url = String.format("https://gdata.youtube.com/feeds/api/playlists/%s?v=2", playListId); return new URL(url); } // https://www.youtube.com/view_play_list?p=B83C613AA955A350 public static URL getPlayListViewUrl(String playListId) throws MalformedURLException { String url = String.format("https://www.youtube.com/view_play_list?p=%s", playListId); return new URL(url); } // http://gdata.youtube.com/feeds/api/videos/ADos_xW4_J0 public static URL getVideoUrl(String videoId) throws MalformedURLException { String url = String.format("http://gdata.youtube.com/feeds/api/videos/%s", videoId); return new URL(url); } // http://www.youtube.com/watch?v=ADos_xW4_J0 public static URL getVideoViewUrl(String videoId) throws MalformedURLException { String url = String.format("http://www.youtube.com/watch?v=%s", videoId); return new URL(url); } } |