use of org.datatransferproject.datatransfer.google.mediaModels.AlbumListResponse in project data-transfer-project by google.
the class GooglePhotosExporter method exportAlbums.
/**
* Note: not all accounts have albums to return. In that case, we just return an empty list of
* albums instead of trying to iterate through a null list.
*/
@VisibleForTesting
ExportResult<PhotosContainerResource> exportAlbums(TokensAndUrlAuthData authData, Optional<PaginationData> paginationData, UUID jobId) throws IOException, InvalidTokenException, PermissionDeniedException {
Optional<String> paginationToken = Optional.empty();
if (paginationData.isPresent()) {
String token = ((StringPaginationToken) paginationData.get()).getToken();
Preconditions.checkArgument(token.startsWith(ALBUM_TOKEN_PREFIX), "Invalid pagination token " + token);
paginationToken = Optional.of(token.substring(ALBUM_TOKEN_PREFIX.length()));
}
AlbumListResponse albumListResponse;
albumListResponse = getOrCreatePhotosInterface(authData).listAlbums(paginationToken);
PaginationData nextPageData;
String token = albumListResponse.getNextPageToken();
List<PhotoAlbum> albums = new ArrayList<>();
GoogleAlbum[] googleAlbums = albumListResponse.getAlbums();
if (Strings.isNullOrEmpty(token)) {
nextPageData = new StringPaginationToken(PHOTO_TOKEN_PREFIX);
} else {
nextPageData = new StringPaginationToken(ALBUM_TOKEN_PREFIX + token);
}
ContinuationData continuationData = new ContinuationData(nextPageData);
if (googleAlbums != null && googleAlbums.length > 0) {
for (GoogleAlbum googleAlbum : googleAlbums) {
// Add album info to list so album can be recreated later
PhotoAlbum photoAlbum = new PhotoAlbum(googleAlbum.getId(), googleAlbum.getTitle(), null);
albums.add(photoAlbum);
monitor.debug(() -> String.format("%s: Google Photos exporting album: %s", jobId, photoAlbum.getId()));
// Add album id to continuation data
continuationData.addContainerResource(new IdOnlyContainerResource(googleAlbum.getId()));
}
}
ResultType resultType = ResultType.CONTINUE;
PhotosContainerResource containerResource = new PhotosContainerResource(albums, null);
return new ExportResult<>(resultType, containerResource, continuationData);
}
use of org.datatransferproject.datatransfer.google.mediaModels.AlbumListResponse in project data-transfer-project by google.
the class GooglePhotosExporterTest method exportAlbumFirstSet.
@Test
public void exportAlbumFirstSet() throws IOException, InvalidTokenException, PermissionDeniedException {
setUpSingleAlbum();
when(albumListResponse.getNextPageToken()).thenReturn(ALBUM_TOKEN);
// Run test
ExportResult<PhotosContainerResource> result = googlePhotosExporter.exportAlbums(null, Optional.empty(), uuid);
// Check results
// Verify correct methods were called
verify(photosInterface).listAlbums(Optional.empty());
verify(albumListResponse).getAlbums();
// Check pagination token
ContinuationData continuationData = result.getContinuationData();
StringPaginationToken paginationToken = (StringPaginationToken) continuationData.getPaginationData();
assertThat(paginationToken.getToken()).isEqualTo(ALBUM_TOKEN_PREFIX + ALBUM_TOKEN);
// Check albums field of container
Collection<PhotoAlbum> actualAlbums = result.getExportedData().getAlbums();
assertThat(actualAlbums.stream().map(PhotoAlbum::getId).collect(Collectors.toList())).containsExactly(ALBUM_ID);
// Check photos field of container (should be empty, even though there is a photo in the
// original album)
Collection<PhotoModel> actualPhotos = result.getExportedData().getPhotos();
assertThat(actualPhotos).isEmpty();
// Should be one container in the resource list
List<ContainerResource> actualResources = continuationData.getContainerResources();
assertThat(actualResources.stream().map(a -> ((IdOnlyContainerResource) a).getId()).collect(Collectors.toList())).containsExactly(ALBUM_ID);
}
use of org.datatransferproject.datatransfer.google.mediaModels.AlbumListResponse in project data-transfer-project by google.
the class GooglePhotosExporterTest method setup.
@Before
public void setup() throws IOException, InvalidTokenException, PermissionDeniedException {
GoogleCredentialFactory credentialFactory = mock(GoogleCredentialFactory.class);
jobStore = mock(TemporaryPerJobDataStore.class);
when(jobStore.getStream(any(), anyString())).thenReturn(mock(InputStreamWrapper.class));
photosInterface = mock(GooglePhotosInterface.class);
albumListResponse = mock(AlbumListResponse.class);
mediaItemSearchResponse = mock(MediaItemSearchResponse.class);
Monitor monitor = mock(Monitor.class);
googlePhotosExporter = new GooglePhotosExporter(credentialFactory, jobStore, new JacksonFactory(), photosInterface, monitor);
when(photosInterface.listAlbums(any(Optional.class))).thenReturn(albumListResponse);
when(photosInterface.listMediaItems(any(Optional.class), any(Optional.class))).thenReturn(mediaItemSearchResponse);
verifyNoInteractions(credentialFactory);
}
use of org.datatransferproject.datatransfer.google.mediaModels.AlbumListResponse in project data-transfer-project by google.
the class GoogleVideosExporterTest method setup.
@Before
public void setup() throws IOException {
GoogleCredentialFactory credentialFactory = mock(GoogleCredentialFactory.class);
jobStore = mock(TemporaryPerJobDataStore.class);
videosInterface = mock(GoogleVideosInterface.class);
albumListResponse = mock(AlbumListResponse.class);
mediaItemSearchResponse = mock(MediaItemSearchResponse.class);
googleVideosExporter = new GoogleVideosExporter(credentialFactory, videosInterface);
when(videosInterface.listVideoItems(any(Optional.class))).thenReturn(mediaItemSearchResponse);
verifyNoInteractions(credentialFactory);
}
use of org.datatransferproject.datatransfer.google.mediaModels.AlbumListResponse in project data-transfer-project by google.
the class GooglePhotosExporter method populateContainedPhotosList.
/**
* Method for storing a list of all photos that are already contained in albums
*/
@VisibleForTesting
void populateContainedPhotosList(UUID jobId, TokensAndUrlAuthData authData) throws IOException, InvalidTokenException, PermissionDeniedException {
// This method is only called once at the beginning of the transfer, so we can start by
// initializing a new TempPhotosData to be store in the job store.
TempPhotosData tempPhotosData = new TempPhotosData(jobId);
String albumToken = null;
AlbumListResponse albumListResponse;
MediaItemSearchResponse containedMediaSearchResponse;
do {
albumListResponse = getOrCreatePhotosInterface(authData).listAlbums(Optional.ofNullable(albumToken));
if (albumListResponse.getAlbums() != null) {
for (GoogleAlbum album : albumListResponse.getAlbums()) {
String albumId = album.getId();
String photoToken = null;
do {
containedMediaSearchResponse = getOrCreatePhotosInterface(authData).listMediaItems(Optional.of(albumId), Optional.ofNullable(photoToken));
if (containedMediaSearchResponse.getMediaItems() != null) {
for (GoogleMediaItem mediaItem : containedMediaSearchResponse.getMediaItems()) {
tempPhotosData.addContainedPhotoId(mediaItem.getId());
}
}
photoToken = containedMediaSearchResponse.getNextPageToken();
} while (photoToken != null);
}
}
albumToken = albumListResponse.getNextPageToken();
} while (albumToken != null);
// TODO: if we see complaints about objects being too large for JobStore in other places, we
// should consider putting logic in JobStore itself to handle it
InputStream stream = convertJsonToInputStream(tempPhotosData);
jobStore.create(jobId, createCacheKey(), stream);
}
Aggregations