Archives the contents of your Google Photos library to disk
Project description
google-photos-archiver
What?
google-photos-archiver
aims to provide a simple, fast, extensible interface to be able to back up one's Google Photos to a location of their choosing.
I've drawn inspiration from projects such as: https://github.com/mholt/timeliner & https://github.com/gilesknap/gphotos-sync but wanted to cut my teeth in this domain and see what I could come up with myself.
Why?
I wanted a tool (of my own creation) which could easily provide a copy of mine and my partner's Google Photos libraries, and keep said copy up to date over time.
In reality I've mainly just needed a distraction from the vicious cycle of wake, work, Netflix, sleep, and I thought it was high time to do a little side project.
How?
Development Pre-reqs
docker
... Or
python==3.8
- poetry
>=1.0.0
Optional Reqs
- pre-commit
- Run
pre-commit install
- Run
Getting Started
Google Oauth Setup
These instructions will help you set up Google OAuth2 client credentials so you can start using google-photos-archiver
- While logged into your Google account navigate to Create a New Project
- Create one, and switch to using it with the UI dropdown
- Navigate to
APIs & Services
click on+ Enable APIs and services
, and enable thePhotos Library API
- Navigate back to
APIs & Services
and click onCredentials
- Click on
+ Create Credentials > OAuth client ID
- Configure an OAuth consent screen. You can just fill out the required fields and hit Save.
- Click
Add Or Remove Scopes
and manually add scope:https://www.googleapis.com/auth/photoslibrary.readonly
- Accept remaining defaults, save through and return to
Credentials
- Click
- Click on
+ Create Credentials > OAuth client ID
- Make a
"Desktop App"
- Congrats!, you now have a Client ID and Client Secret
- Download the associated
client_secret.json
file and make note of its location as we'll be providing it's path togoogle-photos-archiver
First Run
A browser window will be opened during the initial OAuth flow. After successfully authenticating once, a refresh token will be stored for future use (See: --refresh-token-path
) and will omit the need to reauthenticate.
Development Usage
$ git clone git@github.com:scottx611x/google-photos-archiver.git
$ poetry install
$ poetry run google-photos-archiver --help
... with Docker
Note that some more Docker volume mounting will be warranted here if you want to specify a different path to download to etc. Ref: https://docs.docker.com/storage/volumes
$ docker build . -t google-photos-archiver
$ docker run -v $PWD:/app/ google-photos-archiver --help
General Usage
$ pip install google-photos-archiver
$ google-photos-archiver --help
Running tests
$ poetry run pytest
Examples
Specify a different download location
$ google-photos-archiver archive-media-items --download-path /Volumes/my-big-hdd/downloaded_media
Download from specific dates (with wildcard support)
$ google-photos-archiver archive-media-items --date-filter 2020/*/*,2021/8/22
$ google-photos-archiver archive-media-items --date-range-filter 2019/8/22-2020/8/22
Download Albums and their MediaItems only
$ google-photos-archiver archive-media-items --albums-only
Download Path Hierarchy
$ tree /<download_path>/downloaded_media/ | head
/<download_path>/downloaded_media/
├── 2021
│ └── 1
│ ├── 1
│ │ └── a.jpg
│ └── 2
│ └── b.mov
├── 2020
│ ├── 1
│ │ └── 2
│ │ └── c.jpg
│ └── 2
│ └── 3
│ └── d.jpg
└── albums
└── Album A
└── <symlink /<download_path>/downloaded_media/2021/1/1/a.jpg >
...
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for google-photos-archiver-0.2.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0bf55bef0f2a4a9fa08b2d119a2a414f93246d3d24877e9c65d986d984602ee3 |
|
MD5 | 514e662f1ec699a4a69809cf9ee63197 |
|
BLAKE2b-256 | 75f6f939337e91e8a35bffaf80bb6cded2ac60d16e2a766dd66699e6492530bb |
Hashes for google_photos_archiver-0.2.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bad687eece0fca23068ff2e51c15c2e285ba7554ca6e05b013a478d711c76372 |
|
MD5 | 1aec9e646de6d0d73dbcde0edc57ed7b |
|
BLAKE2b-256 | 1b6588c196510bfdb246eb147118282bd776e0052b6dd62d3da9f5c219d9d9dc |