Git Product home page Git Product logo

jiotty-photos-uploader's Introduction

Jiotty Photos Uploader is a simple desktop Google Photos media uploader that creates albums according to your directory structure and can resume failed uploads. See Wiki for more information, including how to download and install.

For enthusiasts, to build or run from sources:

  1. Follow these steps to generate your own Google API client secret file.
  2. Install JDK
    1. for a desktop other than Windows 7 32 bit, use any JDK version 16 or higher.
    2. for a Raspberry Pi, use Liberica OpenJDK (because it contains RPi-compatible javafx). Go to https://bell-sw.com/pages/downloads/, select version 16 or higher, 32-bit, Linux, package: Full JDK, and install via .deb.
    3. for Windows 7 32-bit, use Liberica OpenJDK (because it contains compatible javafx). Go to https://bell-sw.com/pages/downloads/, select version 16 or higher, 32-bit, Windows, package: Full JDK, download and install.
  3. Clone this repository.
  4. cd jiotty-photos-uploader

Then, to compile and run locally:

  1. on a desktop: ./gradlew --no-daemon -DCLIENT_SECRET_PATH=/path/to/google-API-client-secret.json run
  2. on Raspberry Pi: ./gradlew --no-daemon -DCLIENT_SECRET_PATH=/path/to/google-API-client-secret.json -PraspberryPi run

Or to build the self-contained native binary and installer for the current platform:

  1. Run the following, replacing 0.0.0 with the version you want:
    1. on a desktop: ./gradlew --no-daemon -DCLIENT_SECRET_PATH=/path/to/google-API-client-secret.json fullPackage -DVERSION=0.0.0
    2. on Raspberry Pi: ./gradlew --no-daemon -PraspberryPi -DCLIENT_SECRET_PATH=/path/to/google-API-client-secret.json fullPackage -DVERSION=0.0.0
  2. look for the executable bundle in app/build/jpackage and for the installer in app/build/fullpackage

Note: if doing repeated builds, to improve build speed, replace --no-daemon with --build-cache, but only if you understand what you're doing and are prepared to maintain gradle cache and daemons.

jiotty-photos-uploader's People

Contributors

axylee avatar cantolla avatar marcovanree avatar sngnr avatar ylexus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

jiotty-photos-uploader's Issues

Linux version may crash on startup on machines with NVidia GPU

Logs and crash dump:
main.log
hs_err_pid11798.log

# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f8e7987ce78, pid=11798, tid=11820
#
# JRE version: OpenJDK Runtime Environment (13.0.2+8) (build 13.0.2+8)
# Java VM: OpenJDK 64-Bit Server VM (13.0.2+8, mixed mode, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# C  [libnvidia-glcore.so.435.21+0x9ede78]

FR: Option to add files from subfolders to main album

photo folder

  • folder1
    • folder2
      • photo1.jpg
      • photo2.jpg
    • folder3
      • photo2.jpg
  • folder4

Like the example
all files in folder 1 including subfolders (folder2 and folder3) will be added to album "folder1"

In this case you will have 2 albums, Folder1 and Folder4

Failed to launch JVM

Hello,

Whenver I try to start the windows 10 app (I am on windows 10) it shows me an failed to launch JVM error:
failed to launch jvm
main.log

Uploading a zero-length NEF file results in "com.google.api.gax.rpc.ApiException: java.lang.IllegalArgumentException: The upload was completed but failed to finalize or get the result"

2020-03-28 12:11:53,104 ERROR [JavaFX Application Thread] n.y.g.u.UploadPaneControllerImpl Upload failed
java.util.concurrent.CompletionException: java.lang.RuntimeException: java.util.concurrent.CompletionException: java.lang.RuntimeException: Failed uploading /Volumes/Public/pic-do-not-upload-to-goggle-photos/UK/out-duplicate-with-src/2008-08-26-SmilingForFlera/DSC_4791.NEF
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314) ~[?:?]
	at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319) ~[?:?]
	at java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:990) ~[?:?]
	at java.util.concurrent.CompletableFuture$UniExceptionally.tryFire(CompletableFuture.java:970) ~[?:?]
	at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[?:?]
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1776) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
	at java.lang.Thread.run(Thread.java:830) ~[?:?]
Caused by: java.lang.RuntimeException: java.util.concurrent.CompletionException: java.lang.RuntimeException: Failed uploading /Volumes/Public/pic-do-not-upload-to-goggle-photos/UK/out-duplicate-with-src/2008-08-26-SmilingForFlera/DSC_4791.NEF
	at net.yudichev.googlephotosupload.core.GooglePhotosUploaderImpl.lambda$uploadFile$3(GooglePhotosUploaderImpl.java:101) ~[main/:?]
	at java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:986) ~[?:?]
	... 6 more
Caused by: java.util.concurrent.CompletionException: java.lang.RuntimeException: Failed uploading /Volumes/Public/pic-do-not-upload-to-goggle-photos/UK/out-duplicate-with-src/2008-08-26-SmilingForFlera/DSC_4791.NEF
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314) ~[?:?]
	at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319) ~[?:?]
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) ~[?:?]
	... 3 more
Caused by: java.lang.RuntimeException: Failed uploading /Volumes/Public/pic-do-not-upload-to-goggle-photos/UK/out-duplicate-with-src/2008-08-26-SmilingForFlera/DSC_4791.NEF
	at net.yudichev.jiotty.connector.google.photos.GooglePhotosClientImpl.lambda$null$1(GooglePhotosClientImpl.java:71) ~[jiotty-connector-google-photos-1.4.1.jar:?]
	at java.util.Optional.ifPresent(Optional.java:176) ~[?:?]
	at net.yudichev.jiotty.connector.google.photos.GooglePhotosClientImpl.lambda$null$4(GooglePhotosClientImpl.java:71) ~[jiotty-connector-google-photos-1.4.1.jar:?]
	at net.yudichev.jiotty.common.inject.BaseLifecycleComponent.lambda$whenStartedAndNotLifecycling$5(BaseLifecycleComponent.java:60) ~[jiotty-common-1.4.1.jar:?]
	at net.yudichev.jiotty.common.lang.Locks.inLock(Locks.java:22) ~[jiotty-common-1.4.1.jar:?]
	at net.yudichev.jiotty.common.inject.BaseLifecycleComponent.whenNotLifecycling(BaseLifecycleComponent.java:54) ~[jiotty-common-1.4.1.jar:?]
	at net.yudichev.jiotty.common.inject.BaseLifecycleComponent.whenStartedAndNotLifecycling(BaseLifecycleComponent.java:58) ~[jiotty-common-1.4.1.jar:?]
	at net.yudichev.jiotty.connector.google.photos.GooglePhotosClientImpl.lambda$uploadMediaItem$5(GooglePhotosClientImpl.java:58) ~[jiotty-connector-google-photos-1.4.1.jar:?]
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1771) ~[?:?]
	... 3 more
Caused by: com.google.api.gax.rpc.ApiException: java.lang.IllegalArgumentException: The upload was completed but failed to finalize or get the result.
	at com.google.photos.library.v1.upload.PhotosLibraryUploadExceptionMappingFn.apply(PhotosLibraryUploadExceptionMappingFn.java:48) ~[google-photos-library-client-1.4.0.jar:1.4.0]
	at com.google.photos.library.v1.upload.PhotosLibraryUploadExceptionMappingFn.apply(PhotosLibraryUploadExceptionMappingFn.java:29) ~[google-photos-library-client-1.4.0.jar:1.4.0]
	at com.google.api.core.ApiFutures$GaxFunctionToGuavaFunction.apply(ApiFutures.java:204) ~[api-common-1.8.1.jar:?]
	at com.google.common.util.concurrent.AbstractCatchingFuture$CatchingFuture.doFallback(AbstractCatchingFuture.java:223) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.AbstractCatchingFuture$CatchingFuture.doFallback(AbstractCatchingFuture.java:211) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.AbstractCatchingFuture.run(AbstractCatchingFuture.java:124) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:141) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:130) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.ListenableFutureTask.done(ListenableFutureTask.java:86) ~[guava-28.2-jre.jar:?]
	at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:381) ~[?:?]
	at java.util.concurrent.FutureTask.setException(FutureTask.java:250) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:269) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]
	... 3 more
Caused by: java.lang.IllegalArgumentException: The upload was completed but failed to finalize or get the result.
	at com.google.photos.library.v1.upload.PhotosLibraryUploadCallable.buildUploadMediaItemResponse(PhotosLibraryUploadCallable.java:303) ~[google-photos-library-client-1.4.0.jar:1.4.0]
	at com.google.photos.library.v1.upload.PhotosLibraryUploadCallable.call(PhotosLibraryUploadCallable.java:183) ~[google-photos-library-client-1.4.0.jar:1.4.0]
	at com.google.photos.library.v1.upload.PhotosLibraryUploadCallable.call(PhotosLibraryUploadCallable.java:45) ~[google-photos-library-client-1.4.0.jar:1.4.0]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]
	... 3 more

Stock on Loading albums in cloud

Stock on Loading albums in cloud
Changed IP, Not working
Uninstall and install, Not working
sign-out and signing , not working
revoke access and grant it again, not working
Screenshot (3)

Add tip to detail what happens in event of failures

Great piece of software, but it isn't clear whether failures stop upload of photos, or whether the api limit has been hit. Uploads appear to have stopped but I don't k ow whether to wait or whether a failure has caused them to stop.

Privacy

Hello, thanks for releasing this app, it's very useful batch upload photos onto a google photos. I do however have some concerns about uploading thousands and thousands of pictures to Google photos via this API. What is the level of privacy that you can offer i.e. the app will not store users' photos and personal data? Thank you so much.

Uploading to create albums w/existing photos

Hi, I saw your Reddit post saying that uploading with existing photos was working. So I was using the app on Mac and I was trying to upload to get the app to create an album for me when I had previously uploaded the photos via web browser or backup and sync and for some reason I can't get it to create that album if the photos exist already. If the photos have not been uploaded before, the app works perfectly and does create that album. Any insight on how you were able to get that to work initially when you had existing photos? I also tried deleting the photos and then even permanently deleting and then re uploading through the app but then that didn't work either.

Thank you for your help!

"INVALID_ARGUMENT: Request contains an invalid media item id." on existing photos.

Hi and thanks for this great app! It definitely saves me from a lot of trouble. As per the wiki you've written and specifically "If a photo has already been uploaded, will duplicate be created?"--->3, the program should be able to add photos already exist in Google Photos AND that are uploaded again to an album created by Jiotty.

I can't get this to work however and Jiotty spits out an "INVALID_ARGUMENT: Request contains an invalid media item id" error. I even tried with one photo to no avail. Clearing out the .jiottyphotouploader folder also didn't help.

What gives?

Order of items in albums

Uploaded photos are displayed in Google Photos album in some inconsistent order. They are definitely not ordered by date (which is the case when one uses native Google Photos UI to do it).

IMHO it would be natural to sort the photos by date in create albums. Maybe this is another limitation of Google Photos API? Then it's worth mentioning it in Wiki.

Affected version: 1.0.8

Linux version may display empty window on startup

The following in printed to the console and the Log in to Google window is empty.

Framebuffer object format is unsupported by the video hardware. (GL_FRAMEBUFFER_UNSUPPORTED)(FBO - 820)
Error creating framebuffer object with TexID 6)

Add support for High quality instead of Original full resolution

Looks like the upload is original full resolution. My Google Photos account setting is High quality (free unlimited storage). Getting error INVALID_ARGUMENT: The remaining storage in the user's account is not enough to perform this operation.

Can you honor the upload setting or provide a Jiotty setting for upload resolution? Thanks

Improve progress bars

  1. "Uploading media files" can now display precise percentage
  2. "Processing folders" is not needed anymore

Date change to today with large video file

The date will change to today with Jiotty , tested below steps :
1: upload to GP manually within the web browser , the file size and date is correct .
2: delete and clean up the bin .
3: upload to GP the same video with Jiotty uploader , the file size the same , but the date change to today .
1-test file size in explorer
1-test file size in explorer

2-manual upload to GP
2-manual upload to GP

3-data size and date is correct
3-data size and date is correct

4-date change with Jiotty
4-date change with Jiotty

Fails to upload a folder with more than 50 images

Tested using Windows 10. Version 1.0.6

When I try an upload a folder with over 50 images I get this error for each of the files:

C:\PHOTOGRAPHS\ALBUM_NAME\FILE_NAME.JPG INVALID_ARGUMENT: Request must have less than 50 items.

