diff --git a/.env.example b/.env.example index a577f2a..614bd19 100644 --- a/.env.example +++ b/.env.example @@ -4,8 +4,8 @@ GIT_BRANCH=main GIT_REPO_URL=https://github.com/your-org/your-repo.git BLENDER_PATH=/Applications/Blender.app/Contents/MacOS/Blender -# Nextcloud Drive (WebDAV) +# Nextcloud Drive (public share WebDAV) NEXTCLOUD_URL=https://cloud.example.com -NEXTCLOUD_USER=your-nextcloud-username -NEXTCLOUD_PASSWORD=your-nextcloud-password +NEXTCLOUD_SHARE_TOKEN=your-public-share-token +NEXTCLOUD_SHARE_PASSWORD= NEXTCLOUD_BASE_PATH=Models \ No newline at end of file diff --git a/README.md b/README.md index 3931d98..ea31454 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,10 @@ GIT_BRANCH=main GIT_REPO_URL=https://github.com/your-org/your-repo.git BLENDER_PATH=/Applications/Blender.app/Contents/MacOS/Blender -# Nextcloud Drive (WebDAV) +# Nextcloud Drive (public share WebDAV) NEXTCLOUD_URL=https://cloud.example.com -NEXTCLOUD_USER=your-nextcloud-username -NEXTCLOUD_PASSWORD=your-nextcloud-password +NEXTCLOUD_SHARE_TOKEN=your-public-share-token +NEXTCLOUD_SHARE_PASSWORD= NEXTCLOUD_BASE_PATH=Models ``` @@ -51,8 +51,8 @@ NEXTCLOUD_BASE_PATH=Models | `GIT_REPO_URL` | Target GitHub repository URL | Yes | | `BLENDER_PATH` | Path to Blender binary (default: `blender`) | No | | `NEXTCLOUD_URL` | Nextcloud instance URL | Yes | -| `NEXTCLOUD_USER` | Nextcloud username (Basic auth) | Yes | -| `NEXTCLOUD_PASSWORD` | Nextcloud password (Basic auth) | Yes | +| `NEXTCLOUD_SHARE_TOKEN` | Public share token (the part after `/s/` in the share link) | Yes | +| `NEXTCLOUD_SHARE_PASSWORD` | Public share password (empty if none) | No | | `NEXTCLOUD_BASE_PATH` | Root folder on the Drive (default: `Models`) | No | > To create a GitHub token: GitHub > Settings > Developer settings > Fine-grained personal access tokens > select the target repo > Permissions > Contents: Read and write. @@ -78,8 +78,7 @@ docker run -p 3000:3000 \ -e GITHUB_TOKEN=ghp_xxx \ -e GIT_REPO_URL=https://github.com/org/repo.git \ -e NEXTCLOUD_URL=https://cloud.example.com \ - -e NEXTCLOUD_USER=user \ - -e NEXTCLOUD_PASSWORD=pass \ + -e NEXTCLOUD_SHARE_TOKEN=your-share-token \ upload-gltf ``` diff --git a/app/api/upload/drive/route.ts b/app/api/upload/drive/route.ts index cd8f842..c71316f 100644 --- a/app/api/upload/drive/route.ts +++ b/app/api/upload/drive/route.ts @@ -35,9 +35,9 @@ export async function POST(req: NextRequest) { if (authError) return authError // --- Check Nextcloud config --- - if (!process.env.NEXTCLOUD_URL || !process.env.NEXTCLOUD_USER || !process.env.NEXTCLOUD_PASSWORD) { + if (!process.env.NEXTCLOUD_URL || !process.env.NEXTCLOUD_SHARE_TOKEN) { return NextResponse.json( - { success: false, error: 'Nextcloud non configure sur le serveur' }, + { success: false, error: 'Nextcloud non configure sur le serveur (NEXTCLOUD_URL, NEXTCLOUD_SHARE_TOKEN)' }, { status: 500 }, ) } diff --git a/app/api/upload/git/route.ts b/app/api/upload/git/route.ts index f8705c9..956d08d 100644 --- a/app/api/upload/git/route.ts +++ b/app/api/upload/git/route.ts @@ -108,9 +108,11 @@ export async function POST(req: NextRequest) { const isModel = MODEL_EXTENSIONS.has(ext) if (isModel) { - // Model: always re-push since compression makes size comparison unreliable + // Model: always re-push since compression makes size comparison unreliable. + // Mark as 'unchanged' for the commit message when the folder already exists, + // because we can't know if the model really changed after Blender compression. const remoteSize = remoteFileMap.get(filename.toLowerCase()) - fileChanges.set(filename.toLowerCase(), remoteSize === undefined ? 'new' : 'changed') + fileChanges.set(filename.toLowerCase(), remoteSize === undefined ? 'new' : 'unchanged') changedFilesToPush.push(f) } else { // Texture: compare by size diff --git a/components/UploadZone.tsx b/components/UploadZone.tsx index 9cb4180..7b3e409 100644 --- a/components/UploadZone.tsx +++ b/components/UploadZone.tsx @@ -278,7 +278,7 @@ export default function UploadZone() { // ---- Step 1: Drive upload ---- updateEntry(i, { status: 'uploading', - progress: 0, + progress: 1, error: undefined, driveStatus: 'uploading', driveError: undefined, @@ -300,7 +300,7 @@ export default function UploadZone() { return } - updateEntry(i, { driveStatus: 'success' }) + updateEntry(i, { driveStatus: 'success', progress: 50 }) // ---- Step 2: Git upload ---- await pushGit(i, controller.signal) @@ -314,13 +314,11 @@ export default function UploadZone() { const pushGit = async (index: number, signal?: AbortSignal) => { const folderEntry = entries[index] - updateEntry(index, { progress: 5 }) - const gitResult = await uploadGit( folderEntry, secret, destination!, - (pct) => updateEntry(index, { progress: pct }), + (pct) => updateEntry(index, { progress: 50 + Math.round(pct / 2) }), signal, ) diff --git a/components/upload/FolderCard.tsx b/components/upload/FolderCard.tsx index 0960e03..2704b7f 100644 --- a/components/upload/FolderCard.tsx +++ b/components/upload/FolderCard.tsx @@ -62,7 +62,7 @@ export default function FolderCard({ entry, index, onToggleViewer, onRemove }: F Dossier