use of org.datatransferproject.spi.transfer.provider.ExportResult in project data-transfer-project by google.
the class FacebookPhotosExporter method exportAlbums.
private ExportResult<PhotosContainerResource> exportAlbums(TokensAndUrlAuthData authData, Optional<StringPaginationToken> paginationData) throws CopyExceptionWithFailureReason {
Optional<String> paginationToken = stripTokenPrefix(paginationData, ALBUM_TOKEN_PREFIX);
// Get albums
Connection<Album> connection = getOrCreatePhotosInterface(authData).getAlbums(paginationToken);
PaginationData nextPageData = null;
String token = connection.getAfterCursor();
if (!Strings.isNullOrEmpty(token)) {
nextPageData = new StringPaginationToken(ALBUM_TOKEN_PREFIX + token);
}
ContinuationData continuationData = new ContinuationData(nextPageData);
List<Album> albums = connection.getData();
if (albums.isEmpty()) {
return new ExportResult<>(ExportResult.ResultType.END, null, null);
}
ArrayList<PhotoAlbum> exportAlbums = new ArrayList<>();
for (Album album : albums) {
exportAlbums.add(new PhotoAlbum(album.getId(), album.getName(), album.getDescription()));
continuationData.addContainerResource(new IdOnlyContainerResource(album.getId()));
}
return new ExportResult<>(ExportResult.ResultType.CONTINUE, new PhotosContainerResource(exportAlbums, null), continuationData);
}
use of org.datatransferproject.spi.transfer.provider.ExportResult 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.spi.transfer.provider.ExportResult in project data-transfer-project by google.
the class FacebookVideosExporter method exportVideos.
private ExportResult<VideosContainerResource> exportVideos(TokensAndUrlAuthData authData, Optional<StringPaginationToken> paginationData) throws CopyExceptionWithFailureReason {
Optional<String> paginationToken = paginationData.map(StringPaginationToken::getToken);
try {
Connection<Video> videoConnection = getOrCreateVideosInterface(authData).getVideos(paginationToken);
List<Video> videos = videoConnection.getData();
if (videos.isEmpty()) {
return new ExportResult<>(ExportResult.ResultType.END, null);
}
ArrayList<VideoModel> exportVideos = new ArrayList<>();
for (Video video : videos) {
final String url = video.getSource();
final String fbid = video.getId();
if (null == url || url.isEmpty()) {
monitor.severe(() -> String.format("Source was missing or empty for video %s", fbid));
continue;
}
exportVideos.add(new VideoModel(String.format("%s.mp4", fbid), url, video.getDescription(), "video/mp4", fbid, null, false));
}
String token = videoConnection.getAfterCursor();
if (Strings.isNullOrEmpty(token)) {
return new ExportResult<>(ExportResult.ResultType.END, new VideosContainerResource(null, exportVideos));
} else {
PaginationData nextPageData = new StringPaginationToken(token);
ContinuationData continuationData = new ContinuationData(nextPageData);
return new ExportResult<>(ExportResult.ResultType.CONTINUE, new VideosContainerResource(null, exportVideos), 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 videos to export, skipping to the next bunch", e);
return new ExportResult<>(ExportResult.ResultType.END, null);
}
throw e;
}
}
use of org.datatransferproject.spi.transfer.provider.ExportResult in project data-transfer-project by google.
the class SolidContactsExport method export.
@Override
public ExportResult<ContactsModelWrapper> export(UUID jobId, CookiesAndUrlAuthData authData, Optional<ExportInformation> exportInformation) throws Exception {
if (exportInformation.isPresent()) {
throw new IllegalStateException("Currently solid doesn't support paged exports");
}
checkState(authData.getCookies().size() == 1, "Exactly 1 cookie expected: %s", authData.getCookies());
SolidUtilities solidUtilities = new SolidUtilities(authData.getCookies().get(0));
String url = authData.getUrl();
List<List<VCard>> vCards = explore(url, solidUtilities);
// TODO: This flattens all the address books together, which isn't perfect.
List<VCard> allCards = new ArrayList<>();
vCards.forEach(allCards::addAll);
return new ExportResult<>(ResultType.END, new ContactsModelWrapper(Ezvcard.write(allCards).go()));
}
use of org.datatransferproject.spi.transfer.provider.ExportResult in project data-transfer-project by google.
the class RememberTheMilkTasksExporter method exportTask.
private ExportResult exportTask(RememberTheMilkService service, IdOnlyContainerResource resource) {
String oldListId = resource.getId();
GetListResponse oldList = null;
try {
oldList = service.getList(oldListId);
} catch (IOException e) {
return new ExportResult(e);
}
List<TaskList> taskLists = oldList.tasks.list;
List<TaskModel> tasks = new ArrayList<>();
for (TaskList taskList : taskLists) {
if (taskList.taskseries != null) {
for (TaskSeries taskSeries : taskList.taskseries) {
// TODO: figure out what to do with notes
String notesStr = taskSeries.notes == null ? "" : taskSeries.notes.toString();
for (Task task : taskSeries.tasks) {
// TODO: How to handle case with multiple tasks in a series? Is this good enough?
Instant completedTime = null;
Instant dueTime = null;
if (task.completed != null && !Strings.isNullOrEmpty(task.completed)) {
completedTime = Instant.parse(task.completed);
}
if (task.due != null && !Strings.isNullOrEmpty(task.due)) {
dueTime = Instant.parse(task.due);
}
tasks.add(new TaskModel(oldListId, taskSeries.name, notesStr, completedTime, dueTime));
}
}
}
}
TaskContainerResource taskContainerResource = new TaskContainerResource(null, tasks);
// TODO: what do we do with pagination data?
return new ExportResult(ResultType.CONTINUE, taskContainerResource, null);
}
Aggregations