Break free from the 25-file download limit
A powerful CLI tool to bulk download your entire GoPro Plus media library without restrictions.
Features β’ Quick Start β’ Contributing β’ Troubleshooting
This tool lets you download your entire media library in bulk, making it easy to:
- π€ Migrate to Google Drive, Dropbox, or any cloud storage
- πΎ Backup to your self-hosted NAS (Synology, TrueNAS, etc.)
- π¬ Access your full media collection offline
- οΏ½ Automate regular backups with Docker
- π¦ Bulk Download - Download all your GoPro Plus media without the 25-file limit
- π Idempotent Downloads - Safely re-run downloads; already downloaded files are automatically skipped
- π Automatic Retry - Network failures are handled with exponential backoff retry logic (restarts from scratch on failure)
- π³ Docker Support - Run in a containerized environment for easy deployment
- π₯οΈ CLI Interface - Full command-line control with flexible options
- Go to GoPro Plus Media Library and log in
- Press
F12to open Developer Tools - Go to Application tab (Chrome/Edge) or Storage tab (Firefox/Safari)
- Click Cookies β Select
https://plus.gopro.com - Copy these values:
gp_access_tokenβ This is yourAUTH_TOKENgp_user_idβ This is yourUSER_ID
Choose your preferred method:
π³ Option A: Docker
# Paste your credentials from step 1
export AUTH_TOKEN='your_token_here'
export USER_ID='your_user_id_here'
# Download all media
docker run --name gopro-downloader \
-e AUTH_TOKEN="${AUTH_TOKEN}" \
-e USER_ID="${USER_ID}" \
-v ~/gopro-downloads:/app/download \
maxrodrigo/gopro:latestYour files will be in ~/gopro-downloads/
π» Option B: Direct (Python 3.10+)
# Paste your credentials from step 1
export AUTH_TOKEN='your_token_here'
export USER_ID='your_user_id_here'
# Clone and setup
git clone https://github.com/maxrodrigo/gopro-plus.git
cd gopro-plus
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -r requirements.txt
# Download all media
./goproYour files will be in ./download/
Want to see what will be downloaded first?
# Docker
docker run -e AUTH_TOKEN="${AUTH_TOKEN}" -e USER_ID="${USER_ID}" -e DRY_RUN=true maxrodrigo/gopro:latest
# Direct
./gopro --dry-runPrerequisites: Get your AUTH_TOKEN and USER_ID from Environment Variables section below.
docker run --name gopro-downloader \
-e AUTH_TOKEN='<YOUR_TOKEN>' \
-e USER_ID='<YOUR_USER_ID>' \
-v /path/to/download:/app/download \
maxrodrigo/gopro:latest| Variable | Required | Default | Description |
|---|---|---|---|
AUTH_TOKEN |
β Yes | - | Authentication token from GoPro Media Library |
USER_ID |
β Yes | - | User ID from GoPro Media Library |
DRY_RUN |
β No | false |
Set to true to preview without downloading |
START_PAGE |
β No | 1 |
Starting page number |
PAGES |
β No | 1000000 |
Number of pages to process |
PER_PAGE |
β No | 15 |
Items per page |
PROGRESS_MODE |
β No | noline |
Progress display: inline, newline, or noline |
To set up AUTH_TOKEN and USER_ID, you need to extract them from your GoPro Plus account.
- Go to GoPro Plus Media Library and log in
- Open your browser's Developer Tools:
- Chrome/Edge: Press
F12β Go to Application tab β Cookies βhttps://plus.gopro.com - Firefox: Press
F12β Go to Storage tab β Cookies βhttps://plus.gopro.com - Safari:
Cmd+Option+Iβ Go to Storage tab β Cookies βplus.gopro.com
- Chrome/Edge: Press
- Find and copy these cookie values:
gp_access_tokenβ Copy the Value (starts witheyJhbGc...)gp_user_idβ Copy the Value
- Go to GoPro Plus Media Library and log in
- Open Developer Tools (
F12orCtrl+Shift+I/Cmd+Option+I) - Go to the Network tab
- In the filter field, type:
user - Refresh the page if needed
- Click on any request and find the Cookies tab
- Look for these cookies:
gp_access_token- starts witheyJhbGc...β Copy toAUTH_TOKENgp_user_id- the user ID β Copy toUSER_ID
For Docker:
docker run -e AUTH_TOKEN=<gopro-auth-token> -e USER_ID=<gopro-user-id> maxrodrigo/gopro:latestFor Linux/macOS:
export AUTH_TOKEN="<gibberish_string_here>"
export USER_ID="<user-id>"For Windows Command Prompt:
set AUTH_TOKEN="<gibberish_string_here>"
set USER_ID="<user-id>"For Windows PowerShell:
$env:AUTH_TOKEN="<gibberish_string_here>"
$env:USER_ID="<user-id>"Once the AUTH_TOKEN and USER_ID are set, you can run the application without passing them explicitly each time.
docker logs gopro-downloader- Authentication failed: Your
AUTH_TOKENorUSER_IDmay have expired. Re-authenticate and update your environment variables. - Download stuck: The script validates existing files before downloading. For large ZIP files, this may take a moment.
- File already exists: The script is idempotent - it will skip files that are already fully downloaded.
Important: When a download fails and retries, it restarts from the beginning. ZIP files are dynamically generated by the GoPro API and cannot be resumed without corruption.
If you experience repeated download failures:
-
Reduce items per page - Smaller ZIP files are more reliable and faster to download
# Instead of default 30 items per page ./gopro --per-page 10 # For very unstable connections, try even smaller batches ./gopro --per-page 5
-
Increase retry attempts - Give the script more chances to complete the download
./gopro --max-retries 10
-
Process fewer pages at a time - Download in smaller batches
# Download pages 1-5 ./gopro --start-page 1 --pages 5 # Then continue with pages 6-10 ./gopro --start-page 6 --pages 5
Recommended strategy for unreliable connections:
./gopro --per-page 10 --max-retries 10 --progress-mode newlineThis creates smaller, more manageable ZIP files that are less likely to fail and faster to retry if they do.
Interested in contributing? Check out CONTRIBUTING.md for:
- π» Local development setup
- π³ Docker development workflow
- π Coding guidelines
- π Contribution workflow
This project is open source. Check the LICENSE file for details.
If this tool helped you, consider giving it a β on GitHub!