Steps to reproduce:

1)Create folder A with 70 images
2)Try to upload the folder A
3)Fails with the error INVALID_ARGUMENT: Request must have less than 50 items. --however Album A is created in Google photos, it is just empty
4)Move 30 of the images from folder to folder B (folder A now has 40 images)
5)Try and upload folder A
5)This should be successful - the album on Google photos now has 40 images
6)Move the 30 images from folder B back into folder A (folder A now has all 70 images)
7)Try to upload folder A
8)Should fail with the error INVALID_ARGUMENT: Request must have less than 50 items.
9)Remove from folder A the 40 images that successfully uploaded under point 5 (folder A now has 30 images)
10)Try and upload folder A
11)This should be successful - the album on Google photos now has all 70 images

Chinese Translation

To help with translation, please have a look at this file: https://github.com/ylexus/jiotty-photos-uploader/blob/master/src/main/resources/i18n/Resources.properties. It contains all the phrases needed by the app. The file is in the format:

key=phrase

There are also some clarifying comments in the file that start with '#' - these explain some context for the key that follows, but do not need to be translated.

@axylee, there are two options:

  1. if you are familiar with git and GitHub, you could just create two copies of this file in same directory and submit a pull request.
  2. if you are not familiar with git, please copy-paste the contents of the file above here twice in two different comments and in each comment replace the English text after the "=" with the corresponding Chinese phrase?

Thanks again for agreeing to help!

Fails the whole upload if a a directory matches pre-existing album that's been created manually by user

2020-03-30 20:17:13,139 ERROR [JavaFX Application Thread] n.y.g.u.UploadPaneControllerImpl Upload failed
java.util.concurrent.CompletionException: java.lang.RuntimeException: java.util.concurrent.CompletionException: com.google.api.gax.rpc.InvalidArgumentException: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: No permission to add media items to this album.
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314) ~[?:?]
	at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319) ~[?:?]
	at java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:990) ~[?:?]
	at java.util.concurrent.CompletableFuture$UniExceptionally.tryFire(CompletableFuture.java:970) ~[?:?]
	at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[?:?]
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1769) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[?:?]
	at java.lang.Thread.run(Thread.java:832) ~[?:?]
Caused by: java.lang.RuntimeException: java.util.concurrent.CompletionException: com.google.api.gax.rpc.InvalidArgumentException: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: No permission to add media items to this album.
	at net.yudichev.googlephotosupload.core.GooglePhotosUploaderImpl.lambda$uploadFile$3(GooglePhotosUploaderImpl.java:100) ~[main/:?]
	at java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:986) ~[?:?]
	... 6 more
Caused by: java.util.concurrent.CompletionException: com.google.api.gax.rpc.InvalidArgumentException: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: No permission to add media items to this album.
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314) ~[?:?]
	at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319) ~[?:?]
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1766) ~[?:?]
	... 3 more
