add readme
This commit is contained in:
parent
005c2970f7
commit
690cd31a40
3 changed files with 107 additions and 17 deletions
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
101
README.md
Normal file
101
README.md
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
Sure! Here's a clean and minimal `README.md` for your Immich album downloader project, including setup instructions and the example `systemd` service and timer:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Immich Album Downloader
|
||||||
|
|
||||||
|
This Python script downloads all assets (photos/videos) from a specific album in your [Immich](https://github.com/immich-app/immich) instance, using its API. It supports resuming by skipping files that already exist locally.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Downloads all assets from a specified album
|
||||||
|
- Uses pagination to handle large albums
|
||||||
|
- Skips already-downloaded files
|
||||||
|
- Can be automated with `systemd` services and timers
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
You can install dependencies with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install requests
|
||||||
|
```
|
||||||
|
or you can use your system's package manager.
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
|------------------------|----------------------------------------|
|
||||||
|
| `IMMICH_API_KEY` | Your Immich API key |
|
||||||
|
| `IMMICH_INSTANCE_URL` | Immich instance URL (e.g. `https://your-instance/api`) |
|
||||||
|
| `IMMICH_ALBUM_ID` | The ID of the album to download |
|
||||||
|
| `IMMICH_DOWNLOAD_PATH` | Directory to save downloaded assets |
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
You can run the script manually:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Or set it up as a `systemd` service for automatic and scheduled execution.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Example: systemd Service
|
||||||
|
|
||||||
|
Create a service file at `/etc/systemd/user/immich-album-downloader.service`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Immich Album Downloader
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Environment="IMMICH_ALBUM_ID=my-super-cool-album-id"
|
||||||
|
Environment="IMMICH_API_KEY=averysecretapikeypleasedonotsteal"
|
||||||
|
Environment="IMMICH_DOWNLOAD_PATH=/home/marco/wallapers/"
|
||||||
|
Environment="IMMICH_INSTANCE_URL=https://your-immich.instance/api"
|
||||||
|
ExecStart=/usr/bin/python3 /opt/immich-album-downloader/main.py
|
||||||
|
Restart=no
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable and start the service:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
systemctl --user daemon-reexec
|
||||||
|
systemctl --user enable --now immich-album-downloader.service
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Example: systemd Timer
|
||||||
|
|
||||||
|
To run the download periodically, create `/etc/systemd/user/immich-album-downloader.timer`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Download an Immich album periodically
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnBootSec=15m
|
||||||
|
OnUnitActiveSec=6h
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable the timer:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
systemctl --user enable --now immich-album-downloader.timer
|
||||||
|
```
|
||||||
|
|
||||||
|
This will trigger the album download 15 minutes after boot and then every 6 hours.
|
||||||
|
|
||||||
|
---
|
17
main.py
17
main.py
|
@ -13,23 +13,6 @@ IMMICH_INSTANCE_URL = os.getenv('IMMICH_INSTANCE_URL')
|
||||||
ALBUM_ID = os.getenv('IMMICH_ALBUM_ID')
|
ALBUM_ID = os.getenv('IMMICH_ALBUM_ID')
|
||||||
DOWNLOAD_PATH = Path(os.getenv('IMMICH_DOWNLOAD_PATH', './downloads'))
|
DOWNLOAD_PATH = Path(os.getenv('IMMICH_DOWNLOAD_PATH', './downloads'))
|
||||||
|
|
||||||
|
|
||||||
# def get_album_id():
|
|
||||||
# """Get album ID by name from Immich API"""
|
|
||||||
# headers = {'x-api-key': IMMICH_API_KEY}
|
|
||||||
# response = requests.get(
|
|
||||||
# f"{IMMICH_INSTANCE_URL}/albums",
|
|
||||||
# headers=headers,
|
|
||||||
# params={'albumName': ALBUM_NAME}
|
|
||||||
# )
|
|
||||||
# response.raise_for_status()
|
|
||||||
#
|
|
||||||
# for album in response.json():
|
|
||||||
# if album['albumName'] == ALBUM_NAME:
|
|
||||||
# return album['id']
|
|
||||||
# raise ValueError(f"Album '{ALBUM_NAME}' not found")
|
|
||||||
|
|
||||||
|
|
||||||
def get_album_assets(album_id):
|
def get_album_assets(album_id):
|
||||||
"""Retrieve all assets in album with pagination"""
|
"""Retrieve all assets in album with pagination"""
|
||||||
headers = {'x-api-key': IMMICH_API_KEY}
|
headers = {'x-api-key': IMMICH_API_KEY}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue