YouTube API mit Java benutzen

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);
  }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.