Caused by: com.google.api.gax.rpc.InvalidArgumentException: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: No permission to add media items to this album.
	at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:49) ~[gax-1.45.0.jar:1.45.0]
	at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:72) ~[gax-grpc-1.45.0.jar:1.45.0]
	at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:60) ~[gax-grpc-1.45.0.jar:1.45.0]
	at com.google.api.gax.grpc.GrpcExceptionCallable$ExceptionTransformingFuture.onFailure(GrpcExceptionCallable.java:97) ~[gax-grpc-1.45.0.jar:1.45.0]
	at com.google.api.core.ApiFutures$1.onFailure(ApiFutures.java:68) ~[api-common-1.8.1.jar:?]
	at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1072) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1164) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:958) ~[guava-28.2-jre.jar:?]
	at com.google.common.util.concurrent.AbstractFuture.setException(AbstractFuture.java:749) ~[guava-28.2-jre.jar:?]
	at io.grpc.stub.ClientCalls$GrpcFuture.setException(ClientCalls.java:515) ~[grpc-stub-1.21.0.jar:1.21.0]
	at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:490) ~[grpc-stub-1.21.0.jar:1.21.0]
	at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.internal.CensusStatsModule$StatsClientInterceptor$1$1.onClose(CensusStatsModule.java:700) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:399) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:500) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:65) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:592) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$700(ClientCallImpl.java:508) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:632) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) ~[grpc-core-1.21.0.jar:1.21.0]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]
	... 3 more
	Suppressed: com.google.api.gax.rpc.AsyncTaskException: Asynchronous task failed
		at com.google.api.gax.rpc.ApiExceptions.callAndTranslateApiException(ApiExceptions.java:57) ~[gax-1.45.0.jar:1.45.0]
		at com.google.api.gax.rpc.UnaryCallable.call(UnaryCallable.java:112) ~[gax-1.45.0.jar:1.45.0]
		at com.google.photos.library.v1.internal.InternalPhotosLibraryClient.batchCreateMediaItems(InternalPhotosLibraryClient.java:353) ~[google-photos-library-client-1.4.0.jar:1.4.0]
		at com.google.photos.library.v1.PhotosLibraryClient.batchCreateMediaItems(PhotosLibraryClient.java:176) ~[google-photos-library-client-1.4.0.jar:1.4.0]
		at net.yudichev.jiotty.connector.google.photos.GooglePhotosClientImpl.lambda$null$2(GooglePhotosClientImpl.java:81) ~[jiotty-connector-google-photos-1.4.0.jar:?]
		at java.util.Optional.map(Optional.java:258) ~[?:?]
		at net.yudichev.jiotty.connector.google.photos.GooglePhotosClientImpl.lambda$null$4(GooglePhotosClientImpl.java:81) ~[jiotty-connector-google-photos-1.4.0.jar:?]
		at net.yudichev.jiotty.common.inject.BaseLifecycleComponent.lambda$whenStartedAndNotLifecycling$5(BaseLifecycleComponent.java:60) ~[jiotty-common-1.4.0.jar:?]
		at net.yudichev.jiotty.common.lang.Locks.inLock(Locks.java:22) ~[jiotty-common-1.4.0.jar:?]
		at net.yudichev.jiotty.common.inject.BaseLifecycleComponent.whenNotLifecycling(BaseLifecycleComponent.java:54) ~[jiotty-common-1.4.0.jar:?]
		at net.yudichev.jiotty.common.inject.BaseLifecycleComponent.whenStartedAndNotLifecycling(BaseLifecycleComponent.java:58) ~[jiotty-common-1.4.0.jar:?]
		at net.yudichev.jiotty.connector.google.photos.GooglePhotosClientImpl.lambda$uploadMediaItem$5(GooglePhotosClientImpl.java:58) ~[jiotty-connector-google-photos-1.4.0.jar:?]
		at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1764) ~[?:?]
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[?:?]
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[?:?]
		at java.lang.Thread.run(Thread.java:832) ~[?:?]
Caused by: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: No permission to add media items to this album.
	at io.grpc.Status.asRuntimeException(Status.java:533) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:490) ~[grpc-stub-1.21.0.jar:1.21.0]
	at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.internal.CensusStatsModule$StatsClientInterceptor$1$1.onClose(CensusStatsModule.java:700) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) ~[grpc-api-1.21.0.jar:1.21.0]
	at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:399) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:500) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:65) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:592) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$700(ClientCallImpl.java:508) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:632) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[grpc-core-1.21.0.jar:1.21.0]
	at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) ~[grpc-core-1.21.0.jar:1.21.0]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]
	... 3 more

If Google request quota is exceeded, hint the user

Notify the user about this, in a friendly way:

RESOURCE_EXHAUSTED: Quota exceeded for quota metric 'All requests' and limit 'All requests per day' of service 'photoslibrary.googleapis.com' for consumer 'project_number:641898159424'.

Fix MacOS notarization

Since 3 feb 2020, Apple requires hardened runtime and signing with timestamp for all binaries

another copy of the app is already running - error

Hi. I’ve been using your great utility for a week or so and its been working fine.
But when I came to run it today, I got this error mgs:
another copy of the app is already running
so I looked in Task manager, and I could not see any evidence of this. So I rebooted and still got the same msg when I restarted. I’ve uninstalled and reinstalled, tried removing all references to Jiotty photos uploader from regedit, restarted, reinstalled and still get this msg.
I’m now at the end of my own problem-solving skills.
Any chance of some help / guidance please?
Richard

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.