GithubHelp home page GithubHelp logo

int128 / gpup Goto Github PK

View Code? Open in Web Editor NEW
219.0 16.0 21.0 129 KB

A command to upload photos and movies to Google Photos Library using the official Google Photos Library API

License: Apache License 2.0

Go 96.84% Makefile 2.09% Ruby 1.07%
google-photos golang google-api

gpup's Introduction

gpup CircleCI

A command to upload photos and movies to your Google Photos Library.

Getting Started

Setup

You can install this from brew tap or releases.

brew tap int128/gpup
brew install gpup

Setup your API access by the following steps:

  1. Open https://console.cloud.google.com/apis/library/photoslibrary.googleapis.com/
  2. Enable Photos Library API.
  3. Open https://console.cloud.google.com/apis/credentials
  4. Create an OAuth client ID where the application type is other.
  5. Run gpup and follow the instruction as follows.
% gpup
2018/09/13 15:38:13 Skip reading ~/.gpupconfig: Could not open ~/.gpupconfig: open /user/.gpupconfig: no such file or directory
2018/09/13 15:38:13 Setup your API access by the following steps:

1. Open https://console.cloud.google.com/apis/library/photoslibrary.googleapis.com/
1. Enable Photos Library API.
1. Open https://console.cloud.google.com/apis/credentials
1. Create an OAuth client ID where the application type is other.

Enter your OAuth client ID (e.g. xxx.apps.googleusercontent.com): YOUR_CLIENT_ID.apps.googleusercontent.com
Enter your OAuth client secret: YOUR_CLIENT_SECRET
2018/09/13 15:38:22 Saved credentials to ~/.gpupconfig
2018/09/13 15:38:22 Error: Nothing to upload

Upload files to the library

To upload files in a folder to your Google Photos library:

$ gpup my-photos/
2018/06/14 10:28:40 The following 2 files will be uploaded:
  1: my-photos/travel.jpg
  2: my-photos/lunch.jpg
2018/06/14 10:28:40 Open http://localhost:8000 for authorization
2018/06/14 10:28:43 GET /
2018/06/14 10:28:49 GET /?state=...&code=...
2018/06/14 10:28:49 Saved token to ~/.gpupconfig
2018/06/14 10:28:49 Queued 2 file(s)
2018/06/14 10:28:49 Uploading travel.jpg
2018/06/14 10:28:49 Uploading lunch.jpg
2018/06/14 10:28:52 Adding 2 file(s) to the library

It opens the browser and you can log in to the provider. And then it uploads files concurrently.

You can specify URLs as well.

gpup https://www.example.com/image.jpg

Upload files to an album

You can upload files to the album by -a option. If the album does not exist, it will be created.

gpup -a "My Album" my-photos/

You can upload files to a new album by -n option.

gpup -n "My Album" my-photos/

Usage

Usage:
  gpup [OPTIONS] <FILE | DIRECTORY | URL>...

Application Options:
  -a, --album=TITLE                 Add files to the album or a new album if it does not exist
  -n, --new-album=TITLE             Add files to a new album
      --request-header=KEY:VALUE    Add the header on fetching URLs
      --request-auth=USER:PASS      Add the basic auth header on fetching URLs
      --gpupconfig=                 Path to the config file (default: ~/.gpupconfig) [$GPUPCONFIG]
      --debug                       Enable request and response logging [$DEBUG]

Options read from gpupconfig:
      --google-client-id=           Google API client ID [$GOOGLE_CLIENT_ID]
      --google-client-secret=       Google API client secret [$GOOGLE_CLIENT_SECRET]
      --google-token=               Google API token [$GOOGLE_TOKEN]

Help Options:
  -h, --help                        Show this help message

Known issues

See the Google Issue Tracker for the known issues.

Timestamp

If you upload an photo or movie without timestamp in the header, timestamp of the image will be current time. Google Photos Library API does not provide setting timestamp for now.

Photo storage and quality

By using gpup, files are uploaded in original quality, which consumes user's storage. It's the limitation of Photos Library API, as stated in the offical document.

All media items uploaded to Google Photos using the API are stored in full resolution at original quality. They count toward the user’s storage.

A workaround for this is to use recover storage feature of Google Photos, which lets you free up the storage space by converting all the files uploaded in original quality to high quality.

Contribution

Feel free to open issues or pull requests.

gpup's People

Contributors

harupong avatar int128 avatar pacoorozco avatar zenitram 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gpup's Issues

Can't install this commang using "go get"

Hi

If you try to install this command line using typical go get, an error is raised when it's trying to download google.golang.org/api/photoslibrary/v1 package. It seems that Google announced package removal and it should be vendor.

$ go get github.com/int128/gpup
package google.golang.org/api/photoslibrary/v1: cannot find package "google.golang.org/api/photoslibrary/v1" in any of:
        /usr/local/go/src/google.golang.org/api/photoslibrary/v1 (from $GOROOT)
        /go/src/google.golang.org/api/photoslibrary/v1 (from $GOPATH)

Feature request: watch folder

Mostly, firstly:

This is superb - thank you very much - it works beautifully (on a Raspberry Pi no less).

I'm using it to watch a folder populated by a motion triggered camera. Sadly I'm a node.js guy so my approach is batch up 50 pictures and send them to gpup (using caolan/async cargo); works like a dream, but if you happened to want a challenge a -w path to folder would be great.

Thanks again.

Error when uploading more than 50 images at once.

Hello, I've just noticed that uploading more than 50 images at once gives out an error:

This is the debug output of the following command:

gpup --google-client-id= --google-client-secret= /home/plex/fotos --debug

Output:
2018/08/28 14:26:20 The following 51 files will be uploaded:
1: /home/plex/fotos/001_62.jpg
2: /home/plex/fotos/002_62.jpg
3: /home/plex/fotos/003_62.jpg
4: /home/plex/fotos/004_62.jpg
5: /home/plex/fotos/005_62.jpg
6: /home/plex/fotos/006_62.jpg
7: /home/plex/fotos/007_62.jpg
8: /home/plex/fotos/008_62.jpg
9: /home/plex/fotos/009_62.jpg
10: /home/plex/fotos/010_62.jpg
11: /home/plex/fotos/011_62.jpg
12: /home/plex/fotos/012_62.jpg
13: /home/plex/fotos/013_62.jpg
14: /home/plex/fotos/014_62.jpg
15: /home/plex/fotos/015_62.jpg
16: /home/plex/fotos/016_62.jpg
17: /home/plex/fotos/017_62.jpg
18: /home/plex/fotos/018_62.jpg
19: /home/plex/fotos/019_62.jpg
20: /home/plex/fotos/020_62.jpg
21: /home/plex/fotos/021_62.jpg
22: /home/plex/fotos/022_62.jpg
23: /home/plex/fotos/023_62.jpg
24: /home/plex/fotos/024_62.jpg
25: /home/plex/fotos/025_62.jpg
26: /home/plex/fotos/026_62.jpg
27: /home/plex/fotos/027_62.jpg
28: /home/plex/fotos/028_62.jpg
29: /home/plex/fotos/029_62.jpg
30: /home/plex/fotos/030_62.jpg
31: /home/plex/fotos/031_62.jpg
32: /home/plex/fotos/032_62.jpg
33: /home/plex/fotos/033_62.jpg
34: /home/plex/fotos/034_62.jpg
35: /home/plex/fotos/035_62.jpg
36: /home/plex/fotos/036_62.jpg
37: /home/plex/fotos/037_62.jpg
38: /home/plex/fotos/038_62.jpg
39: /home/plex/fotos/039_62.jpg
40: /home/plex/fotos/040_62.jpg
41: /home/plex/fotos/041_62.jpg
42: /home/plex/fotos/042_62.jpg
43: /home/plex/fotos/043_62.jpg
44: /home/plex/fotos/044_62.jpg
45: /home/plex/fotos/045_62.jpg
46: /home/plex/fotos/046_62.jpg
47: /home/plex/fotos/047_62.jpg
48: /home/plex/fotos/048_62.jpg
49: /home/plex/fotos/049_62.jpg
50: /home/plex/fotos/050_62.jpg
51: /home/plex/fotos/053_61.jpg
2018/08/28 14:26:20 Using token cache file /home/plex/.gpup_token
2018/08/28 14:26:20 Queued 51 file(s)
2018/08/28 14:26:20 Uploading /home/plex/fotos/002_62.jpg
2018/08/28 14:26:20 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:20 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:20 <- X-Goog-Upload-File-Name: 002_62.jpg
2018/08/28 14:26:20 Uploading /home/plex/fotos/003_62.jpg
2018/08/28 14:26:20 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:20 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:20 <- X-Goog-Upload-File-Name: 003_62.jpg
2018/08/28 14:26:20 Uploading /home/plex/fotos/004_62.jpg
2018/08/28 14:26:20 Uploading /home/plex/fotos/001_62.jpg
2018/08/28 14:26:20 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:20 <- X-Goog-Upload-File-Name: 004_62.jpg
2018/08/28 14:26:20 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:20 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:20 <- X-Goog-Upload-File-Name: 001_62.jpg
2018/08/28 14:26:20 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UoV012SwynICtdZmzhj5324kDSgHu1AU5NlDc4smrFzKyI_ZSNpE6jtmksauHY8PaI4xanThVUq6Qp44tpjlRIYOxU7zw
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 510
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 Uploading /home/plex/fotos/005_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 005_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UpKxjvFO_0Q1IX1UkrE7nJzxCEgYMekt7TKg3483yV-YEGILfHvcdLypFJEGE80niPQWtukO_008zgkCQBPoPi8KD9PCtFimpC0-VQStAyUbBWDwZ0
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 531
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UpVTn1tL6ymbRBpBtJC6eph_UykpiQRLKfS5jMxubDvohb1o6rADLFrs5je2KZxh90Kt7I-D5M77M2oP7wNQv9ZhjBfSm0gbHypTYB5JlsaZTB3VWc
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 531
2018/08/28 14:26:21 Uploading /home/plex/fotos/006_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 006_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 Uploading /home/plex/fotos/007_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 007_62.jpg
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UrHhk4EhT3lQ8eVKeubT3UWfnpfX82Ccbxm4s43bX6DBUe8HBVTBjcHG1vdTvoHSbvBhCy-G1Kx9dunLxrv7kH5XM7vWKeJpnU6DgyXgHyBaS49QB0
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 531
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 Uploading /home/plex/fotos/008_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 008_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> Content-Length: 531
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UobrYAsQboxlEKIAmfBW77dNyHtkniBXa3PDeSyfs1YlJUJcXRdo9bDbdAxOrDeYoxyawDD_Fujqmp9lDdCgoZ-FrINBptZSCuYnZbKK156EhNL-rE
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 Uploading /home/plex/fotos/009_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 009_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UrT6UT0Ql5y4fkxWTIlx7YDQbDCYdHn6A0EQ-ASoINLvas-CKsigyHZtTyYvV-0S3wt_XK6gAWvIGCgYElNaJgNDHSOZg
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 510
2018/08/28 14:26:21 Uploading /home/plex/fotos/010_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 010_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UqI0Mirice4kOVaNRHWIJJn17H6ybfoxt2jg8ZAc6-dRKHjMkBcKE_Lf0zuSz9yBSfwJTY2QVy2DsjwQUhbxzgPPCdUm675qkOqdgUWeIXYF858Gg
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 531
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 Uploading /home/plex/fotos/011_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 011_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2Uodk5G8ttl1DLTP_TUomO-1KONbAjEXet2UTf1AF8_UipvMYxgD8I10TJKktZ_yZitpU-nCOzAoRIH16x_L9HCVjEEwIjp_MkV08KAOdP
-hhAA9dg
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 531
2018/08/28 14:26:21 Uploading /home/plex/fotos/012_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 012_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UqaCXCvAwUI0L7gRdOqwPHnlLDSA2h8Xi-t9mC5Rovw3yz3bzOgLodC3Tg4lwtBNQnGWnOy_r-0qhi_Tp9YyzmRhuD2uA
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 510
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 Uploading /home/plex/fotos/013_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 013_62.jpg
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UqdnuxOLN9fORnbtkTLi6Ek9JpIbz3n8YWnFlXUENvQ3IV6HC7YL2hikqpoevgkzNIdIHlO12pJQ47_k344AvNhJGCiDQ
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 510
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> HTTP/2.0 200 OK
2018/08/28 14:26:21 -> Date: Tue, 28 Aug 2018 12:26:21 GMT
2018/08/28 14:26:21 -> Server: UploadServer
2018/08/28 14:26:21 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:21 -> X-Guploader-Uploadid: AEnB2UoCIrhxzZC8zI_XT44zUZ2fEnLzwHl8ddX8JqVN8eJbgqibRCcJA7UCzrxfckJ2ohp1gOrvZMNUnP8xe_XSqQr6GlDYWSh23up66lE5vk3X42aKtcU
2018/08/28 14:26:21 -> Content-Type: text/plain
2018/08/28 14:26:21 -> Content-Length: 531
2018/08/28 14:26:21 Uploading /home/plex/fotos/014_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 014_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:21 Uploading /home/plex/fotos/015_62.jpg
2018/08/28 14:26:21 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:21 <- X-Goog-Upload-File-Name: 015_62.jpg
2018/08/28 14:26:21 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Content-Length: 510
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2Uo-bN3I-OAkQlCamYm6_FqRd2esS5245ulbzsLfCK6Lt9Qw4cJYF6r6585m0NNLo_2cYKOKRBk995rwREGOAP_URVrR-w
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 Uploading /home/plex/fotos/016_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 016_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2Up7AGMkd8tIOkU38n6BQmNjCPIF_r4tbpmy7-xZutwRk-M4wFR2fSGvnBYOXD-3gTrNkCJNW1A8BFyxZI-qKyirGiu7ug
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 -> Content-Length: 510
2018/08/28 14:26:22 Uploading /home/plex/fotos/017_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 017_62.jpg
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2UrxZMpddKgr-BVwXnZawYIxwZiLqoiZCxKZqlYZXpBGC-mVwrzsOYQHH2WAuyQ-IPJIUMS78WKVCpXp9OHLsfYBDI4K5Q
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 -> Content-Length: 510
2018/08/28 14:26:22 Uploading /home/plex/fotos/018_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 018_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Content-Length: 510
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2UoG48byi8kgZfU2l7UyaiKuiy8curULXjAple2ugWFxS26zwUjERm9OoLzBzhYzrICb3EO-qHlayBuUZ9X_8dYtvRXsmg
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 Uploading /home/plex/fotos/019_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 019_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2Uo33X9Z312sZ-ONgmUaET6tjFdqYacS9uGQPh5DjLPZ3ApgOEp3Z_DUDo3aUw3MsGxHsaIAc3myb83iLBEqTTpRDKYO9m6F-J6yfClYj1llmIoEJ8U
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 -> Content-Length: 531
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 Uploading /home/plex/fotos/020_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 020_62.jpg
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2UrpcLlLpk0fsjAVX1JjvLK-7yDjT_rgscQYZODGuPs1RGpr4gOdQLsOSmF-mmF3G869AcDFirmpm3_NYxPfDNaezEEBQQ
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 -> Content-Length: 510
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 Uploading /home/plex/fotos/021_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 021_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Content-Length: 531
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2UqGOWWmSUJmQLgaLfn7aEt91x485oDfW4IhhUK8Ic-su7lbL3J4sSqXpP4yMkjqBd4SUL2s0ivUf0r6gHXWQ1SFhSImg51PRvfR7sFkPHzW84VodMo
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 Uploading /home/plex/fotos/022_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 022_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2Uo0KPEJ5gJ85doxCRsGpIn5WKOyAMO4KXjwU43jbA5toRf7rC43nWx0DJED3j_yPo8RaJ0tkJ5pLycQYlUfdM77BMTx0tQl1Ts6_iUFXFC5PRMdHoo
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 -> Content-Length: 531
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 Uploading /home/plex/fotos/023_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 023_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2Urc-S5QfH6kiESQCV8_WGIdfsDZnO6QDaVcHFcTiB5LJoPSfNa2rpSjoPgneCHujg1r7cgRvgYRWRlZi3_3E5epDD7VpilzcD1HGDQWHak6ODU-u2I
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 -> Content-Length: 531
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 Uploading /home/plex/fotos/024_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 024_62.jpg
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2UqGR79XKsxOUf_fO9uBfsIA88lcLJzLh6bjODYI892oLz1tVBN_NutDEdkttlJ6N2uTNd6FwCidXjkYnw0fM_OSnZIGnEfZ78ywYwAcc9mLnEmn7jg
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 -> Content-Length: 531
2018/08/28 14:26:22 Uploading /home/plex/fotos/025_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 025_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Content-Length: 510
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2UpOVwfDl44akId_8h-F_V8_ZjE7AGwAHwdmpY8PWxNqAJxxuIVLGNFK6WN1t3cJ4uDrFvifk1IinEMcLCEsK0OGLBjxvA
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 -> HTTP/2.0 200 OK
2018/08/28 14:26:22 -> Content-Length: 531
2018/08/28 14:26:22 -> Date: Tue, 28 Aug 2018 12:26:22 GMT
2018/08/28 14:26:22 -> Server: UploadServer
2018/08/28 14:26:22 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:22 -> X-Guploader-Uploadid: AEnB2Urhm4_Lz3-2BDLPvbbRLjUTJx7JV0odceuuDB0KVgbiI6CsIiPjRU2catTzsFbZ7kHxs5pvUv6RQFqndAKorFT93qOOhf5EJm4Oizx8XIpHvLydQ6E
2018/08/28 14:26:22 -> Content-Type: text/plain
2018/08/28 14:26:22 Uploading /home/plex/fotos/026_62.jpg
2018/08/28 14:26:22 Uploading /home/plex/fotos/027_62.jpg
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 026_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:22 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:22 <- X-Goog-Upload-File-Name: 027_62.jpg
2018/08/28 14:26:22 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2UqeA51sQnnrdU02BSRnUEU87Y0j7jeogNF2ku2qRw-3V3q_j0wXusGLTDtuY1drbcBAY2yzbcE9Yn8wvWArmx6JWqPu-tjGUBGzGhNpO3mJlGRVKbo
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 531
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 Uploading /home/plex/fotos/028_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 028_62.jpg
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> Content-Length: 531
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2Uq5htfs8u2HWW1oakqFVA_t1YJHC46AenfRFpubpDc3FPl07kNT28s0iuvNW4gI2wyAmZXUINp88_4Q3sqXXP19zKyUqbb-mjEBW3cAcS3opZG0m78
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 Uploading /home/plex/fotos/029_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 029_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> Content-Length: 510
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2UoTWyctHx5H3HzpETUjVe1VySDSAYDu-a3IVbgqoQwcGiDy0msDDJQgkcwSKAr2v3jCl99uKguF9AnDTiq7dEF5uQH99A
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 Uploading /home/plex/fotos/030_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 030_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2Uqnm8t9ggLpkk2UMw3HZEPYlTn-qzakbphX3gTy-hmm1CYR_nFkxisgnEvO5kmEiBk2Dkq3c4FKD9RjoatTBLP_2qWeyxycoXhRmAUER4TjqnCvvm0
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 531
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 Uploading /home/plex/fotos/031_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 031_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2UqfA-EAHT5KygZJ6hVqNBHraJO24Lhtd_F7wmONvPpHm8YnrFyZjxVKm1PYa7zzVAgu1Oa4hjA-n-qSaD9qLa5mIzpf_pXiafWU9lND90_skj0Jqws
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 531
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 Uploading /home/plex/fotos/032_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 032_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2UpXixYEFzzT2vP8wUXetFKFUYslaZiv9qYwhwwrSt18a1uJZC5DHfS1UVJGNXFaIXCShRY3oeuEll5aZZAsDporb2dtRQ
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 510
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 Uploading /home/plex/fotos/033_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 033_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2Uqdv-sk0S1r9wA1urdRXL8sUAHoMLYXC5evXucFR6JxzpTQTAmNKi9ectMep52XOYg_QHClebLFNkYXVDFHOrmb-TSv-SchTBpZPaFewhNqMlRJwm8
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 531
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 Uploading /home/plex/fotos/034_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 034_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2Uoii7_a_OoRKwcJT-FS59YCTybgcqNDoPPWT6HZ4kUgkiPMX4vJ3kZwIQAkOkeGOFW5gYo1aVDJ5RtgTa3IqKh2GvwIBQ
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 510
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 Uploading /home/plex/fotos/035_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 035_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2UpY9jYD7N0LgP0D506eZPCp91-xVQWxOoJodd9esvbyZFCqfWlAkOg1HYZP7NyWIwf1LARgAyKBCBw3P8qZdPNxVtOJQSMtJU_VRf13nbvmHsmgjis
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 531
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 Uploading /home/plex/fotos/036_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 036_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2Up5LTCl4AC7kRkKT8LOsS5jYTsTPr20K0XFeS1CuCLpz_ueO58Nt17cvQGFEue7Rhy_Y2OHFJLQjk-fNrS-LwTcDeEjfA
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 510
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 Uploading /home/plex/fotos/037_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 037_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2UqibJhU9KQB3E1_F8lPo0Qfg9bR3KBork-t-gxtlHJS_HH4zRMzjKbiVESvgmMR02JlavtrGrCnz3DC-nWxTpnFAYUc2g
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 510
2018/08/28 14:26:23 Uploading /home/plex/fotos/038_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 038_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:23 -> HTTP/2.0 200 OK
2018/08/28 14:26:23 -> Content-Type: text/plain
2018/08/28 14:26:23 -> Content-Length: 510
2018/08/28 14:26:23 -> Date: Tue, 28 Aug 2018 12:26:23 GMT
2018/08/28 14:26:23 -> Server: UploadServer
2018/08/28 14:26:23 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:23 -> X-Guploader-Uploadid: AEnB2UpYq9_eYuvRCpgdVYEil0EM_08WVx6LGhIWWI3FDlXRvZVajOMsrnUHHPbEdaJwX7zXbjtV0uha9ovF3J3k91K3h_qwNQ
2018/08/28 14:26:23 Uploading /home/plex/fotos/039_62.jpg
2018/08/28 14:26:23 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:23 <- X-Goog-Upload-File-Name: 039_62.jpg
2018/08/28 14:26:23 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Content-Length: 531
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UrFlwnqQQZavNsmkW5Y_dJisAZpYsBbaGw5qqIW0W8TxR60G909SEe9ueABG7trD7RgaOEyO8oq2atCxVUdP4Lh8GWjKsPowO0i8ECwa8KYOb_5xgw
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 Uploading /home/plex/fotos/040_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 040_62.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Content-Length: 531
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2Uq4NeY19EBfpPfX8vZdLGHryloHagPgnnloGD4LNUsccJvfcQPJhb-VYNb9bOHy_hPXDX3mfNKKyV5R5YhZtIGUzFKVucMbnSOYL49Z4gGZzPyYZGQ
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 Uploading /home/plex/fotos/041_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 041_62.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 531
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UqVZKJN3hjXetMNDAfGuYu7nlzteFcv98FvevSVeanaoIfe_NV9JOTdhKgHcmx8bVs0SaW5v-_2AkS0_Nbhr1bPFsL-fmyNbiDWnJ_jwj_BA_O73ck
2018/08/28 14:26:24 Uploading /home/plex/fotos/042_62.jpg
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Content-Length: 510
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UqY0WUp1U9XXL56_KZ6GBFJVI2s_H5NLhMbZ_w0QzYreX1nGBwdmjT_lDMR32Yf4_9-Ud9-mcsFQ-lWWZkNClcSVOdi5g
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 Uploading /home/plex/fotos/043_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 043_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 042_62.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UqSoLN-vJCYeXmX8R6XBygJb92YdmGoLEpimc9vVzIy7ozS0epWNTRnjQEfc_3iAQyEW_M1K7-3cp4-85mq3vW9YfhUpg
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 510
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 Uploading /home/plex/fotos/044_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 044_62.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UqItVZgnWJWt0AkCYqCzCswTIWxbDZ2a_XCMuObz5Vsut8Vw6Vsb86qx2Zfvdzw1lhHt-BryQuwXmRI6siWlwoiRfGHAQ
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 510
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 Uploading /home/plex/fotos/045_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 045_62.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UpIFJQlzrN6Nl0wNV6Hu5v5cpUIul62gqlhqTHOfN6rTHtOIt45ClJKfeOVmwU7bjatbt-_Pk06EsK66xIq3Rmx948-haIUIxG7M_HeqxnGsOaGIIs
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 531
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 Uploading /home/plex/fotos/046_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 046_62.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UqFIf1Tpf4tHwVNid8pnhc9_pqp4G6YfsV55KfhvwyHOg6lZz7eDW2qjfvSIKeo1-Da3oSEjVyPpQEON9LdpVTI0tnWNg
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 510
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 Uploading /home/plex/fotos/047_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 047_62.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UrKFZfa-sE5lkgvVtIbzRb_ZZ92u5HR0b2pqGYA6kwtpb1gTEB2LuUtDbf9y3zGqNjgTNifk1ZXihoCB_1N6bf8gchP0A
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 510
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 Uploading /home/plex/fotos/048_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 048_62.jpg
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 531
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2Up466zUBFEeWg-xdB0SZQGfBAJBkLkFoNgIyLERz06cJqAFhMDvgGeAu0vzDPyO1Gh0HcKrCIBHRGP9SK_dnu_Xo0YqaznKvxT4kXtBvo9QvJppkPY
2018/08/28 14:26:24 Uploading /home/plex/fotos/049_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 049_62.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2Up2GXcqMxnzxZf0HEUT70GaaS_21grHfWfnn74SMJog59aC2nWieMyKDRKHDXuiwSu0kDdJK7KKjk214qW3O0esduBEeTi-eY9zZL0IoRhwtqkRQao
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 531
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 Uploading /home/plex/fotos/050_62.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 050_62.jpg
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 510
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UoFnYDBnvm5YBj5RO1aqpxsgJ_0KMuQWJChi_rHXrfMUVW1ncn-mFO96TE8O_BIqmmgVP1JrVrys-77h1UJ5PPwRNh40Q
2018/08/28 14:26:24 Uploading /home/plex/fotos/053_61.jpg
2018/08/28 14:26:24 <- POST https://photoslibrary.googleapis.com/v1/uploads
2018/08/28 14:26:24 <- X-Goog-Upload-File-Name: 053_61.jpg
2018/08/28 14:26:24 <- X-Goog-Upload-Protocol: raw
2018/08/28 14:26:24 -> HTTP/2.0 200 OK
2018/08/28 14:26:24 -> Date: Tue, 28 Aug 2018 12:26:24 GMT
2018/08/28 14:26:24 -> Server: UploadServer
2018/08/28 14:26:24 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:24 -> X-Guploader-Uploadid: AEnB2UrRAie0u6KYtTDiv4Ytu9JxFx2-25VitJR_aaeUQrV1EJzzMc64sYB-aZx397oiN_DtC120w0xgr-eqAfjLJjOOyaGHBWTUkgJpB_ddZDPNBkySDs8
2018/08/28 14:26:24 -> Content-Type: text/plain
2018/08/28 14:26:24 -> Content-Length: 531
2018/08/28 14:26:25 -> HTTP/2.0 200 OK
2018/08/28 14:26:25 -> Content-Type: text/plain
2018/08/28 14:26:25 -> Content-Length: 531
2018/08/28 14:26:25 -> Date: Tue, 28 Aug 2018 12:26:25 GMT
2018/08/28 14:26:25 -> Server: UploadServer
2018/08/28 14:26:25 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:25 -> X-Guploader-Uploadid: AEnB2Urf94PTtTTXi-727Pf7_i4FjoY5qaLYpilNXGjU2nA0Ky-3kmhfzXiRO3mwPIiUfdhdCV68RrzIZt0U32LWo5bKluO85Wvw6zvsKx6Uv4BGiSRjW-4
2018/08/28 14:26:25 -> HTTP/2.0 200 OK
2018/08/28 14:26:25 -> X-Guploader-Uploadid: AEnB2Uqro1CBvhb1vKEdIZ2_LoiUTMeRoc3HRpf1b2A_N57_Ir_GbdaWV9tkHV4a4Qw3T8rWfCTrfUGso5gzOcXhFDCtN5NO9w
2018/08/28 14:26:25 -> Content-Type: text/plain
2018/08/28 14:26:25 -> Content-Length: 510
2018/08/28 14:26:25 -> Date: Tue, 28 Aug 2018 12:26:25 GMT
2018/08/28 14:26:25 -> Server: UploadServer
2018/08/28 14:26:25 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:25 -> HTTP/2.0 200 OK
2018/08/28 14:26:25 -> Date: Tue, 28 Aug 2018 12:26:25 GMT
2018/08/28 14:26:25 -> Server: UploadServer
2018/08/28 14:26:25 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:25 -> X-Guploader-Uploadid: AEnB2UrAP3UMB3Ke7dENRM8Yr7QTsCSfBEjJH-YArNFzj4pT_mQoBHWKHKvo5dcqkYxeQgdaTSFaly0kyZqtoxiIl5mxxRLnaQ
2018/08/28 14:26:25 -> Content-Type: text/plain
2018/08/28 14:26:25 -> Content-Length: 510
2018/08/28 14:26:25 Adding 20 file(s) to the library
2018/08/28 14:26:25 <- POST https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate?alt=json
2018/08/28 14:26:25 <- User-Agent: google-api-go-client/0.5
2018/08/28 14:26:25 <- Content-Type: application/json
2018/08/28 14:26:25 -> HTTP/2.0 400 Bad Request
2018/08/28 14:26:25 -> Vary: Origin
2018/08/28 14:26:25 -> Vary: X-Origin
2018/08/28 14:26:25 -> Vary: Referer
2018/08/28 14:26:25 -> Content-Type: application/json; charset=UTF-8
2018/08/28 14:26:25 -> Date: Tue, 28 Aug 2018 12:26:25 GMT
2018/08/28 14:26:25 -> Server: ESF
2018/08/28 14:26:25 -> Cache-Control: private
2018/08/28 14:26:25 -> Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
2018/08/28 14:26:25 -> X-Xss-Protection: 1; mode=block
2018/08/28 14:26:25 -> X-Frame-Options: SAMEORIGIN
2018/08/28 14:26:25 -> X-Content-Type-Options: nosniff
2018/08/28 14:26:25 Error while BatchCreate: googleapi: Error 400: Request contains an invalid argument., badRequest

Add Progress Bar

I have a large video file that I want to upload. But it doesn't show the progress of the upload.

Error messages occasionally do not include culprit filename

It looks like gpup error messages typically include details of the file being processed. However on occasion I am seeing errors in the log like this:

2018/12/29 17:53:32 Uploading IMG_4669.MOV (32026 kB)
2018/12/29 17:53:32 Uploading IMG_4759.MOV (30243 kB)
2018/12/29 17:53:36 Error while adding the item: googleapi: Error 500: Internal error encountered., backendError
2018/12/29 17:53:51 Uploading IMG_4760.MOV (29304 kB)

Can anything be inferred from the above trace in terms of which file upload succeeded or failed?

preserve original photo time when uploading.

When uploading from a Web Browsethe image original creation time is preserved. When uploading with gpup the image has the time of upload as creation time. Is it possible to preserve original time so later image are searchable by proper time.

Captions not preserved

When we upload photos to Google Photos using browser, image captions (from IPTC metadata) is used to create captions in web albums. However, gpup-uploaded photos show file paths instead.

Error when setting up the cli

When you try to do the first step to configure gpup and error is raised:

$ ./gpup ~/Downloads/Test                            
2020/07/06 15:34:44 Skip reading ~/.gpupconfig: Could not open ~/.gpupconfig: open /home/xxx/.gpupconfig: no such file or directory
2020/07/06 15:34:44 Setup your API access by the following steps:

1. Open https://console.cloud.google.com/apis/library/photoslibrary.googleapis.com/
1. Enable Photos Library API.
1. Open https://console.cloud.google.com/apis/credentials
1. Create an OAuth client ID where the application type is other.

Enter your OAuth client ID (e.g. xxx.apps.googleusercontent.com): xxx.apps.googleusercontent.com
Enter your OAuth client secret: xxx
2020/07/06 15:34:56 Saved credentials to ~/.gpupconfig
2020/07/06 15:34:56 The following 1 items will be uploaded:
#1: /home/xxx/Downloads/Test/Album_20200702/AeoniumLeaf_EN-AU7200082197_1920x1080.jpg
2020/07/06 15:34:57 Open http://localhost:37663 for authorization
Opening in existing browser session.
[0706/153458.209357:ERROR:nacl_helper_linux.cc(308)] NaCl helper process running without a sandbox!
Most likely you need to configure your SUID sandbox correctly

There are two things that I'be seen different from some time ago (when It was working properly):

  1. Google Photos Library API has not "Other" type of credentials, now it seems it's called "Desktop app"
    2) This strange error on Linux "NaCl helper process running without a sandbox!"

Can you test it on your environment?

Hitting uploads per minute quota

Hey there

When uploading large amounts of photos at once I'm hitting a quota:

