diff --git a/Dockerfile b/Dockerfile index 60abb01..ff83b29 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,13 +15,52 @@ RUN npm install # Bundle app source COPY . . +RUN apt-get -y update +RUN apt install wget + +# PNG ,JPG ,Tiff & WebP support +# Consider adding more support with testing https://gist.github.com/hurricup/e14ae5bc47705fca6b1680e7a1fb6580 +RUN apt install -y libjpeg-dev +RUN apt install -y libpng-dev +RUN apt install -y libtiff-dev +RUN apt install -y libwebp-dev + +# Install HEIF support (libheic-dev Package does not exist on 16.04) +RUN apt-get -y install libde265-dev +RUN apt-get -y install pkg-config m4 libtool automake autoconf +RUN wget https://github.com/strukturag/libheif/archive/v1.4.0.tar.gz +RUN tar -xvf v1.4.0.tar.gz +WORKDIR /usr/src/app/libheif-1.4.0/ +RUN ./autogen.sh +RUN ./configure +RUN make +RUN make install + +WORKDIR /usr/src/app + +# Install ruby 2.3.0 for ImageMagick +RUN apt-get -y install build-essential zlib1g-dev libssl-dev libreadline6-dev libyaml-dev +RUN apt-get -y install wget && apt-get install -y ruby-full && ruby -v + +# Install ImageMagick +# RUN apt-get install imagemagick -y + +# # Install ImageMagick with WEBP and HEIC support +RUN wget https://download.imagemagick.org/ImageMagick/download/releases/ImageMagick-7.1.0-52.tar.gz +RUN tar -xvf ImageMagick-7.1.0-52.tar.gz +WORKDIR /usr/src/app/ImageMagick-7.1.0-52/ +RUN ./configure --with-heic=yes --with-webp=yes +RUN make +RUN make install +RUN ldconfig /usr/local/lib +RUN identify --version + + RUN apt-get update && apt-get install -y \ - imagemagick \ - graphicsmagick \ ghostscript \ && rm -rf /var/lib/apt/lists/* - +WORKDIR /usr/src/app RUN npm run build RUN npm install pm2 -g diff --git a/docker-compose.yml b/docker-compose.yml index 0ee4cdc..5da2a5f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,24 +1,7 @@ version: '2' services: - caddy-ims: - image: caddy:latest - container_name: caddy-service - restart: unless-stopped - command: caddy reverse-proxy --from imexmedia.duckdns.org --to ims:8000 - networks: - c2_proxy: - ipv4_address: 192.168.90.254 - ports: - - 80:80 - - 443:443 - volumes: - - caddy_data:/data - - caddy_config:/config ims: - container_name: ims - networks: - - c2_proxy ports: - 8000:8000 volumes: @@ -26,41 +9,7 @@ services: environment: - MEDIA_PATH=/media - DUPLICATE_BILL_TO_VENDOR=false - - IMS_TOKEN=test + - IMS_TOKEN= - CONVERT_QUALITY=0.5 - KEEP_CONVERTED_ORIGINALS=TRUE - image: imexonline/media-server:beta - restart: unless-stopped - - watchtower: - container_name: watchtower-ims - image: containrrr/watchtower - networks: - - c2_proxy - volumes: - - /var/run/docker.sock:/var/run/docker.sock - environment: - - TZ=America/Vancouver - - WATCHTOWER_CLEANUP=true - - WATCHTOWER_REMOVE_VOLUMES=true - - WATCHTOWER_INCLUDE_STOPPED=true - - WATCHTOWER_INCLUDE_RESTARTING=true - - WATCHTOWER_NO_STARTUP_MESSAGE=false - - WATCHTOWER_REVIVE_STOPPED=true - - WATCHTOWER_ROLLING_RESTART=true - - WATCHTOWER_TIMEOUT=60s - - WATCHTOWER_POLL_INTERVAL=3600 - restart: unless-stopped - -volumes: - ims: - caddy_data: - caddy_config: - -networks: - c2_proxy: - name: c2_proxy - driver: bridge - ipam: - config: - - subnet: 192.168.90.0/24 \ No newline at end of file + image: imexonline/media-server:beta \ No newline at end of file diff --git a/package.json b/package.json index cf850ef..ce66eb8 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,9 @@ "cors": "^2.8.5", "dotenv": "10.0.0", "express": "^4.17.3", - "ffmpeg-static": "^5.0.0", "file-type": "^16.5.3", "fs-extra": "^10.1.0", "gm": "^1.23.1", - "heic-convert": "^1.2.4", "helmet": "^5.0.2", "image-thumbnail": "^1.0.14", "jszip": "^3.10.0", diff --git a/util/generateThumbnail.ts b/util/generateThumbnail.ts index 36239ce..b98f265 100644 --- a/util/generateThumbnail.ts +++ b/util/generateThumbnail.ts @@ -8,7 +8,7 @@ import path from "path"; import { logger } from "../server"; import { AssetPaths, FolderPaths } from "./serverInit"; const simpleThumb = require("simple-thumbnail"); -const ffmpeg = require("ffmpeg-static"); +//const ffmpeg = require("ffmpeg-static"); var Bluebird = require("bluebird"); @@ -43,7 +43,7 @@ export default async function GenerateThumbnail( await GeneratePdfThumbnail(file, thumbPath); } else if (type?.mime.startsWith("video")) { await simpleThumb(file, thumbPath, "250x?", { - path: ffmpeg, + // path: ffmpeg, }); } else { logger.debug("Thumbnail being created for : " + thumbPath); @@ -97,7 +97,7 @@ export async function GenerateOptimized( await GeneratePdfThumbnail(file, thumbPath); } else if (type?.mime.startsWith("video")) { await simpleThumb(file, thumbPath, "250x?", { - path: ffmpeg, + // path: ffmpeg, }); } else { logger.debug("Optimized image being created for : " + thumbPath); diff --git a/util/heicConverter.ts b/util/heicConverter.ts index f93727b..0fecc5b 100644 --- a/util/heicConverter.ts +++ b/util/heicConverter.ts @@ -1,5 +1,3 @@ - - import fs from "fs-extra"; import dotenv from "dotenv"; @@ -9,7 +7,9 @@ import path, { resolve } from "path"; import { logger } from "../server"; import { FolderPaths } from "./serverInit"; -const heicConverter = require("heic-convert"); +//const heicConverter = require("heic-convert"); +import gm from "gm"; +var imageMagick = gm.subClass({ imageMagick: true }); //gm.subClass(); dotenv.config({ @@ -59,10 +59,12 @@ export async function ConvertHeicFiles(files: Express.Multer.File[]) { async function ConvertToJpeg(file: string, newPath: string) { const fileOnDisk: Buffer = await fs.readFile(file); - const outputBuffer = await heicConverter({ - buffer: fileOnDisk, // the HEIC file buffer - format: "JPEG", // output format - quality: process.env.CONVERT_QUALITY || 0.5, // the jpeg compression quality, between 0 and 1 + return new Promise((resolve, reject) => { + const result = imageMagick(fileOnDisk) + .setFormat("jpg") + .write(newPath, (error) => { + if (error) reject(error.message); + resolve(newPath); + }); }); - return await fs.writeFile(newPath, outputBuffer); } diff --git a/yarn.lock b/yarn.lock index 843903b..c7725e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,16 +28,6 @@ enabled "2.0.x" kuler "^2.0.0" -"@derhuerst/http-basic@^8.2.0": - version "8.2.2" - resolved "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.2.tgz" - integrity sha512-ek065nW95mleLHo8vZ+ob7QTQPNOwDEjCe27BX2flme/UTu9z2mD1uRRPko38u7al4tTZADMtozpll8PQHAZgg== - dependencies: - caseless "^0.12.0" - concat-stream "^1.6.2" - http-response-object "^3.0.1" - parse-cache-control "^1.0.1" - "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" @@ -159,11 +149,6 @@ resolved "https://registry.npmjs.org/@types/node/-/node-16.11.32.tgz" integrity sha512-+fnfNvG5JQdC1uGZiTx+0QVtoOHcggy6+epx65JYroPGsE1uhp+vo5kioiGKsAkor6ocwHteU2EvO7N8vtOZtA== -"@types/node@^10.0.3": - version "10.17.60" - resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - "@types/qs@*": version "6.9.7" resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" @@ -213,13 +198,6 @@ acorn@^8.4.1: resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - ansi-align@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" @@ -444,11 +422,6 @@ camelcase@^6.2.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caseless@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - chalk@^4.1.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -552,7 +525,7 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.2, concat-stream@^1.6.2: +concat-stream@^1.5.2: version "1.6.2" resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -639,13 +612,6 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -769,11 +735,6 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" @@ -836,16 +797,6 @@ fecha@^4.2.0: resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== -ffmpeg-static@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.0.0.tgz" - integrity sha512-z96jGVa8uCVMnyrTvbDZe0d5zbvIVQnfBN+vKDZoVK+ssYpfUJGEmo2DkuY43CA9Ytlsk+5ZVTFTqzvKw1gSaA== - dependencies: - "@derhuerst/http-basic" "^8.2.0" - env-paths "^2.2.0" - https-proxy-agent "^5.0.0" - progress "^2.0.3" - file-stream-rotator@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz" @@ -1046,22 +997,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -heic-convert@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/heic-convert/-/heic-convert-1.2.4.tgz#605820f98ace3949a40fc7b263ee0bc573a0176b" - integrity sha512-klJHyv+BqbgKiCQvCqI9IKIvweCcohDuDl0Jphearj8+16+v8eff2piVevHqq4dW9TK0r1onTR6PKHP1I4hdbA== - dependencies: - heic-decode "^1.1.2" - jpeg-js "^0.4.1" - pngjs "^3.4.0" - -heic-decode@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/heic-decode/-/heic-decode-1.1.2.tgz#974701666432e31ed64b2263a1ece7cff5218209" - integrity sha512-UF8teegxvzQPdSTcx5frIUhitNDliz/9Pui0JFdIqVRE00spVE33DcCYtZqaLNyd4y5RP/QQWZFIc1YWVKKm2A== - dependencies: - libheif-js "^1.10.0" - helmet@^5.0.2: version "5.1.0" resolved "https://registry.npmjs.org/helmet/-/helmet-5.1.0.tgz" @@ -1083,21 +1018,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-response-object@^3.0.1: - version "3.0.2" - resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" - integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== - dependencies: - "@types/node" "^10.0.3" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -1268,11 +1188,6 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -jpeg-js@^0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" - integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== - json-buffer@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" @@ -1316,11 +1231,6 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.0" -libheif-js@^1.10.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/libheif-js/-/libheif-js-1.12.0.tgz#9ad1ed16a8e6412b4d3d83565d285465a00e7305" - integrity sha512-hDs6xQ7028VOwAFwEtM0Q+B2x2NW69Jb2MhQFUbk3rUrHzz4qo5mqS8VrqNgYnSc8TiUGnR691LnO4uIfEE23w== - lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" @@ -1463,11 +1373,6 @@ ms@2.0.0: resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -1630,11 +1535,6 @@ pako@~1.0.2: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== -parse-cache-control@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" - integrity sha1-juqz5U+laSD+Fro493+iGqzC104= - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" @@ -1655,11 +1555,6 @@ picomatch@^2.0.4, picomatch@^2.2.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pngjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - prebuild-install@^6.1.2: version "6.1.4" resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz" @@ -1689,11 +1584,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz"