/* * Copyright (c) 2014 Dennis Fischer. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0+ * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: Dennis Fischer */ package de.chaosfisch.google.youtube.playlist; import com.google.api.services.youtube.model.*; import com.google.common.collect.Lists; import com.google.inject.Inject; import de.chaosfisch.google.YouTubeProvider; import de.chaosfisch.google.account.Account; import de.chaosfisch.google.account.IAccountService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; public abstract class AbstractPlaylistService implements IPlaylistService { private static final Logger logger = LoggerFactory.getLogger(AbstractPlaylistService.class); private static final String DEFAULT_THUMBNAIL = "https://i.ytimg.com/vi/default.jpg"; private static final long MAX_PLAYLISTS = 50L; private final IAccountService accountService; private final YouTubeProvider youTubeProvider; @Inject protected AbstractPlaylistService(final IAccountService accountService, final YouTubeProvider youTubeProvider) { this.accountService = accountService; this.youTubeProvider = youTubeProvider; } @Override public void addVideoToPlaylist(final Playlist playlist, final String videoId) throws PlaylistIOException { try { final ResourceId resourceId = new ResourceId(); resourceId.setKind("youtube#video"); resourceId.setVideoId(videoId); final PlaylistItemSnippet playlistItemSnippet = new PlaylistItemSnippet(); playlistItemSnippet.setPlaylistId(playlist.getPkey()); playlistItemSnippet.setResourceId(resourceId); final PlaylistItem playlistItem = new PlaylistItem(); playlistItem.setSnippet(playlistItemSnippet); youTubeProvider.setAccount(playlist.getAccount()) .get() .playlistItems() .insert("snippet,status", playlistItem) .execute(); logger.debug("Video added to playlist!"); } catch (final Exception e) { throw new PlaylistIOException(e); } } @Override public void addYoutubePlaylist(final Playlist playlist) throws PlaylistIOException { logger.debug("Adding playlist {} to youtube.", playlist.getTitle()); try { final PlaylistSnippet playlistSnippet = new PlaylistSnippet(); playlistSnippet.setTitle(playlist.getTitle()); playlistSnippet.setDescription(playlist.getSummary()); final PlaylistStatus playlistStatus = new PlaylistStatus(); playlistStatus.setPrivacyStatus(playlist.isPrivate_() ? "private" : "public"); final com.google.api.services.youtube.model.Playlist youTubePlaylist = new com.google.api.services.youtube.model.Playlist(); youTubePlaylist.setSnippet(playlistSnippet); youTubePlaylist.setStatus(playlistStatus); youTubeProvider.setAccount(playlist.getAccount()) .get() .playlists() .insert("snippet,status", youTubePlaylist) .execute(); logger.info("Added playlist to youtube"); } catch (final Exception e) { throw new PlaylistIOException(e); } } @Override public void synchronizePlaylists(final List<Account> accounts) throws PlaylistIOException { logger.info("Synchronizing playlists."); for (final Account account : accounts) { try { final PlaylistListResponse response = youTubeProvider.setAccount(account) .get() .playlists() .list("id,snippet,contentDetails") .setMaxResults(MAX_PLAYLISTS) .setMine(true) .execute(); logger.debug("Playlist synchronize okay."); final List<Playlist> playlists = parsePlaylistListResponse(account, response); final List<Playlist> accountPlaylists = account.getPlaylists(); accountPlaylists.removeAll(playlists); for (final Playlist playlist : accountPlaylists) { delete(playlist); } account.setPlaylists(playlists); accountService.update(account); } catch (final Exception e) { logger.error("Playlist sync exception", e); throw new PlaylistIOException(e); } } logger.info("Playlists synchronized"); } List<Playlist> parsePlaylistListResponse(final Account account, final PlaylistListResponse response) { final List<Playlist> list = Lists.newArrayListWithExpectedSize(response.getItems().size()); for (final com.google.api.services.youtube.model.Playlist entry : response.getItems()) { final Playlist playlist = findByPkey(entry.getId()); if (null == playlist) { list.add(_createNewPlaylist(account, entry)); } else { list.add(_updateExistingPlaylist(account, entry, playlist)); } } return list; } Playlist _createNewPlaylist(final Account account, final com.google.api.services.youtube.model.Playlist entry) { final Playlist playlist = new Playlist(entry.getSnippet().getTitle(), account); playlist.setPkey(entry.getId()); playlist.setNumber(entry.getContentDetails().getItemCount()); playlist.setSummary(entry.getSnippet().getDescription()); final String thumbnailUrl = entry.getSnippet().getThumbnails().getHigh().getUrl(); playlist.setThumbnail(thumbnailUrl.equals(DEFAULT_THUMBNAIL) ? null : thumbnailUrl); playlist.setHidden(false); insert(playlist); return playlist; } Playlist _updateExistingPlaylist(final Account account, final com.google.api.services.youtube.model.Playlist entry, final Playlist playlist) { playlist.setTitle(entry.getSnippet().getTitle()); playlist.setNumber(entry.getContentDetails().getItemCount()); playlist.setSummary(entry.getSnippet().getDescription()); final String thumbnailUrl = entry.getSnippet().getThumbnails().getHigh().getUrl(); playlist.setThumbnail(thumbnailUrl.equals(DEFAULT_THUMBNAIL) ? null : thumbnailUrl); playlist.setAccount(account); update(playlist); return playlist; } }