diff --git a/Dockerfile b/Dockerfile index e947adf..7c6c366 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,8 +27,9 @@ COPY --from=frontend-build /build/frontend/dist ./frontend/dist # Data directory for SQLite RUN mkdir -p /app/data +# ffmpeg for video poster/metadata extraction at upload time # Health check utility -RUN apk add --no-cache wget +RUN apk add --no-cache wget ffmpeg EXPOSE 8000 diff --git a/backend/routes/upload.js b/backend/routes/upload.js index 76ccfdd..3c9ed41 100644 --- a/backend/routes/upload.js +++ b/backend/routes/upload.js @@ -8,6 +8,7 @@ const { URL } = require('url'); const { authMiddleware } = require('../auth'); const { getBoard, getCollectionMember, createImage } = require('../db'); const { putBuffer, getImageUrl, MIME_TO_EXT, MAX_FILE_SIZE } = require('../minio'); +const { probeVideo, extractPoster } = require('../video-utils'); const router = Router(); @@ -89,17 +90,43 @@ function classifyMedia(mimeType) { } /** - * Upload a media file (image or video) to MinIO as a single file. - * GPU handles all image scaling natively — no LOD tiers needed. + * Upload a media file (image or video) to MinIO. + * For videos: extracts poster frame + metadata via ffmpeg at upload time + * so the board never needs a