/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.motorola.studio.android.videos.implementation.youtube; import java.net.Authenticator; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.internal.net.ProxyManager; import org.eclipse.core.net.proxy.IProxyService; import com.google.gdata.client.youtube.YouTubeService; import com.google.gdata.data.extensions.Rating; import com.google.gdata.data.youtube.PlaylistEntry; import com.google.gdata.data.youtube.PlaylistFeed; import com.google.gdata.data.youtube.PlaylistLinkEntry; import com.google.gdata.data.youtube.PlaylistLinkFeed; import com.google.gdata.data.youtube.VideoEntry; import com.motorola.studio.android.common.log.StudioLogger; import com.motorola.studio.android.common.proxy.ProxyAuthenticator; import com.motorola.studio.android.videos.model.Video; import com.motorola.studio.android.videos.model.VideoChannel; import com.motorola.studio.android.videos.model.extension.VideoServiceProvider; /** * Implements the methods to retrieve videos from YouTube */ public class YoutubeVideoServiceProvider implements VideoServiceProvider { private String youtubeUser = null; /* * YouTube Service */ private YouTubeService youtubeService = null; private final String YOUTUBE_SERVICE_APP_ID = "motodev-studio-for-android"; /* * YouTube Service URIs */ public static final String YOUTUBE_GDATA_SERVER = "http://gdata.youtube.com"; // change <user> by the real YouTube username private final String ALL_PLAYLISTS_FEED = YOUTUBE_GDATA_SERVER + "/feeds/api/users/<user>/playlists"; /* * Map "playlist name" -> object from Youtube API that represent the playlist */ private final Map<String, PlaylistLinkEntry> allPlaylistsMap = new HashMap<String, PlaylistLinkEntry>(); /** * Initialize the YouTube Service */ public YoutubeVideoServiceProvider(String user) throws Exception { // Try to retrieve proxy configuration to use if necessary IProxyService proxyService = ProxyManager.getProxyManager(); if (proxyService.isProxiesEnabled() || proxyService.isSystemProxiesEnabled()) { Authenticator.setDefault(new ProxyAuthenticator()); } youtubeUser = user; youtubeService = new YouTubeService(YOUTUBE_SERVICE_APP_ID); PlaylistLinkFeed feeds = youtubeService.getFeed(new URL(ALL_PLAYLISTS_FEED.replace("<user>", youtubeUser)), PlaylistLinkFeed.class); for (PlaylistLinkEntry feedEntry : feeds.getEntries()) { allPlaylistsMap.put(feedEntry.getTitle().getPlainText(), feedEntry); } } /* (non-Javadoc) * @see com.motorola.studio.android.videos.model.extension.VideoServiceProvider#loadVideos(java.util.List) */ public List<Video> loadVideos(VideoChannel channel) throws Exception { List<Video> videos = null; PlaylistLinkEntry entry = allPlaylistsMap.get(channel.getName()); if (entry != null) { // Get videos in the playlist String playlistUrl = entry.getFeedUrl(); PlaylistFeed playlistFeed = youtubeService.getFeed(new URL(playlistUrl), PlaylistFeed.class); videos = new ArrayList<Video>(); for (PlaylistEntry playlistEntry : playlistFeed.getEntries()) { videos.add(getVideoInstance(playlistEntry)); } } return videos; } /* (non-Javadoc) * @see com.motorola.studio.android.videos.model.VideoManager#rate(com.motorola.studio.android.videos.model.Video, int) */ public void rate(Video video, int rate) throws Exception { VideoEntry youtubeVideo = (VideoEntry) video.getData(); String ratingUrl = youtubeVideo.getRatingLink().getHref(); Rating myRating = new Rating(); myRating.setValue(rate); myRating.setMax(5); myRating.setMin(1); youtubeVideo.setRating(myRating); youtubeService.insert(new URL(ratingUrl), youtubeVideo); } /** * Create and populate an object of Video type, with * the information from the VideoEntry passed as argument * * @param videoEntry the VideoEntry object to be converted * @return the corresponding Video instance */ private Video getVideoInstance(VideoEntry videoEntry) { Video video = new Video(); video.setId(videoEntry.getId()); video.setTitle(videoEntry.getTitle().getPlainText()); video.setDescription(videoEntry.getMediaGroup().getDescription() != null ? videoEntry .getMediaGroup().getDescription().getPlainTextContent() : ""); video.setEmbeddedLink(videoEntry.getMediaGroup().getPlayer().getUrl() .replace("watch?v=", "embed/").replace("&feature=youtube_gdata_player", "")); video.setExternalLink(videoEntry.getMediaGroup().getPlayer().getUrl()); video.setRating(videoEntry.getRating() != null ? videoEntry.getRating().getAverage() : 0); video.setDate(new Date(videoEntry.getUpdated().getValue())); video.setViews(videoEntry.getStatistics() != null ? videoEntry.getStatistics() .getViewCount() : 0); video.setData(videoEntry); video.setKeywords(videoEntry.getMediaGroup().getKeywords() != null ? videoEntry .getMediaGroup().getKeywords().getKeywords() : null); try { video.setSnapshot(new URL(videoEntry.getMediaGroup().getThumbnails().get(0).getUrl())); } catch (MalformedURLException e) { StudioLogger.error(this.getClass(), "Error while retrieving video snapshot", e); } return video; } }