2018/09/15 19:17:26 Uploading IMG_6427.jpg
2018/09/15 19:17:26 Error while uploading /Users/jone/Pictures/Photos Library.photoslibrary/Masters/2009/07/18/20090718-190427/IMG_6663.jpg: Could not upload /Users/jone/Pictures/Photos Library.photoslibrary/Masters/2009/07/18/20090718-190427/IMG_6663.jpg: status 400: {
  "code": 3,
  "message": "Insufficient tokens for quota \u0027photoslibrary.googleapis.com/upload_requests\u0027 and limit \u0027UploadsPerMinute\u0027 of service \u0027photoslibrary.googleapis.com\u0027 for consumer \u0027project_number:638493XXXXX\u0027."
}

Unfortunately I'm not that familiar with Go, but as far as I could interpret the code I suspect that gpup does not detect that problem and retry uploading this particular image: the response status is 400, but retry does only work with codes of 500 and greater.
I guess there is no way to circumvent the quota, with another type of account, right?
Or did I do something wrong?

I'd suggest to implement a sleep / retry strategy, but I'm not familiar enough with the Go environment to do that on may own.

Use narrower Google Photos API scope

Based on the intended use-case of the app, I suspect you only need to use the "photoslibrary.appendonly" scope (and maybe the "photoslibrary.readonly.appcreateddata" scope to read files that the app has uploaded.)

However, I see the app is requesting essentially full read/write rights of my google photos via the "photoslibrary" scope.

The only reason I can figure for this is that the app wants to check to see if an album exists already before creating a new one. Personally, I'd prefer to not have that particular feature in order to have the app have narrower access to my photos account.

unable to compile

: cannot find package "context" in any of:
Trying to compile leads to errors in context. What is your dev environment? I am using
go version go1.6.2 linux/amd64 in ubuntu xenial

Feature request: allow only valid file types

Given that there are upload limits using the Google Photos API, it would be nice to avoid uploading files that are known to be invalid file types. An example of this is .XMP files that are created when exporting a folder or album from Aperture, which one would then like to upload to Google Photos using gpup.

This could either be via an extensible list of file types (suffixes), or a simpler switch (e.g. --only-upload-known-media-types) if it is possible to pre-identify the filetypes that Google Photos accepts.

Don't re-upload files

It looks like the tool is always re-uploading files even if they're already online.
It'd be great to keep a log of already uploaded files (paths) to avoid re-uploading it.

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.