All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencastproject.publication.youtube.YouTubeAPIVersion3ServiceImpl Maven / Gradle / Ivy

/*
 * Licensed to The Apereo Foundation under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 *
 * The Apereo Foundation licenses this file to you under the Educational
 * Community 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://opensource.org/licenses/ecl2.txt
 *
 * 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 org.opencastproject.publication.youtube;

import org.opencastproject.publication.youtube.auth.ClientCredentials;
import org.opencastproject.publication.youtube.auth.OAuth2CredentialFactory;
import org.opencastproject.publication.youtube.auth.OAuth2CredentialFactoryImpl;
import org.opencastproject.util.data.Collections;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.media.MediaHttpUploader;
import com.google.api.client.http.InputStreamContent;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.YouTubeRequest;
import com.google.api.services.youtube.model.Playlist;
import com.google.api.services.youtube.model.PlaylistItem;
import com.google.api.services.youtube.model.PlaylistItemListResponse;
import com.google.api.services.youtube.model.PlaylistItemSnippet;
import com.google.api.services.youtube.model.PlaylistListResponse;
import com.google.api.services.youtube.model.PlaylistSnippet;
import com.google.api.services.youtube.model.PlaylistStatus;
import com.google.api.services.youtube.model.ResourceId;
import com.google.api.services.youtube.model.SearchListResponse;
import com.google.api.services.youtube.model.Video;
import com.google.api.services.youtube.model.VideoListResponse;
import com.google.api.services.youtube.model.VideoSnippet;
import com.google.api.services.youtube.model.VideoStatus;

import org.apache.commons.lang3.ArrayUtils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class YouTubeAPIVersion3ServiceImpl implements YouTubeAPIVersion3Service {

  private YouTube youTube;

  @Override
  public void initialize(final ClientCredentials credentials) throws IOException {
    final OAuth2CredentialFactory factory = new OAuth2CredentialFactoryImpl();
    final GoogleCredential credential = factory.getGoogleCredential(credentials);
    youTube = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), credential).build();
  }

  @Override
  public Video addVideoToMyChannel(final VideoUpload videoUpload) throws IOException {
    final Video videoObjectDefiningMetadata = new Video();
    final VideoStatus status = new VideoStatus();
    status.setPrivacyStatus(videoUpload.getPrivacyStatus());
    videoObjectDefiningMetadata.setStatus(status);
    // Metadata lives in VideoSnippet
    final VideoSnippet snippet = new VideoSnippet();
    snippet.setTitle(videoUpload.getTitle());
    snippet.setDescription(videoUpload.getDescription());
    final String[] tags = videoUpload.getTags();
    if (ArrayUtils.isNotEmpty(tags)) {
      snippet.setTags(Collections.list(tags));
    }
    // Attach metadata to video object.
    videoObjectDefiningMetadata.setSnippet(snippet);

    final File videoFile = videoUpload.getVideoFile();
    final BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(videoFile));
    final InputStreamContent mediaContent = new InputStreamContent("video/*", inputStream);
    mediaContent.setLength(videoFile.length());

    final YouTube.Videos.Insert videoInsert = youTube.videos()
        .insert("snippet,statistics,status", videoObjectDefiningMetadata, mediaContent);
    final MediaHttpUploader uploader = videoInsert.getMediaHttpUploader();

    uploader.setDirectUploadEnabled(false);
    uploader.setProgressListener(videoUpload.getProgressListener());
    return execute(videoInsert);
  }

  @Override
  public Playlist createPlaylist(final String title, final String description, final String... tags)
          throws IOException {
    final PlaylistSnippet playlistSnippet = new PlaylistSnippet();
    playlistSnippet.setTitle(title);
    playlistSnippet.setDescription(description);
    if (tags.length > 0) {
      playlistSnippet.setTags(Collections.list(tags));
    }
    // Playlists are always public. The videos therein might be private.
    final PlaylistStatus playlistStatus = new PlaylistStatus();
    playlistStatus.setPrivacyStatus("public");

    // Create playlist with metadata and status.
    final Playlist youTubePlaylist = new Playlist();
    youTubePlaylist.setSnippet(playlistSnippet);
    youTubePlaylist.setStatus(playlistStatus);

    // The first argument tells the API what to return when a successful insert has been executed.
    final YouTube.Playlists.Insert command = youTube.playlists().insert("snippet,status", youTubePlaylist);
    return execute(command);
  }

  @Override
  public PlaylistItem addPlaylistItem(final String playlistId, final String videoId) throws IOException {
    // Resource type (video,playlist,channel) needs to be set along with resource id.
    final ResourceId resourceId = new ResourceId();
    resourceId.setKind("youtube#video");
    resourceId.setVideoId(videoId);

    // Set the required snippet properties.
    final PlaylistItemSnippet playlistItemSnippet = new PlaylistItemSnippet();
    playlistItemSnippet.setTitle("First video in the test playlist");
    playlistItemSnippet.setPlaylistId(playlistId);
    playlistItemSnippet.setResourceId(resourceId);

    // Create the playlist item.
    final PlaylistItem playlistItem = new PlaylistItem();
    playlistItem.setSnippet(playlistItemSnippet);

    // The first argument tells the API what to return when a successful insert has been executed.
    final YouTube.PlaylistItems.Insert playlistItemsInsertCommand
        = youTube.playlistItems().insert("snippet,contentDetails", playlistItem);
    return execute(playlistItemsInsertCommand);
  }

  @Override
  public void removeVideoFromPlaylist(final String playlistId, final String videoId) throws IOException {
    final PlaylistItem playlistItem = findPlaylistItem(playlistId, videoId);
    final YouTube.PlaylistItems.Delete deleteRequest = youTube.playlistItems().delete(playlistItem.getId());
    execute(deleteRequest);
  }

  @Override
  public void removeMyVideo(final String videoId) throws Exception {
    final YouTube.Videos.Delete deleteRequest = youTube.videos().delete(videoId);
    execute(deleteRequest);
  }

  @Override
  public void removeMyPlaylist(final String playlistId) throws IOException {
    final YouTube.Playlists.Delete deleteRequest = youTube.playlists().delete(playlistId);
    execute(deleteRequest);
  }

  @Override
  public SearchListResponse searchMyVideos(final String queryTerm, final String pageToken, final long maxResults)
          throws IOException {
    final YouTube.Search.List search = youTube.search().list("id,snippet");
    if (pageToken != null) {
      search.set("pageToken", pageToken);
    }
    search.setQ(queryTerm);
    search.setType("video");
    search.setForMine(true);
    search.setMaxResults(maxResults);
    search.setFields("items(id,kind,snippet),nextPageToken,pageInfo,prevPageToken,tokenPagination");
    return execute(search);
  }

  @Override
  public Video getVideoById(final String videoId) throws IOException {
    final YouTube.Videos.List search = youTube.videos().list("id,snippet");
    search.setId(videoId);
    search.setFields("items(id,kind,snippet),nextPageToken,pageInfo,prevPageToken,tokenPagination");
    final VideoListResponse response = execute(search);
    return response.getItems().isEmpty() ? null : response.getItems().get(0);
  }

  @Override
  public Playlist getMyPlaylistByTitle(final String title) throws IOException {
    final String trimmedTitle = title.trim();
    boolean searchedAllPlaylist = false;
    Playlist playlist = null;
    String nextPageToken = null;
    while (!searchedAllPlaylist) {
      final PlaylistListResponse searchResult = getMyPlaylists(nextPageToken, 50);
      for (final Playlist p : searchResult.getItems()) {
        if (p.getSnippet().getTitle().trim().equals(trimmedTitle)) {
          playlist = p;
          break;
        }
      }
      nextPageToken = searchResult.getNextPageToken();
      searchedAllPlaylist = nextPageToken == null;
    }
    return playlist;
  }

  @Override
  public PlaylistListResponse getMyPlaylists(final String pageToken, final long maxResults) throws IOException {
    final YouTube.Playlists.List search = youTube.playlists().list("id,snippet");
    if (pageToken != null) {
      search.set("pageToken", pageToken);
    }
    search.setMaxResults(maxResults);
    search.setMine(true);
    search.setFields("items(id,snippet),kind,nextPageToken,pageInfo,prevPageToken,tokenPagination");
    return execute(search);
  }

  @Override
  public PlaylistItemListResponse getPlaylistItems(
      final String playlistId,
      final String pageToken,
      final long maxResults
  ) throws IOException {
    final YouTube.PlaylistItems.List search = youTube.playlistItems().list("id,snippet");
    search.setPlaylistId(playlistId);
    search.setPageToken(pageToken);
    search.setMaxResults(maxResults);
    search.setFields("items(id,kind,snippet),nextPageToken,pageInfo,prevPageToken,tokenPagination");
    return execute(search);
  }

  /**
   * @param playlistId may not be {@code null}
   * @param videoId may not be {@code null}
   * @return null when not found.
   * @throws IOException when transaction fails.
   */
  private PlaylistItem findPlaylistItem(final String playlistId, final String videoId) throws IOException {
    final List playlistItems = getAllPlaylistItems(playlistId);
    PlaylistItem playlistItem = null;
    for (final PlaylistItem next : playlistItems) {
      final String id = next.getSnippet().getResourceId().getVideoId();
      if (videoId.equals(id)) {
        playlistItem = next;
        break;
      }
    }
    return playlistItem;
  }

  /**
   *
   * @param playlistId may not be {@code null}
   * @return zero or more playlist items.
   * @throws IOException  when transaction fails.
   */
  private List getAllPlaylistItems(final String playlistId) throws IOException {
    final List playlistItems = new LinkedList();
    boolean done = false;
    String nextPageToken = null;
    while (!done) {
      final PlaylistItemListResponse searchResult = getPlaylistItems(playlistId, nextPageToken, 50);
      playlistItems.addAll(searchResult.getItems());
      nextPageToken = searchResult.getNextPageToken();
      done = nextPageToken == null;
    }
    return playlistItems;
  }

  /**
   * @see com.google.api.services.youtube.YouTubeRequest#execute()
   * @param command may not be {@code null}
   * @param  type of request.
   * @return result; may be {@code null}
   * @throws IOException  when transaction fails.
   */
  private  T execute(final YouTubeRequest command) throws IOException {
    return command.execute();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy