{"id":13582333,"url":"https://github.com/int128/gpup","last_synced_at":"2025-08-30T07:31:13.922Z","repository":{"id":50125577,"uuid":"136492602","full_name":"int128/gpup","owner":"int128","description":"A command to upload photos and movies to Google Photos Library using the official Google Photos Library API","archived":true,"fork":false,"pushed_at":"2020-07-04T12:18:27.000Z","size":129,"stargazers_count":221,"open_issues_count":17,"forks_count":22,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-03-14T21:38:31.282Z","etag":null,"topics":["golang","google-api","google-photos"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/int128.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-06-07T14:55:20.000Z","updated_at":"2025-02-13T12:59:17.000Z","dependencies_parsed_at":"2022-09-10T09:01:08.693Z","dependency_job_id":null,"html_url":"https://github.com/int128/gpup","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/int128/gpup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/int128%2Fgpup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/int128%2Fgpup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/int128%2Fgpup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/int128%2Fgpup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/int128","download_url":"https://codeload.github.com/int128/gpup/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/int128%2Fgpup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272821182,"owners_count":24998599,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-30T02:00:09.474Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","google-api","google-photos"],"created_at":"2024-08-01T15:02:36.430Z","updated_at":"2025-08-30T07:31:13.679Z","avatar_url":"https://github.com/int128.png","language":"Go","readme":"# gpup [![CircleCI](https://circleci.com/gh/int128/gpup.svg?style=shield)](https://circleci.com/gh/int128/gpup)\n\nA command to upload photos and movies to your Google Photos Library.\n\n\n## Getting Started\n\n### Setup\n\nYou can install this from brew tap or [releases](https://github.com/int128/gpup/releases).\n\n```sh\nbrew tap int128/gpup\nbrew install gpup\n```\n\nSetup your API access by the following steps:\n\n1. Open https://console.cloud.google.com/apis/library/photoslibrary.googleapis.com/\n1. Enable Photos Library API.\n1. Open https://console.cloud.google.com/apis/credentials\n1. Create an OAuth client ID where the application type is other.\n1. Run `gpup` and follow the instruction as follows.\n\n```\n% gpup\n2018/09/13 15:38:13 Skip reading ~/.gpupconfig: Could not open ~/.gpupconfig: open /user/.gpupconfig: no such file or directory\n2018/09/13 15:38:13 Setup your API access by the following steps:\n\n1. Open https://console.cloud.google.com/apis/library/photoslibrary.googleapis.com/\n1. Enable Photos Library API.\n1. Open https://console.cloud.google.com/apis/credentials\n1. Create an OAuth client ID where the application type is other.\n\nEnter your OAuth client ID (e.g. xxx.apps.googleusercontent.com): YOUR_CLIENT_ID.apps.googleusercontent.com\nEnter your OAuth client secret: YOUR_CLIENT_SECRET\n2018/09/13 15:38:22 Saved credentials to ~/.gpupconfig\n2018/09/13 15:38:22 Error: Nothing to upload\n```\n\n### Upload files to the library\n\nTo upload files in a folder to your Google Photos library:\n\n```\n$ gpup my-photos/\n2018/06/14 10:28:40 The following 2 files will be uploaded:\n  1: my-photos/travel.jpg\n  2: my-photos/lunch.jpg\n2018/06/14 10:28:40 Open http://localhost:8000 for authorization\n2018/06/14 10:28:43 GET /\n2018/06/14 10:28:49 GET /?state=...\u0026code=...\n2018/06/14 10:28:49 Saved token to ~/.gpupconfig\n2018/06/14 10:28:49 Queued 2 file(s)\n2018/06/14 10:28:49 Uploading travel.jpg\n2018/06/14 10:28:49 Uploading lunch.jpg\n2018/06/14 10:28:52 Adding 2 file(s) to the library\n```\n\nIt opens the browser and you can log in to the provider.\nAnd then it uploads files concurrently.\n\nYou can specify URLs as well.\n\n```sh\ngpup https://www.example.com/image.jpg\n```\n\n### Upload files to an album\n\nYou can upload files to the album by `-a` option.\nIf the album does not exist, it will be created.\n\n```sh\ngpup -a \"My Album\" my-photos/\n```\n\nYou can upload files to a new album by `-n` option.\n\n```sh\ngpup -n \"My Album\" my-photos/\n```\n\n\n## Usage\n\n```\nUsage:\n  gpup [OPTIONS] \u003cFILE | DIRECTORY | URL\u003e...\n\nApplication Options:\n  -a, --album=TITLE                 Add files to the album or a new album if it does not exist\n  -n, --new-album=TITLE             Add files to a new album\n      --request-header=KEY:VALUE    Add the header on fetching URLs\n      --request-auth=USER:PASS      Add the basic auth header on fetching URLs\n      --gpupconfig=                 Path to the config file (default: ~/.gpupconfig) [$GPUPCONFIG]\n      --debug                       Enable request and response logging [$DEBUG]\n\nOptions read from gpupconfig:\n      --google-client-id=           Google API client ID [$GOOGLE_CLIENT_ID]\n      --google-client-secret=       Google API client secret [$GOOGLE_CLIENT_SECRET]\n      --google-token=               Google API token [$GOOGLE_TOKEN]\n\nHelp Options:\n  -h, --help                        Show this help message\n```\n\n\n## Known issues\n\nSee [the Google Issue Tracker](https://issuetracker.google.com/issues?q=componentid:385336%20status:open) for the known issues.\n\n### Timestamp\n\nIf you upload an photo or movie without timestamp in the header, timestamp of the image will be current time.\nGoogle Photos Library API does not provide setting timestamp for now.\n\n### Photo storage and quality\n\nBy 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](https://developers.google.com/photos/library/guides/api-limits-quotas).\n\n```\nAll media items uploaded to Google Photos using the API are stored in full resolution at original quality. They count toward the user’s storage.\n```\n\nA workaround for this is to use [recover storage feature](https://support.google.com/photos/answer/6220791) of Google Photos, which lets you free up the storage space by converting all the files uploaded in original quality to high quality.\n\n## Contribution\n\nFeel free to open issues or pull requests.\n","funding_links":[],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fint128%2Fgpup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fint128%2Fgpup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fint128%2Fgpup/lists"}