diff --git a/README.md b/README.md index fb6ea14..6a3442b 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,22 @@ -# Immich Drop Uploader +# File Drop Uploader -A tiny web app for collecting photos/videos into your **Immich** server. +A tiny web app for collecting photos/videos and saving them to the local filesystem. Admin users log in to create public invite links; invite links are always public-by-URL. A public uploader page is optional and disabled by default. -![Immich Drop Uploader Dark Mode UI](./screenshot.png) +![File Drop Uploader Dark Mode UI](./screenshot.png) ## Features -- **Invite Links:** public-by-URL links for uploads; one-time or multi-use -- **Manage Links:** search/sort, enable/disable, delete, edit name/expiry -- **Row Actions:** icon-only actions with tooltips (Open, Copy, Details, QR, Save) -- **Passwords (optional):** protect invites with a password gate -- **Albums (optional):** upload into a specific album (auto-create supported) -- **Duplicate Prevention:** local SHA‑1 cache (+ optional Immich bulk-check) -- **Progress Queue:** WebSocket updates; retry failed items -- **Chunked Uploads (optional):** large-file support with configurable chunk size -- **Privacy-first:** never lists server media; session-local uploads only -- **Mobile + Dark Mode:** responsive UI, safe-area padding, persistent theme +- **Local Saving:** All uploaded files are saved to the local filesystem. +- **Invite Links:** Create public-by-URL links for uploads; one-time or multi-use. +- **Manage Links:** Search/sort, enable/disable, delete, edit name/expiry. +- **Passwords (optional):** Protect invites with a password gate. +- **Albums:** Upload into a specific folder (auto-create supported). Preserves client-side folder structure on upload. +- **Duplicate Prevention:** Local SHA‑1 cache prevents re-uploading the same file. +- **Telegram Notifications:** Get notified via Telegram when upload batches are complete. +- **Progress Queue:** WebSocket updates; see upload progress in real-time. +- **Chunked Uploads (optional):** Large-file support with configurable chunk size. +- **Mobile + Dark Mode:** Responsive UI, safe-area padding, persistent theme. --- @@ -54,15 +54,14 @@ services: # Configure all settings here (no .env required) environment: - # Immich connection (must include /api) - IMMICH_BASE_URL: https://immich.example.com/api - IMMICH_API_KEY: ${IMMICH_API_KEY} - # Optional behavior - IMMICH_ALBUM_NAME: dead-drop PUBLIC_UPLOAD_PAGE_ENABLED: "false" # keep disabled by default PUBLIC_BASE_URL: https://drop.example.com + # Telegram Bot for notifications (optional) + #TELEGRAM_BOT_API_KEY: "YOUR_BOT_API_KEY" + #TELEGRAM_BOT_OWNER_ID: "YOUR_TELEGRAM_USER_ID" + # Large files: chunked uploads (bypass 100MB proxy limits) CHUNKED_UPLOADS_ENABLED: "false" # enable chunked uploads CHUNK_SIZE_MB: "95" # per-chunk size (MB) @@ -98,62 +97,22 @@ docker compose up -d ``` --- -## What's New - -### v0.5.0 – Manage Links overhaul -- In-panel bulk actions footer (Delete/Enable/Disable stay inside the box) -- Per-row icon actions with tooltips; Save button lights up only on changes -- Per-row QR modal; Details modal close fixed and reliable -- Auto-refresh after creating a link; new row is highlighted and scrolled into view -- Expiry save fix: stores end-of-day to avoid off-by-one date issues - -Roadmap highlight -- We’d like to add a per-user UI and remove reliance on a fixed API key by allowing users to authenticate and provide their own Immich API tokens. This is not in scope for the initial versions but aligns with future direction. -- The frontend automatically switches to chunked mode only for files larger than the configured chunk size. - -### 📱 Device‑Flexible HMI (New) -- Fully responsive UI with improved spacing and wrapping for small and large screens. -- Mobile‑safe file picker and a sticky bottom “Choose files” bar on phones. -- Safe‑area padding for devices with notches; refined dark/light theme behavior. -- Desktop keeps the dropzone clickable; touch devices avoid accidental double‑open. - -### ♻️ Reliability & Quality of Life (New) -- Retry button to re‑attempt any failed upload without re‑selecting the file. -- Progress and status updates are more resilient to late/reordered WebSocket events. -- Invites can be created without an album, keeping uploads unassigned when preferred. - -### Last 8 Days – Highlights -- Added chunked uploads with configurable chunk size. -- Added optional passwords for invite links with in‑UI unlock prompt. -- Responsive HMI overhaul: mobile‑safe picker, sticky mobile action bar, safe‑area support. -- Retry for failed uploads and improved progress handling. -- Support for invites with no album association. - -### 🌙 Dark Mode -- Automatic or manual toggle; persisted preference - -### 📁 Album Integration -- Auto-create + assign album if configured; optional invites without album - ---- - ## Chunked Uploads - Enable chunked uploads by setting `CHUNKED_UPLOADS_ENABLED=true`. - Configure chunk size with `CHUNK_SIZE_MB` (default: `95`). The client only uses chunked mode for files larger than this. -- Intended to bypass upstream limits (e.g., 100MB) while preserving duplicate checks, EXIF timestamps, album add, and per‑item progress via WebSocket. +- Intended to bypass upstream proxy limits (e.g., 100MB) while preserving duplicate checks, EXIF timestamps, album add, and per‑item progress via WebSocket. --- ## Architecture -- **Frontend:** static HTML/JS (Tailwind). Drag & drop or "Choose files", queue UI with progress and status chips. -- **Backend:** FastAPI + Uvicorn. - - Proxies uploads to Immich `/assets` - - Computes SHA‑1 and checks a local SQLite cache (`state.db`) - - Optional Immich de‑dupe via `/assets/bulk-upload-check` - - WebSocket `/ws` pushes per‑item progress to the current browser session only -- **Persistence:** local SQLite (`state.db`) prevents re‑uploads across sessions/runs. +- **Frontend:** static HTML/JS (Tailwind). Drag & drop or "Choose files", queue UI with progress and status chips. +- **Backend:** FastAPI + Uvicorn. + - Saves uploaded files to the local filesystem. + - Computes SHA‑1 and checks a local SQLite cache (`state.db`) to prevent duplicates. + - WebSocket `/ws` pushes per‑item progress to the current browser session only. +- **Persistence:** A local SQLite database (`state.db`) prevents re‑uploads across sessions. Uploaded files are stored in `/data/uploads`. --- @@ -187,7 +146,6 @@ immich_drop/ ## Requirements - **Python** 3.11 -- An **Immich** server + **API key** --- # Local dev quickstart @@ -211,20 +169,16 @@ The backend contains docstrings so you can generate docs later if desired. HOST=0.0.0.0 PORT=8080 -# Immich connection (include /api) -IMMICH_BASE_URL=http://REPLACE_ME:2283/api -IMMICH_API_KEY=ADD-YOUR-API-KEY # needs: asset.upload; for albums also: album.create, album.read, albumAsset.create -MAX_CONCURRENT=3 - # Public uploader page (optional) — disabled by default PUBLIC_UPLOAD_PAGE_ENABLED=TRUE -# Album (optional): auto-add uploads from public uploader to this album (creates if needed) -IMMICH_ALBUM_NAME=dead-drop - # Local dedupe cache (SQLite) STATE_DB=./data/state.db +# Telegram Bot for notifications (optional) +#TELEGRAM_BOT_API_KEY= +#TELEGRAM_BOT_OWNER_ID= + # Base URL for generating absolute invite links (recommended for production) # e.g., PUBLIC_BASE_URL=https://photos.example.com #PUBLIC_BASE_URL=