use of org.datatransferproject.types.common.models.photos.PhotoModel in project data-transfer-project by google.
the class FacebookPhotosExporter method exportPhotos.
private ExportResult<PhotosContainerResource> exportPhotos(UUID jobId, TokensAndUrlAuthData authData, IdOnlyContainerResource containerResource, Optional<StringPaginationToken> paginationData) throws CopyExceptionWithFailureReason {
Optional<String> paginationToken = stripTokenPrefix(paginationData, PHOTO_TOKEN_PREFIX);
String albumId = containerResource.getId();
try {
Connection<Photo> photoConnection = getOrCreatePhotosInterface(authData).getPhotos(albumId, paginationToken);
List<Photo> photos = photoConnection.getData();
if (photos.isEmpty()) {
return new ExportResult<>(ExportResult.ResultType.END, null);
}
ArrayList<PhotoModel> exportPhotos = new ArrayList<>();
for (Photo photo : photos) {
final String url = photo.getImages().get(0).getSource();
final String fbid = photo.getId();
if (null == url || url.isEmpty()) {
monitor.severe(() -> String.format("Source was missing or empty for photo %s", fbid));
continue;
}
boolean photoWasGarbage;
try {
photoWasGarbage = modifyExifAndStorePhoto(jobId, photo, url, photo.getId());
} catch (IOException e) {
monitor.info(() -> String.format("Error while modifying exif or storing photo %s", fbid), e);
photoWasGarbage = true;
}
if (photoWasGarbage) {
continue;
}
exportPhotos.add(new PhotoModel(String.format("%s.jpg", photo.getId()), // store and the url is too long for that.
photo.getId(), photo.getName(), "image/jpg", photo.getId(), albumId, true, photo.getCreatedTime()));
}
String token = photoConnection.getAfterCursor();
if (Strings.isNullOrEmpty(token)) {
return new ExportResult<>(ExportResult.ResultType.END, new PhotosContainerResource(null, exportPhotos));
} else {
PaginationData nextPageData = new StringPaginationToken(PHOTO_TOKEN_PREFIX + token);
ContinuationData continuationData = new ContinuationData(nextPageData);
return new ExportResult<>(ExportResult.ResultType.CONTINUE, new PhotosContainerResource(null, exportPhotos), continuationData);
}
} catch (FacebookGraphException e) {
String message = e.getMessage();
// In such case, we should skip this object and continue with the rest of the transfer.
if (message != null && message.contains("code 100, subcode 33")) {
monitor.info(() -> "Cannot find photos to export, skipping to the next bunch", e);
return new ExportResult<>(ExportResult.ResultType.END, null);
}
throw e;
}
}
use of org.datatransferproject.types.common.models.photos.PhotoModel in project data-transfer-project by google.
the class BackblazePhotosImporterTest method testImportPhoto.
@Test
public void testImportPhoto() throws Exception {
String dataId = "dataId";
String title = "title";
String photoUrl = "photoUrl";
String albumName = "albumName";
String albumId = "albumId";
String response = "response";
UUID jobId = UUID.randomUUID();
PhotoModel photoModel = new PhotoModel(title, photoUrl, "", "", dataId, albumId, false, null);
ArrayList<PhotoModel> photos = new ArrayList<>();
photos.add(photoModel);
PhotosContainerResource data = mock(PhotosContainerResource.class);
when(data.getPhotos()).thenReturn(photos);
when(executor.getCachedValue(albumId)).thenReturn(albumName);
HttpURLConnection connection = mock(HttpURLConnection.class);
when(connection.getInputStream()).thenReturn(IOUtils.toInputStream("photo content", "UTF-8"));
when(streamProvider.getConnection(photoUrl)).thenReturn(connection);
when(client.uploadFile(eq("Photo Transfer/albumName/dataId.jpg"), any())).thenReturn(response);
when(clientFactory.getOrCreateB2Client(jobId, authData)).thenReturn(client);
BackblazePhotosImporter sut = new BackblazePhotosImporter(monitor, dataStore, streamProvider, clientFactory);
sut.importItem(jobId, executor, authData, data);
ArgumentCaptor<Callable<String>> importCapture = ArgumentCaptor.forClass(Callable.class);
verify(executor, times(1)).executeAndSwallowIOExceptions(eq(String.format("%s-%s", albumId, dataId)), eq(title), importCapture.capture());
String actual = importCapture.getValue().call();
assertEquals(response, actual);
}
use of org.datatransferproject.types.common.models.photos.PhotoModel in project data-transfer-project by google.
the class TwitterPhotosImporter method importItem.
@Override
public ImportResult importItem(UUID jobId, IdempotentImportExecutor idempotentExecutor, TokenSecretAuthData authData, PhotosContainerResource data) throws Exception {
Twitter twitterApi = TwitterApiWrapper.getInstance(appCredentials, authData);
for (PhotoModel image : data.getPhotos()) {
try {
StatusUpdate update = new StatusUpdate(image.getDescription());
InputStreamContent content = new InputStreamContent(null, getImageAsStream(image.getFetchableUrl()));
update.media(image.getTitle(), content.getInputStream());
idempotentExecutor.executeAndSwallowIOExceptions(IdempotentImportExecutorHelper.getPhotoIdempotentId(image), image.getTitle(), () -> twitterApi.tweets().updateStatus(update));
} catch (IOException e) {
monitor.severe(() -> "Error importing twitter photo", e);
return new ImportResult(e);
}
}
return new ImportResult(ResultType.OK);
}
use of org.datatransferproject.types.common.models.photos.PhotoModel in project data-transfer-project by google.
the class MicrosoftPhotosExporterTest method exportOneAlbumWithNextPage.
@Test
public void exportOneAlbumWithNextPage() throws IOException {
// Setup
MicrosoftDriveItem folderItem = setUpSingleAlbum();
when(driveItemsResponse.getDriveItems()).thenReturn(new MicrosoftDriveItem[] { folderItem });
when(driveItemsResponse.getNextPageLink()).thenReturn(DRIVE_PAGE_URL);
// Run
ExportResult<PhotosContainerResource> result = microsoftPhotosExporter.exportOneDrivePhotos(null, Optional.empty(), Optional.empty(), uuid);
// Verify method calls
verify(photosInterface).getDriveItemsFromSpecialFolder(MicrosoftSpecialFolder.FolderType.photos);
verify(driveItemsResponse).getDriveItems();
// Verify pagination token is set
ContinuationData continuationData = result.getContinuationData();
StringPaginationToken paginationToken = (StringPaginationToken) continuationData.getPaginationData();
assertThat(paginationToken.getToken()).isEqualTo(DRIVE_TOKEN_PREFIX + DRIVE_PAGE_URL);
// Verify one album is ready for import
Collection<PhotoAlbum> actualAlbums = result.getExportedData().getAlbums();
assertThat(actualAlbums.stream().map(PhotoAlbum::getId).collect(Collectors.toList())).containsExactly(FOLDER_ID);
// Verify photos should be empty (in the root)
Collection<PhotoModel> actualPhotos = result.getExportedData().getPhotos();
assertThat(actualPhotos).isEmpty();
// Verify there is one container ready for sub-processing
List<ContainerResource> actualResources = continuationData.getContainerResources();
assertThat(actualResources.stream().map(a -> ((IdOnlyContainerResource) a).getId()).collect(Collectors.toList())).containsExactly(FOLDER_ID);
}
use of org.datatransferproject.types.common.models.photos.PhotoModel in project data-transfer-project by google.
the class MicrosoftPhotosExporterTest method exportPhotoWithNextPage.
@Test
public void exportPhotoWithNextPage() throws IOException {
// Setup
when(driveItemsResponse.getNextPageLink()).thenReturn(null);
MicrosoftDriveItem photoItem = setUpSinglePhoto(IMAGE_URI, PHOTO_ID);
when(driveItemsResponse.getDriveItems()).thenReturn(new MicrosoftDriveItem[] { photoItem });
when(driveItemsResponse.getNextPageLink()).thenReturn(DRIVE_PAGE_URL);
IdOnlyContainerResource idOnlyContainerResource = new IdOnlyContainerResource(FOLDER_ID);
// Run
ExportResult<PhotosContainerResource> result = microsoftPhotosExporter.exportOneDrivePhotos(null, Optional.of(idOnlyContainerResource), Optional.empty(), uuid);
// Verify method calls
verify(photosInterface).getDriveItems(Optional.of(FOLDER_ID), Optional.empty());
verify(driveItemsResponse).getDriveItems();
// Verify pagination token is set
ContinuationData continuationData = result.getContinuationData();
StringPaginationToken paginationToken = (StringPaginationToken) continuationData.getPaginationData();
assertThat(paginationToken.getToken()).isEqualTo(DRIVE_TOKEN_PREFIX + DRIVE_PAGE_URL);
// Verify no albums are exported
Collection<PhotoAlbum> actualAlbums = result.getExportedData().getAlbums();
assertThat(actualAlbums).isEmpty();
// Verify one photo (in an album) should be exported
Collection<PhotoModel> actualPhotos = result.getExportedData().getPhotos();
assertThat(actualPhotos.stream().map(PhotoModel::getFetchableUrl).collect(Collectors.toList())).containsExactly(IMAGE_URI);
assertThat(actualPhotos.stream().map(PhotoModel::getAlbumId).collect(Collectors.toList())).containsExactly(FOLDER_ID);
assertThat(actualPhotos.stream().map(PhotoModel::getTitle).collect(Collectors.toList())).containsExactly(FILENAME);
// Verify there are no containers ready for sub-processing
List<ContainerResource> actualResources = continuationData.getContainerResources();
assertThat(actualResources).isEmpty();
}
Aggregations