gphotos-cdp
What?
This program uses the Chrome DevTools Protocol to drive a Chrome session that downloads your photos stored in Google Photos. By default, it starts at the most ancient item in the library, and progresses towards the most recent. It can be run incrementally, as it keeps track of the last item that was downloaded. It only works with the main library for now, i.e. it does not support the photos moved to Archive, or albums. For each downloaded photo, an external program can be run on it (with the -run flag) right after it is downloaded to e.g. upload it somewhere else. See the upload/perkeep program, which uploads to a Perkeep server, for an example.
Why?
We want to incrementally download our own photos out of Google Photos.
Google Photos used to have an API to do this (the Picasa Web Albums API) but they removed it, replacing it with a new API that doesn't let you download your original photos. They instead let you download your photos with mangled EXIF, stripping location (and maybe recompressing the image bytes?).
There also used to be a way to sync your Google Photos to Google Drive, and then you could use the Google Drive API to download your original photos, but Google Photos removed that too.
We can get our original photos out with Google Takeout, but only manually, and slowly. We don't want to have to remember to do it (or remember to renew the time-limited scheduled takeouts) and we'd like our photos mirrored in seconds or minutes, not weeks.
In our original Perkeep issue, @bradfitz said that we might have to give up on APIs and resort to scraping, noting that the Chrome DevTools Protocol makes this pretty easy. Brad hacked up some Go code to drive Chrome (using https://github.com/chromedp/chromedp) and do a basic download and then Mathieu Lonjaret made this tool, fleshing out the idea.
What if Google Photos breaks this tool on purpose or accident?
I guess we'll have to continually update it.
But that's no different than using people's APIs, because companies all seem to be deprecating and changing their APIs regularly too.