From a8220172f8b2d5d30484f433187d95def84a1576 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 11 Jun 2022 16:12:06 -0500 Subject: [PATCH] WIP refactor container and queuing system (#206) * refactor microservices to machine-learning * Update tGithub issue template with correct task syntax * Added microservices container * Communicate between service based on queue system * added dependency * Fixed problem with having to import BullQueue into the individual service * Added todo * refactor server into monorepo with microservices * refactor database and entity to library * added simple migration * Move migrations and database config to library * Migration works in library * Cosmetic change in logging message * added user dto * Fixed issue with testing not able to find the shared library * Clean up library mapping path * Added webp generator to microservices * Update Github Action build latest * Fixed issue NPM cannot install due to conflict witl Bull Queue * format project with prettier * Modified docker-compose file * Add GH Action for Staging build: * Fixed GH action job name * Modified GH Action to only build & push latest when pushing to main * Added Test 2e2 Github Action * Added Test 2e2 Github Action * Implemented microservice to extract exif * Added cronjob to scan and generate webp thumbnail at midnight * Refactor to ireduce hit time to database when running microservices * Added error handling to asset services that handle read file from disk * Added video transcoding queue to process one video at a time * Fixed loading spinner on web while loading covering the info panel * Add mechanism to show new release announcement to web and mobile app (#209) * Added changelog page * Fixed issues based on PR comments * Fixed issue with video transcoding run on the server * Change entry point content for backward combatibility when starting up server * Added announcement box * Added error handling to failed silently when the app version checking is not able to make the request to GITHUB * Added new version announcement overlay * Update message * Added messages * Added logic to check and show announcement * Add method to handle saving new version * Added button to dimiss the acknowledge message * Up version for deployment to the app store --- .github/ISSUE_TEMPLATE/bug_report.md | 8 +- .../workflows/build_push_docker_latest.yml | 27 +- .../workflows/build_push_docker_staging.yml | 95 ++ docker/docker-compose.dev.yml | 29 +- docker/docker-compose.staging.yml | 39 +- docker/docker-compose.yml | 26 +- .../.dockerignore | 0 .../.eslintrc.js | 0 .../.gitignore | 4 +- .../.prettierrc | 0 .../Dockerfile | 0 {microservices => machine-learning}/README.md | 0 .../entrypoint.sh | 0 .../nest-cli.json | 0 .../package-lock.json | 0 .../package.json | 0 .../src/app.module.ts | 0 .../src/config/database.config.ts | 0 .../image-classifier.controller.ts | 2 +- .../image-classifier.module.ts | 0 .../image-classifier.service.ts | 0 .../src/main.ts | 4 +- .../object-detection.controller.ts | 2 +- .../object-detection.module.ts | 0 .../object-detection.service.ts | 0 .../tsconfig.build.json | 0 .../tsconfig.json | 0 machine_learning/.dockerignore | 1 - machine_learning/.gitignore | 3 - machine_learning/Dockerfile | 25 - machine_learning/app/__init__.py | 0 machine_learning/app/cars.jpg | Bin 197210 -> 0 bytes .../app/image_classifier/__init__.py | 0 .../app/image_classifier/image_classifier.py | 37 - .../app/imagenet_class_index.json | 1002 ----------------- machine_learning/app/main.py | 46 - .../app/object_detection/__init__.py | 0 .../app/object_detection/object_detection.py | 4 - machine_learning/app/test.png | Bin 353075 -> 0 bytes machine_learning/requirements.txt | 8 - .../android/app/src/main/AndroidManifest.xml | 7 + .../metadata/android/en-US/changelogs/17.txt | 1 + mobile/ios/Runner/Info.plist | 8 +- mobile/ios/fastlane/Fastfile | 2 +- mobile/lib/constants/hive_box.dart | 4 + mobile/lib/main.dart | 21 +- .../providers/release_info.provider.dart | 57 + .../providers/server_info.provider.dart | 5 - .../shared/services/server_info.service.dart | 18 +- .../views/version_announcement_overlay.dart | 133 +++ mobile/pubspec.lock | 56 + mobile/pubspec.yaml | 3 +- server/Dockerfile | 2 +- .../src/api-v1/asset/asset.controller.ts | 30 +- .../immich}/src/api-v1/asset/asset.module.ts | 36 +- .../immich}/src/api-v1/asset/asset.service.ts | 259 +++-- .../src/api-v1/asset/dto/create-asset.dto.ts | 2 +- .../src/api-v1/asset/dto/create-exif.dto.ts | 0 .../src/api-v1/asset/dto/delete-asset.dto.ts | 0 .../asset/dto/get-all-asset-query.dto.ts | 0 .../asset/dto/get-all-asset-response.dto.ts | 2 +- .../src/api-v1/asset/dto/get-asset.dto.ts | 0 .../asset/dto/get-new-asset-query.dto.ts | 0 .../src/api-v1/asset/dto/search-asset.dto.ts | 0 .../src/api-v1/asset/dto/serve-file.dto.ts | 0 .../src/api-v1/asset/dto/update-asset.dto.ts | 0 .../src/api-v1/asset/dto/update-exif.dto.ts | 0 .../src/api-v1/auth/auth.controller.ts | 2 +- .../immich}/src/api-v1/auth/auth.module.ts | 2 +- .../immich}/src/api-v1/auth/auth.service.ts | 2 +- .../src/api-v1/auth/dto/jwt-payload.dto.ts | 0 .../api-v1/auth/dto/login-credential.dto.ts | 0 .../src/api-v1/auth/dto/sign-up.dto.ts | 0 .../communication/communication.gateway.ts | 2 +- .../communication/communication.module.ts | 2 +- .../communication/communication.service.ts | 0 .../device-info/device-info.controller.ts | 0 .../api-v1/device-info/device-info.module.ts | 2 +- .../api-v1/device-info/device-info.service.ts | 2 +- .../device-info/dto/create-device-info.dto.ts | 2 +- .../device-info/dto/update-device-info.dto.ts | 2 +- .../api-v1/server-info/dto/server-info.dto.ts | 0 .../server-info/server-info.controller.ts | 0 .../api-v1/server-info/server-info.module.ts | 2 +- .../api-v1/server-info/server-info.service.ts | 0 .../src/api-v1/sharing/dto/add-assets.dto.ts | 2 +- .../src/api-v1/sharing/dto/add-users.dto.ts | 0 .../sharing/dto/create-shared-album.dto.ts | 2 +- .../api-v1/sharing/dto/remove-assets.dto.ts | 0 .../sharing/dto/update-shared-album.dto.ts | 0 .../src/api-v1/sharing/sharing.controller.ts | 0 .../src/api-v1/sharing/sharing.module.ts | 10 +- .../src/api-v1/sharing/sharing.service.ts | 10 +- .../src/api-v1/user/dto/create-user.dto.ts | 0 .../src/api-v1/user/dto/update-user.dto.ts | 0 .../src/api-v1/user/response-dto/user.ts | 2 +- .../src/api-v1/user/user.controller.ts | 26 +- .../immich}/src/api-v1/user/user.module.ts | 4 +- .../immich}/src/api-v1/user/user.service.ts | 2 +- .../{ => apps/immich}/src/app.controller.ts | 6 +- server/{ => apps/immich}/src/app.module.ts | 12 +- .../immich}/src/config/app.config.ts | 0 .../immich}/src/config/asset-upload.config.ts | 2 - .../immich}/src/config/jwt.config.ts | 0 .../src/config/profile-image-upload.config.ts | 4 - .../immich}/src/constants/jwt.constant.ts | 0 .../src/constants/server_version.constant.ts | 4 +- .../src/constants/upload_location.constant.ts | 0 .../src/decorators/auth-user.decorator.ts | 4 +- server/{ => apps/immich}/src/main.ts | 4 +- .../admin-role-guard.middleware.ts | 12 +- .../src/middlewares/app-logger.middleware.ts | 0 .../redis-io.adapter.middleware.ts | 2 +- .../background-task/background-task.module.ts | 11 +- .../background-task.processor.ts | 39 + .../background-task.service.ts | 23 + .../immich-jwt/guards/jwt-auth.guard.ts | 0 .../modules/immich-jwt/immich-jwt.module.ts | 2 +- .../modules/immich-jwt/immich-jwt.service.ts | 0 .../immich-jwt/strategies/jwt.strategy.ts | 2 +- .../schedule-tasks/schedule-tasks.module.ts | 30 + .../schedule-tasks/schedule-tasks.service.ts | 60 + server/apps/immich/test/jest-e2e.json | 13 + server/{ => apps/immich}/test/test-utils.ts | 0 .../{ => apps/immich}/test/user.e2e-spec.ts | 2 +- server/apps/immich/tsconfig.app.json | 17 + server/apps/microservices/src/main.ts | 18 + .../microservices/src/microservices.module.ts | 70 ++ .../src/microservices.service.ts | 8 + .../processors/asset-uploaded.processor.ts | 67 ++ .../metadata-extraction.processor.ts | 131 +++ .../src/processors/thumbnail.processor.ts | 37 + .../processors/video-transcode.processor.ts | 59 + .../apps/microservices}/test/app.e2e-spec.ts | 12 +- .../apps/microservices}/test/jest-e2e.json | 0 server/apps/microservices/tsconfig.app.json | 9 + server/entrypoint.sh | 3 +- .../database}/src/config/database.config.ts | 5 +- server/libs/database/src/database.module.ts | 10 + .../entities/asset-shared-album.entity.ts | 2 +- .../database/src}/entities/asset.entity.ts | 0 .../src}/entities/device-info.entity.ts | 0 .../database/src}/entities/exif.entity.ts | 0 .../src}/entities/shared-album.entity.ts | 0 .../src}/entities/smart-info.entity.ts | 0 .../src}/entities/user-shared-album.entity.ts | 2 +- .../database/src}/entities/user.entity.ts | 0 server/libs/database/src/index.ts | 1 + .../1645130759468-CreateUserTable.ts | 0 .../1645130777674-CreateDeviceInfoTable.ts | 0 .../1645130805273-CreateAssetsTable.ts | 0 .../1645130817965-CreateExifTable.ts | 0 .../1645130870184-CreateSmartInfoTable.ts | 0 .../1646249209023-AddExifTextSearchColumn.ts | 0 ...1646249734844-CreateExifTextSearchIndex.ts | 0 .../1646709533213-AddRegionCityToExIf.ts | 0 ...46710459852-AddLocationToExifTextSearch.ts | 0 ...648317474768-AddObjectColumnToSmartInfo.ts | 0 ...16111-CreateSharedAlbumAndRelatedTables.ts | 0 ...3525943-UpdateUserTableWithAdminAndName.ts | 8 +- ...3214255670-UpdateAssetTableWithWebpPath.ts | 6 +- ...583-UpdateAssetTableWithEncodeVideoPath.ts | 4 +- server/libs/database/tsconfig.lib.json | 9 + server/nest-cli.json | 37 +- server/package.json | 21 +- server/settings/nginx-conf/nginx.conf | 35 - .../background-task.processor.ts | 155 --- .../background-task.service.ts | 57 - .../image-optimize/image-optimize.module.ts | 36 - .../image-optimize.processor.ts | 17 - .../image-optimize/image-optimize.service.ts | 10 - .../image-conversion.service.ts | 52 - .../schedule-tasks/schedule-tasks.module.ts | 30 - .../video-conversion.processor.ts | 56 - .../video-conversion.service.ts | 49 - server/start-microservices.sh | 1 + server/start-server.sh | 1 + server/test/jest-e2e.json | 9 - server/tsconfig.json | 12 +- web/package-lock.json | 131 ++- web/src/hooks.ts | 86 +- web/src/lib/api.ts | 73 +- .../asset-viewer/video-viewer.svelte | 2 +- .../components/shared/announcement-box.svelte | 61 + .../shared/full-screen-modal.svelte | 2 +- .../components/shared/navigation-bar.svelte | 1 - .../lib/components/shared/status-box.svelte | 13 +- web/src/lib/utils/check-app-version.ts | 50 + web/src/routes/__layout.svelte | 23 +- web/src/routes/auth/login/api/get-users.ts | 13 +- web/src/routes/auth/login/update.ts | 110 +- web/src/routes/photos/index.svelte | 1 + 192 files changed, 1823 insertions(+), 2117 deletions(-) create mode 100644 .github/workflows/build_push_docker_staging.yml rename {microservices => machine-learning}/.dockerignore (100%) rename {microservices => machine-learning}/.eslintrc.js (100%) rename {microservices => machine-learning}/.gitignore (91%) rename {microservices => machine-learning}/.prettierrc (100%) rename {microservices => machine-learning}/Dockerfile (100%) rename {microservices => machine-learning}/README.md (100%) rename {microservices => machine-learning}/entrypoint.sh (100%) rename {microservices => machine-learning}/nest-cli.json (100%) rename {microservices => machine-learning}/package-lock.json (100%) rename {microservices => machine-learning}/package.json (100%) rename {microservices => machine-learning}/src/app.module.ts (100%) rename {microservices => machine-learning}/src/config/database.config.ts (100%) rename {microservices => machine-learning}/src/image-classifier/image-classifier.controller.ts (95%) rename {microservices => machine-learning}/src/image-classifier/image-classifier.module.ts (100%) rename {microservices => machine-learning}/src/image-classifier/image-classifier.service.ts (100%) rename {microservices => machine-learning}/src/main.ts (77%) rename {microservices => machine-learning}/src/object-detection/object-detection.controller.ts (94%) rename {microservices => machine-learning}/src/object-detection/object-detection.module.ts (100%) rename {microservices => machine-learning}/src/object-detection/object-detection.service.ts (100%) rename {microservices => machine-learning}/tsconfig.build.json (100%) rename {microservices => machine-learning}/tsconfig.json (100%) delete mode 100644 machine_learning/.dockerignore delete mode 100644 machine_learning/.gitignore delete mode 100644 machine_learning/Dockerfile delete mode 100644 machine_learning/app/__init__.py delete mode 100644 machine_learning/app/cars.jpg delete mode 100644 machine_learning/app/image_classifier/__init__.py delete mode 100644 machine_learning/app/image_classifier/image_classifier.py delete mode 100644 machine_learning/app/imagenet_class_index.json delete mode 100644 machine_learning/app/main.py delete mode 100644 machine_learning/app/object_detection/__init__.py delete mode 100644 machine_learning/app/object_detection/object_detection.py delete mode 100644 machine_learning/app/test.png delete mode 100644 machine_learning/requirements.txt create mode 100644 mobile/android/fastlane/metadata/android/en-US/changelogs/17.txt create mode 100644 mobile/lib/shared/providers/release_info.provider.dart create mode 100644 mobile/lib/shared/views/version_announcement_overlay.dart rename server/{ => apps/immich}/src/api-v1/asset/asset.controller.ts (84%) rename server/{ => apps/immich}/src/api-v1/asset/asset.module.ts (59%) rename server/{ => apps/immich}/src/api-v1/asset/asset.service.ts (61%) rename server/{ => apps/immich}/src/api-v1/asset/dto/create-asset.dto.ts (86%) rename server/{ => apps/immich}/src/api-v1/asset/dto/create-exif.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/asset/dto/delete-asset.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/asset/dto/get-all-asset-query.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/asset/dto/get-all-asset-response.dto.ts (67%) rename server/{ => apps/immich}/src/api-v1/asset/dto/get-asset.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/asset/dto/get-new-asset-query.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/asset/dto/search-asset.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/asset/dto/serve-file.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/asset/dto/update-asset.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/asset/dto/update-exif.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/auth/auth.controller.ts (93%) rename server/{ => apps/immich}/src/api-v1/auth/auth.module.ts (91%) rename server/{ => apps/immich}/src/api-v1/auth/auth.service.ts (98%) rename server/{ => apps/immich}/src/api-v1/auth/dto/jwt-payload.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/auth/dto/login-credential.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/auth/dto/sign-up.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/communication/communication.gateway.ts (95%) rename server/{ => apps/immich}/src/api-v1/communication/communication.module.ts (91%) rename server/{ => apps/immich}/src/api-v1/communication/communication.service.ts (100%) rename server/{ => apps/immich}/src/api-v1/device-info/device-info.controller.ts (100%) rename server/{ => apps/immich}/src/api-v1/device-info/device-info.module.ts (83%) rename server/{ => apps/immich}/src/api-v1/device-info/device-info.service.ts (96%) rename server/{ => apps/immich}/src/api-v1/device-info/dto/create-device-info.dto.ts (75%) rename server/{ => apps/immich}/src/api-v1/device-info/dto/update-device-info.dto.ts (76%) rename server/{ => apps/immich}/src/api-v1/server-info/dto/server-info.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/server-info/server-info.controller.ts (100%) rename server/{ => apps/immich}/src/api-v1/server-info/server-info.module.ts (88%) rename server/{ => apps/immich}/src/api-v1/server-info/server-info.service.ts (100%) rename server/{ => apps/immich}/src/api-v1/sharing/dto/add-assets.dto.ts (69%) rename server/{ => apps/immich}/src/api-v1/sharing/dto/add-users.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/sharing/dto/create-shared-album.dto.ts (76%) rename server/{ => apps/immich}/src/api-v1/sharing/dto/remove-assets.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/sharing/dto/update-shared-album.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/sharing/sharing.controller.ts (100%) rename server/{ => apps/immich}/src/api-v1/sharing/sharing.module.ts (55%) rename server/{ => apps/immich}/src/api-v1/sharing/sharing.service.ts (94%) rename server/{ => apps/immich}/src/api-v1/user/dto/create-user.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/user/dto/update-user.dto.ts (100%) rename server/{ => apps/immich}/src/api-v1/user/response-dto/user.ts (79%) rename server/{ => apps/immich}/src/api-v1/user/user.controller.ts (80%) rename server/{ => apps/immich}/src/api-v1/user/user.module.ts (87%) rename server/{ => apps/immich}/src/api-v1/user/user.service.ts (98%) rename server/{ => apps/immich}/src/app.controller.ts (80%) rename server/{ => apps/immich}/src/app.module.ts (86%) rename server/{ => apps/immich}/src/config/app.config.ts (100%) rename server/{ => apps/immich}/src/config/asset-upload.config.ts (99%) rename server/{ => apps/immich}/src/config/jwt.config.ts (100%) rename server/{ => apps/immich}/src/config/profile-image-upload.config.ts (99%) rename server/{ => apps/immich}/src/constants/jwt.constant.ts (100%) rename server/{ => apps/immich}/src/constants/server_version.constant.ts (84%) rename server/{ => apps/immich}/src/constants/upload_location.constant.ts (100%) rename server/{ => apps/immich}/src/decorators/auth-user.decorator.ts (87%) rename server/{ => apps/immich}/src/main.ts (94%) rename server/{ => apps/immich}/src/middlewares/admin-role-guard.middleware.ts (83%) rename server/{ => apps/immich}/src/middlewares/app-logger.middleware.ts (100%) rename server/{ => apps/immich}/src/middlewares/redis-io.adapter.middleware.ts (91%) rename server/{ => apps/immich}/src/modules/background-task/background-task.module.ts (67%) create mode 100644 server/apps/immich/src/modules/background-task/background-task.processor.ts create mode 100644 server/apps/immich/src/modules/background-task/background-task.service.ts rename server/{ => apps/immich}/src/modules/immich-jwt/guards/jwt-auth.guard.ts (100%) rename server/{ => apps/immich}/src/modules/immich-jwt/immich-jwt.module.ts (87%) rename server/{ => apps/immich}/src/modules/immich-jwt/immich-jwt.service.ts (100%) rename server/{ => apps/immich}/src/modules/immich-jwt/strategies/jwt.strategy.ts (93%) create mode 100644 server/apps/immich/src/modules/schedule-tasks/schedule-tasks.module.ts create mode 100644 server/apps/immich/src/modules/schedule-tasks/schedule-tasks.service.ts create mode 100644 server/apps/immich/test/jest-e2e.json rename server/{ => apps/immich}/test/test-utils.ts (100%) rename server/{ => apps/immich}/test/user.e2e-spec.ts (98%) create mode 100644 server/apps/immich/tsconfig.app.json create mode 100644 server/apps/microservices/src/main.ts create mode 100644 server/apps/microservices/src/microservices.module.ts create mode 100644 server/apps/microservices/src/microservices.service.ts create mode 100644 server/apps/microservices/src/processors/asset-uploaded.processor.ts create mode 100644 server/apps/microservices/src/processors/metadata-extraction.processor.ts create mode 100644 server/apps/microservices/src/processors/thumbnail.processor.ts create mode 100644 server/apps/microservices/src/processors/video-transcode.processor.ts rename {microservices => server/apps/microservices}/test/app.e2e-spec.ts (62%) rename {microservices => server/apps/microservices}/test/jest-e2e.json (100%) create mode 100644 server/apps/microservices/tsconfig.app.json rename server/{ => libs/database}/src/config/database.config.ts (77%) create mode 100644 server/libs/database/src/database.module.ts rename server/{src/api-v1/sharing => libs/database/src}/entities/asset-shared-album.entity.ts (92%) rename server/{src/api-v1/asset => libs/database/src}/entities/asset.entity.ts (100%) rename server/{src/api-v1/device-info => libs/database/src}/entities/device-info.entity.ts (100%) rename server/{src/api-v1/asset => libs/database/src}/entities/exif.entity.ts (100%) rename server/{src/api-v1/sharing => libs/database/src}/entities/shared-album.entity.ts (100%) rename server/{src/api-v1/asset => libs/database/src}/entities/smart-info.entity.ts (100%) rename server/{src/api-v1/sharing => libs/database/src}/entities/user-shared-album.entity.ts (91%) rename server/{src/api-v1/user => libs/database/src}/entities/user.entity.ts (100%) create mode 100644 server/libs/database/src/index.ts rename server/{src/migration => libs/database/src/migrations}/1645130759468-CreateUserTable.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1645130777674-CreateDeviceInfoTable.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1645130805273-CreateAssetsTable.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1645130817965-CreateExifTable.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1645130870184-CreateSmartInfoTable.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1646249209023-AddExifTextSearchColumn.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1646249734844-CreateExifTextSearchIndex.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1646709533213-AddRegionCityToExIf.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1646710459852-AddLocationToExifTextSearch.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1648317474768-AddObjectColumnToSmartInfo.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1649643216111-CreateSharedAlbumAndRelatedTables.ts (100%) rename server/{src/migration => libs/database/src/migrations}/1652633525943-UpdateUserTableWithAdminAndName.ts (93%) rename server/{src/migration => libs/database/src/migrations}/1653214255670-UpdateAssetTableWithWebpPath.ts (86%) rename server/{src/migration => libs/database/src/migrations}/1654299904583-UpdateAssetTableWithEncodeVideoPath.ts (87%) create mode 100644 server/libs/database/tsconfig.lib.json delete mode 100644 server/settings/nginx-conf/nginx.conf delete mode 100644 server/src/modules/background-task/background-task.processor.ts delete mode 100644 server/src/modules/background-task/background-task.service.ts delete mode 100644 server/src/modules/image-optimize/image-optimize.module.ts delete mode 100644 server/src/modules/image-optimize/image-optimize.processor.ts delete mode 100644 server/src/modules/image-optimize/image-optimize.service.ts delete mode 100644 server/src/modules/schedule-tasks/image-conversion.service.ts delete mode 100644 server/src/modules/schedule-tasks/schedule-tasks.module.ts delete mode 100644 server/src/modules/schedule-tasks/video-conversion.processor.ts delete mode 100644 server/src/modules/schedule-tasks/video-conversion.service.ts create mode 100644 server/start-microservices.sh create mode 100644 server/start-server.sh delete mode 100644 server/test/jest-e2e.json create mode 100644 web/src/lib/components/shared/announcement-box.svelte create mode 100644 web/src/lib/utils/check-app-version.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 494abedfeb8..029596b3da2 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -16,10 +16,10 @@ Note: Please search to see if an issue already exists for the bug you encountere A clear and concise description of what the bug is. **Task List** -[ ] I have read thoroughly the README setup and installation instructions. -[ ] If my setup is different, I have included my docker-compose file. -[ ] I have included my redacted `.env` file. -[ ] I have included information on my machine, and environment. +- [ ] I have read thoroughly the README setup and installation instructions. +- [ ] If my setup is different, I have included my docker-compose file. +- [ ] I have included my redacted `.env` file. +- [ ] I have included information on my machine, and environment. **To Reproduce** Steps to reproduce the behavior: diff --git a/.github/workflows/build_push_docker_latest.yml b/.github/workflows/build_push_docker_latest.yml index 80ae74bb2dc..e436eb60acd 100644 --- a/.github/workflows/build_push_docker_latest.yml +++ b/.github/workflows/build_push_docker_latest.yml @@ -4,17 +4,16 @@ on: workflow_dispatch: push: branches: [main] - pull_request: - branches: [main] jobs: - build_and_push_server_latest: + # This image include both the server and microservices - the two containers can be slitted into separated + # service with its coressponding entry file. + build_and_push_server_monorepo_latest: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 with: - # ref: "main" # branch fetch-depth: 0 - name: Set up QEMU @@ -27,23 +26,22 @@ jobs: with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push Immich + - name: Build and push Immich Mono Repo uses: docker/build-push-action@v3.0.0 with: context: ./server file: ./server/Dockerfile platforms: linux/arm/v7,linux/amd64,linux/arm64 - push: ${{ github.event_name != 'pull_request' }} + push: true tags: | altran1502/immich-server:latest - build_and_push_microservice_latest: + build_and_push_machine_learning_latest: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 with: - # ref: "main" # branch fetch-depth: 0 - name: Set up QEMU @@ -56,15 +54,15 @@ jobs: with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and Push Microservices + - name: Build and Push Machine Learning uses: docker/build-push-action@v3.0.0 with: - context: ./microservices - file: ./microservices/Dockerfile + context: ./machine-learning + file: ./machine-learning/Dockerfile platforms: linux/arm/v7,linux/amd64 - push: ${{ github.event_name != 'pull_request' }} + push: true tags: | - altran1502/immich-microservices:latest + altran1502/immich-machine-learning:latest build_and_push_web_latest: runs-on: ubuntu-latest @@ -72,7 +70,6 @@ jobs: - name: Checkout uses: actions/checkout@v3 with: - # ref: "main" # branch fetch-depth: 0 - name: Set up QEMU uses: docker/setup-qemu-action@v2.0.0 @@ -91,6 +88,6 @@ jobs: file: ./web/Dockerfile platforms: linux/arm/v7,linux/amd64,linux/arm64 target: prod - push: ${{ github.event_name != 'pull_request' }} + push: true tags: | altran1502/immich-web:latest diff --git a/.github/workflows/build_push_docker_staging.yml b/.github/workflows/build_push_docker_staging.yml new file mode 100644 index 00000000000..1f5347d9b89 --- /dev/null +++ b/.github/workflows/build_push_docker_staging.yml @@ -0,0 +1,95 @@ +name: Build and Push Docker Image - Staging + +on: + workflow_dispatch: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + # This image include both the server and microservices - the two containers can be slitted into separated + # service with its coressponding entry file. + build_and_push_server_monorepo_staging: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2.0.0 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2.0.0 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push Immich Mono Repo + uses: docker/build-push-action@v3.0.0 + with: + context: ./server + file: ./server/Dockerfile + platforms: linux/arm/v7,linux/amd64,linux/arm64 + push: ${{ github.event_name == 'pull_request' }} + tags: | + altran1502/immich-server:staging + + build_and_push_machine_learning_staging: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2.0.0 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2.0.0 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and Push Machine Learning + uses: docker/build-push-action@v3.0.0 + with: + context: ./machine-learning + file: ./machine-learning/Dockerfile + platforms: linux/arm/v7,linux/amd64 + push: ${{ github.event_name == 'pull_request' }} + tags: | + altran1502/immich-machine-learning:staging + + build_and_push_web_staging: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2.0.0 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2.0.0 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and Push Web + uses: docker/build-push-action@v3.0.0 + with: + context: ./web + file: ./web/Dockerfile + platforms: linux/arm/v7,linux/amd64,linux/arm64 + target: prod + push: ${{ github.event_name == 'pull_request' }} + tags: | + altran1502/immich-web:staging diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index a834ee951ea..1b763ed6c4d 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -6,7 +6,7 @@ services: build: context: ../server dockerfile: Dockerfile - command: npm run start:dev + command: npm run start:dev immich expose: - "3000" volumes: @@ -23,16 +23,35 @@ services: networks: - immich-network - immich-microservices: - image: immich-microservices-dev:1.9.0 + immich-machine-learning: + image: immich-machine-learning-dev:1.9.0 build: - context: ../microservices + context: ../machine-learning dockerfile: Dockerfile command: npm run start:dev expose: - "3001" volumes: - - ../microservices:/usr/src/app + - ../machine-learning:/usr/src/app + - ${UPLOAD_LOCATION}:/usr/src/app/upload + - /usr/src/app/node_modules + env_file: + - .env + environment: + - NODE_ENV=development + depends_on: + - database + networks: + - immich-network + + immich-microservices: + image: immich-microservices:1.9.0 + build: + context: ../server + dockerfile: Dockerfile + command: npm run start:dev microservices + volumes: + - ../server:/usr/src/app - ${UPLOAD_LOCATION}:/usr/src/app/upload - /usr/src/app/node_modules env_file: diff --git a/docker/docker-compose.staging.yml b/docker/docker-compose.staging.yml index 0e02e5ad0bd..55b442d8327 100644 --- a/docker/docker-compose.staging.yml +++ b/docker/docker-compose.staging.yml @@ -2,11 +2,8 @@ version: "3.8" services: immich-server: - image: immich-server-staging:latest - build: - context: ../server - dockerfile: Dockerfile - entrypoint: ["/bin/sh", "./entrypoint.sh"] + image: altran1502/immich-server:staging + entrypoint: ["/bin/sh", "./start-server.sh"] expose: - "3000" volumes: @@ -23,10 +20,23 @@ services: restart: always immich-microservices: - image: immich-microservices-staging:latest - build: - context: ../microservices - dockerfile: Dockerfile + image: altran1502/immich-server:staging + entrypoint: ["/bin/sh", "./start-microservices.sh"] + volumes: + - ${UPLOAD_LOCATION}:/usr/src/app/upload + env_file: + - .env + environment: + - NODE_ENV=production + depends_on: + - redis + - database + networks: + - immich-network + restart: always + + immich-machine-learning: + image: altran1502/immich-machine-learning:staging entrypoint: ["/bin/sh", "./entrypoint.sh"] expose: - "3001" @@ -43,12 +53,8 @@ services: restart: always immich-web: - image: immich-web-staging:latest + image: altran1502/immich-web:staging entrypoint: ["/bin/sh", "./entrypoint.sh"] - build: - context: ../web - dockerfile: Dockerfile - target: prod env_file: - .env ports: @@ -57,14 +63,12 @@ services: - immich-network restart: always - redis: container_name: immich_redis image: redis:6.2 networks: - immich-network restart: always - database: container_name: immich_postgres @@ -82,6 +86,7 @@ services: - 5432:5432 networks: - immich-network + restart: always nginx: container_name: proxy_nginx @@ -102,4 +107,4 @@ services: networks: immich-network: volumes: - pgdata: \ No newline at end of file + pgdata: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 8f4e61f41e7..d6e90dd864d 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -3,7 +3,7 @@ version: "3.8" services: immich-server: image: altran1502/immich-server:latest - entrypoint: ["/bin/sh", "./entrypoint.sh"] + entrypoint: ["/bin/sh", "./start-server.sh"] expose: - "3000" volumes: @@ -20,7 +20,23 @@ services: restart: always immich-microservices: - image: altran1502/immich-microservices:latest + image: altran1502/immich-server:latest + entrypoint: ["/bin/sh", "./start-microservices.sh"] + volumes: + - ${UPLOAD_LOCATION}:/usr/src/app/upload + env_file: + - .env + environment: + - NODE_ENV=production + depends_on: + - redis + - database + networks: + - immich-network + restart: always + + immich-machine-learning: + image: altran1502/immich-machine-learning:latest entrypoint: ["/bin/sh", "./entrypoint.sh"] expose: - "3001" @@ -47,14 +63,12 @@ services: - immich-network restart: always - redis: container_name: immich_redis image: redis:6.2 networks: - immich-network restart: always - database: container_name: immich_postgres @@ -73,7 +87,7 @@ services: networks: - immich-network restart: always - + nginx: container_name: proxy_nginx image: nginx:latest @@ -93,4 +107,4 @@ services: networks: immich-network: volumes: - pgdata: \ No newline at end of file + pgdata: diff --git a/microservices/.dockerignore b/machine-learning/.dockerignore similarity index 100% rename from microservices/.dockerignore rename to machine-learning/.dockerignore diff --git a/microservices/.eslintrc.js b/machine-learning/.eslintrc.js similarity index 100% rename from microservices/.eslintrc.js rename to machine-learning/.eslintrc.js diff --git a/microservices/.gitignore b/machine-learning/.gitignore similarity index 91% rename from microservices/.gitignore rename to machine-learning/.gitignore index 22f55adc564..eccd2d48628 100644 --- a/microservices/.gitignore +++ b/machine-learning/.gitignore @@ -32,4 +32,6 @@ lerna-debug.log* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json -!.vscode/extensions.json \ No newline at end of file +!.vscode/extensions.json + +upload/ \ No newline at end of file diff --git a/microservices/.prettierrc b/machine-learning/.prettierrc similarity index 100% rename from microservices/.prettierrc rename to machine-learning/.prettierrc diff --git a/microservices/Dockerfile b/machine-learning/Dockerfile similarity index 100% rename from microservices/Dockerfile rename to machine-learning/Dockerfile diff --git a/microservices/README.md b/machine-learning/README.md similarity index 100% rename from microservices/README.md rename to machine-learning/README.md diff --git a/microservices/entrypoint.sh b/machine-learning/entrypoint.sh similarity index 100% rename from microservices/entrypoint.sh rename to machine-learning/entrypoint.sh diff --git a/microservices/nest-cli.json b/machine-learning/nest-cli.json similarity index 100% rename from microservices/nest-cli.json rename to machine-learning/nest-cli.json diff --git a/microservices/package-lock.json b/machine-learning/package-lock.json similarity index 100% rename from microservices/package-lock.json rename to machine-learning/package-lock.json diff --git a/microservices/package.json b/machine-learning/package.json similarity index 100% rename from microservices/package.json rename to machine-learning/package.json diff --git a/microservices/src/app.module.ts b/machine-learning/src/app.module.ts similarity index 100% rename from microservices/src/app.module.ts rename to machine-learning/src/app.module.ts diff --git a/microservices/src/config/database.config.ts b/machine-learning/src/config/database.config.ts similarity index 100% rename from microservices/src/config/database.config.ts rename to machine-learning/src/config/database.config.ts diff --git a/microservices/src/image-classifier/image-classifier.controller.ts b/machine-learning/src/image-classifier/image-classifier.controller.ts similarity index 95% rename from microservices/src/image-classifier/image-classifier.controller.ts rename to machine-learning/src/image-classifier/image-classifier.controller.ts index 5dbe8bdffed..0cb16552871 100644 --- a/microservices/src/image-classifier/image-classifier.controller.ts +++ b/machine-learning/src/image-classifier/image-classifier.controller.ts @@ -7,7 +7,7 @@ export class ImageClassifierController { private readonly imageClassifierService: ImageClassifierService, ) { } - @Post('/tagImage') + @Post('/tag-image') async tagImage(@Body('thumbnailPath') thumbnailPath: string) { return await this.imageClassifierService.tagImage(thumbnailPath); } diff --git a/microservices/src/image-classifier/image-classifier.module.ts b/machine-learning/src/image-classifier/image-classifier.module.ts similarity index 100% rename from microservices/src/image-classifier/image-classifier.module.ts rename to machine-learning/src/image-classifier/image-classifier.module.ts diff --git a/microservices/src/image-classifier/image-classifier.service.ts b/machine-learning/src/image-classifier/image-classifier.service.ts similarity index 100% rename from microservices/src/image-classifier/image-classifier.service.ts rename to machine-learning/src/image-classifier/image-classifier.service.ts diff --git a/microservices/src/main.ts b/machine-learning/src/main.ts similarity index 77% rename from microservices/src/main.ts rename to machine-learning/src/main.ts index 4f9d22d007b..5591e76fbdb 100644 --- a/microservices/src/main.ts +++ b/machine-learning/src/main.ts @@ -8,14 +8,14 @@ async function bootstrap() { await app.listen(3001, () => { if (process.env.NODE_ENV == 'development') { Logger.log( - 'Running Immich Microservices in DEVELOPMENT environment', + 'Running Immich Machine Learning in DEVELOPMENT environment', 'IMMICH MICROSERVICES', ); } if (process.env.NODE_ENV == 'production') { Logger.log( - 'Running Immich Microservices in PRODUCTION environment', + 'Running Immich Machine Learning in PRODUCTION environment', 'IMMICH MICROSERVICES', ); } diff --git a/microservices/src/object-detection/object-detection.controller.ts b/machine-learning/src/object-detection/object-detection.controller.ts similarity index 94% rename from microservices/src/object-detection/object-detection.controller.ts rename to machine-learning/src/object-detection/object-detection.controller.ts index 77ec167b8d5..c69c640acb0 100644 --- a/microservices/src/object-detection/object-detection.controller.ts +++ b/machine-learning/src/object-detection/object-detection.controller.ts @@ -8,7 +8,7 @@ export class ObjectDetectionController { private readonly objectDetectionService: ObjectDetectionService, ) { } - @Post('/detectObject') + @Post('/detect-object') async detectObject(@Body('thumbnailPath') thumbnailPath: string) { return await this.objectDetectionService.detectObject(thumbnailPath); } diff --git a/microservices/src/object-detection/object-detection.module.ts b/machine-learning/src/object-detection/object-detection.module.ts similarity index 100% rename from microservices/src/object-detection/object-detection.module.ts rename to machine-learning/src/object-detection/object-detection.module.ts diff --git a/microservices/src/object-detection/object-detection.service.ts b/machine-learning/src/object-detection/object-detection.service.ts similarity index 100% rename from microservices/src/object-detection/object-detection.service.ts rename to machine-learning/src/object-detection/object-detection.service.ts diff --git a/microservices/tsconfig.build.json b/machine-learning/tsconfig.build.json similarity index 100% rename from microservices/tsconfig.build.json rename to machine-learning/tsconfig.build.json diff --git a/microservices/tsconfig.json b/machine-learning/tsconfig.json similarity index 100% rename from microservices/tsconfig.json rename to machine-learning/tsconfig.json diff --git a/machine_learning/.dockerignore b/machine_learning/.dockerignore deleted file mode 100644 index 19120dc4356..00000000000 --- a/machine_learning/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -devenv/ \ No newline at end of file diff --git a/machine_learning/.gitignore b/machine_learning/.gitignore deleted file mode 100644 index 530bf8383aa..00000000000 --- a/machine_learning/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -__pycache__/ -devenv/ -app/upload \ No newline at end of file diff --git a/machine_learning/Dockerfile b/machine_learning/Dockerfile deleted file mode 100644 index f575b479efb..00000000000 --- a/machine_learning/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -## GPU Build -# FROM tensorflow/tensorflow:latest-gpu as gpu - -# WORKDIR /code - -# COPY ./requirements.txt /code/requirements.txt - -# RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt - -# COPY ./app /code/app - - -## CPU BUILD -FROM python:3.8 as cpu - -RUN apt-get update -RUN apt-get install ffmpeg libsm6 libxext6 -y - -WORKDIR /code - -COPY ./requirements.txt /code/requirements.txt - -RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt - -COPY ./app /code/app \ No newline at end of file diff --git a/machine_learning/app/__init__.py b/machine_learning/app/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/machine_learning/app/cars.jpg b/machine_learning/app/cars.jpg deleted file mode 100644 index 8628adafde7c37a32adb0e6bd0285c384d0c5f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197210 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 diff --git a/machine_learning/app/image_classifier/__init__.py b/machine_learning/app/image_classifier/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/machine_learning/app/image_classifier/image_classifier.py b/machine_learning/app/image_classifier/image_classifier.py deleted file mode 100644 index 73fb692c027..00000000000 --- a/machine_learning/app/image_classifier/image_classifier.py +++ /dev/null @@ -1,37 +0,0 @@ -from tensorflow.keras.applications import InceptionV3 -from tensorflow.keras.applications.inception_v3 import preprocess_input, decode_predictions -from tensorflow.keras.preprocessing import image -import numpy as np -from PIL import Image -import cv2 -IMG_SIZE = 299 -PREDICTION_MODEL = InceptionV3(weights='imagenet') - - -def classify_image(image_path: str): - img_path = f'./app/{image_path}' - # img = image.load_img(img_path, target_size=(IMG_SIZE, IMG_SIZE)) - - target_image = cv2.imread(img_path, cv2.IMREAD_UNCHANGED) - resized_target_image = cv2.resize(target_image, (IMG_SIZE, IMG_SIZE)) - - x = image.img_to_array(resized_target_image) - x = np.expand_dims(x, axis=0) - x = preprocess_input(x) - - preds = PREDICTION_MODEL.predict(x) - result = decode_predictions(preds, top=3)[0] - payload = [] - for _, value, _ in result: - payload.append(value) - - return payload - - -def warm_up(): - img_path = f'./app/test.png' - img = image.load_img(img_path, target_size=(IMG_SIZE, IMG_SIZE)) - x = image.img_to_array(img) - x = np.expand_dims(x, axis=0) - x = preprocess_input(x) - PREDICTION_MODEL.predict(x) diff --git a/machine_learning/app/imagenet_class_index.json b/machine_learning/app/imagenet_class_index.json deleted file mode 100644 index fc349e8c3fb..00000000000 --- a/machine_learning/app/imagenet_class_index.json +++ /dev/null @@ -1,1002 +0,0 @@ -{ - "0": ["n01440764", "tench"], - "1": ["n01443537", "goldfish"], - "2": ["n01484850", "great_white_shark"], - "3": ["n01491361", "tiger_shark"], - "4": ["n01494475", "hammerhead"], - "5": ["n01496331", "electric_ray"], - "6": ["n01498041", "stingray"], - "7": ["n01514668", "cock"], - "8": ["n01514859", "hen"], - "9": ["n01518878", "ostrich"], - "10": ["n01530575", "brambling"], - "11": ["n01531178", "goldfinch"], - "12": ["n01532829", "house_finch"], - "13": ["n01534433", "junco"], - "14": ["n01537544", "indigo_bunting"], - "15": ["n01558993", "robin"], - "16": ["n01560419", "bulbul"], - "17": ["n01580077", "jay"], - "18": ["n01582220", "magpie"], - "19": ["n01592084", "chickadee"], - "20": ["n01601694", "water_ouzel"], - "21": ["n01608432", "kite"], - "22": ["n01614925", "bald_eagle"], - "23": ["n01616318", "vulture"], - "24": ["n01622779", "great_grey_owl"], - "25": ["n01629819", "European_fire_salamander"], - "26": ["n01630670", "common_newt"], - "27": ["n01631663", "eft"], - "28": ["n01632458", "spotted_salamander"], - "29": ["n01632777", "axolotl"], - "30": ["n01641577", "bullfrog"], - "31": ["n01644373", "tree_frog"], - "32": ["n01644900", "tailed_frog"], - "33": ["n01664065", "loggerhead"], - "34": ["n01665541", "leatherback_turtle"], - "35": ["n01667114", "mud_turtle"], - "36": ["n01667778", "terrapin"], - "37": ["n01669191", "box_turtle"], - "38": ["n01675722", "banded_gecko"], - "39": ["n01677366", "common_iguana"], - "40": ["n01682714", "American_chameleon"], - "41": ["n01685808", "whiptail"], - "42": ["n01687978", "agama"], - "43": ["n01688243", "frilled_lizard"], - "44": ["n01689811", "alligator_lizard"], - "45": ["n01692333", "Gila_monster"], - "46": ["n01693334", "green_lizard"], - "47": ["n01694178", "African_chameleon"], - "48": ["n01695060", "Komodo_dragon"], - "49": ["n01697457", "African_crocodile"], - "50": ["n01698640", "American_alligator"], - "51": ["n01704323", "triceratops"], - "52": ["n01728572", "thunder_snake"], - "53": ["n01728920", "ringneck_snake"], - "54": ["n01729322", "hognose_snake"], - "55": ["n01729977", "green_snake"], - "56": ["n01734418", "king_snake"], - "57": ["n01735189", "garter_snake"], - "58": ["n01737021", "water_snake"], - "59": ["n01739381", "vine_snake"], - "60": ["n01740131", "night_snake"], - "61": ["n01742172", "boa_constrictor"], - "62": ["n01744401", "rock_python"], - "63": ["n01748264", "Indian_cobra"], - "64": ["n01749939", "green_mamba"], - "65": ["n01751748", "sea_snake"], - "66": ["n01753488", "horned_viper"], - "67": ["n01755581", "diamondback"], - "68": ["n01756291", "sidewinder"], - "69": ["n01768244", "trilobite"], - "70": ["n01770081", "harvestman"], - "71": ["n01770393", "scorpion"], - "72": ["n01773157", "black_and_gold_garden_spider"], - "73": ["n01773549", "barn_spider"], - "74": ["n01773797", "garden_spider"], - "75": ["n01774384", "black_widow"], - "76": ["n01774750", "tarantula"], - "77": ["n01775062", "wolf_spider"], - "78": ["n01776313", "tick"], - "79": ["n01784675", "centipede"], - "80": ["n01795545", "black_grouse"], - "81": ["n01796340", "ptarmigan"], - "82": ["n01797886", "ruffed_grouse"], - "83": ["n01798484", "prairie_chicken"], - "84": ["n01806143", "peacock"], - "85": ["n01806567", "quail"], - "86": ["n01807496", "partridge"], - "87": ["n01817953", "African_grey"], - "88": ["n01818515", "macaw"], - "89": ["n01819313", "sulphur-crested_cockatoo"], - "90": ["n01820546", "lorikeet"], - "91": ["n01824575", "coucal"], - "92": ["n01828970", "bee_eater"], - "93": ["n01829413", "hornbill"], - "94": ["n01833805", "hummingbird"], - "95": ["n01843065", "jacamar"], - "96": ["n01843383", "toucan"], - "97": ["n01847000", "drake"], - "98": ["n01855032", "red-breasted_merganser"], - "99": ["n01855672", "goose"], - "100": ["n01860187", "black_swan"], - "101": ["n01871265", "tusker"], - "102": ["n01872401", "echidna"], - "103": ["n01873310", "platypus"], - "104": ["n01877812", "wallaby"], - "105": ["n01882714", "koala"], - "106": ["n01883070", "wombat"], - "107": ["n01910747", "jellyfish"], - "108": ["n01914609", "sea_anemone"], - "109": ["n01917289", "brain_coral"], - "110": ["n01924916", "flatworm"], - "111": ["n01930112", "nematode"], - "112": ["n01943899", "conch"], - "113": ["n01944390", "snail"], - "114": ["n01945685", "slug"], - "115": ["n01950731", "sea_slug"], - "116": ["n01955084", "chiton"], - "117": ["n01968897", "chambered_nautilus"], - "118": ["n01978287", "Dungeness_crab"], - "119": ["n01978455", "rock_crab"], - "120": ["n01980166", "fiddler_crab"], - "121": ["n01981276", "king_crab"], - "122": ["n01983481", "American_lobster"], - "123": ["n01984695", "spiny_lobster"], - "124": ["n01985128", "crayfish"], - "125": ["n01986214", "hermit_crab"], - "126": ["n01990800", "isopod"], - "127": ["n02002556", "white_stork"], - "128": ["n02002724", "black_stork"], - "129": ["n02006656", "spoonbill"], - "130": ["n02007558", "flamingo"], - "131": ["n02009229", "little_blue_heron"], - "132": ["n02009912", "American_egret"], - "133": ["n02011460", "bittern"], - "134": ["n02012849", "crane"], - "135": ["n02013706", "limpkin"], - "136": ["n02017213", "European_gallinule"], - "137": ["n02018207", "American_coot"], - "138": ["n02018795", "bustard"], - "139": ["n02025239", "ruddy_turnstone"], - "140": ["n02027492", "red-backed_sandpiper"], - "141": ["n02028035", "redshank"], - "142": ["n02033041", "dowitcher"], - "143": ["n02037110", "oystercatcher"], - "144": ["n02051845", "pelican"], - "145": ["n02056570", "king_penguin"], - "146": ["n02058221", "albatross"], - "147": ["n02066245", "grey_whale"], - "148": ["n02071294", "killer_whale"], - "149": ["n02074367", "dugong"], - "150": ["n02077923", "sea_lion"], - "151": ["n02085620", "Chihuahua"], - "152": ["n02085782", "Japanese_spaniel"], - "153": ["n02085936", "Maltese_dog"], - "154": ["n02086079", "Pekinese"], - "155": ["n02086240", "Shih-Tzu"], - "156": ["n02086646", "Blenheim_spaniel"], - "157": ["n02086910", "papillon"], - "158": ["n02087046", "toy_terrier"], - "159": ["n02087394", "Rhodesian_ridgeback"], - "160": ["n02088094", "Afghan_hound"], - "161": ["n02088238", "basset"], - "162": ["n02088364", "beagle"], - "163": ["n02088466", "bloodhound"], - "164": ["n02088632", "bluetick"], - "165": ["n02089078", "black-and-tan_coonhound"], - "166": ["n02089867", "Walker_hound"], - "167": ["n02089973", "English_foxhound"], - "168": ["n02090379", "redbone"], - "169": ["n02090622", "borzoi"], - "170": ["n02090721", "Irish_wolfhound"], - "171": ["n02091032", "Italian_greyhound"], - "172": ["n02091134", "whippet"], - "173": ["n02091244", "Ibizan_hound"], - "174": ["n02091467", "Norwegian_elkhound"], - "175": ["n02091635", "otterhound"], - "176": ["n02091831", "Saluki"], - "177": ["n02092002", "Scottish_deerhound"], - "178": ["n02092339", "Weimaraner"], - "179": ["n02093256", "Staffordshire_bullterrier"], - "180": ["n02093428", "American_Staffordshire_terrier"], - "181": ["n02093647", "Bedlington_terrier"], - "182": ["n02093754", "Border_terrier"], - "183": ["n02093859", "Kerry_blue_terrier"], - "184": ["n02093991", "Irish_terrier"], - "185": ["n02094114", "Norfolk_terrier"], - "186": ["n02094258", "Norwich_terrier"], - "187": ["n02094433", "Yorkshire_terrier"], - "188": ["n02095314", "wire-haired_fox_terrier"], - "189": ["n02095570", "Lakeland_terrier"], - "190": ["n02095889", "Sealyham_terrier"], - "191": ["n02096051", "Airedale"], - "192": ["n02096177", "cairn"], - "193": ["n02096294", "Australian_terrier"], - "194": ["n02096437", "Dandie_Dinmont"], - "195": ["n02096585", "Boston_bull"], - "196": ["n02097047", "miniature_schnauzer"], - "197": ["n02097130", "giant_schnauzer"], - "198": ["n02097209", "standard_schnauzer"], - "199": ["n02097298", "Scotch_terrier"], - "200": ["n02097474", "Tibetan_terrier"], - "201": ["n02097658", "silky_terrier"], - "202": ["n02098105", "soft-coated_wheaten_terrier"], - "203": ["n02098286", "West_Highland_white_terrier"], - "204": ["n02098413", "Lhasa"], - "205": ["n02099267", "flat-coated_retriever"], - "206": ["n02099429", "curly-coated_retriever"], - "207": ["n02099601", "golden_retriever"], - "208": ["n02099712", "Labrador_retriever"], - "209": ["n02099849", "Chesapeake_Bay_retriever"], - "210": ["n02100236", "German_short-haired_pointer"], - "211": ["n02100583", "vizsla"], - "212": ["n02100735", "English_setter"], - "213": ["n02100877", "Irish_setter"], - "214": ["n02101006", "Gordon_setter"], - "215": ["n02101388", "Brittany_spaniel"], - "216": ["n02101556", "clumber"], - "217": ["n02102040", "English_springer"], - "218": ["n02102177", "Welsh_springer_spaniel"], - "219": ["n02102318", "cocker_spaniel"], - "220": ["n02102480", "Sussex_spaniel"], - "221": ["n02102973", "Irish_water_spaniel"], - "222": ["n02104029", "kuvasz"], - "223": ["n02104365", "schipperke"], - "224": ["n02105056", "groenendael"], - "225": ["n02105162", "malinois"], - "226": ["n02105251", "briard"], - "227": ["n02105412", "kelpie"], - "228": ["n02105505", "komondor"], - "229": ["n02105641", "Old_English_sheepdog"], - "230": ["n02105855", "Shetland_sheepdog"], - "231": ["n02106030", "collie"], - "232": ["n02106166", "Border_collie"], - "233": ["n02106382", "Bouvier_des_Flandres"], - "234": ["n02106550", "Rottweiler"], - "235": ["n02106662", "German_shepherd"], - "236": ["n02107142", "Doberman"], - "237": ["n02107312", "miniature_pinscher"], - "238": ["n02107574", "Greater_Swiss_Mountain_dog"], - "239": ["n02107683", "Bernese_mountain_dog"], - "240": ["n02107908", "Appenzeller"], - "241": ["n02108000", "EntleBucher"], - "242": ["n02108089", "boxer"], - "243": ["n02108422", "bull_mastiff"], - "244": ["n02108551", "Tibetan_mastiff"], - "245": ["n02108915", "French_bulldog"], - "246": ["n02109047", "Great_Dane"], - "247": ["n02109525", "Saint_Bernard"], - "248": ["n02109961", "Eskimo_dog"], - "249": ["n02110063", "malamute"], - "250": ["n02110185", "Siberian_husky"], - "251": ["n02110341", "dalmatian"], - "252": ["n02110627", "affenpinscher"], - "253": ["n02110806", "basenji"], - "254": ["n02110958", "pug"], - "255": ["n02111129", "Leonberg"], - "256": ["n02111277", "Newfoundland"], - "257": ["n02111500", "Great_Pyrenees"], - "258": ["n02111889", "Samoyed"], - "259": ["n02112018", "Pomeranian"], - "260": ["n02112137", "chow"], - "261": ["n02112350", "keeshond"], - "262": ["n02112706", "Brabancon_griffon"], - "263": ["n02113023", "Pembroke"], - "264": ["n02113186", "Cardigan"], - "265": ["n02113624", "toy_poodle"], - "266": ["n02113712", "miniature_poodle"], - "267": ["n02113799", "standard_poodle"], - "268": ["n02113978", "Mexican_hairless"], - "269": ["n02114367", "timber_wolf"], - "270": ["n02114548", "white_wolf"], - "271": ["n02114712", "red_wolf"], - "272": ["n02114855", "coyote"], - "273": ["n02115641", "dingo"], - "274": ["n02115913", "dhole"], - "275": ["n02116738", "African_hunting_dog"], - "276": ["n02117135", "hyena"], - "277": ["n02119022", "red_fox"], - "278": ["n02119789", "kit_fox"], - "279": ["n02120079", "Arctic_fox"], - "280": ["n02120505", "grey_fox"], - "281": ["n02123045", "tabby"], - "282": ["n02123159", "tiger_cat"], - "283": ["n02123394", "Persian_cat"], - "284": ["n02123597", "Siamese_cat"], - "285": ["n02124075", "Egyptian_cat"], - "286": ["n02125311", "cougar"], - "287": ["n02127052", "lynx"], - "288": ["n02128385", "leopard"], - "289": ["n02128757", "snow_leopard"], - "290": ["n02128925", "jaguar"], - "291": ["n02129165", "lion"], - "292": ["n02129604", "tiger"], - "293": ["n02130308", "cheetah"], - "294": ["n02132136", "brown_bear"], - "295": ["n02133161", "American_black_bear"], - "296": ["n02134084", "ice_bear"], - "297": ["n02134418", "sloth_bear"], - "298": ["n02137549", "mongoose"], - "299": ["n02138441", "meerkat"], - "300": ["n02165105", "tiger_beetle"], - "301": ["n02165456", "ladybug"], - "302": ["n02167151", "ground_beetle"], - "303": ["n02168699", "long-horned_beetle"], - "304": ["n02169497", "leaf_beetle"], - "305": ["n02172182", "dung_beetle"], - "306": ["n02174001", "rhinoceros_beetle"], - "307": ["n02177972", "weevil"], - "308": ["n02190166", "fly"], - "309": ["n02206856", "bee"], - "310": ["n02219486", "ant"], - "311": ["n02226429", "grasshopper"], - "312": ["n02229544", "cricket"], - "313": ["n02231487", "walking_stick"], - "314": ["n02233338", "cockroach"], - "315": ["n02236044", "mantis"], - "316": ["n02256656", "cicada"], - "317": ["n02259212", "leafhopper"], - "318": ["n02264363", "lacewing"], - "319": ["n02268443", "dragonfly"], - "320": ["n02268853", "damselfly"], - "321": ["n02276258", "admiral"], - "322": ["n02277742", "ringlet"], - "323": ["n02279972", "monarch"], - "324": ["n02280649", "cabbage_butterfly"], - "325": ["n02281406", "sulphur_butterfly"], - "326": ["n02281787", "lycaenid"], - "327": ["n02317335", "starfish"], - "328": ["n02319095", "sea_urchin"], - "329": ["n02321529", "sea_cucumber"], - "330": ["n02325366", "wood_rabbit"], - "331": ["n02326432", "hare"], - "332": ["n02328150", "Angora"], - "333": ["n02342885", "hamster"], - "334": ["n02346627", "porcupine"], - "335": ["n02356798", "fox_squirrel"], - "336": ["n02361337", "marmot"], - "337": ["n02363005", "beaver"], - "338": ["n02364673", "guinea_pig"], - "339": ["n02389026", "sorrel"], - "340": ["n02391049", "zebra"], - "341": ["n02395406", "hog"], - "342": ["n02396427", "wild_boar"], - "343": ["n02397096", "warthog"], - "344": ["n02398521", "hippopotamus"], - "345": ["n02403003", "ox"], - "346": ["n02408429", "water_buffalo"], - "347": ["n02410509", "bison"], - "348": ["n02412080", "ram"], - "349": ["n02415577", "bighorn"], - "350": ["n02417914", "ibex"], - "351": ["n02422106", "hartebeest"], - "352": ["n02422699", "impala"], - "353": ["n02423022", "gazelle"], - "354": ["n02437312", "Arabian_camel"], - "355": ["n02437616", "llama"], - "356": ["n02441942", "weasel"], - "357": ["n02442845", "mink"], - "358": ["n02443114", "polecat"], - "359": ["n02443484", "black-footed_ferret"], - "360": ["n02444819", "otter"], - "361": ["n02445715", "skunk"], - "362": ["n02447366", "badger"], - "363": ["n02454379", "armadillo"], - "364": ["n02457408", "three-toed_sloth"], - "365": ["n02480495", "orangutan"], - "366": ["n02480855", "gorilla"], - "367": ["n02481823", "chimpanzee"], - "368": ["n02483362", "gibbon"], - "369": ["n02483708", "siamang"], - "370": ["n02484975", "guenon"], - "371": ["n02486261", "patas"], - "372": ["n02486410", "baboon"], - "373": ["n02487347", "macaque"], - "374": ["n02488291", "langur"], - "375": ["n02488702", "colobus"], - "376": ["n02489166", "proboscis_monkey"], - "377": ["n02490219", "marmoset"], - "378": ["n02492035", "capuchin"], - "379": ["n02492660", "howler_monkey"], - "380": ["n02493509", "titi"], - "381": ["n02493793", "spider_monkey"], - "382": ["n02494079", "squirrel_monkey"], - "383": ["n02497673", "Madagascar_cat"], - "384": ["n02500267", "indri"], - "385": ["n02504013", "Indian_elephant"], - "386": ["n02504458", "African_elephant"], - "387": ["n02509815", "lesser_panda"], - "388": ["n02510455", "giant_panda"], - "389": ["n02514041", "barracouta"], - "390": ["n02526121", "eel"], - "391": ["n02536864", "coho"], - "392": ["n02606052", "rock_beauty"], - "393": ["n02607072", "anemone_fish"], - "394": ["n02640242", "sturgeon"], - "395": ["n02641379", "gar"], - "396": ["n02643566", "lionfish"], - "397": ["n02655020", "puffer"], - "398": ["n02666196", "abacus"], - "399": ["n02667093", "abaya"], - "400": ["n02669723", "academic_gown"], - "401": ["n02672831", "accordion"], - "402": ["n02676566", "acoustic_guitar"], - "403": ["n02687172", "aircraft_carrier"], - "404": ["n02690373", "airliner"], - "405": ["n02692877", "airship"], - "406": ["n02699494", "altar"], - "407": ["n02701002", "ambulance"], - "408": ["n02704792", "amphibian"], - "409": ["n02708093", "analog_clock"], - "410": ["n02727426", "apiary"], - "411": ["n02730930", "apron"], - "412": ["n02747177", "ashcan"], - "413": ["n02749479", "assault_rifle"], - "414": ["n02769748", "backpack"], - "415": ["n02776631", "bakery"], - "416": ["n02777292", "balance_beam"], - "417": ["n02782093", "balloon"], - "418": ["n02783161", "ballpoint"], - "419": ["n02786058", "Band_Aid"], - "420": ["n02787622", "banjo"], - "421": ["n02788148", "bannister"], - "422": ["n02790996", "barbell"], - "423": ["n02791124", "barber_chair"], - "424": ["n02791270", "barbershop"], - "425": ["n02793495", "barn"], - "426": ["n02794156", "barometer"], - "427": ["n02795169", "barrel"], - "428": ["n02797295", "barrow"], - "429": ["n02799071", "baseball"], - "430": ["n02802426", "basketball"], - "431": ["n02804414", "bassinet"], - "432": ["n02804610", "bassoon"], - "433": ["n02807133", "bathing_cap"], - "434": ["n02808304", "bath_towel"], - "435": ["n02808440", "bathtub"], - "436": ["n02814533", "beach_wagon"], - "437": ["n02814860", "beacon"], - "438": ["n02815834", "beaker"], - "439": ["n02817516", "bearskin"], - "440": ["n02823428", "beer_bottle"], - "441": ["n02823750", "beer_glass"], - "442": ["n02825657", "bell_cote"], - "443": ["n02834397", "bib"], - "444": ["n02835271", "bicycle-built-for-two"], - "445": ["n02837789", "bikini"], - "446": ["n02840245", "binder"], - "447": ["n02841315", "binoculars"], - "448": ["n02843684", "birdhouse"], - "449": ["n02859443", "boathouse"], - "450": ["n02860847", "bobsled"], - "451": ["n02865351", "bolo_tie"], - "452": ["n02869837", "bonnet"], - "453": ["n02870880", "bookcase"], - "454": ["n02871525", "bookshop"], - "455": ["n02877765", "bottlecap"], - "456": ["n02879718", "bow"], - "457": ["n02883205", "bow_tie"], - "458": ["n02892201", "brass"], - "459": ["n02892767", "brassiere"], - "460": ["n02894605", "breakwater"], - "461": ["n02895154", "breastplate"], - "462": ["n02906734", "broom"], - "463": ["n02909870", "bucket"], - "464": ["n02910353", "buckle"], - "465": ["n02916936", "bulletproof_vest"], - "466": ["n02917067", "bullet_train"], - "467": ["n02927161", "butcher_shop"], - "468": ["n02930766", "cab"], - "469": ["n02939185", "caldron"], - "470": ["n02948072", "candle"], - "471": ["n02950826", "cannon"], - "472": ["n02951358", "canoe"], - "473": ["n02951585", "can_opener"], - "474": ["n02963159", "cardigan"], - "475": ["n02965783", "car_mirror"], - "476": ["n02966193", "carousel"], - "477": ["n02966687", "carpenter's_kit"], - "478": ["n02971356", "carton"], - "479": ["n02974003", "car_wheel"], - "480": ["n02977058", "cash_machine"], - "481": ["n02978881", "cassette"], - "482": ["n02979186", "cassette_player"], - "483": ["n02980441", "castle"], - "484": ["n02981792", "catamaran"], - "485": ["n02988304", "CD_player"], - "486": ["n02992211", "cello"], - "487": ["n02992529", "cellular_telephone"], - "488": ["n02999410", "chain"], - "489": ["n03000134", "chainlink_fence"], - "490": ["n03000247", "chain_mail"], - "491": ["n03000684", "chain_saw"], - "492": ["n03014705", "chest"], - "493": ["n03016953", "chiffonier"], - "494": ["n03017168", "chime"], - "495": ["n03018349", "china_cabinet"], - "496": ["n03026506", "Christmas_stocking"], - "497": ["n03028079", "church"], - "498": ["n03032252", "cinema"], - "499": ["n03041632", "cleaver"], - "500": ["n03042490", "cliff_dwelling"], - "501": ["n03045698", "cloak"], - "502": ["n03047690", "clog"], - "503": ["n03062245", "cocktail_shaker"], - "504": ["n03063599", "coffee_mug"], - "505": ["n03063689", "coffeepot"], - "506": ["n03065424", "coil"], - "507": ["n03075370", "combination_lock"], - "508": ["n03085013", "computer_keyboard"], - "509": ["n03089624", "confectionery"], - "510": ["n03095699", "container_ship"], - "511": ["n03100240", "convertible"], - "512": ["n03109150", "corkscrew"], - "513": ["n03110669", "cornet"], - "514": ["n03124043", "cowboy_boot"], - "515": ["n03124170", "cowboy_hat"], - "516": ["n03125729", "cradle"], - "517": ["n03126707", "crane"], - "518": ["n03127747", "crash_helmet"], - "519": ["n03127925", "crate"], - "520": ["n03131574", "crib"], - "521": ["n03133878", "Crock_Pot"], - "522": ["n03134739", "croquet_ball"], - "523": ["n03141823", "crutch"], - "524": ["n03146219", "cuirass"], - "525": ["n03160309", "dam"], - "526": ["n03179701", "desk"], - "527": ["n03180011", "desktop_computer"], - "528": ["n03187595", "dial_telephone"], - "529": ["n03188531", "diaper"], - "530": ["n03196217", "digital_clock"], - "531": ["n03197337", "digital_watch"], - "532": ["n03201208", "dining_table"], - "533": ["n03207743", "dishrag"], - "534": ["n03207941", "dishwasher"], - "535": ["n03208938", "disk_brake"], - "536": ["n03216828", "dock"], - "537": ["n03218198", "dogsled"], - "538": ["n03220513", "dome"], - "539": ["n03223299", "doormat"], - "540": ["n03240683", "drilling_platform"], - "541": ["n03249569", "drum"], - "542": ["n03250847", "drumstick"], - "543": ["n03255030", "dumbbell"], - "544": ["n03259280", "Dutch_oven"], - "545": ["n03271574", "electric_fan"], - "546": ["n03272010", "electric_guitar"], - "547": ["n03272562", "electric_locomotive"], - "548": ["n03290653", "entertainment_center"], - "549": ["n03291819", "envelope"], - "550": ["n03297495", "espresso_maker"], - "551": ["n03314780", "face_powder"], - "552": ["n03325584", "feather_boa"], - "553": ["n03337140", "file"], - "554": ["n03344393", "fireboat"], - "555": ["n03345487", "fire_engine"], - "556": ["n03347037", "fire_screen"], - "557": ["n03355925", "flagpole"], - "558": ["n03372029", "flute"], - "559": ["n03376595", "folding_chair"], - "560": ["n03379051", "football_helmet"], - "561": ["n03384352", "forklift"], - "562": ["n03388043", "fountain"], - "563": ["n03388183", "fountain_pen"], - "564": ["n03388549", "four-poster"], - "565": ["n03393912", "freight_car"], - "566": ["n03394916", "French_horn"], - "567": ["n03400231", "frying_pan"], - "568": ["n03404251", "fur_coat"], - "569": ["n03417042", "garbage_truck"], - "570": ["n03424325", "gasmask"], - "571": ["n03425413", "gas_pump"], - "572": ["n03443371", "goblet"], - "573": ["n03444034", "go-kart"], - "574": ["n03445777", "golf_ball"], - "575": ["n03445924", "golfcart"], - "576": ["n03447447", "gondola"], - "577": ["n03447721", "gong"], - "578": ["n03450230", "gown"], - "579": ["n03452741", "grand_piano"], - "580": ["n03457902", "greenhouse"], - "581": ["n03459775", "grille"], - "582": ["n03461385", "grocery_store"], - "583": ["n03467068", "guillotine"], - "584": ["n03476684", "hair_slide"], - "585": ["n03476991", "hair_spray"], - "586": ["n03478589", "half_track"], - "587": ["n03481172", "hammer"], - "588": ["n03482405", "hamper"], - "589": ["n03483316", "hand_blower"], - "590": ["n03485407", "hand-held_computer"], - "591": ["n03485794", "handkerchief"], - "592": ["n03492542", "hard_disc"], - "593": ["n03494278", "harmonica"], - "594": ["n03495258", "harp"], - "595": ["n03496892", "harvester"], - "596": ["n03498962", "hatchet"], - "597": ["n03527444", "holster"], - "598": ["n03529860", "home_theater"], - "599": ["n03530642", "honeycomb"], - "600": ["n03532672", "hook"], - "601": ["n03534580", "hoopskirt"], - "602": ["n03535780", "horizontal_bar"], - "603": ["n03538406", "horse_cart"], - "604": ["n03544143", "hourglass"], - "605": ["n03584254", "iPod"], - "606": ["n03584829", "iron"], - "607": ["n03590841", "jack-o'-lantern"], - "608": ["n03594734", "jean"], - "609": ["n03594945", "jeep"], - "610": ["n03595614", "jersey"], - "611": ["n03598930", "jigsaw_puzzle"], - "612": ["n03599486", "jinrikisha"], - "613": ["n03602883", "joystick"], - "614": ["n03617480", "kimono"], - "615": ["n03623198", "knee_pad"], - "616": ["n03627232", "knot"], - "617": ["n03630383", "lab_coat"], - "618": ["n03633091", "ladle"], - "619": ["n03637318", "lampshade"], - "620": ["n03642806", "laptop"], - "621": ["n03649909", "lawn_mower"], - "622": ["n03657121", "lens_cap"], - "623": ["n03658185", "letter_opener"], - "624": ["n03661043", "library"], - "625": ["n03662601", "lifeboat"], - "626": ["n03666591", "lighter"], - "627": ["n03670208", "limousine"], - "628": ["n03673027", "liner"], - "629": ["n03676483", "lipstick"], - "630": ["n03680355", "Loafer"], - "631": ["n03690938", "lotion"], - "632": ["n03691459", "loudspeaker"], - "633": ["n03692522", "loupe"], - "634": ["n03697007", "lumbermill"], - "635": ["n03706229", "magnetic_compass"], - "636": ["n03709823", "mailbag"], - "637": ["n03710193", "mailbox"], - "638": ["n03710637", "maillot"], - "639": ["n03710721", "maillot"], - "640": ["n03717622", "manhole_cover"], - "641": ["n03720891", "maraca"], - "642": ["n03721384", "marimba"], - "643": ["n03724870", "mask"], - "644": ["n03729826", "matchstick"], - "645": ["n03733131", "maypole"], - "646": ["n03733281", "maze"], - "647": ["n03733805", "measuring_cup"], - "648": ["n03742115", "medicine_chest"], - "649": ["n03743016", "megalith"], - "650": ["n03759954", "microphone"], - "651": ["n03761084", "microwave"], - "652": ["n03763968", "military_uniform"], - "653": ["n03764736", "milk_can"], - "654": ["n03769881", "minibus"], - "655": ["n03770439", "miniskirt"], - "656": ["n03770679", "minivan"], - "657": ["n03773504", "missile"], - "658": ["n03775071", "mitten"], - "659": ["n03775546", "mixing_bowl"], - "660": ["n03776460", "mobile_home"], - "661": ["n03777568", "Model_T"], - "662": ["n03777754", "modem"], - "663": ["n03781244", "monastery"], - "664": ["n03782006", "monitor"], - "665": ["n03785016", "moped"], - "666": ["n03786901", "mortar"], - "667": ["n03787032", "mortarboard"], - "668": ["n03788195", "mosque"], - "669": ["n03788365", "mosquito_net"], - "670": ["n03791053", "motor_scooter"], - "671": ["n03792782", "mountain_bike"], - "672": ["n03792972", "mountain_tent"], - "673": ["n03793489", "mouse"], - "674": ["n03794056", "mousetrap"], - "675": ["n03796401", "moving_van"], - "676": ["n03803284", "muzzle"], - "677": ["n03804744", "nail"], - "678": ["n03814639", "neck_brace"], - "679": ["n03814906", "necklace"], - "680": ["n03825788", "nipple"], - "681": ["n03832673", "notebook"], - "682": ["n03837869", "obelisk"], - "683": ["n03838899", "oboe"], - "684": ["n03840681", "ocarina"], - "685": ["n03841143", "odometer"], - "686": ["n03843555", "oil_filter"], - "687": ["n03854065", "organ"], - "688": ["n03857828", "oscilloscope"], - "689": ["n03866082", "overskirt"], - "690": ["n03868242", "oxcart"], - "691": ["n03868863", "oxygen_mask"], - "692": ["n03871628", "packet"], - "693": ["n03873416", "paddle"], - "694": ["n03874293", "paddlewheel"], - "695": ["n03874599", "padlock"], - "696": ["n03876231", "paintbrush"], - "697": ["n03877472", "pajama"], - "698": ["n03877845", "palace"], - "699": ["n03884397", "panpipe"], - "700": ["n03887697", "paper_towel"], - "701": ["n03888257", "parachute"], - "702": ["n03888605", "parallel_bars"], - "703": ["n03891251", "park_bench"], - "704": ["n03891332", "parking_meter"], - "705": ["n03895866", "passenger_car"], - "706": ["n03899768", "patio"], - "707": ["n03902125", "pay-phone"], - "708": ["n03903868", "pedestal"], - "709": ["n03908618", "pencil_box"], - "710": ["n03908714", "pencil_sharpener"], - "711": ["n03916031", "perfume"], - "712": ["n03920288", "Petri_dish"], - "713": ["n03924679", "photocopier"], - "714": ["n03929660", "pick"], - "715": ["n03929855", "pickelhaube"], - "716": ["n03930313", "picket_fence"], - "717": ["n03930630", "pickup"], - "718": ["n03933933", "pier"], - "719": ["n03935335", "piggy_bank"], - "720": ["n03937543", "pill_bottle"], - "721": ["n03938244", "pillow"], - "722": ["n03942813", "ping-pong_ball"], - "723": ["n03944341", "pinwheel"], - "724": ["n03947888", "pirate"], - "725": ["n03950228", "pitcher"], - "726": ["n03954731", "plane"], - "727": ["n03956157", "planetarium"], - "728": ["n03958227", "plastic_bag"], - "729": ["n03961711", "plate_rack"], - "730": ["n03967562", "plow"], - "731": ["n03970156", "plunger"], - "732": ["n03976467", "Polaroid_camera"], - "733": ["n03976657", "pole"], - "734": ["n03977966", "police_van"], - "735": ["n03980874", "poncho"], - "736": ["n03982430", "pool_table"], - "737": ["n03983396", "pop_bottle"], - "738": ["n03991062", "pot"], - "739": ["n03992509", "potter's_wheel"], - "740": ["n03995372", "power_drill"], - "741": ["n03998194", "prayer_rug"], - "742": ["n04004767", "printer"], - "743": ["n04005630", "prison"], - "744": ["n04008634", "projectile"], - "745": ["n04009552", "projector"], - "746": ["n04019541", "puck"], - "747": ["n04023962", "punching_bag"], - "748": ["n04026417", "purse"], - "749": ["n04033901", "quill"], - "750": ["n04033995", "quilt"], - "751": ["n04037443", "racer"], - "752": ["n04039381", "racket"], - "753": ["n04040759", "radiator"], - "754": ["n04041544", "radio"], - "755": ["n04044716", "radio_telescope"], - "756": ["n04049303", "rain_barrel"], - "757": ["n04065272", "recreational_vehicle"], - "758": ["n04067472", "reel"], - "759": ["n04069434", "reflex_camera"], - "760": ["n04070727", "refrigerator"], - "761": ["n04074963", "remote_control"], - "762": ["n04081281", "restaurant"], - "763": ["n04086273", "revolver"], - "764": ["n04090263", "rifle"], - "765": ["n04099969", "rocking_chair"], - "766": ["n04111531", "rotisserie"], - "767": ["n04116512", "rubber_eraser"], - "768": ["n04118538", "rugby_ball"], - "769": ["n04118776", "rule"], - "770": ["n04120489", "running_shoe"], - "771": ["n04125021", "safe"], - "772": ["n04127249", "safety_pin"], - "773": ["n04131690", "saltshaker"], - "774": ["n04133789", "sandal"], - "775": ["n04136333", "sarong"], - "776": ["n04141076", "sax"], - "777": ["n04141327", "scabbard"], - "778": ["n04141975", "scale"], - "779": ["n04146614", "school_bus"], - "780": ["n04147183", "schooner"], - "781": ["n04149813", "scoreboard"], - "782": ["n04152593", "screen"], - "783": ["n04153751", "screw"], - "784": ["n04154565", "screwdriver"], - "785": ["n04162706", "seat_belt"], - "786": ["n04179913", "sewing_machine"], - "787": ["n04192698", "shield"], - "788": ["n04200800", "shoe_shop"], - "789": ["n04201297", "shoji"], - "790": ["n04204238", "shopping_basket"], - "791": ["n04204347", "shopping_cart"], - "792": ["n04208210", "shovel"], - "793": ["n04209133", "shower_cap"], - "794": ["n04209239", "shower_curtain"], - "795": ["n04228054", "ski"], - "796": ["n04229816", "ski_mask"], - "797": ["n04235860", "sleeping_bag"], - "798": ["n04238763", "slide_rule"], - "799": ["n04239074", "sliding_door"], - "800": ["n04243546", "slot"], - "801": ["n04251144", "snorkel"], - "802": ["n04252077", "snowmobile"], - "803": ["n04252225", "snowplow"], - "804": ["n04254120", "soap_dispenser"], - "805": ["n04254680", "soccer_ball"], - "806": ["n04254777", "sock"], - "807": ["n04258138", "solar_dish"], - "808": ["n04259630", "sombrero"], - "809": ["n04263257", "soup_bowl"], - "810": ["n04264628", "space_bar"], - "811": ["n04265275", "space_heater"], - "812": ["n04266014", "space_shuttle"], - "813": ["n04270147", "spatula"], - "814": ["n04273569", "speedboat"], - "815": ["n04275548", "spider_web"], - "816": ["n04277352", "spindle"], - "817": ["n04285008", "sports_car"], - "818": ["n04286575", "spotlight"], - "819": ["n04296562", "stage"], - "820": ["n04310018", "steam_locomotive"], - "821": ["n04311004", "steel_arch_bridge"], - "822": ["n04311174", "steel_drum"], - "823": ["n04317175", "stethoscope"], - "824": ["n04325704", "stole"], - "825": ["n04326547", "stone_wall"], - "826": ["n04328186", "stopwatch"], - "827": ["n04330267", "stove"], - "828": ["n04332243", "strainer"], - "829": ["n04335435", "streetcar"], - "830": ["n04336792", "stretcher"], - "831": ["n04344873", "studio_couch"], - "832": ["n04346328", "stupa"], - "833": ["n04347754", "submarine"], - "834": ["n04350905", "suit"], - "835": ["n04355338", "sundial"], - "836": ["n04355933", "sunglass"], - "837": ["n04356056", "sunglasses"], - "838": ["n04357314", "sunscreen"], - "839": ["n04366367", "suspension_bridge"], - "840": ["n04367480", "swab"], - "841": ["n04370456", "sweatshirt"], - "842": ["n04371430", "swimming_trunks"], - "843": ["n04371774", "swing"], - "844": ["n04372370", "switch"], - "845": ["n04376876", "syringe"], - "846": ["n04380533", "table_lamp"], - "847": ["n04389033", "tank"], - "848": ["n04392985", "tape_player"], - "849": ["n04398044", "teapot"], - "850": ["n04399382", "teddy"], - "851": ["n04404412", "television"], - "852": ["n04409515", "tennis_ball"], - "853": ["n04417672", "thatch"], - "854": ["n04418357", "theater_curtain"], - "855": ["n04423845", "thimble"], - "856": ["n04428191", "thresher"], - "857": ["n04429376", "throne"], - "858": ["n04435653", "tile_roof"], - "859": ["n04442312", "toaster"], - "860": ["n04443257", "tobacco_shop"], - "861": ["n04447861", "toilet_seat"], - "862": ["n04456115", "torch"], - "863": ["n04458633", "totem_pole"], - "864": ["n04461696", "tow_truck"], - "865": ["n04462240", "toyshop"], - "866": ["n04465501", "tractor"], - "867": ["n04467665", "trailer_truck"], - "868": ["n04476259", "tray"], - "869": ["n04479046", "trench_coat"], - "870": ["n04482393", "tricycle"], - "871": ["n04483307", "trimaran"], - "872": ["n04485082", "tripod"], - "873": ["n04486054", "triumphal_arch"], - "874": ["n04487081", "trolleybus"], - "875": ["n04487394", "trombone"], - "876": ["n04493381", "tub"], - "877": ["n04501370", "turnstile"], - "878": ["n04505470", "typewriter_keyboard"], - "879": ["n04507155", "umbrella"], - "880": ["n04509417", "unicycle"], - "881": ["n04515003", "upright"], - "882": ["n04517823", "vacuum"], - "883": ["n04522168", "vase"], - "884": ["n04523525", "vault"], - "885": ["n04525038", "velvet"], - "886": ["n04525305", "vending_machine"], - "887": ["n04532106", "vestment"], - "888": ["n04532670", "viaduct"], - "889": ["n04536866", "violin"], - "890": ["n04540053", "volleyball"], - "891": ["n04542943", "waffle_iron"], - "892": ["n04548280", "wall_clock"], - "893": ["n04548362", "wallet"], - "894": ["n04550184", "wardrobe"], - "895": ["n04552348", "warplane"], - "896": ["n04553703", "washbasin"], - "897": ["n04554684", "washer"], - "898": ["n04557648", "water_bottle"], - "899": ["n04560804", "water_jug"], - "900": ["n04562935", "water_tower"], - "901": ["n04579145", "whiskey_jug"], - "902": ["n04579432", "whistle"], - "903": ["n04584207", "wig"], - "904": ["n04589890", "window_screen"], - "905": ["n04590129", "window_shade"], - "906": ["n04591157", "Windsor_tie"], - "907": ["n04591713", "wine_bottle"], - "908": ["n04592741", "wing"], - "909": ["n04596742", "wok"], - "910": ["n04597913", "wooden_spoon"], - "911": ["n04599235", "wool"], - "912": ["n04604644", "worm_fence"], - "913": ["n04606251", "wreck"], - "914": ["n04612504", "yawl"], - "915": ["n04613696", "yurt"], - "916": ["n06359193", "web_site"], - "917": ["n06596364", "comic_book"], - "918": ["n06785654", "crossword_puzzle"], - "919": ["n06794110", "street_sign"], - "920": ["n06874185", "traffic_light"], - "921": ["n07248320", "book_jacket"], - "922": ["n07565083", "menu"], - "923": ["n07579787", "plate"], - "924": ["n07583066", "guacamole"], - "925": ["n07584110", "consomme"], - "926": ["n07590611", "hot_pot"], - "927": ["n07613480", "trifle"], - "928": ["n07614500", "ice_cream"], - "929": ["n07615774", "ice_lolly"], - "930": ["n07684084", "French_loaf"], - "931": ["n07693725", "bagel"], - "932": ["n07695742", "pretzel"], - "933": ["n07697313", "cheeseburger"], - "934": ["n07697537", "hotdog"], - "935": ["n07711569", "mashed_potato"], - "936": ["n07714571", "head_cabbage"], - "937": ["n07714990", "broccoli"], - "938": ["n07715103", "cauliflower"], - "939": ["n07716358", "zucchini"], - "940": ["n07716906", "spaghetti_squash"], - "941": ["n07717410", "acorn_squash"], - "942": ["n07717556", "butternut_squash"], - "943": ["n07718472", "cucumber"], - "944": ["n07718747", "artichoke"], - "945": ["n07720875", "bell_pepper"], - "946": ["n07730033", "cardoon"], - "947": ["n07734744", "mushroom"], - "948": ["n07742313", "Granny_Smith"], - "949": ["n07745940", "strawberry"], - "950": ["n07747607", "orange"], - "951": ["n07749582", "lemon"], - "952": ["n07753113", "fig"], - "953": ["n07753275", "pineapple"], - "954": ["n07753592", "banana"], - "955": ["n07754684", "jackfruit"], - "956": ["n07760859", "custard_apple"], - "957": ["n07768694", "pomegranate"], - "958": ["n07802026", "hay"], - "959": ["n07831146", "carbonara"], - "960": ["n07836838", "chocolate_sauce"], - "961": ["n07860988", "dough"], - "962": ["n07871810", "meat_loaf"], - "963": ["n07873807", "pizza"], - "964": ["n07875152", "potpie"], - "965": ["n07880968", "burrito"], - "966": ["n07892512", "red_wine"], - "967": ["n07920052", "espresso"], - "968": ["n07930864", "cup"], - "969": ["n07932039", "eggnog"], - "970": ["n09193705", "alp"], - "971": ["n09229709", "bubble"], - "972": ["n09246464", "cliff"], - "973": ["n09256479", "coral_reef"], - "974": ["n09288635", "geyser"], - "975": ["n09332890", "lakeside"], - "976": ["n09399592", "promontory"], - "977": ["n09421951", "sandbar"], - "978": ["n09428293", "seashore"], - "979": ["n09468604", "valley"], - "980": ["n09472597", "volcano"], - "981": ["n09835506", "ballplayer"], - "982": ["n10148035", "groom"], - "983": ["n10565667", "scuba_diver"], - "984": ["n11879895", "rapeseed"], - "985": ["n11939491", "daisy"], - "986": ["n12057211", "yellow_lady's_slipper"], - "987": ["n12144580", "corn"], - "988": ["n12267677", "acorn"], - "989": ["n12620546", "hip"], - "990": ["n12768682", "buckeye"], - "991": ["n12985857", "coral_fungus"], - "992": ["n12998815", "agaric"], - "993": ["n13037406", "gyromitra"], - "994": ["n13040303", "stinkhorn"], - "995": ["n13044778", "earthstar"], - "996": ["n13052670", "hen-of-the-woods"], - "997": ["n13054560", "bolete"], - "998": ["n13133613", "ear"], - "999": ["n15075141", "toilet_tissue"] -} diff --git a/machine_learning/app/main.py b/machine_learning/app/main.py deleted file mode 100644 index 966dc8c53dd..00000000000 --- a/machine_learning/app/main.py +++ /dev/null @@ -1,46 +0,0 @@ -from pydantic import BaseModel -from fastapi import FastAPI - -from .object_detection import object_detection -from .image_classifier import image_classifier - -from tf2_yolov4.anchors import YOLOV4_ANCHORS -from tf2_yolov4.model import YOLOv4 - - -HEIGHT, WIDTH = (640, 960) - -# Warm up model -image_classifier.warm_up() -app = FastAPI() - - -class TagImagePayload(BaseModel): - thumbnail_path: str - - -@app.post("/tagImage") -async def post_root(payload: TagImagePayload): - image_path = payload.thumbnail_path - - if image_path[0] == '.': - image_path = image_path[2:] - - return image_classifier.classify_image(image_path=image_path) - - -@app.get("/") -async def test(): - - object_detection.run_detection() - # image = tf.io.read_file("./app/cars.jpg") - # image = tf.image.decode_image(image) - # image = tf.image.resize(image, (HEIGHT, WIDTH)) - # images = tf.expand_dims(image, axis=0) / 255.0 - - # model = YOLOv4( - # (HEIGHT, WIDTH, 3), - # 80, - # YOLOV4_ANCHORS, - # "darknet", - # ) diff --git a/machine_learning/app/object_detection/__init__.py b/machine_learning/app/object_detection/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/machine_learning/app/object_detection/object_detection.py b/machine_learning/app/object_detection/object_detection.py deleted file mode 100644 index 2f44f7b7482..00000000000 --- a/machine_learning/app/object_detection/object_detection.py +++ /dev/null @@ -1,4 +0,0 @@ - - -def run_detection(): - print("run detection") diff --git a/machine_learning/app/test.png b/machine_learning/app/test.png deleted file mode 100644 index bd77f7719aec5533a216fbd9b6b7b0795dcd2561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353075 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

!{jZmQQs_yT~sEI6n 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¥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 diff --git a/machine_learning/requirements.txt b/machine_learning/requirements.txt deleted file mode 100644 index c1d9129272f..00000000000 --- a/machine_learning/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -opencv-python==4.5.5.64 -fastapi>=0.68.0,<0.69.0 -pydantic>=1.8.0,<2.0.0 -uvicorn>=0.15.0,<0.16.0 -tensorflow==2.8.0 -numpy==1.22.2 -pillow==9.0.1 -tf2_yolov4==0.1.0 \ No newline at end of file diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml index 6d1832875ec..9fdb4c15723 100644 --- a/mobile/android/app/src/main/AndroidManifest.xml +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -23,4 +23,11 @@ + + + + + + + \ No newline at end of file diff --git a/mobile/android/fastlane/metadata/android/en-US/changelogs/17.txt b/mobile/android/fastlane/metadata/android/en-US/changelogs/17.txt new file mode 100644 index 00000000000..87e139d5199 --- /dev/null +++ b/mobile/android/fastlane/metadata/android/en-US/changelogs/17.txt @@ -0,0 +1 @@ +* Added announcement pop-up when a new released is pushed out in Github. \ No newline at end of file diff --git a/mobile/ios/Runner/Info.plist b/mobile/ios/Runner/Info.plist index 36873521ba5..ffdad9da735 100644 --- a/mobile/ios/Runner/Info.plist +++ b/mobile/ios/Runner/Info.plist @@ -58,7 +58,7 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - + UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait @@ -76,5 +76,11 @@ CADisableMinimumFrameDurationOnPhone + + + LSApplicationQueriesSchemes + + https + \ No newline at end of file diff --git a/mobile/ios/fastlane/Fastfile b/mobile/ios/fastlane/Fastfile index d6cd6ee4ca8..a420a9b6772 100644 --- a/mobile/ios/fastlane/Fastfile +++ b/mobile/ios/fastlane/Fastfile @@ -19,7 +19,7 @@ platform :ios do desc "iOS Beta" lane :beta do increment_version_number( - version_number: "1.10.1" + version_number: "1.11.0" ) increment_build_number( build_number: latest_testflight_build_number + 1, diff --git a/mobile/lib/constants/hive_box.dart b/mobile/lib/constants/hive_box.dart index 397680dd39c..fd9642aa742 100644 --- a/mobile/lib/constants/hive_box.dart +++ b/mobile/lib/constants/hive_box.dart @@ -13,3 +13,7 @@ const String savedLoginInfoKey = "immichSavedLoginInfoKey"; // Backup Info const String hiveBackupInfoBox = "immichBackupAlbumInfoBox"; const String backupInfoKey = "immichBackupAlbumInfoKey"; + +// Github Release Info +const String hiveGithubReleaseInfoBox = "immichGithubReleaseInfoBox"; +const String githubReleaseInfoKey = "immichGithubReleaseInfoKey"; diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 7249c712228..0cdc0df67f4 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -5,14 +5,17 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/immich_colors.dart'; import 'package:immich_mobile/modules/backup/models/hive_backup_albums.model.dart'; import 'package:immich_mobile/modules/login/models/hive_saved_login_info.model.dart'; +import 'package:immich_mobile/modules/login/providers/authentication.provider.dart'; import 'package:immich_mobile/shared/providers/asset.provider.dart'; import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/routing/tab_navigation_observer.dart'; import 'package:immich_mobile/shared/providers/app_state.provider.dart'; import 'package:immich_mobile/modules/backup/providers/backup.provider.dart'; +import 'package:immich_mobile/shared/providers/release_info.provider.dart'; import 'package:immich_mobile/shared/providers/server_info.provider.dart'; import 'package:immich_mobile/shared/providers/websocket.provider.dart'; import 'package:immich_mobile/shared/views/immich_loading_overlay.dart'; +import 'package:immich_mobile/shared/views/version_announcement_overlay.dart'; import 'constants/hive_box.dart'; void main() async { @@ -24,6 +27,7 @@ void main() async { await Hive.openBox(userInfoBox); await Hive.openBox(hiveLoginInfoBox); await Hive.openBox(hiveBackupInfoBox); + await Hive.openBox(hiveGithubReleaseInfoBox); SystemChrome.setSystemUIOverlayStyle( const SystemUiOverlayStyle( @@ -48,10 +52,18 @@ class _ImmichAppState extends ConsumerState with WidgetsBindingObserv case AppLifecycleState.resumed: debugPrint("[APP STATE] resumed"); ref.watch(appStateProvider.notifier).state = AppStateEnum.resumed; - ref.watch(backupProvider.notifier).resumeBackup(); + + var isAuthenticated = ref.watch(authenticationProvider).isAuthenticated; + + if (isAuthenticated) { + ref.watch(backupProvider.notifier).resumeBackup(); + ref.watch(assetProvider.notifier).getAllAsset(); + ref.watch(serverInfoProvider.notifier).getServerVersion(); + } + ref.watch(websocketProvider.notifier).connect(); - ref.watch(assetProvider.notifier).getAllAsset(); - ref.watch(serverInfoProvider.notifier).getServerVersion(); + + ref.watch(releaseInfoProvider.notifier).checkGithubReleaseInfo(); break; @@ -95,6 +107,8 @@ class _ImmichAppState extends ConsumerState with WidgetsBindingObserv @override Widget build(BuildContext context) { + ref.watch(releaseInfoProvider.notifier).checkGithubReleaseInfo(); + return MaterialApp( debugShowCheckedModeBanner: false, home: Stack( @@ -121,6 +135,7 @@ class _ImmichAppState extends ConsumerState with WidgetsBindingObserv routerDelegate: _immichRouter.delegate(navigatorObservers: () => [TabNavigationObserver(ref: ref)]), ), const ImmichLoadingOverlay(), + const VersionAnnouncementOverlay(), ], ), ); diff --git a/mobile/lib/shared/providers/release_info.provider.dart b/mobile/lib/shared/providers/release_info.provider.dart new file mode 100644 index 00000000000..dabe2ab7d9a --- /dev/null +++ b/mobile/lib/shared/providers/release_info.provider.dart @@ -0,0 +1,57 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/constants/hive_box.dart'; +import 'package:immich_mobile/shared/views/version_announcement_overlay.dart'; + +class ReleaseInfoNotifier extends StateNotifier { + ReleaseInfoNotifier() : super(""); + + void checkGithubReleaseInfo() async { + var dio = Dio(); + var box = Hive.box(hiveGithubReleaseInfoBox); + + try { + String? localReleaseVersion = box.get(githubReleaseInfoKey); + + Response res = await dio.get( + "https://api.github.com/repos/alextran1502/immich/releases/latest", + options: Options( + headers: {"Accept": "application/vnd.github.v3+json"}, + ), + ); + + if (res.statusCode == 200) { + String latestTagVersion = res.data["tag_name"]; + state = latestTagVersion; + + debugPrint("Local release version $localReleaseVersion"); + debugPrint("Remote release veresion $latestTagVersion"); + + if (localReleaseVersion == null && latestTagVersion.isNotEmpty) { + VersionAnnouncementOverlayController.appLoader.show(); + return; + } + + if (latestTagVersion.isNotEmpty && localReleaseVersion != latestTagVersion) { + VersionAnnouncementOverlayController.appLoader.show(); + return; + } + } + } catch (e) { + debugPrint("Error gettting latest release version"); + + state = ""; + } + } + + void acknowledgeNewVersion() { + var box = Hive.box(hiveGithubReleaseInfoBox); + + box.put(githubReleaseInfoKey, state); + VersionAnnouncementOverlayController.appLoader.hide(); + } +} + +final releaseInfoProvider = StateNotifierProvider((ref) => ReleaseInfoNotifier()); diff --git a/mobile/lib/shared/providers/server_info.provider.dart b/mobile/lib/shared/providers/server_info.provider.dart index edba9cdc271..36abea4f312 100644 --- a/mobile/lib/shared/providers/server_info.provider.dart +++ b/mobile/lib/shared/providers/server_info.provider.dart @@ -19,11 +19,6 @@ class ServerInfoNotifier extends StateNotifier { final ServerInfoService _serverInfoService = ServerInfoService(); - getMapboxInfo() async { - MapboxInfo mapboxInfoRes = await _serverInfoService.getMapboxInfo(); - state = state.copyWith(mapboxInfo: mapboxInfoRes); - } - getServerVersion() async { ServerVersion? serverVersion = await _serverInfoService.getServerVersion(); diff --git a/mobile/lib/shared/services/server_info.service.dart b/mobile/lib/shared/services/server_info.service.dart index 31d127795b3..6fcbda4da73 100644 --- a/mobile/lib/shared/services/server_info.service.dart +++ b/mobile/lib/shared/services/server_info.service.dart @@ -1,4 +1,5 @@ import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; import 'package:immich_mobile/shared/models/mapbox_info.model.dart'; import 'package:immich_mobile/shared/models/server_version.model.dart'; import 'package:immich_mobile/shared/services/network.service.dart'; @@ -13,15 +14,16 @@ class ServerInfoService { return ServerInfo.fromJson(response.toString()); } - Future getMapboxInfo() async { - Response response = await _networkService.getRequest(url: 'server-info/mapbox'); - - return MapboxInfo.fromJson(response.toString()); - } - Future getServerVersion() async { - Response response = await _networkService.getRequest(url: 'server-info/version'); + try { + Response response = + await _networkService.getRequest(url: 'server-info/version'); - return ServerVersion.fromJson(response.toString()); + return ServerVersion.fromJson(response.toString()); + } catch (e) { + debugPrint("Error getting server info"); + } + + return null; } } diff --git a/mobile/lib/shared/views/version_announcement_overlay.dart b/mobile/lib/shared/views/version_announcement_overlay.dart new file mode 100644 index 00000000000..474a1340866 --- /dev/null +++ b/mobile/lib/shared/views/version_announcement_overlay.dart @@ -0,0 +1,133 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/shared/providers/release_info.provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class VersionAnnouncementOverlay extends HookConsumerWidget { + const VersionAnnouncementOverlay({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + void goToReleaseNote() async { + final Uri _url = Uri.parse('https://github.com/alextran1502/immich/releases/latest'); + await launchUrl(_url); + } + + void onAcknowledgeTapped() { + ref.watch(releaseInfoProvider.notifier).acknowledgeNewVersion(); + } + + return ValueListenableBuilder( + valueListenable: VersionAnnouncementOverlayController.appLoader.loaderShowingNotifier, + builder: (context, shouldShow, child) { + if (shouldShow) { + return Scaffold( + backgroundColor: Colors.black38, + body: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 307), + child: Wrap( + children: [ + Card( + child: Padding( + padding: const EdgeInsets.all(30.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + "New Server Version Available 🎉", + style: TextStyle( + fontSize: 16, + fontFamily: 'WorkSans', + fontWeight: FontWeight.bold, + color: Colors.indigo, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 16.0), + child: RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 14, fontFamily: 'WorkSans', color: Colors.black87, height: 1.2), + children: [ + const TextSpan( + text: 'Hi friend, there is a new release of', + ), + const TextSpan( + text: ' Immich ', + style: TextStyle( + fontFamily: "SnowBurstOne", + color: Colors.indigo, + fontWeight: FontWeight.bold, + ), + ), + const TextSpan( + text: "please take your time to visit the ", + ), + TextSpan( + text: "release note", + style: const TextStyle( + decoration: TextDecoration.underline, + ), + recognizer: TapGestureRecognizer()..onTap = goToReleaseNote, + ), + const TextSpan( + text: + " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.", + ) + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + shape: const StadiumBorder(), + visualDensity: VisualDensity.standard, + primary: Colors.indigo, + onPrimary: Colors.grey[50], + elevation: 2, + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 25), + ), + onPressed: onAcknowledgeTapped, + child: const Text( + "Acknowledge", + style: TextStyle( + fontSize: 14, + ), + )), + ) + ], + ), + ), + ), + ], + ), + ), + ), + ); + } else { + return Container(); + } + }, + ); + } +} + +class VersionAnnouncementOverlayController { + static final VersionAnnouncementOverlayController appLoader = VersionAnnouncementOverlayController(); + ValueNotifier loaderShowingNotifier = ValueNotifier(false); + ValueNotifier loaderTextNotifier = ValueNotifier('error message'); + + void show() { + loaderShowingNotifier.value = true; + } + + void hide() { + loaderShowingNotifier.value = false; + } +} diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index f63caf2fc2d..a39306df51b 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1015,6 +1015,62 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.3" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" uuid: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index eec9e7e41dc..62922e7fe3c 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -2,7 +2,7 @@ name: immich_mobile description: Immich - selfhosted backup media file on mobile phone publish_to: "none" -version: 1.10.1+16 +version: 1.11.0+17 environment: sdk: ">=2.15.1 <3.0.0" @@ -39,6 +39,7 @@ dependencies: flutter_swipe_detector: ^2.0.0 equatable: ^2.0.3 image_picker: ^0.8.5+3 + url_launcher: ^6.1.3 dev_dependencies: flutter_test: diff --git a/server/Dockerfile b/server/Dockerfile index 902e9aaf31f..1c1c2979699 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,4 +1,4 @@ -FROM node:16-alpine3.14 +FROM node:16-alpine3.14 as core ARG DEBIAN_FRONTEND=noninteractive diff --git a/server/src/api-v1/asset/asset.controller.ts b/server/apps/immich/src/api-v1/asset/asset.controller.ts similarity index 84% rename from server/src/api-v1/asset/asset.controller.ts rename to server/apps/immich/src/api-v1/asset/asset.controller.ts index 83316abbfe7..75331f6d0a8 100644 --- a/server/src/api-v1/asset/asset.controller.ts +++ b/server/apps/immich/src/api-v1/asset/asset.controller.ts @@ -23,7 +23,7 @@ import { assetUploadOption } from '../../config/asset-upload.config'; import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator'; import { CreateAssetDto } from './dto/create-asset.dto'; import { ServeFileDto } from './dto/serve-file.dto'; -import { AssetEntity } from './entities/asset.entity'; +import { AssetEntity } from '@app/database/entities/asset.entity'; import { GetAllAssetQueryDto } from './dto/get-all-asset-query.dto'; import { Response as Res } from 'express'; import { GetNewAssetQueryDto } from './dto/get-new-asset-query.dto'; @@ -31,6 +31,8 @@ import { BackgroundTaskService } from '../../modules/background-task/background- import { DeleteAssetDto } from './dto/delete-asset.dto'; import { SearchAssetDto } from './dto/search-asset.dto'; import { CommunicationGateway } from '../communication/communication.gateway'; +import { InjectQueue } from '@nestjs/bull'; +import { Queue } from 'bull'; @UseGuards(JwtAuthGuard) @Controller('asset') @@ -39,7 +41,10 @@ export class AssetController { private wsCommunicateionGateway: CommunicationGateway, private assetService: AssetService, private backgroundTaskService: BackgroundTaskService, - ) { } + + @InjectQueue('asset-uploaded-queue') + private assetUploadedQueue: Queue, + ) {} @Post('upload') @UseInterceptors( @@ -61,12 +66,23 @@ export class AssetController { const savedAsset = await this.assetService.createUserAsset(authUser, assetInfo, file.path, file.mimetype); if (uploadFiles.thumbnailData != null && savedAsset) { - await this.assetService.updateThumbnailInfo(savedAsset.id, uploadFiles.thumbnailData[0].path); - await this.backgroundTaskService.tagImage(uploadFiles.thumbnailData[0].path, savedAsset); - await this.backgroundTaskService.detectObject(uploadFiles.thumbnailData[0].path, savedAsset); - } + const assetWithThumbnail = await this.assetService.updateThumbnailInfo( + savedAsset, + uploadFiles.thumbnailData[0].path, + ); - await this.backgroundTaskService.extractExif(savedAsset, file.originalname, file.size); + await this.assetUploadedQueue.add( + 'asset-uploaded', + { asset: assetWithThumbnail, fileName: file.originalname, fileSize: file.size, hasThumbnail: true }, + { jobId: savedAsset.id }, + ); + } else { + await this.assetUploadedQueue.add( + 'asset-uploaded', + { asset: savedAsset, fileName: file.originalname, fileSize: file.size, hasThumbnail: false }, + { jobId: savedAsset.id }, + ); + } this.wsCommunicateionGateway.server.to(savedAsset.userId).emit('on_upload_success', JSON.stringify(savedAsset)); } catch (e) { diff --git a/server/src/api-v1/asset/asset.module.ts b/server/apps/immich/src/api-v1/asset/asset.module.ts similarity index 59% rename from server/src/api-v1/asset/asset.module.ts rename to server/apps/immich/src/api-v1/asset/asset.module.ts index 20fb5d1613b..bb9e0823e0e 100644 --- a/server/src/api-v1/asset/asset.module.ts +++ b/server/apps/immich/src/api-v1/asset/asset.module.ts @@ -2,9 +2,7 @@ import { Module } from '@nestjs/common'; import { AssetService } from './asset.service'; import { AssetController } from './asset.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AssetEntity } from './entities/asset.entity'; -import { ImageOptimizeModule } from '../../modules/image-optimize/image-optimize.module'; -import { AssetOptimizeService } from '../../modules/image-optimize/image-optimize.service'; +import { AssetEntity } from '@app/database/entities/asset.entity'; import { BullModule } from '@nestjs/bull'; import { BackgroundTaskModule } from '../../modules/background-task/background-task.module'; import { BackgroundTaskService } from '../../modules/background-task/background-task.service'; @@ -13,29 +11,19 @@ import { CommunicationModule } from '../communication/communication.module'; @Module({ imports: [ CommunicationModule, - - BullModule.registerQueue({ - name: 'optimize', - defaultJobOptions: { - attempts: 3, - removeOnComplete: true, - removeOnFail: false, - }, - }), - BullModule.registerQueue({ - name: 'background-task', - defaultJobOptions: { - attempts: 3, - removeOnComplete: true, - removeOnFail: false, - }, - }), - TypeOrmModule.forFeature([AssetEntity]), - ImageOptimizeModule, BackgroundTaskModule, + TypeOrmModule.forFeature([AssetEntity]), + BullModule.registerQueue({ + name: 'asset-uploaded-queue', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), ], controllers: [AssetController], - providers: [AssetService, AssetOptimizeService, BackgroundTaskService], + providers: [AssetService, BackgroundTaskService], exports: [], }) -export class AssetModule { } +export class AssetModule {} diff --git a/server/src/api-v1/asset/asset.service.ts b/server/apps/immich/src/api-v1/asset/asset.service.ts similarity index 61% rename from server/src/api-v1/asset/asset.service.ts rename to server/apps/immich/src/api-v1/asset/asset.service.ts index 4c598d6acfc..3221c64bc56 100644 --- a/server/src/api-v1/asset/asset.service.ts +++ b/server/apps/immich/src/api-v1/asset/asset.service.ts @@ -1,9 +1,9 @@ -import { BadRequestException, Injectable, Logger, StreamableFile } from '@nestjs/common'; +import { BadRequestException, Injectable, InternalServerErrorException, Logger, StreamableFile } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { AuthUserDto } from '../../decorators/auth-user.decorator'; import { CreateAssetDto } from './dto/create-asset.dto'; -import { AssetEntity, AssetType } from './entities/asset.entity'; +import { AssetEntity, AssetType } from '@app/database/entities/asset.entity'; import _ from 'lodash'; import { createReadStream, stat } from 'fs'; import { ServeFileDto } from './dto/serve-file.dto'; @@ -11,7 +11,6 @@ import { Response as Res } from 'express'; import { promisify } from 'util'; import { DeleteAssetDto } from './dto/delete-asset.dto'; import { SearchAssetDto } from './dto/search-asset.dto'; -import ffmpeg from 'fluent-ffmpeg'; const fileInfo = promisify(stat); @@ -20,12 +19,18 @@ export class AssetService { constructor( @InjectRepository(AssetEntity) private assetRepository: Repository, - ) { } + ) {} - public async updateThumbnailInfo(assetId: string, path: string) { - return await this.assetRepository.update(assetId, { - resizePath: path, - }); + public async updateThumbnailInfo(asset: AssetEntity, thumbnailPath: string): Promise { + const updatedAsset = await this.assetRepository + .createQueryBuilder('assets') + .update(AssetEntity, { ...asset, resizePath: thumbnailPath }) + .where('assets.id = :id', { id: asset.id }) + .returning('*') + .updateEntity(true) + .execute(); + + return updatedAsset.raw[0]; } public async createUserAsset(authUser: AuthUserDto, assetInfo: CreateAssetDto, path: string, mimeType: string) { @@ -66,13 +71,13 @@ export class AssetService { try { return await this.assetRepository.find({ where: { - userId: authUser.id + userId: authUser.id, }, relations: ['exifInfo'], order: { - createdAt: 'DESC' - } - }) + createdAt: 'DESC', + }, + }); } catch (e) { Logger.error(e, 'getAllAssets'); } @@ -101,35 +106,45 @@ export class AssetService { } public async downloadFile(query: ServeFileDto, res: Res) { - let file = null; - const asset = await this.findOne(query.did, query.aid); + try { + let file = null; + const asset = await this.findOne(query.did, query.aid); - if (query.isThumb === 'false' || !query.isThumb) { - const { size } = await fileInfo(asset.originalPath); - res.set({ - 'Content-Type': asset.mimeType, - 'Content-Length': size, - }); - file = createReadStream(asset.originalPath); - } else { - const { size } = await fileInfo(asset.resizePath); - res.set({ - 'Content-Type': 'image/jpeg', - 'Content-Length': size, - }); - file = createReadStream(asset.resizePath); + if (query.isThumb === 'false' || !query.isThumb) { + const { size } = await fileInfo(asset.originalPath); + res.set({ + 'Content-Type': asset.mimeType, + 'Content-Length': size, + }); + file = createReadStream(asset.originalPath); + } else { + const { size } = await fileInfo(asset.resizePath); + res.set({ + 'Content-Type': 'image/jpeg', + 'Content-Length': size, + }); + file = createReadStream(asset.resizePath); + } + + return new StreamableFile(file); + } catch (e) { + Logger.error('Error download asset ', e); + throw new InternalServerErrorException(`Failed to download asset ${e}`, 'DownloadFile'); } - - return new StreamableFile(file); } public async getAssetThumbnail(assetId: string) { - const asset = await this.assetRepository.findOne({ id: assetId }); + try { + const asset = await this.assetRepository.findOne({ id: assetId }); - if (asset.webpPath != '') { - return new StreamableFile(createReadStream(asset.webpPath)); - } else { - return new StreamableFile(createReadStream(asset.resizePath)); + if (asset.webpPath && asset.webpPath.length > 0) { + return new StreamableFile(createReadStream(asset.webpPath)); + } else { + return new StreamableFile(createReadStream(asset.resizePath)); + } + } catch (e) { + Logger.error('Error serving asset thumbnail ', e); + throw new InternalServerErrorException('Failed to serve asset thumbnail', 'GetAssetThumbnail'); } } @@ -141,7 +156,6 @@ export class AssetService { throw new BadRequestException('Asset does not exist'); } - // Handle Sending Images if (asset.type == AssetType.IMAGE || query.isThumb == 'true') { /** @@ -154,97 +168,102 @@ export class AssetService { return new StreamableFile(createReadStream(asset.resizePath)); } - - /** - * Serve thumbnail image for both web and mobile app - */ - if (query.isThumb === 'false' || !query.isThumb) { - res.set({ - 'Content-Type': asset.mimeType, - }); - file = createReadStream(asset.originalPath); - } else { - if (asset.webpPath != '') { + try { + /** + * Serve thumbnail image for both web and mobile app + */ + if (query.isThumb === 'false' || !query.isThumb) { res.set({ - 'Content-Type': 'image/webp', + 'Content-Type': asset.mimeType, }); - file = createReadStream(asset.webpPath); + file = createReadStream(asset.originalPath); + } else { + if (asset.webpPath && asset.webpPath.length > 0) { + res.set({ + 'Content-Type': 'image/webp', + }); + + file = createReadStream(asset.webpPath); + } else { + res.set({ + 'Content-Type': 'image/jpeg', + }); + file = createReadStream(asset.resizePath); + } + } + + file.on('error', (error) => { + Logger.log(`Cannot create read stream ${error}`); + return new BadRequestException('Cannot Create Read Stream'); + }); + + return new StreamableFile(file); + } catch (e) { + Logger.error('Error serving IMAGE asset ', e); + throw new InternalServerErrorException(`Failed to serve image asset ${e}`, 'ServeFile'); + } + } else if (asset.type == AssetType.VIDEO) { + try { + // Handle Video + let videoPath = asset.originalPath; + let mimeType = asset.mimeType; + + if (query.isWeb && asset.mimeType == 'video/quicktime') { + videoPath = asset.encodedVideoPath == '' ? asset.originalPath : asset.encodedVideoPath; + mimeType = asset.encodedVideoPath == '' ? asset.mimeType : 'video/mp4'; + } + + const { size } = await fileInfo(videoPath); + const range = headers.range; + + if (range) { + /** Extracting Start and End value from Range Header */ + let [start, end] = range.replace(/bytes=/, '').split('-'); + start = parseInt(start, 10); + end = end ? parseInt(end, 10) : size - 1; + + if (!isNaN(start) && isNaN(end)) { + start = start; + end = size - 1; + } + if (isNaN(start) && !isNaN(end)) { + start = size - end; + end = size - 1; + } + + // Handle unavailable range request + if (start >= size || end >= size) { + console.error('Bad Request'); + // Return the 416 Range Not Satisfiable. + res.status(416).set({ + 'Content-Range': `bytes */${size}`, + }); + + throw new BadRequestException('Bad Request Range'); + } + + /** Sending Partial Content With HTTP Code 206 */ + + res.status(206).set({ + 'Content-Range': `bytes ${start}-${end}/${size}`, + 'Accept-Ranges': 'bytes', + 'Content-Length': end - start + 1, + 'Content-Type': mimeType, + }); + + const videoStream = createReadStream(videoPath, { start: start, end: end }); + + return new StreamableFile(videoStream); } else { res.set({ - 'Content-Type': 'image/jpeg', - }); - file = createReadStream(asset.resizePath); - } - } - - file.on('error', (error) => { - Logger.log(`Cannot create read stream ${error}`); - return new BadRequestException('Cannot Create Read Stream'); - }); - - return new StreamableFile(file); - - } else if (asset.type == AssetType.VIDEO) { - // Handle Video - let videoPath = asset.originalPath; - let mimeType = asset.mimeType; - - if (query.isWeb && asset.mimeType == 'video/quicktime') { - videoPath = asset.encodedVideoPath == '' ? asset.originalPath : asset.encodedVideoPath; - mimeType = asset.encodedVideoPath == '' ? asset.mimeType : 'video/mp4'; - } - - const { size } = await fileInfo(videoPath); - const range = headers.range; - - if (range) { - /** Extracting Start and End value from Range Header */ - let [start, end] = range.replace(/bytes=/, '').split('-'); - start = parseInt(start, 10); - end = end ? parseInt(end, 10) : size - 1; - - if (!isNaN(start) && isNaN(end)) { - start = start; - end = size - 1; - } - if (isNaN(start) && !isNaN(end)) { - start = size - end; - end = size - 1; - } - - // Handle unavailable range request - if (start >= size || end >= size) { - console.error('Bad Request'); - // Return the 416 Range Not Satisfiable. - res.status(416).set({ - 'Content-Range': `bytes */${size}`, + 'Content-Type': mimeType, }); - throw new BadRequestException('Bad Request Range'); + return new StreamableFile(createReadStream(videoPath)); } - - /** Sending Partial Content With HTTP Code 206 */ - - res.status(206).set({ - 'Content-Range': `bytes ${start}-${end}/${size}`, - 'Accept-Ranges': 'bytes', - 'Content-Length': end - start + 1, - 'Content-Type': mimeType, - }); - - - const videoStream = createReadStream(videoPath, { start: start, end: end }); - - return new StreamableFile(videoStream); - - - } else { - - res.set({ - 'Content-Type': mimeType, - }); - - return new StreamableFile(createReadStream(videoPath)); + } catch (e) { + Logger.error('Error serving VIDEO asset ', e); + throw new InternalServerErrorException(`Failed to serve video asset ${e}`, 'ServeFile'); } } } diff --git a/server/src/api-v1/asset/dto/create-asset.dto.ts b/server/apps/immich/src/api-v1/asset/dto/create-asset.dto.ts similarity index 86% rename from server/src/api-v1/asset/dto/create-asset.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/create-asset.dto.ts index f3e469ed00e..80ebdfd437a 100644 --- a/server/src/api-v1/asset/dto/create-asset.dto.ts +++ b/server/apps/immich/src/api-v1/asset/dto/create-asset.dto.ts @@ -1,5 +1,5 @@ import { IsNotEmpty, IsOptional } from 'class-validator'; -import { AssetType } from '../entities/asset.entity'; +import { AssetType } from '@app/database/entities/asset.entity'; export class CreateAssetDto { @IsNotEmpty() diff --git a/server/src/api-v1/asset/dto/create-exif.dto.ts b/server/apps/immich/src/api-v1/asset/dto/create-exif.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/create-exif.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/create-exif.dto.ts diff --git a/server/src/api-v1/asset/dto/delete-asset.dto.ts b/server/apps/immich/src/api-v1/asset/dto/delete-asset.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/delete-asset.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/delete-asset.dto.ts diff --git a/server/src/api-v1/asset/dto/get-all-asset-query.dto.ts b/server/apps/immich/src/api-v1/asset/dto/get-all-asset-query.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/get-all-asset-query.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/get-all-asset-query.dto.ts diff --git a/server/src/api-v1/asset/dto/get-all-asset-response.dto.ts b/server/apps/immich/src/api-v1/asset/dto/get-all-asset-response.dto.ts similarity index 67% rename from server/src/api-v1/asset/dto/get-all-asset-response.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/get-all-asset-response.dto.ts index c26bdff1cff..6118786e9ed 100644 --- a/server/src/api-v1/asset/dto/get-all-asset-response.dto.ts +++ b/server/apps/immich/src/api-v1/asset/dto/get-all-asset-response.dto.ts @@ -1,4 +1,4 @@ -import { AssetEntity } from '../entities/asset.entity'; +import { AssetEntity } from '@app/database/entities/asset.entity'; export class GetAllAssetReponseDto { data: Array<{ date: string; assets: Array }>; diff --git a/server/src/api-v1/asset/dto/get-asset.dto.ts b/server/apps/immich/src/api-v1/asset/dto/get-asset.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/get-asset.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/get-asset.dto.ts diff --git a/server/src/api-v1/asset/dto/get-new-asset-query.dto.ts b/server/apps/immich/src/api-v1/asset/dto/get-new-asset-query.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/get-new-asset-query.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/get-new-asset-query.dto.ts diff --git a/server/src/api-v1/asset/dto/search-asset.dto.ts b/server/apps/immich/src/api-v1/asset/dto/search-asset.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/search-asset.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/search-asset.dto.ts diff --git a/server/src/api-v1/asset/dto/serve-file.dto.ts b/server/apps/immich/src/api-v1/asset/dto/serve-file.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/serve-file.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/serve-file.dto.ts diff --git a/server/src/api-v1/asset/dto/update-asset.dto.ts b/server/apps/immich/src/api-v1/asset/dto/update-asset.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/update-asset.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/update-asset.dto.ts diff --git a/server/src/api-v1/asset/dto/update-exif.dto.ts b/server/apps/immich/src/api-v1/asset/dto/update-exif.dto.ts similarity index 100% rename from server/src/api-v1/asset/dto/update-exif.dto.ts rename to server/apps/immich/src/api-v1/asset/dto/update-exif.dto.ts diff --git a/server/src/api-v1/auth/auth.controller.ts b/server/apps/immich/src/api-v1/auth/auth.controller.ts similarity index 93% rename from server/src/api-v1/auth/auth.controller.ts rename to server/apps/immich/src/api-v1/auth/auth.controller.ts index 27e5d38b052..16220f2250f 100644 --- a/server/src/api-v1/auth/auth.controller.ts +++ b/server/apps/immich/src/api-v1/auth/auth.controller.ts @@ -7,7 +7,7 @@ import { SignUpDto } from './dto/sign-up.dto'; @Controller('auth') export class AuthController { - constructor(private readonly authService: AuthService) { } + constructor(private readonly authService: AuthService) {} @Post('/login') async login(@Body(ValidationPipe) loginCredential: LoginCredentialDto) { diff --git a/server/src/api-v1/auth/auth.module.ts b/server/apps/immich/src/api-v1/auth/auth.module.ts similarity index 91% rename from server/src/api-v1/auth/auth.module.ts rename to server/apps/immich/src/api-v1/auth/auth.module.ts index f9b3eee0660..29c009a295c 100644 --- a/server/src/api-v1/auth/auth.module.ts +++ b/server/apps/immich/src/api-v1/auth/auth.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { AuthService } from './auth.service'; import { AuthController } from './auth.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { UserEntity } from '../user/entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; import { ImmichJwtService } from '../../modules/immich-jwt/immich-jwt.service'; import { ImmichJwtModule } from '../../modules/immich-jwt/immich-jwt.module'; import { JwtModule } from '@nestjs/jwt'; diff --git a/server/src/api-v1/auth/auth.service.ts b/server/apps/immich/src/api-v1/auth/auth.service.ts similarity index 98% rename from server/src/api-v1/auth/auth.service.ts rename to server/apps/immich/src/api-v1/auth/auth.service.ts index 8bc2f36231b..34a0c478a5a 100644 --- a/server/src/api-v1/auth/auth.service.ts +++ b/server/apps/immich/src/api-v1/auth/auth.service.ts @@ -1,7 +1,7 @@ import { BadRequestException, Injectable, InternalServerErrorException, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { UserEntity } from '../user/entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; import { LoginCredentialDto } from './dto/login-credential.dto'; import { ImmichJwtService } from '../../modules/immich-jwt/immich-jwt.service'; import { JwtPayloadDto } from './dto/jwt-payload.dto'; diff --git a/server/src/api-v1/auth/dto/jwt-payload.dto.ts b/server/apps/immich/src/api-v1/auth/dto/jwt-payload.dto.ts similarity index 100% rename from server/src/api-v1/auth/dto/jwt-payload.dto.ts rename to server/apps/immich/src/api-v1/auth/dto/jwt-payload.dto.ts diff --git a/server/src/api-v1/auth/dto/login-credential.dto.ts b/server/apps/immich/src/api-v1/auth/dto/login-credential.dto.ts similarity index 100% rename from server/src/api-v1/auth/dto/login-credential.dto.ts rename to server/apps/immich/src/api-v1/auth/dto/login-credential.dto.ts diff --git a/server/src/api-v1/auth/dto/sign-up.dto.ts b/server/apps/immich/src/api-v1/auth/dto/sign-up.dto.ts similarity index 100% rename from server/src/api-v1/auth/dto/sign-up.dto.ts rename to server/apps/immich/src/api-v1/auth/dto/sign-up.dto.ts diff --git a/server/src/api-v1/communication/communication.gateway.ts b/server/apps/immich/src/api-v1/communication/communication.gateway.ts similarity index 95% rename from server/src/api-v1/communication/communication.gateway.ts rename to server/apps/immich/src/api-v1/communication/communication.gateway.ts index 7bf88411d21..ae3d4e70319 100644 --- a/server/src/api-v1/communication/communication.gateway.ts +++ b/server/apps/immich/src/api-v1/communication/communication.gateway.ts @@ -4,7 +4,7 @@ import { Socket, Server } from 'socket.io'; import { ImmichJwtService } from '../../modules/immich-jwt/immich-jwt.service'; import { Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { UserEntity } from '../user/entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; import { Repository } from 'typeorm'; @WebSocketGateway() diff --git a/server/src/api-v1/communication/communication.module.ts b/server/apps/immich/src/api-v1/communication/communication.module.ts similarity index 91% rename from server/src/api-v1/communication/communication.module.ts rename to server/apps/immich/src/api-v1/communication/communication.module.ts index d0b0214265e..95d0360c34e 100644 --- a/server/src/api-v1/communication/communication.module.ts +++ b/server/apps/immich/src/api-v1/communication/communication.module.ts @@ -6,7 +6,7 @@ import { ImmichJwtService } from '../../modules/immich-jwt/immich-jwt.service'; import { JwtModule } from '@nestjs/jwt'; import { jwtConfig } from '../../config/jwt.config'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { UserEntity } from '../user/entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; @Module({ imports: [TypeOrmModule.forFeature([UserEntity]), ImmichJwtModule, JwtModule.register(jwtConfig)], diff --git a/server/src/api-v1/communication/communication.service.ts b/server/apps/immich/src/api-v1/communication/communication.service.ts similarity index 100% rename from server/src/api-v1/communication/communication.service.ts rename to server/apps/immich/src/api-v1/communication/communication.service.ts diff --git a/server/src/api-v1/device-info/device-info.controller.ts b/server/apps/immich/src/api-v1/device-info/device-info.controller.ts similarity index 100% rename from server/src/api-v1/device-info/device-info.controller.ts rename to server/apps/immich/src/api-v1/device-info/device-info.controller.ts diff --git a/server/src/api-v1/device-info/device-info.module.ts b/server/apps/immich/src/api-v1/device-info/device-info.module.ts similarity index 83% rename from server/src/api-v1/device-info/device-info.module.ts rename to server/apps/immich/src/api-v1/device-info/device-info.module.ts index 61a30c3df35..59a129f6679 100644 --- a/server/src/api-v1/device-info/device-info.module.ts +++ b/server/apps/immich/src/api-v1/device-info/device-info.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { DeviceInfoService } from './device-info.service'; import { DeviceInfoController } from './device-info.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { DeviceInfoEntity } from './entities/device-info.entity'; +import { DeviceInfoEntity } from '@app/database/entities/device-info.entity'; @Module({ imports: [TypeOrmModule.forFeature([DeviceInfoEntity])], diff --git a/server/src/api-v1/device-info/device-info.service.ts b/server/apps/immich/src/api-v1/device-info/device-info.service.ts similarity index 96% rename from server/src/api-v1/device-info/device-info.service.ts rename to server/apps/immich/src/api-v1/device-info/device-info.service.ts index fa6270780c5..718774cbf13 100644 --- a/server/src/api-v1/device-info/device-info.service.ts +++ b/server/apps/immich/src/api-v1/device-info/device-info.service.ts @@ -4,7 +4,7 @@ import { Repository } from 'typeorm'; import { AuthUserDto } from '../../decorators/auth-user.decorator'; import { CreateDeviceInfoDto } from './dto/create-device-info.dto'; import { UpdateDeviceInfoDto } from './dto/update-device-info.dto'; -import { DeviceInfoEntity } from './entities/device-info.entity'; +import { DeviceInfoEntity } from '@app/database/entities/device-info.entity'; @Injectable() export class DeviceInfoService { diff --git a/server/src/api-v1/device-info/dto/create-device-info.dto.ts b/server/apps/immich/src/api-v1/device-info/dto/create-device-info.dto.ts similarity index 75% rename from server/src/api-v1/device-info/dto/create-device-info.dto.ts rename to server/apps/immich/src/api-v1/device-info/dto/create-device-info.dto.ts index 9f50e6eaf41..04c7e0e1905 100644 --- a/server/src/api-v1/device-info/dto/create-device-info.dto.ts +++ b/server/apps/immich/src/api-v1/device-info/dto/create-device-info.dto.ts @@ -1,5 +1,5 @@ import { IsNotEmpty, IsOptional } from 'class-validator'; -import { DeviceType } from '../entities/device-info.entity'; +import { DeviceType } from '@app/database/entities/device-info.entity'; export class CreateDeviceInfoDto { @IsNotEmpty() diff --git a/server/src/api-v1/device-info/dto/update-device-info.dto.ts b/server/apps/immich/src/api-v1/device-info/dto/update-device-info.dto.ts similarity index 76% rename from server/src/api-v1/device-info/dto/update-device-info.dto.ts rename to server/apps/immich/src/api-v1/device-info/dto/update-device-info.dto.ts index 10efa928c4a..f8e954f8e85 100644 --- a/server/src/api-v1/device-info/dto/update-device-info.dto.ts +++ b/server/apps/immich/src/api-v1/device-info/dto/update-device-info.dto.ts @@ -1,6 +1,6 @@ import { PartialType } from '@nestjs/mapped-types'; import { IsOptional } from 'class-validator'; -import { DeviceType } from '../entities/device-info.entity'; +import { DeviceType } from '@app/database/entities/device-info.entity'; import { CreateDeviceInfoDto } from './create-device-info.dto'; export class UpdateDeviceInfoDto extends PartialType(CreateDeviceInfoDto) {} diff --git a/server/src/api-v1/server-info/dto/server-info.dto.ts b/server/apps/immich/src/api-v1/server-info/dto/server-info.dto.ts similarity index 100% rename from server/src/api-v1/server-info/dto/server-info.dto.ts rename to server/apps/immich/src/api-v1/server-info/dto/server-info.dto.ts diff --git a/server/src/api-v1/server-info/server-info.controller.ts b/server/apps/immich/src/api-v1/server-info/server-info.controller.ts similarity index 100% rename from server/src/api-v1/server-info/server-info.controller.ts rename to server/apps/immich/src/api-v1/server-info/server-info.controller.ts diff --git a/server/src/api-v1/server-info/server-info.module.ts b/server/apps/immich/src/api-v1/server-info/server-info.module.ts similarity index 88% rename from server/src/api-v1/server-info/server-info.module.ts rename to server/apps/immich/src/api-v1/server-info/server-info.module.ts index feb31de0181..455b4021459 100644 --- a/server/src/api-v1/server-info/server-info.module.ts +++ b/server/apps/immich/src/api-v1/server-info/server-info.module.ts @@ -4,6 +4,6 @@ import { ServerInfoController } from './server-info.controller'; @Module({ controllers: [ServerInfoController], - providers: [ServerInfoService] + providers: [ServerInfoService], }) export class ServerInfoModule {} diff --git a/server/src/api-v1/server-info/server-info.service.ts b/server/apps/immich/src/api-v1/server-info/server-info.service.ts similarity index 100% rename from server/src/api-v1/server-info/server-info.service.ts rename to server/apps/immich/src/api-v1/server-info/server-info.service.ts diff --git a/server/src/api-v1/sharing/dto/add-assets.dto.ts b/server/apps/immich/src/api-v1/sharing/dto/add-assets.dto.ts similarity index 69% rename from server/src/api-v1/sharing/dto/add-assets.dto.ts rename to server/apps/immich/src/api-v1/sharing/dto/add-assets.dto.ts index a64a602fcf7..22f57c1b3a7 100644 --- a/server/src/api-v1/sharing/dto/add-assets.dto.ts +++ b/server/apps/immich/src/api-v1/sharing/dto/add-assets.dto.ts @@ -1,5 +1,5 @@ import { IsNotEmpty } from 'class-validator'; -import { AssetEntity } from '../../asset/entities/asset.entity'; +import { AssetEntity } from '@app/database/entities/asset.entity'; export class AddAssetsDto { @IsNotEmpty() diff --git a/server/src/api-v1/sharing/dto/add-users.dto.ts b/server/apps/immich/src/api-v1/sharing/dto/add-users.dto.ts similarity index 100% rename from server/src/api-v1/sharing/dto/add-users.dto.ts rename to server/apps/immich/src/api-v1/sharing/dto/add-users.dto.ts diff --git a/server/src/api-v1/sharing/dto/create-shared-album.dto.ts b/server/apps/immich/src/api-v1/sharing/dto/create-shared-album.dto.ts similarity index 76% rename from server/src/api-v1/sharing/dto/create-shared-album.dto.ts rename to server/apps/immich/src/api-v1/sharing/dto/create-shared-album.dto.ts index 5aa59cd38ae..6a7194ce3a2 100644 --- a/server/src/api-v1/sharing/dto/create-shared-album.dto.ts +++ b/server/apps/immich/src/api-v1/sharing/dto/create-shared-album.dto.ts @@ -1,5 +1,5 @@ import { IsNotEmpty, IsOptional } from 'class-validator'; -import { AssetEntity } from '../../asset/entities/asset.entity'; +import { AssetEntity } from '@app/database/entities/asset.entity'; export class CreateSharedAlbumDto { @IsNotEmpty() diff --git a/server/src/api-v1/sharing/dto/remove-assets.dto.ts b/server/apps/immich/src/api-v1/sharing/dto/remove-assets.dto.ts similarity index 100% rename from server/src/api-v1/sharing/dto/remove-assets.dto.ts rename to server/apps/immich/src/api-v1/sharing/dto/remove-assets.dto.ts diff --git a/server/src/api-v1/sharing/dto/update-shared-album.dto.ts b/server/apps/immich/src/api-v1/sharing/dto/update-shared-album.dto.ts similarity index 100% rename from server/src/api-v1/sharing/dto/update-shared-album.dto.ts rename to server/apps/immich/src/api-v1/sharing/dto/update-shared-album.dto.ts diff --git a/server/src/api-v1/sharing/sharing.controller.ts b/server/apps/immich/src/api-v1/sharing/sharing.controller.ts similarity index 100% rename from server/src/api-v1/sharing/sharing.controller.ts rename to server/apps/immich/src/api-v1/sharing/sharing.controller.ts diff --git a/server/src/api-v1/sharing/sharing.module.ts b/server/apps/immich/src/api-v1/sharing/sharing.module.ts similarity index 55% rename from server/src/api-v1/sharing/sharing.module.ts rename to server/apps/immich/src/api-v1/sharing/sharing.module.ts index 04b511e7d28..f49e21850fc 100644 --- a/server/src/api-v1/sharing/sharing.module.ts +++ b/server/apps/immich/src/api-v1/sharing/sharing.module.ts @@ -2,11 +2,11 @@ import { Module } from '@nestjs/common'; import { SharingService } from './sharing.service'; import { SharingController } from './sharing.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AssetEntity } from '../asset/entities/asset.entity'; -import { UserEntity } from '../user/entities/user.entity'; -import { SharedAlbumEntity } from './entities/shared-album.entity'; -import { AssetSharedAlbumEntity } from './entities/asset-shared-album.entity'; -import { UserSharedAlbumEntity } from './entities/user-shared-album.entity'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; +import { AssetSharedAlbumEntity } from '@app/database/entities/asset-shared-album.entity'; +import { SharedAlbumEntity } from '@app/database/entities/shared-album.entity'; +import { UserSharedAlbumEntity } from '@app/database/entities/user-shared-album.entity'; @Module({ imports: [ diff --git a/server/src/api-v1/sharing/sharing.service.ts b/server/apps/immich/src/api-v1/sharing/sharing.service.ts similarity index 94% rename from server/src/api-v1/sharing/sharing.service.ts rename to server/apps/immich/src/api-v1/sharing/sharing.service.ts index 6a1ffa07e01..7f8207fcfc8 100644 --- a/server/src/api-v1/sharing/sharing.service.ts +++ b/server/apps/immich/src/api-v1/sharing/sharing.service.ts @@ -2,13 +2,13 @@ import { BadRequestException, Injectable, NotFoundException, UnauthorizedExcepti import { InjectRepository } from '@nestjs/typeorm'; import { getConnection, Repository } from 'typeorm'; import { AuthUserDto } from '../../decorators/auth-user.decorator'; -import { AssetEntity } from '../asset/entities/asset.entity'; -import { UserEntity } from '../user/entities/user.entity'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; import { AddAssetsDto } from './dto/add-assets.dto'; import { CreateSharedAlbumDto } from './dto/create-shared-album.dto'; -import { AssetSharedAlbumEntity } from './entities/asset-shared-album.entity'; -import { SharedAlbumEntity } from './entities/shared-album.entity'; -import { UserSharedAlbumEntity } from './entities/user-shared-album.entity'; +import { AssetSharedAlbumEntity } from '@app/database/entities/asset-shared-album.entity'; +import { SharedAlbumEntity } from '@app/database/entities/shared-album.entity'; +import { UserSharedAlbumEntity } from '@app/database/entities/user-shared-album.entity'; import _ from 'lodash'; import { AddUsersDto } from './dto/add-users.dto'; import { RemoveAssetsDto } from './dto/remove-assets.dto'; diff --git a/server/src/api-v1/user/dto/create-user.dto.ts b/server/apps/immich/src/api-v1/user/dto/create-user.dto.ts similarity index 100% rename from server/src/api-v1/user/dto/create-user.dto.ts rename to server/apps/immich/src/api-v1/user/dto/create-user.dto.ts diff --git a/server/src/api-v1/user/dto/update-user.dto.ts b/server/apps/immich/src/api-v1/user/dto/update-user.dto.ts similarity index 100% rename from server/src/api-v1/user/dto/update-user.dto.ts rename to server/apps/immich/src/api-v1/user/dto/update-user.dto.ts diff --git a/server/src/api-v1/user/response-dto/user.ts b/server/apps/immich/src/api-v1/user/response-dto/user.ts similarity index 79% rename from server/src/api-v1/user/response-dto/user.ts rename to server/apps/immich/src/api-v1/user/response-dto/user.ts index 9f96380a9ac..57f503ac162 100644 --- a/server/src/api-v1/user/response-dto/user.ts +++ b/server/apps/immich/src/api-v1/user/response-dto/user.ts @@ -1,4 +1,4 @@ -import { UserEntity } from '../entities/user.entity'; +import { UserEntity } from '../../../../../../libs/database/src/entities/user.entity'; export interface User { id: string; diff --git a/server/src/api-v1/user/user.controller.ts b/server/apps/immich/src/api-v1/user/user.controller.ts similarity index 80% rename from server/src/api-v1/user/user.controller.ts rename to server/apps/immich/src/api-v1/user/user.controller.ts index 58c30a9e2ac..b7da4f87d3b 100644 --- a/server/src/api-v1/user/user.controller.ts +++ b/server/apps/immich/src/api-v1/user/user.controller.ts @@ -1,4 +1,19 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, ValidationPipe, Put, Query, UseInterceptors, UploadedFile, Response } from '@nestjs/common'; +import { + Controller, + Get, + Post, + Body, + Patch, + Param, + Delete, + UseGuards, + ValidationPipe, + Put, + Query, + UseInterceptors, + UploadedFile, + Response, +} from '@nestjs/common'; import { UserService } from './user.service'; import { JwtAuthGuard } from '../../modules/immich-jwt/guards/jwt-auth.guard'; import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator'; @@ -11,7 +26,7 @@ import { Response as Res } from 'express'; @Controller('user') export class UserController { - constructor(private readonly userService: UserService) { } + constructor(private readonly userService: UserService) {} @UseGuards(JwtAuthGuard) @Get() @@ -28,14 +43,13 @@ export class UserController { @Get('/count') async getUserCount(@Query('isAdmin') isAdmin: boolean) { - return await this.userService.getUserCount(isAdmin); } @UseGuards(JwtAuthGuard) @Put() async updateUser(@Body(ValidationPipe) updateUserDto: UpdateUserDto) { - return await this.userService.updateUser(updateUserDto) + return await this.userService.updateUser(updateUserDto); } @UseGuards(JwtAuthGuard) @@ -46,9 +60,7 @@ export class UserController { } @Get('/profile-image/:userId') - async getProfileImage(@Param('userId') userId: string, - @Response({ passthrough: true }) res: Res, - ) { + async getProfileImage(@Param('userId') userId: string, @Response({ passthrough: true }) res: Res) { return await this.userService.getUserProfileImage(userId, res); } } diff --git a/server/src/api-v1/user/user.module.ts b/server/apps/immich/src/api-v1/user/user.module.ts similarity index 87% rename from server/src/api-v1/user/user.module.ts rename to server/apps/immich/src/api-v1/user/user.module.ts index c348f4bc20c..021db43339c 100644 --- a/server/src/api-v1/user/user.module.ts +++ b/server/apps/immich/src/api-v1/user/user.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { UserService } from './user.service'; import { UserController } from './user.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { UserEntity } from './entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; import { ImmichJwtModule } from '../../modules/immich-jwt/immich-jwt.module'; import { ImmichJwtService } from '../../modules/immich-jwt/immich-jwt.service'; import { JwtModule } from '@nestjs/jwt'; @@ -13,4 +13,4 @@ import { jwtConfig } from '../../config/jwt.config'; controllers: [UserController], providers: [UserService, ImmichJwtService], }) -export class UserModule { } +export class UserModule {} diff --git a/server/src/api-v1/user/user.service.ts b/server/apps/immich/src/api-v1/user/user.service.ts similarity index 98% rename from server/src/api-v1/user/user.service.ts rename to server/apps/immich/src/api-v1/user/user.service.ts index e24bb1784ef..3ce8d38531b 100644 --- a/server/src/api-v1/user/user.service.ts +++ b/server/apps/immich/src/api-v1/user/user.service.ts @@ -4,7 +4,7 @@ import { Not, Repository } from 'typeorm'; import { AuthUserDto } from '../../decorators/auth-user.decorator'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; -import { UserEntity } from './entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; import * as bcrypt from 'bcrypt'; import { createReadStream } from 'fs'; import { Response as Res } from 'express'; diff --git a/server/src/app.controller.ts b/server/apps/immich/src/app.controller.ts similarity index 80% rename from server/src/app.controller.ts rename to server/apps/immich/src/app.controller.ts index 85fbb096a1f..f104e3c77b2 100644 --- a/server/src/app.controller.ts +++ b/server/apps/immich/src/app.controller.ts @@ -1,15 +1,13 @@ import { Controller, Get, Res, Headers } from '@nestjs/common'; import { Response } from 'express'; - @Controller() - export class AppController { - constructor() { } + constructor() {} @Get() async redirectToWebpage(@Res({ passthrough: true }) res: Response, @Headers() headers) { const host = headers.host; - return res.redirect(`http://${host}:2285`) + return res.redirect(`http://${host}:2285`); } } diff --git a/server/src/app.module.ts b/server/apps/immich/src/app.module.ts similarity index 86% rename from server/src/app.module.ts rename to server/apps/immich/src/app.module.ts index 7aedb33c80e..084b01b38ce 100644 --- a/server/src/app.module.ts +++ b/server/apps/immich/src/app.module.ts @@ -1,6 +1,4 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { databaseConfig } from './config/database.config'; import { UserModule } from './api-v1/user/user.module'; import { AssetModule } from './api-v1/asset/asset.module'; import { AuthModule } from './api-v1/auth/auth.module'; @@ -10,7 +8,6 @@ import { AppLoggerMiddleware } from './middlewares/app-logger.middleware'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { immichAppConfig } from './config/app.config'; import { BullModule } from '@nestjs/bull'; -import { ImageOptimizeModule } from './modules/image-optimize/image-optimize.module'; import { ServerInfoModule } from './api-v1/server-info/server-info.module'; import { BackgroundTaskModule } from './modules/background-task/background-task.module'; import { CommunicationModule } from './api-v1/communication/communication.module'; @@ -18,14 +15,13 @@ import { SharingModule } from './api-v1/sharing/sharing.module'; import { AppController } from './app.controller'; import { ScheduleModule } from '@nestjs/schedule'; import { ScheduleTasksModule } from './modules/schedule-tasks/schedule-tasks.module'; - +import { DatabaseModule } from '@app/database'; @Module({ imports: [ ConfigModule.forRoot(immichAppConfig), - TypeOrmModule.forRoot(databaseConfig), - + DatabaseModule, UserModule, AssetModule, @@ -45,8 +41,6 @@ import { ScheduleTasksModule } from './modules/schedule-tasks/schedule-tasks.mod }), }), - ImageOptimizeModule, - ServerInfoModule, BackgroundTaskModule, @@ -57,7 +51,7 @@ import { ScheduleTasksModule } from './modules/schedule-tasks/schedule-tasks.mod ScheduleModule.forRoot(), - ScheduleTasksModule + ScheduleTasksModule, ], controllers: [AppController], providers: [], diff --git a/server/src/config/app.config.ts b/server/apps/immich/src/config/app.config.ts similarity index 100% rename from server/src/config/app.config.ts rename to server/apps/immich/src/config/app.config.ts diff --git a/server/src/config/asset-upload.config.ts b/server/apps/immich/src/config/asset-upload.config.ts similarity index 99% rename from server/src/config/asset-upload.config.ts rename to server/apps/immich/src/config/asset-upload.config.ts index 4a1c2691819..a868d0c3565 100644 --- a/server/src/config/asset-upload.config.ts +++ b/server/apps/immich/src/config/asset-upload.config.ts @@ -56,5 +56,3 @@ export const assetUploadOption: MulterOptions = { }, }), }; - - diff --git a/server/src/config/jwt.config.ts b/server/apps/immich/src/config/jwt.config.ts similarity index 100% rename from server/src/config/jwt.config.ts rename to server/apps/immich/src/config/jwt.config.ts diff --git a/server/src/config/profile-image-upload.config.ts b/server/apps/immich/src/config/profile-image-upload.config.ts similarity index 99% rename from server/src/config/profile-image-upload.config.ts rename to server/apps/immich/src/config/profile-image-upload.config.ts index 29d8be5d565..76e65e68c57 100644 --- a/server/src/config/profile-image-upload.config.ts +++ b/server/apps/immich/src/config/profile-image-upload.config.ts @@ -24,17 +24,13 @@ export const profileImageUploadOption: MulterOptions = { mkdirSync(profileImageLocation, { recursive: true }); } - cb(null, profileImageLocation); }, filename: (req: Request, file: Express.Multer.File, cb: any) => { - const userId = req.user['id']; cb(null, `${userId}${extname(file.originalname)}`); }, }), }; - - diff --git a/server/src/constants/jwt.constant.ts b/server/apps/immich/src/constants/jwt.constant.ts similarity index 100% rename from server/src/constants/jwt.constant.ts rename to server/apps/immich/src/constants/jwt.constant.ts diff --git a/server/src/constants/server_version.constant.ts b/server/apps/immich/src/constants/server_version.constant.ts similarity index 84% rename from server/src/constants/server_version.constant.ts rename to server/apps/immich/src/constants/server_version.constant.ts index 4ae25c1bea9..97b113bdf29 100644 --- a/server/src/constants/server_version.constant.ts +++ b/server/apps/immich/src/constants/server_version.constant.ts @@ -3,7 +3,7 @@ export const serverVersion = { major: 1, - minor: 10, + minor: 11, patch: 0, - build: 14, + build: 17, }; diff --git a/server/src/constants/upload_location.constant.ts b/server/apps/immich/src/constants/upload_location.constant.ts similarity index 100% rename from server/src/constants/upload_location.constant.ts rename to server/apps/immich/src/constants/upload_location.constant.ts diff --git a/server/src/decorators/auth-user.decorator.ts b/server/apps/immich/src/decorators/auth-user.decorator.ts similarity index 87% rename from server/src/decorators/auth-user.decorator.ts rename to server/apps/immich/src/decorators/auth-user.decorator.ts index bedd96baed4..629fa62a8ab 100644 --- a/server/src/decorators/auth-user.decorator.ts +++ b/server/apps/immich/src/decorators/auth-user.decorator.ts @@ -1,5 +1,5 @@ import { createParamDecorator, ExecutionContext, UnauthorizedException } from '@nestjs/common'; -import { UserEntity } from '../api-v1/user/entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; // import { AuthUserDto } from './dto/auth-user.dto'; export class AuthUserDto { @@ -18,4 +18,4 @@ export const GetAuthUser = createParamDecorator((data, ctx: ExecutionContext): A }; return authUser; -}); \ No newline at end of file +}); diff --git a/server/src/main.ts b/server/apps/immich/src/main.ts similarity index 94% rename from server/src/main.ts rename to server/apps/immich/src/main.ts index 98487642aa0..a61c78caf58 100644 --- a/server/src/main.ts +++ b/server/apps/immich/src/main.ts @@ -15,11 +15,11 @@ async function bootstrap() { await app.listen(3000, () => { if (process.env.NODE_ENV == 'development') { - Logger.log('Running Immich Server in DEVELOPMENT environment', 'IMMICH SERVER'); + Logger.log('Running Immich Server in DEVELOPMENT environment', 'ImmichServer'); } if (process.env.NODE_ENV == 'production') { - Logger.log('Running Immich Server in PRODUCTION environment', 'IMMICH SERVER'); + Logger.log('Running Immich Server in PRODUCTION environment', 'ImmichServer'); } }); } diff --git a/server/src/middlewares/admin-role-guard.middleware.ts b/server/apps/immich/src/middlewares/admin-role-guard.middleware.ts similarity index 83% rename from server/src/middlewares/admin-role-guard.middleware.ts rename to server/apps/immich/src/middlewares/admin-role-guard.middleware.ts index 84d8f6ac463..5719328e11b 100644 --- a/server/src/middlewares/admin-role-guard.middleware.ts +++ b/server/apps/immich/src/middlewares/admin-role-guard.middleware.ts @@ -3,21 +3,23 @@ import { Reflector } from '@nestjs/core'; import { JwtService } from '@nestjs/jwt'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { UserEntity } from '../api-v1/user/entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; import { ImmichJwtService } from '../modules/immich-jwt/immich-jwt.service'; @Injectable() export class AdminRolesGuard implements CanActivate { - constructor(private reflector: Reflector, private jwtService: ImmichJwtService, + constructor( + private reflector: Reflector, + private jwtService: ImmichJwtService, @InjectRepository(UserEntity) private userRepository: Repository, - ) { } + ) {} async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest(); if (request.headers['authorization']) { - const bearerToken = request.headers['authorization'].split(" ")[1] + const bearerToken = request.headers['authorization'].split(' ')[1]; const { userId } = await this.jwtService.validateToken(bearerToken); const user = await this.userRepository.findOne(userId); @@ -27,4 +29,4 @@ export class AdminRolesGuard implements CanActivate { return false; } -} \ No newline at end of file +} diff --git a/server/src/middlewares/app-logger.middleware.ts b/server/apps/immich/src/middlewares/app-logger.middleware.ts similarity index 100% rename from server/src/middlewares/app-logger.middleware.ts rename to server/apps/immich/src/middlewares/app-logger.middleware.ts diff --git a/server/src/middlewares/redis-io.adapter.middleware.ts b/server/apps/immich/src/middlewares/redis-io.adapter.middleware.ts similarity index 91% rename from server/src/middlewares/redis-io.adapter.middleware.ts rename to server/apps/immich/src/middlewares/redis-io.adapter.middleware.ts index 45940b04d6a..4e06813dedd 100644 --- a/server/src/middlewares/redis-io.adapter.middleware.ts +++ b/server/apps/immich/src/middlewares/redis-io.adapter.middleware.ts @@ -3,7 +3,7 @@ import { RedisClient } from 'redis'; import { ServerOptions } from 'socket.io'; import { createAdapter } from 'socket.io-redis'; -const redis_host = process.env.REDIS_HOSTNAME || 'immich_redis' +const redis_host = process.env.REDIS_HOSTNAME || 'immich_redis'; // const pubClient = createClient({ url: `redis://${redis_host}:6379` }); // const subClient = pubClient.duplicate(); diff --git a/server/src/modules/background-task/background-task.module.ts b/server/apps/immich/src/modules/background-task/background-task.module.ts similarity index 67% rename from server/src/modules/background-task/background-task.module.ts rename to server/apps/immich/src/modules/background-task/background-task.module.ts index ba912f5b2ff..11e1e7a69ec 100644 --- a/server/src/modules/background-task/background-task.module.ts +++ b/server/apps/immich/src/modules/background-task/background-task.module.ts @@ -1,9 +1,9 @@ import { BullModule } from '@nestjs/bull'; import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; -import { ExifEntity } from '../../api-v1/asset/entities/exif.entity'; -import { SmartInfoEntity } from '../../api-v1/asset/entities/smart-info.entity'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import { ExifEntity } from '@app/database/entities/exif.entity'; +import { SmartInfoEntity } from '@app/database/entities/smart-info.entity'; import { BackgroundTaskProcessor } from './background-task.processor'; import { BackgroundTaskService } from './background-task.service'; @@ -17,10 +17,9 @@ import { BackgroundTaskService } from './background-task.service'; removeOnFail: false, }, }), - TypeOrmModule.forFeature([AssetEntity, ExifEntity, SmartInfoEntity]), ], providers: [BackgroundTaskService, BackgroundTaskProcessor], - exports: [BackgroundTaskService], + exports: [BackgroundTaskService, BullModule], }) -export class BackgroundTaskModule { } +export class BackgroundTaskModule {} diff --git a/server/apps/immich/src/modules/background-task/background-task.processor.ts b/server/apps/immich/src/modules/background-task/background-task.processor.ts new file mode 100644 index 00000000000..900b5fffb60 --- /dev/null +++ b/server/apps/immich/src/modules/background-task/background-task.processor.ts @@ -0,0 +1,39 @@ +import { InjectQueue, Process, Processor } from '@nestjs/bull'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Job, Queue } from 'bull'; +import { Repository } from 'typeorm'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import fs from 'fs'; +import { Logger } from '@nestjs/common'; +import axios from 'axios'; +import { SmartInfoEntity } from '@app/database/entities/smart-info.entity'; + +@Processor('background-task') +export class BackgroundTaskProcessor { + constructor( + @InjectRepository(AssetEntity) + private assetRepository: Repository, + + @InjectRepository(SmartInfoEntity) + private smartInfoRepository: Repository, + ) {} + + @Process('delete-file-on-disk') + async deleteFileOnDisk(job) { + const { assets }: { assets: AssetEntity[] } = job.data; + + for (const asset of assets) { + fs.unlink(asset.originalPath, (err) => { + if (err) { + console.log('error deleting ', asset.originalPath); + } + }); + + fs.unlink(asset.resizePath, (err) => { + if (err) { + console.log('error deleting ', asset.originalPath); + } + }); + } + } +} diff --git a/server/apps/immich/src/modules/background-task/background-task.service.ts b/server/apps/immich/src/modules/background-task/background-task.service.ts new file mode 100644 index 00000000000..6b15b7ff6be --- /dev/null +++ b/server/apps/immich/src/modules/background-task/background-task.service.ts @@ -0,0 +1,23 @@ +import { InjectQueue } from '@nestjs/bull/dist/decorators'; +import { Injectable } from '@nestjs/common'; +import { Queue } from 'bull'; +import { randomUUID } from 'node:crypto'; +import { AssetEntity } from '@app/database/entities/asset.entity'; + +@Injectable() +export class BackgroundTaskService { + constructor( + @InjectQueue('background-task') + private backgroundTaskQueue: Queue, + ) {} + + async deleteFileOnDisk(assets: AssetEntity[]) { + await this.backgroundTaskQueue.add( + 'delete-file-on-disk', + { + assets, + }, + { jobId: randomUUID() }, + ); + } +} diff --git a/server/src/modules/immich-jwt/guards/jwt-auth.guard.ts b/server/apps/immich/src/modules/immich-jwt/guards/jwt-auth.guard.ts similarity index 100% rename from server/src/modules/immich-jwt/guards/jwt-auth.guard.ts rename to server/apps/immich/src/modules/immich-jwt/guards/jwt-auth.guard.ts diff --git a/server/src/modules/immich-jwt/immich-jwt.module.ts b/server/apps/immich/src/modules/immich-jwt/immich-jwt.module.ts similarity index 87% rename from server/src/modules/immich-jwt/immich-jwt.module.ts rename to server/apps/immich/src/modules/immich-jwt/immich-jwt.module.ts index 5008613832f..d7835d277c8 100644 --- a/server/src/modules/immich-jwt/immich-jwt.module.ts +++ b/server/apps/immich/src/modules/immich-jwt/immich-jwt.module.ts @@ -4,7 +4,7 @@ import { JwtModule } from '@nestjs/jwt'; import { jwtConfig } from '../../config/jwt.config'; import { JwtStrategy } from './strategies/jwt.strategy'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { UserEntity } from '../../api-v1/user/entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; @Module({ imports: [JwtModule.register(jwtConfig), TypeOrmModule.forFeature([UserEntity])], diff --git a/server/src/modules/immich-jwt/immich-jwt.service.ts b/server/apps/immich/src/modules/immich-jwt/immich-jwt.service.ts similarity index 100% rename from server/src/modules/immich-jwt/immich-jwt.service.ts rename to server/apps/immich/src/modules/immich-jwt/immich-jwt.service.ts diff --git a/server/src/modules/immich-jwt/strategies/jwt.strategy.ts b/server/apps/immich/src/modules/immich-jwt/strategies/jwt.strategy.ts similarity index 93% rename from server/src/modules/immich-jwt/strategies/jwt.strategy.ts rename to server/apps/immich/src/modules/immich-jwt/strategies/jwt.strategy.ts index d4cabe897c5..d83e01ebdb7 100644 --- a/server/src/modules/immich-jwt/strategies/jwt.strategy.ts +++ b/server/apps/immich/src/modules/immich-jwt/strategies/jwt.strategy.ts @@ -4,7 +4,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { ExtractJwt, Strategy } from 'passport-jwt'; import { Repository } from 'typeorm'; import { JwtPayloadDto } from '../../../api-v1/auth/dto/jwt-payload.dto'; -import { UserEntity } from '../../../api-v1/user/entities/user.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; import { jwtSecret } from '../../../constants/jwt.constant'; @Injectable() diff --git a/server/apps/immich/src/modules/schedule-tasks/schedule-tasks.module.ts b/server/apps/immich/src/modules/schedule-tasks/schedule-tasks.module.ts new file mode 100644 index 00000000000..d085cb0398f --- /dev/null +++ b/server/apps/immich/src/modules/schedule-tasks/schedule-tasks.module.ts @@ -0,0 +1,30 @@ +import { BullModule } from '@nestjs/bull'; +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import { ScheduleTasksService } from './schedule-tasks.service'; +import { MicroservicesModule } from '../../../../microservices/src/microservices.module'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([AssetEntity]), + BullModule.registerQueue({ + name: 'video-conversion-queue', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + BullModule.registerQueue({ + name: 'thumbnail-generator-queue', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + ], + providers: [ScheduleTasksService], +}) +export class ScheduleTasksModule {} diff --git a/server/apps/immich/src/modules/schedule-tasks/schedule-tasks.service.ts b/server/apps/immich/src/modules/schedule-tasks/schedule-tasks.service.ts new file mode 100644 index 00000000000..aa869480b8c --- /dev/null +++ b/server/apps/immich/src/modules/schedule-tasks/schedule-tasks.service.ts @@ -0,0 +1,60 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { Cron, CronExpression } from '@nestjs/schedule'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import { InjectQueue } from '@nestjs/bull'; +import { Queue } from 'bull'; +import { randomUUID } from 'crypto'; + +@Injectable() +export class ScheduleTasksService { + constructor( + @InjectRepository(AssetEntity) + private assetRepository: Repository, + + @InjectQueue('thumbnail-generator-queue') + private thumbnailGeneratorQueue: Queue, + + @InjectQueue('video-conversion-queue') + private videoConversionQueue: Queue, + ) {} + + @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT) + async webpConversion() { + Logger.log('Starting Schedule Webp Conversion Tasks', 'CronjobWebpGenerator'); + + const assets = await this.assetRepository.find({ + where: { + webpPath: '', + }, + }); + + if (assets.length == 0) { + Logger.log('All assets has webp file - aborting task', 'CronjobWebpGenerator'); + return; + } + + for (const asset of assets) { + await this.thumbnailGeneratorQueue.add('generate-webp-thumbnail', { asset: asset }, { jobId: randomUUID() }); + } + } + + @Cron(CronExpression.EVERY_DAY_AT_1AM) + async videoConversion() { + const assets = await this.assetRepository.find({ + where: { + type: 'VIDEO', + mimeType: 'video/quicktime', + encodedVideoPath: '', + }, + order: { + createdAt: 'DESC', + }, + }); + + for (const asset of assets) { + await this.videoConversionQueue.add('mp4-conversion', { asset }, { jobId: randomUUID() }); + } + } +} diff --git a/server/apps/immich/test/jest-e2e.json b/server/apps/immich/test/jest-e2e.json new file mode 100644 index 00000000000..7358e01b4f0 --- /dev/null +++ b/server/apps/immich/test/jest-e2e.json @@ -0,0 +1,13 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "moduleNameMapper": { + "@app/database/config/(.*)": "../../../libs/database/src/config/$1", + "@app/database/entities/(.*)": "../../../libs/database/src/entities/$1" + } +} diff --git a/server/test/test-utils.ts b/server/apps/immich/test/test-utils.ts similarity index 100% rename from server/test/test-utils.ts rename to server/apps/immich/test/test-utils.ts diff --git a/server/test/user.e2e-spec.ts b/server/apps/immich/test/user.e2e-spec.ts similarity index 98% rename from server/test/user.e2e-spec.ts rename to server/apps/immich/test/user.e2e-spec.ts index 5657c94efd2..c12ad1d8a3c 100644 --- a/server/test/user.e2e-spec.ts +++ b/server/apps/immich/test/user.e2e-spec.ts @@ -3,7 +3,7 @@ import { INestApplication } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import request from 'supertest'; import { clearDb, authCustom } from './test-utils'; -import { databaseConfig } from '../src/config/database.config'; +import { databaseConfig } from '@app/database/config/database.config'; import { UserModule } from '../src/api-v1/user/user.module'; import { ImmichJwtModule } from '../src/modules/immich-jwt/immich-jwt.module'; import { UserService } from '../src/api-v1/user/user.service'; diff --git a/server/apps/immich/tsconfig.app.json b/server/apps/immich/tsconfig.app.json new file mode 100644 index 00000000000..44a4899dda1 --- /dev/null +++ b/server/apps/immich/tsconfig.app.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/immich" + }, + "include": [ + "src/**/*", + "../../libs/**/*" + ], + "exclude": [ + "node_modules", + "dist", + "test", + "**/*spec.ts" + ] +} \ No newline at end of file diff --git a/server/apps/microservices/src/main.ts b/server/apps/microservices/src/main.ts new file mode 100644 index 00000000000..efd6fdad7b9 --- /dev/null +++ b/server/apps/microservices/src/main.ts @@ -0,0 +1,18 @@ +import { Logger } from '@nestjs/common'; +import { NestFactory } from '@nestjs/core'; +import { MicroservicesModule } from './microservices.module'; + +async function bootstrap() { + const app = await NestFactory.create(MicroservicesModule); + + await app.listen(3000, () => { + if (process.env.NODE_ENV == 'development') { + Logger.log('Running Immich Microservices in DEVELOPMENT environment', 'ImmichMicroservice'); + } + + if (process.env.NODE_ENV == 'production') { + Logger.log('Running Immich Microservices in PRODUCTION environment', 'ImmichMicroservice'); + } + }); +} +bootstrap(); diff --git a/server/apps/microservices/src/microservices.module.ts b/server/apps/microservices/src/microservices.module.ts new file mode 100644 index 00000000000..92c1ce4e753 --- /dev/null +++ b/server/apps/microservices/src/microservices.module.ts @@ -0,0 +1,70 @@ +import { BullModule } from '@nestjs/bull'; +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { DatabaseModule } from '@app/database'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import { ExifEntity } from '@app/database/entities/exif.entity'; +import { SmartInfoEntity } from '@app/database/entities/smart-info.entity'; +import { UserEntity } from '@app/database/entities/user.entity'; +import { MicroservicesService } from './microservices.service'; +import { AssetUploadedProcessor } from './processors/asset-uploaded.processor'; +import { ThumbnailGeneratorProcessor } from './processors/thumbnail.processor'; +import { MetadataExtractionProcessor } from './processors/metadata-extraction.processor'; +import { VideoTranscodeProcessor } from './processors/video-transcode.processor'; + +@Module({ + imports: [ + DatabaseModule, + TypeOrmModule.forFeature([UserEntity, ExifEntity, AssetEntity, SmartInfoEntity]), + BullModule.forRootAsync({ + useFactory: async () => ({ + redis: { + host: process.env.REDIS_HOSTNAME || 'immich_redis', + port: 6379, + }, + }), + }), + BullModule.registerQueue({ + name: 'thumbnail-generator-queue', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + BullModule.registerQueue({ + name: 'asset-uploaded-queue', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + BullModule.registerQueue({ + name: 'metadata-extraction-queue', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + BullModule.registerQueue({ + name: 'video-conversion-queue', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + ], + controllers: [], + providers: [ + MicroservicesService, + AssetUploadedProcessor, + ThumbnailGeneratorProcessor, + MetadataExtractionProcessor, + VideoTranscodeProcessor, + ], + exports: [], +}) +export class MicroservicesModule {} diff --git a/server/apps/microservices/src/microservices.service.ts b/server/apps/microservices/src/microservices.service.ts new file mode 100644 index 00000000000..e2a6ae0c226 --- /dev/null +++ b/server/apps/microservices/src/microservices.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class MicroservicesService { + getHello(): string { + return 'Hello World 123!'; + } +} diff --git a/server/apps/microservices/src/processors/asset-uploaded.processor.ts b/server/apps/microservices/src/processors/asset-uploaded.processor.ts new file mode 100644 index 00000000000..c8345c5ca36 --- /dev/null +++ b/server/apps/microservices/src/processors/asset-uploaded.processor.ts @@ -0,0 +1,67 @@ +import { InjectQueue, OnQueueActive, OnQueueCompleted, OnQueueWaiting, Process, Processor } from '@nestjs/bull'; +import { Job, Queue } from 'bull'; +import { AssetEntity, AssetType } from '@app/database/entities/asset.entity'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { randomUUID } from 'crypto'; + +@Processor('asset-uploaded-queue') +export class AssetUploadedProcessor { + constructor( + @InjectQueue('thumbnail-generator-queue') + private thumbnailGeneratorQueue: Queue, + + @InjectQueue('metadata-extraction-queue') + private metadataExtractionQueue: Queue, + + @InjectQueue('video-conversion-queue') + private videoConversionQueue: Queue, + + @InjectRepository(AssetEntity) + private assetRepository: Repository, + ) {} + + /** + * Post processing uploaded asset to perform the following function if missing + * 1. Generate JPEG Thumbnail + * 2. Generate Webp Thumbnail <-> if JPEG thumbnail exist + * 3. EXIF extractor + * 4. Reverse Geocoding + * + * @param job asset-uploaded + */ + @Process('asset-uploaded') + async processUploadedVideo(job: Job) { + const { + asset, + fileName, + fileSize, + hasThumbnail, + }: { asset: AssetEntity; fileName: string; fileSize: number; hasThumbnail: boolean } = job.data; + + if (hasThumbnail) { + // The jobs below depends on the existence of jpeg thumbnail + await this.thumbnailGeneratorQueue.add('generate-webp-thumbnail', { asset }, { jobId: randomUUID() }); + await this.metadataExtractionQueue.add('tag-image', { asset }, { jobId: randomUUID() }); + await this.metadataExtractionQueue.add('detect-object', { asset }, { jobId: randomUUID() }); + } else { + // Generate Thumbnail -> Then generate webp, tag image and detect object + } + + // Video Conversion + if (asset.type == AssetType.VIDEO) { + await this.videoConversionQueue.add('mp4-conversion', { asset }, { jobId: randomUUID() }); + } else { + // Extract Metadata/Exif for Images - Currently the library cannot extract EXIF for video yet + await this.metadataExtractionQueue.add( + 'exif-extraction', + { + asset, + fileName, + fileSize, + }, + { jobId: randomUUID() }, + ); + } + } +} diff --git a/server/apps/microservices/src/processors/metadata-extraction.processor.ts b/server/apps/microservices/src/processors/metadata-extraction.processor.ts new file mode 100644 index 00000000000..61da0012afb --- /dev/null +++ b/server/apps/microservices/src/processors/metadata-extraction.processor.ts @@ -0,0 +1,131 @@ +import { Process, Processor } from '@nestjs/bull'; +import { Job } from 'bull'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import { Repository } from 'typeorm/repository/Repository'; +import { InjectRepository } from '@nestjs/typeorm'; +import { ExifEntity } from '@app/database/entities/exif.entity'; +import exifr from 'exifr'; +import mapboxGeocoding, { GeocodeService } from '@mapbox/mapbox-sdk/services/geocoding'; +import { MapiResponse } from '@mapbox/mapbox-sdk/lib/classes/mapi-response'; +import { readFile } from 'fs/promises'; +import { Logger } from '@nestjs/common'; +import axios from 'axios'; +import { SmartInfoEntity } from '@app/database/entities/smart-info.entity'; + +@Processor('metadata-extraction-queue') +export class MetadataExtractionProcessor { + private geocodingClient: GeocodeService; + + constructor( + @InjectRepository(AssetEntity) + private assetRepository: Repository, + + @InjectRepository(ExifEntity) + private exifRepository: Repository, + + @InjectRepository(SmartInfoEntity) + private smartInfoRepository: Repository, + ) { + if (process.env.ENABLE_MAPBOX) { + this.geocodingClient = mapboxGeocoding({ + accessToken: process.env.MAPBOX_KEY, + }); + } + } + + @Process('exif-extraction') + async extractExifInfo(job: Job) { + try { + const { asset, fileName, fileSize }: { asset: AssetEntity; fileName: string; fileSize: number } = job.data; + + const fileBuffer = await readFile(asset.originalPath); + + const exifData = await exifr.parse(fileBuffer); + + const newExif = new ExifEntity(); + newExif.assetId = asset.id; + newExif.make = exifData['Make'] || null; + newExif.model = exifData['Model'] || null; + newExif.imageName = fileName || null; + newExif.exifImageHeight = exifData['ExifImageHeight'] || null; + newExif.exifImageWidth = exifData['ExifImageWidth'] || null; + newExif.fileSizeInByte = fileSize || null; + newExif.orientation = exifData['Orientation'] || null; + newExif.dateTimeOriginal = exifData['DateTimeOriginal'] || null; + newExif.modifyDate = exifData['ModifyDate'] || null; + newExif.lensModel = exifData['LensModel'] || null; + newExif.fNumber = exifData['FNumber'] || null; + newExif.focalLength = exifData['FocalLength'] || null; + newExif.iso = exifData['ISO'] || null; + newExif.exposureTime = exifData['ExposureTime'] || null; + newExif.latitude = exifData['latitude'] || null; + newExif.longitude = exifData['longitude'] || null; + + // Reverse GeoCoding + if (process.env.ENABLE_MAPBOX && exifData['longitude'] && exifData['latitude']) { + const geoCodeInfo: MapiResponse = await this.geocodingClient + .reverseGeocode({ + query: [exifData['longitude'], exifData['latitude']], + types: ['country', 'region', 'place'], + }) + .send(); + + const res: [] = geoCodeInfo.body['features']; + + const city = res.filter((geoInfo) => geoInfo['place_type'][0] == 'place')[0]['text']; + const state = res.filter((geoInfo) => geoInfo['place_type'][0] == 'region')[0]['text']; + const country = res.filter((geoInfo) => geoInfo['place_type'][0] == 'country')[0]['text']; + + newExif.city = city || null; + newExif.state = state || null; + newExif.country = country || null; + } + + await this.exifRepository.save(newExif); + } catch (e) { + Logger.error(`Error extracting EXIF ${e.toString()}`, 'extractExif'); + } + } + + @Process({ name: 'tag-image', concurrency: 2 }) + async tagImage(job: Job) { + const { asset }: { asset: AssetEntity } = job.data; + + const res = await axios.post('http://immich-machine-learning:3001/image-classifier/tag-image', { + thumbnailPath: asset.resizePath, + }); + + if (res.status == 201 && res.data.length > 0) { + const smartInfo = new SmartInfoEntity(); + smartInfo.assetId = asset.id; + smartInfo.tags = [...res.data]; + + await this.smartInfoRepository.upsert(smartInfo, { + conflictPaths: ['assetId'], + }); + } + } + + @Process({ name: 'detect-object', concurrency: 2 }) + async detectObject(job: Job) { + try { + const { asset }: { asset: AssetEntity } = job.data; + + const res = await axios.post('http://immich-machine-learning:3001/object-detection/detect-object', { + thumbnailPath: asset.resizePath, + }); + + if (res.status == 201 && res.data.length > 0) { + const smartInfo = new SmartInfoEntity(); + smartInfo.assetId = asset.id; + smartInfo.objects = [...res.data]; + + await this.smartInfoRepository.upsert(smartInfo, { + conflictPaths: ['assetId'], + }); + } + } catch (error) { + Logger.error(`Failed to trigger object detection pipe line ${error.toString()}`); + } + } +} diff --git a/server/apps/microservices/src/processors/thumbnail.processor.ts b/server/apps/microservices/src/processors/thumbnail.processor.ts new file mode 100644 index 00000000000..3f3919daa51 --- /dev/null +++ b/server/apps/microservices/src/processors/thumbnail.processor.ts @@ -0,0 +1,37 @@ +import { Process, Processor } from '@nestjs/bull'; +import { Job } from 'bull'; +import { AssetEntity } from '@app/database/entities/asset.entity'; +import { Repository } from 'typeorm/repository/Repository'; +import { InjectRepository } from '@nestjs/typeorm'; +import sharp from 'sharp'; + +@Processor('thumbnail-generator-queue') +export class ThumbnailGeneratorProcessor { + constructor( + @InjectRepository(AssetEntity) + private assetRepository: Repository, + ) {} + + @Process('generate-jpeg-thumbnail') + async generateJPEGThumbnail(job: Job) { + const { asset }: { asset: AssetEntity } = job.data; + + console.log(asset); + } + + @Process({ name: 'generate-webp-thumbnail', concurrency: 2 }) + async generateWepbThumbnail(job: Job) { + const { asset }: { asset: AssetEntity } = job.data; + + const webpPath = asset.resizePath.replace('jpeg', 'webp'); + + sharp(asset.resizePath) + .resize(250) + .webp() + .toFile(webpPath, (err, info) => { + if (!err) { + this.assetRepository.update({ id: asset.id }, { webpPath: webpPath }); + } + }); + } +} diff --git a/server/apps/microservices/src/processors/video-transcode.processor.ts b/server/apps/microservices/src/processors/video-transcode.processor.ts new file mode 100644 index 00000000000..c7f8f3b3baa --- /dev/null +++ b/server/apps/microservices/src/processors/video-transcode.processor.ts @@ -0,0 +1,59 @@ +import { Process, Processor } from '@nestjs/bull'; +import { Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Job } from 'bull'; +import ffmpeg from 'fluent-ffmpeg'; +import { existsSync, mkdirSync } from 'fs'; +import { Repository } from 'typeorm'; +import { AssetEntity } from '../../../../libs/database/src/entities/asset.entity'; +import { APP_UPLOAD_LOCATION } from '../../../immich/src/constants/upload_location.constant'; + +@Processor('video-conversion-queue') +export class VideoTranscodeProcessor { + constructor( + @InjectRepository(AssetEntity) + private assetRepository: Repository, + ) {} + + @Process({ name: 'mp4-conversion', concurrency: 1 }) + async mp4Conversion(job: Job) { + const { asset }: { asset: AssetEntity } = job.data; + + if (asset.mimeType != 'video/mp4') { + const basePath = APP_UPLOAD_LOCATION; + const encodedVideoPath = `${basePath}/${asset.userId}/encoded-video`; + + if (!existsSync(encodedVideoPath)) { + mkdirSync(encodedVideoPath, { recursive: true }); + } + + const savedEncodedPath = encodedVideoPath + '/' + asset.id + '.mp4'; + + if (asset.encodedVideoPath == '' || !asset.encodedVideoPath) { + // Put the processing into its own async function to prevent the job exist right away + await this.runFFMPEGPipeLine(asset, savedEncodedPath); + } + } + } + + async runFFMPEGPipeLine(asset: AssetEntity, savedEncodedPath: string): Promise { + return new Promise((resolve, reject) => { + ffmpeg(asset.originalPath) + .outputOptions(['-crf 23', '-preset ultrafast', '-vcodec libx264', '-acodec mp3', '-vf scale=1280:-2']) + .output(savedEncodedPath) + .on('start', () => { + Logger.log('Start Converting', 'mp4Conversion'); + }) + .on('error', (error, b, c) => { + Logger.error(`Cannot Convert Video ${error}`, 'mp4Conversion'); + reject(); + }) + .on('end', async () => { + Logger.log(`Converting Success ${asset.id}`, 'mp4Conversion'); + await this.assetRepository.update({ id: asset.id }, { encodedVideoPath: savedEncodedPath }); + resolve(); + }) + .run(); + }); + } +} diff --git a/microservices/test/app.e2e-spec.ts b/server/apps/microservices/test/app.e2e-spec.ts similarity index 62% rename from microservices/test/app.e2e-spec.ts rename to server/apps/microservices/test/app.e2e-spec.ts index 8a785650514..edd3fc48cf5 100644 --- a/microservices/test/app.e2e-spec.ts +++ b/server/apps/microservices/test/app.e2e-spec.ts @@ -1,15 +1,14 @@ import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import * as request from 'supertest'; -import { AppModule } from '../src/app.module'; +import { MicroservicesModule } from './../src/microservices.module'; -// End to End test -describe('AppController (e2e)', () => { +describe('MicroservicesController (e2e)', () => { let app: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], + imports: [MicroservicesModule], }).compile(); app = moduleFixture.createNestApplication(); @@ -17,9 +16,6 @@ describe('AppController (e2e)', () => { }); it('/ (GET)', () => { - return request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!'); + return request(app.getHttpServer()).get('/').expect(200).expect('Hello World!'); }); }); diff --git a/microservices/test/jest-e2e.json b/server/apps/microservices/test/jest-e2e.json similarity index 100% rename from microservices/test/jest-e2e.json rename to server/apps/microservices/test/jest-e2e.json diff --git a/server/apps/microservices/tsconfig.app.json b/server/apps/microservices/tsconfig.app.json new file mode 100644 index 00000000000..a24a8136bb8 --- /dev/null +++ b/server/apps/microservices/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/microservices" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/server/entrypoint.sh b/server/entrypoint.sh index 7dd3325ba40..9f35169bf66 100644 --- a/server/entrypoint.sh +++ b/server/entrypoint.sh @@ -1,2 +1 @@ -# npm run typeorm migration:run -npm run build && npm run start:prod \ No newline at end of file +npm start immich \ No newline at end of file diff --git a/server/src/config/database.config.ts b/server/libs/database/src/config/database.config.ts similarity index 77% rename from server/src/config/database.config.ts rename to server/libs/database/src/config/database.config.ts index d635b5113a5..618499c2567 100644 --- a/server/src/config/database.config.ts +++ b/server/libs/database/src/config/database.config.ts @@ -9,11 +9,12 @@ export const databaseConfig: TypeOrmModuleOptions = { database: process.env.DB_DATABASE_NAME, entities: [__dirname + '/../**/*.entity.{js,ts}'], synchronize: false, - migrations: [__dirname + '/../migration/*.{js,ts}'], + migrations: [__dirname + '/../migrations/*.{js,ts}'], cli: { - migrationsDir: __dirname + '/../migration', + migrationsDir: __dirname + '/../migrations', }, migrationsRun: true, + autoLoadEntities: true, }; export default databaseConfig; diff --git a/server/libs/database/src/database.module.ts b/server/libs/database/src/database.module.ts new file mode 100644 index 00000000000..df512ee62ba --- /dev/null +++ b/server/libs/database/src/database.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { databaseConfig } from './config/database.config'; + +@Module({ + imports: [TypeOrmModule.forRoot(databaseConfig)], + providers: [], + exports: [TypeOrmModule], +}) +export class DatabaseModule {} diff --git a/server/src/api-v1/sharing/entities/asset-shared-album.entity.ts b/server/libs/database/src/entities/asset-shared-album.entity.ts similarity index 92% rename from server/src/api-v1/sharing/entities/asset-shared-album.entity.ts rename to server/libs/database/src/entities/asset-shared-album.entity.ts index 69f4f780426..a26c4408110 100644 --- a/server/src/api-v1/sharing/entities/asset-shared-album.entity.ts +++ b/server/libs/database/src/entities/asset-shared-album.entity.ts @@ -1,5 +1,5 @@ import { Column, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryGeneratedColumn, Unique } from 'typeorm'; -import { AssetEntity } from '../../asset/entities/asset.entity'; +import { AssetEntity } from './asset.entity'; import { SharedAlbumEntity } from './shared-album.entity'; @Entity('asset_shared_album') diff --git a/server/src/api-v1/asset/entities/asset.entity.ts b/server/libs/database/src/entities/asset.entity.ts similarity index 100% rename from server/src/api-v1/asset/entities/asset.entity.ts rename to server/libs/database/src/entities/asset.entity.ts diff --git a/server/src/api-v1/device-info/entities/device-info.entity.ts b/server/libs/database/src/entities/device-info.entity.ts similarity index 100% rename from server/src/api-v1/device-info/entities/device-info.entity.ts rename to server/libs/database/src/entities/device-info.entity.ts diff --git a/server/src/api-v1/asset/entities/exif.entity.ts b/server/libs/database/src/entities/exif.entity.ts similarity index 100% rename from server/src/api-v1/asset/entities/exif.entity.ts rename to server/libs/database/src/entities/exif.entity.ts diff --git a/server/src/api-v1/sharing/entities/shared-album.entity.ts b/server/libs/database/src/entities/shared-album.entity.ts similarity index 100% rename from server/src/api-v1/sharing/entities/shared-album.entity.ts rename to server/libs/database/src/entities/shared-album.entity.ts diff --git a/server/src/api-v1/asset/entities/smart-info.entity.ts b/server/libs/database/src/entities/smart-info.entity.ts similarity index 100% rename from server/src/api-v1/asset/entities/smart-info.entity.ts rename to server/libs/database/src/entities/smart-info.entity.ts diff --git a/server/src/api-v1/sharing/entities/user-shared-album.entity.ts b/server/libs/database/src/entities/user-shared-album.entity.ts similarity index 91% rename from server/src/api-v1/sharing/entities/user-shared-album.entity.ts rename to server/libs/database/src/entities/user-shared-album.entity.ts index b3041e07c43..2f4aeb599ac 100644 --- a/server/src/api-v1/sharing/entities/user-shared-album.entity.ts +++ b/server/libs/database/src/entities/user-shared-album.entity.ts @@ -1,5 +1,5 @@ import { Column, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryGeneratedColumn, Unique } from 'typeorm'; -import { UserEntity } from '../../user/entities/user.entity'; +import { UserEntity } from './user.entity'; import { SharedAlbumEntity } from './shared-album.entity'; @Entity('user_shared_album') diff --git a/server/src/api-v1/user/entities/user.entity.ts b/server/libs/database/src/entities/user.entity.ts similarity index 100% rename from server/src/api-v1/user/entities/user.entity.ts rename to server/libs/database/src/entities/user.entity.ts diff --git a/server/libs/database/src/index.ts b/server/libs/database/src/index.ts new file mode 100644 index 00000000000..90b0aaab989 --- /dev/null +++ b/server/libs/database/src/index.ts @@ -0,0 +1 @@ +export * from './database.module'; diff --git a/server/src/migration/1645130759468-CreateUserTable.ts b/server/libs/database/src/migrations/1645130759468-CreateUserTable.ts similarity index 100% rename from server/src/migration/1645130759468-CreateUserTable.ts rename to server/libs/database/src/migrations/1645130759468-CreateUserTable.ts diff --git a/server/src/migration/1645130777674-CreateDeviceInfoTable.ts b/server/libs/database/src/migrations/1645130777674-CreateDeviceInfoTable.ts similarity index 100% rename from server/src/migration/1645130777674-CreateDeviceInfoTable.ts rename to server/libs/database/src/migrations/1645130777674-CreateDeviceInfoTable.ts diff --git a/server/src/migration/1645130805273-CreateAssetsTable.ts b/server/libs/database/src/migrations/1645130805273-CreateAssetsTable.ts similarity index 100% rename from server/src/migration/1645130805273-CreateAssetsTable.ts rename to server/libs/database/src/migrations/1645130805273-CreateAssetsTable.ts diff --git a/server/src/migration/1645130817965-CreateExifTable.ts b/server/libs/database/src/migrations/1645130817965-CreateExifTable.ts similarity index 100% rename from server/src/migration/1645130817965-CreateExifTable.ts rename to server/libs/database/src/migrations/1645130817965-CreateExifTable.ts diff --git a/server/src/migration/1645130870184-CreateSmartInfoTable.ts b/server/libs/database/src/migrations/1645130870184-CreateSmartInfoTable.ts similarity index 100% rename from server/src/migration/1645130870184-CreateSmartInfoTable.ts rename to server/libs/database/src/migrations/1645130870184-CreateSmartInfoTable.ts diff --git a/server/src/migration/1646249209023-AddExifTextSearchColumn.ts b/server/libs/database/src/migrations/1646249209023-AddExifTextSearchColumn.ts similarity index 100% rename from server/src/migration/1646249209023-AddExifTextSearchColumn.ts rename to server/libs/database/src/migrations/1646249209023-AddExifTextSearchColumn.ts diff --git a/server/src/migration/1646249734844-CreateExifTextSearchIndex.ts b/server/libs/database/src/migrations/1646249734844-CreateExifTextSearchIndex.ts similarity index 100% rename from server/src/migration/1646249734844-CreateExifTextSearchIndex.ts rename to server/libs/database/src/migrations/1646249734844-CreateExifTextSearchIndex.ts diff --git a/server/src/migration/1646709533213-AddRegionCityToExIf.ts b/server/libs/database/src/migrations/1646709533213-AddRegionCityToExIf.ts similarity index 100% rename from server/src/migration/1646709533213-AddRegionCityToExIf.ts rename to server/libs/database/src/migrations/1646709533213-AddRegionCityToExIf.ts diff --git a/server/src/migration/1646710459852-AddLocationToExifTextSearch.ts b/server/libs/database/src/migrations/1646710459852-AddLocationToExifTextSearch.ts similarity index 100% rename from server/src/migration/1646710459852-AddLocationToExifTextSearch.ts rename to server/libs/database/src/migrations/1646710459852-AddLocationToExifTextSearch.ts diff --git a/server/src/migration/1648317474768-AddObjectColumnToSmartInfo.ts b/server/libs/database/src/migrations/1648317474768-AddObjectColumnToSmartInfo.ts similarity index 100% rename from server/src/migration/1648317474768-AddObjectColumnToSmartInfo.ts rename to server/libs/database/src/migrations/1648317474768-AddObjectColumnToSmartInfo.ts diff --git a/server/src/migration/1649643216111-CreateSharedAlbumAndRelatedTables.ts b/server/libs/database/src/migrations/1649643216111-CreateSharedAlbumAndRelatedTables.ts similarity index 100% rename from server/src/migration/1649643216111-CreateSharedAlbumAndRelatedTables.ts rename to server/libs/database/src/migrations/1649643216111-CreateSharedAlbumAndRelatedTables.ts diff --git a/server/src/migration/1652633525943-UpdateUserTableWithAdminAndName.ts b/server/libs/database/src/migrations/1652633525943-UpdateUserTableWithAdminAndName.ts similarity index 93% rename from server/src/migration/1652633525943-UpdateUserTableWithAdminAndName.ts rename to server/libs/database/src/migrations/1652633525943-UpdateUserTableWithAdminAndName.ts index 863c4159c70..af5082ebb29 100644 --- a/server/src/migration/1652633525943-UpdateUserTableWithAdminAndName.ts +++ b/server/libs/database/src/migrations/1652633525943-UpdateUserTableWithAdminAndName.ts @@ -1,7 +1,6 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; +import { MigrationInterface, QueryRunner } from 'typeorm'; export class UpdateUserTableWithAdminAndName1652633525943 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` alter table users @@ -18,9 +17,7 @@ export class UpdateUserTableWithAdminAndName1652633525943 implements MigrationIn alter table users add column if not exists "isFirstLoggedIn" bool default true; - `) - - + `); } public async down(queryRunner: QueryRunner): Promise { @@ -36,5 +33,4 @@ export class UpdateUserTableWithAdminAndName1652633525943 implements MigrationIn `); } - } diff --git a/server/src/migration/1653214255670-UpdateAssetTableWithWebpPath.ts b/server/libs/database/src/migrations/1653214255670-UpdateAssetTableWithWebpPath.ts similarity index 86% rename from server/src/migration/1653214255670-UpdateAssetTableWithWebpPath.ts rename to server/libs/database/src/migrations/1653214255670-UpdateAssetTableWithWebpPath.ts index 537c07c337f..4de9684f182 100644 --- a/server/src/migration/1653214255670-UpdateAssetTableWithWebpPath.ts +++ b/server/libs/database/src/migrations/1653214255670-UpdateAssetTableWithWebpPath.ts @@ -1,12 +1,11 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; +import { MigrationInterface, QueryRunner } from 'typeorm'; export class UpdateAssetTableWithWebpPath1653214255670 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` alter table assets add column if not exists "webpPath" varchar default ''; - `) + `); } public async down(queryRunner: QueryRunner): Promise { @@ -15,5 +14,4 @@ export class UpdateAssetTableWithWebpPath1653214255670 implements MigrationInter drop column if exists "webpPath"; `); } - } diff --git a/server/src/migration/1654299904583-UpdateAssetTableWithEncodeVideoPath.ts b/server/libs/database/src/migrations/1654299904583-UpdateAssetTableWithEncodeVideoPath.ts similarity index 87% rename from server/src/migration/1654299904583-UpdateAssetTableWithEncodeVideoPath.ts rename to server/libs/database/src/migrations/1654299904583-UpdateAssetTableWithEncodeVideoPath.ts index 0c05b0b9bbd..169f7db171d 100644 --- a/server/src/migration/1654299904583-UpdateAssetTableWithEncodeVideoPath.ts +++ b/server/libs/database/src/migrations/1654299904583-UpdateAssetTableWithEncodeVideoPath.ts @@ -1,11 +1,11 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; +import { MigrationInterface, QueryRunner } from 'typeorm'; export class UpdateAssetTableWithEncodeVideoPath1654299904583 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` alter table assets add column if not exists "encodedVideoPath" varchar default ''; - `) + `); } public async down(queryRunner: QueryRunner): Promise { diff --git a/server/libs/database/tsconfig.lib.json b/server/libs/database/tsconfig.lib.json new file mode 100644 index 00000000000..21c8d58b53d --- /dev/null +++ b/server/libs/database/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/database" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/server/nest-cli.json b/server/nest-cli.json index 56167b36a14..d39f78a0743 100644 --- a/server/nest-cli.json +++ b/server/nest-cli.json @@ -1,4 +1,39 @@ { "collection": "@nestjs/schematics", - "sourceRoot": "src" + "sourceRoot": "apps/immich/src", + "monorepo": true, + "root": "apps/immich", + "compilerOptions": { + "webpack": false, + "tsConfigPath": "apps/immich/tsconfig.app.json" + }, + "projects": { + "immich": { + "type": "application", + "root": "apps/immich", + "entryFile": "main", + "sourceRoot": "apps/immich/src", + "compilerOptions": { + "tsConfigPath": "apps/immich/tsconfig.app.json" + } + }, + "microservices": { + "type": "application", + "root": "apps/microservices", + "entryFile": "main", + "sourceRoot": "apps/microservices/src", + "compilerOptions": { + "tsConfigPath": "apps/microservices/tsconfig.app.json" + } + }, + "database": { + "type": "library", + "root": "libs/database", + "entryFile": "index", + "sourceRoot": "libs/database/src", + "compilerOptions": { + "tsConfigPath": "libs/database/tsconfig.lib.json" + } + } + } } diff --git a/server/package.json b/server/package.json index 480e6ea5723..07edf46f631 100644 --- a/server/package.json +++ b/server/package.json @@ -8,7 +8,7 @@ "scripts": { "prebuild": "rimraf dist", "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", @@ -18,8 +18,8 @@ "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json", - "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js --config src/config/database.config.ts" + "test:e2e": "jest --config ./apps/immich/test/jest-e2e.json", + "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js --config libs/database/src/config/database.config.ts" }, "dependencies": { "@mapbox/mapbox-sdk": "^0.13.3", @@ -97,7 +97,7 @@ "json", "ts" ], - "rootDir": "src", + "rootDir": ".", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" @@ -105,7 +105,16 @@ "collectCoverageFrom": [ "**/*.(t|j)s" ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" + "coverageDirectory": "./coverage", + "testEnvironment": "node", + "roots": [ + "/apps/", + "/libs/" + ], + "moduleNameMapper": { + "^@app/database(|/.*)$": "/libs/database/src/$1", + "@app/database/config/(.*)": "/libs/database/src/config/$1", + "@app/database/config": "/libs/database/src/config" + } } } diff --git a/server/settings/nginx-conf/nginx.conf b/server/settings/nginx-conf/nginx.conf deleted file mode 100644 index cb6edc36384..00000000000 --- a/server/settings/nginx-conf/nginx.conf +++ /dev/null @@ -1,35 +0,0 @@ - -map $http_upgrade $connection_upgrade { - default upgrade; - '' close; -} - -# events { -# worker_connections 1000; -# } - -server { - - client_max_body_size 50000M; - - listen 80; - - location / { - proxy_buffering off; - proxy_buffer_size 16k; - proxy_busy_buffers_size 24k; - proxy_buffers 64 4k; - proxy_force_ranges on; - - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - - proxy_pass http://immich_server:3000; - } -} diff --git a/server/src/modules/background-task/background-task.processor.ts b/server/src/modules/background-task/background-task.processor.ts deleted file mode 100644 index 98f7369f70b..00000000000 --- a/server/src/modules/background-task/background-task.processor.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { InjectQueue, Process, Processor } from '@nestjs/bull'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Job, Queue } from 'bull'; -import { Repository } from 'typeorm'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; -import { ConfigService } from '@nestjs/config'; -import exifr from 'exifr'; -import { readFile } from 'fs/promises'; -import fs from 'fs'; -import { Logger } from '@nestjs/common'; -import { ExifEntity } from '../../api-v1/asset/entities/exif.entity'; -import axios from 'axios'; -import { SmartInfoEntity } from '../../api-v1/asset/entities/smart-info.entity'; -import mapboxGeocoding, { GeocodeService } from '@mapbox/mapbox-sdk/services/geocoding'; -import { MapiResponse } from '@mapbox/mapbox-sdk/lib/classes/mapi-response'; - -@Processor('background-task') -export class BackgroundTaskProcessor { - private geocodingClient: GeocodeService; - - constructor( - @InjectRepository(AssetEntity) - private assetRepository: Repository, - - @InjectRepository(SmartInfoEntity) - private smartInfoRepository: Repository, - - @InjectRepository(ExifEntity) - private exifRepository: Repository, - - private configService: ConfigService, - ) { - if (this.configService.get('ENABLE_MAPBOX')) { - this.geocodingClient = mapboxGeocoding({ - accessToken: this.configService.get('MAPBOX_KEY'), - }); - } - } - - @Process('extract-exif') - async extractExif(job: Job) { - const { savedAsset, fileName, fileSize }: { savedAsset: AssetEntity; fileName: string; fileSize: number } = - job.data; - const fileBuffer = await readFile(savedAsset.originalPath); - - const exifData = await exifr.parse(fileBuffer); - - const newExif = new ExifEntity(); - newExif.assetId = savedAsset.id; - newExif.make = exifData['Make'] || null; - newExif.model = exifData['Model'] || null; - newExif.imageName = fileName || null; - newExif.exifImageHeight = exifData['ExifImageHeight'] || null; - newExif.exifImageWidth = exifData['ExifImageWidth'] || null; - newExif.fileSizeInByte = fileSize || null; - newExif.orientation = exifData['Orientation'] || null; - newExif.dateTimeOriginal = exifData['DateTimeOriginal'] || null; - newExif.modifyDate = exifData['ModifyDate'] || null; - newExif.lensModel = exifData['LensModel'] || null; - newExif.fNumber = exifData['FNumber'] || null; - newExif.focalLength = exifData['FocalLength'] || null; - newExif.iso = exifData['ISO'] || null; - newExif.exposureTime = exifData['ExposureTime'] || null; - newExif.latitude = exifData['latitude'] || null; - newExif.longitude = exifData['longitude'] || null; - - // Reverse GeoCoding - if (this.configService.get('ENABLE_MAPBOX') && exifData['longitude'] && exifData['latitude']) { - const geoCodeInfo: MapiResponse = await this.geocodingClient - .reverseGeocode({ - query: [exifData['longitude'], exifData['latitude']], - types: ['country', 'region', 'place'], - }) - .send(); - - const res: [] = geoCodeInfo.body['features']; - - const city = res.filter((geoInfo) => geoInfo['place_type'][0] == 'place')[0]['text']; - const state = res.filter((geoInfo) => geoInfo['place_type'][0] == 'region')[0]['text']; - const country = res.filter((geoInfo) => geoInfo['place_type'][0] == 'country')[0]['text']; - - newExif.city = city || null; - newExif.state = state || null; - newExif.country = country || null; - } - - await this.exifRepository.save(newExif); - - try { - } catch (e) { - Logger.error(`Error extracting EXIF ${e.toString()}`, 'extractExif'); - } - } - - @Process('delete-file-on-disk') - async deleteFileOnDisk(job) { - const { assets }: { assets: AssetEntity[] } = job.data; - - for (const asset of assets) { - fs.unlink(asset.originalPath, (err) => { - if (err) { - console.log('error deleting ', asset.originalPath); - } - }); - - fs.unlink(asset.resizePath, (err) => { - if (err) { - console.log('error deleting ', asset.originalPath); - } - }); - } - } - - @Process('tag-image') - async tagImage(job) { - const { thumbnailPath, asset }: { thumbnailPath: string; asset: AssetEntity } = job.data; - - const res = await axios.post('http://immich-microservices:3001/image-classifier/tagImage', { - thumbnailPath: thumbnailPath, - }); - - if (res.status == 201 && res.data.length > 0) { - const smartInfo = new SmartInfoEntity(); - smartInfo.assetId = asset.id; - smartInfo.tags = [...res.data]; - - await this.smartInfoRepository.upsert(smartInfo, { - conflictPaths: ['assetId'], - }); - } - } - - @Process('detect-object') - async detectObject(job) { - try { - const { thumbnailPath, asset }: { thumbnailPath: string; asset: AssetEntity } = job.data; - - const res = await axios.post('http://immich-microservices:3001/object-detection/detectObject', { - thumbnailPath: thumbnailPath, - }); - - if (res.status == 201 && res.data.length > 0) { - const smartInfo = new SmartInfoEntity(); - smartInfo.assetId = asset.id; - smartInfo.objects = [...res.data]; - await this.smartInfoRepository.upsert(smartInfo, { - conflictPaths: ['assetId'], - }); - } - } catch (error) { - Logger.error(`Failed to trigger object detection pipe line ${error.toString()}`) - } - - } -} diff --git a/server/src/modules/background-task/background-task.service.ts b/server/src/modules/background-task/background-task.service.ts deleted file mode 100644 index 1a62ce54d5e..00000000000 --- a/server/src/modules/background-task/background-task.service.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { InjectQueue } from '@nestjs/bull/dist/decorators'; -import { Injectable } from '@nestjs/common'; -import { Queue } from 'bull'; -import { randomUUID } from 'node:crypto'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; - -@Injectable() -export class BackgroundTaskService { - constructor( - @InjectQueue('background-task') - private backgroundTaskQueue: Queue, - ) { } - - async extractExif(savedAsset: AssetEntity, fileName: string, fileSize: number) { - await this.backgroundTaskQueue.add( - 'extract-exif', - { - savedAsset, - fileName, - fileSize, - }, - { jobId: randomUUID() }, - ); - } - - async deleteFileOnDisk(assets: AssetEntity[]) { - await this.backgroundTaskQueue.add( - 'delete-file-on-disk', - { - assets, - }, - { jobId: randomUUID() }, - ); - } - - async tagImage(thumbnailPath: string, asset: AssetEntity) { - await this.backgroundTaskQueue.add( - 'tag-image', - { - thumbnailPath, - asset, - }, - { jobId: randomUUID() }, - ); - } - - async detectObject(thumbnailPath: string, asset: AssetEntity) { - await this.backgroundTaskQueue.add( - 'detect-object', - { - thumbnailPath, - asset, - }, - { jobId: randomUUID() }, - ); - } -} diff --git a/server/src/modules/image-optimize/image-optimize.module.ts b/server/src/modules/image-optimize/image-optimize.module.ts deleted file mode 100644 index 3d58ad8d0ca..00000000000 --- a/server/src/modules/image-optimize/image-optimize.module.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { BullModule } from '@nestjs/bull'; -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; -import { CommunicationModule } from '../../api-v1/communication/communication.module'; -import { BackgroundTaskModule } from '../background-task/background-task.module'; -import { BackgroundTaskService } from '../background-task/background-task.service'; -import { ImageOptimizeProcessor } from './image-optimize.processor'; -import { AssetOptimizeService } from './image-optimize.service'; - -@Module({ - imports: [ - CommunicationModule, - BackgroundTaskModule, - BullModule.registerQueue({ - name: 'optimize', - defaultJobOptions: { - attempts: 3, - removeOnComplete: true, - removeOnFail: false, - }, - }), - BullModule.registerQueue({ - name: 'background-task', - defaultJobOptions: { - attempts: 3, - removeOnComplete: true, - removeOnFail: false, - }, - }), - TypeOrmModule.forFeature([AssetEntity]), - ], - providers: [AssetOptimizeService, ImageOptimizeProcessor, BackgroundTaskService], - exports: [AssetOptimizeService], -}) -export class ImageOptimizeModule { } diff --git a/server/src/modules/image-optimize/image-optimize.processor.ts b/server/src/modules/image-optimize/image-optimize.processor.ts deleted file mode 100644 index f5bcecc7eff..00000000000 --- a/server/src/modules/image-optimize/image-optimize.processor.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Processor } from '@nestjs/bull'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; -import { CommunicationGateway } from '../../api-v1/communication/communication.gateway'; -import { BackgroundTaskService } from '../background-task/background-task.service'; - -@Processor('optimize') -export class ImageOptimizeProcessor { - constructor( - private wsCommunicateionGateway: CommunicationGateway, - @InjectRepository(AssetEntity) - private assetRepository: Repository, - - private backgroundTaskService: BackgroundTaskService, - ) {} -} diff --git a/server/src/modules/image-optimize/image-optimize.service.ts b/server/src/modules/image-optimize/image-optimize.service.ts deleted file mode 100644 index ae8b711e3d1..00000000000 --- a/server/src/modules/image-optimize/image-optimize.service.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { InjectQueue } from '@nestjs/bull'; -import { Injectable } from '@nestjs/common'; -import { Queue } from 'bull'; -import { randomUUID } from 'crypto'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; - -@Injectable() -export class AssetOptimizeService { - constructor(@InjectQueue('optimize') private optimizeQueue: Queue) {} -} diff --git a/server/src/modules/schedule-tasks/image-conversion.service.ts b/server/src/modules/schedule-tasks/image-conversion.service.ts deleted file mode 100644 index b9690ca8fba..00000000000 --- a/server/src/modules/schedule-tasks/image-conversion.service.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Injectable, Logger } from '@nestjs/common'; -import { Cron, CronExpression } from '@nestjs/schedule'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; -import sharp from 'sharp'; - -@Injectable() -export class ImageConversionService { - - constructor( - @InjectRepository(AssetEntity) - private assetRepository: Repository - ) { } - - @Cron(CronExpression.EVERY_5_MINUTES - , { - name: 'webp-conversion' - }) - async webpConversion() { - Logger.log('Starting Webp Conversion Tasks', 'ImageConversionService') - - const assets = await this.assetRepository.find({ - where: { - webpPath: '' - }, - take: 500 - }); - - - if (assets.length == 0) { - Logger.log('All assets has webp file - aborting task', 'ImageConversionService') - return; - } - - - for (const asset of assets) { - const resizePath = asset.resizePath; - if (resizePath != '') { - const webpPath = resizePath.replace('jpeg', 'webp') - - sharp(resizePath).resize(250).webp().toFile(webpPath, (err, info) => { - - if (!err) { - this.assetRepository.update({ id: asset.id }, { webpPath: webpPath }) - } - - }); - } - } - } -} diff --git a/server/src/modules/schedule-tasks/schedule-tasks.module.ts b/server/src/modules/schedule-tasks/schedule-tasks.module.ts deleted file mode 100644 index a37054df940..00000000000 --- a/server/src/modules/schedule-tasks/schedule-tasks.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { BullModule } from '@nestjs/bull'; -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { AssetModule } from '../../api-v1/asset/asset.module'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; -import { ImageConversionService } from './image-conversion.service'; -import { VideoConversionProcessor } from './video-conversion.processor'; -import { VideoConversionService } from './video-conversion.service'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([AssetEntity]), - - BullModule.registerQueue({ - settings: {}, - name: 'video-conversion', - limiter: { - max: 1, - duration: 60000 - }, - defaultJobOptions: { - attempts: 3, - removeOnComplete: true, - removeOnFail: false, - }, - }), - ], - providers: [ImageConversionService, VideoConversionService, VideoConversionProcessor,], -}) -export class ScheduleTasksModule { } diff --git a/server/src/modules/schedule-tasks/video-conversion.processor.ts b/server/src/modules/schedule-tasks/video-conversion.processor.ts deleted file mode 100644 index da64d08acc3..00000000000 --- a/server/src/modules/schedule-tasks/video-conversion.processor.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Process, Processor } from '@nestjs/bull'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Job } from 'bull'; -import { Repository } from 'typeorm'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; -import { existsSync, mkdirSync } from 'fs'; -import { APP_UPLOAD_LOCATION } from '../../constants/upload_location.constant'; -import ffmpeg from 'fluent-ffmpeg'; -import { Logger } from '@nestjs/common'; - -@Processor('video-conversion') -export class VideoConversionProcessor { - - constructor( - @InjectRepository(AssetEntity) - private assetRepository: Repository, - ) { } - - @Process('to-mp4') - async convertToMp4(job: Job) { - const { asset }: { asset: AssetEntity } = job.data; - - const basePath = APP_UPLOAD_LOCATION; - const encodedVideoPath = `${basePath}/${asset.userId}/encoded-video`; - - if (!existsSync(encodedVideoPath)) { - mkdirSync(encodedVideoPath, { recursive: true }); - } - - const latestAssetInfo = await this.assetRepository.findOne({ id: asset.id }); - const savedEncodedPath = encodedVideoPath + "/" + latestAssetInfo.id + '.mp4' - - if (latestAssetInfo.encodedVideoPath == '') { - ffmpeg(latestAssetInfo.originalPath) - .outputOptions([ - '-crf 23', - '-preset ultrafast', - '-vcodec libx264', - '-acodec mp3', - '-vf scale=1280:-2' - ]) - .output(savedEncodedPath) - .on('start', () => Logger.log("Start Converting", 'VideoConversionMOV2MP4')) - .on('error', (a, b, c) => { - Logger.error('Cannot Convert Video', 'VideoConversionMOV2MP4') - console.log(a, b, c) - }) - .on('end', async () => { - Logger.log(`Converting Success ${latestAssetInfo.id}`, 'VideoConversionMOV2MP4') - await this.assetRepository.update({ id: latestAssetInfo.id }, { encodedVideoPath: savedEncodedPath }); - }).run(); - } - - return {} - } -} diff --git a/server/src/modules/schedule-tasks/video-conversion.service.ts b/server/src/modules/schedule-tasks/video-conversion.service.ts deleted file mode 100644 index d2a1a82a433..00000000000 --- a/server/src/modules/schedule-tasks/video-conversion.service.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Injectable, Logger } from '@nestjs/common'; -import { Cron, CronExpression } from '@nestjs/schedule'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; -import sharp from 'sharp'; -import ffmpeg from 'fluent-ffmpeg'; -import { APP_UPLOAD_LOCATION } from '../../constants/upload_location.constant'; -import { existsSync, mkdirSync } from 'fs'; -import { InjectQueue } from '@nestjs/bull/dist/decorators'; -import { Queue } from 'bull'; -import { randomUUID } from 'crypto'; - -@Injectable() -export class VideoConversionService { - - - constructor( - @InjectRepository(AssetEntity) - private assetRepository: Repository, - - @InjectQueue('video-conversion') - private videoEncodingQueue: Queue - ) { } - - - @Cron(CronExpression.EVERY_MINUTE - , { - name: 'video-encoding' - }) - async mp4Conversion() { - const assets = await this.assetRepository.find({ - where: { - type: 'VIDEO', - mimeType: 'video/quicktime', - encodedVideoPath: '' - }, - order: { - createdAt: 'DESC' - }, - take: 1 - }); - - if (assets.length > 0) { - const asset = assets[0]; - await this.videoEncodingQueue.add('to-mp4', { asset }, { jobId: asset.id },) - } - } -} diff --git a/server/start-microservices.sh b/server/start-microservices.sh new file mode 100644 index 00000000000..4e1f9c12ebd --- /dev/null +++ b/server/start-microservices.sh @@ -0,0 +1 @@ +npm start microservices \ No newline at end of file diff --git a/server/start-server.sh b/server/start-server.sh new file mode 100644 index 00000000000..9f35169bf66 --- /dev/null +++ b/server/start-server.sh @@ -0,0 +1 @@ +npm start immich \ No newline at end of file diff --git a/server/test/jest-e2e.json b/server/test/jest-e2e.json deleted file mode 100644 index e9d912f3e3c..00000000000 --- a/server/test/jest-e2e.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": ".", - "testEnvironment": "node", - "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - } -} diff --git a/server/tsconfig.json b/server/tsconfig.json index 7039c7253a2..e7e31bffa63 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -6,16 +6,26 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, "target": "es2017", "sourceMap": true, "outDir": "./dist", "incremental": true, "skipLibCheck": true, "esModuleInterop": true, + "baseUrl": "./", + "paths": { + "@app/database": [ + "libs/database/src" + ], + "@app/database/*": [ + "libs/database/src/*" + ] + } }, "exclude": [ "dist", "node_modules", "upload" - ], + ] } \ No newline at end of file diff --git a/web/package-lock.json b/web/package-lock.json index dfee43d84b0..89a4d7d3c28 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -13,6 +13,7 @@ "leaflet": "^1.8.0", "lodash": "^4.17.21", "lodash-es": "^4.17.21", + "markdown-it": "^13.0.1", "moment": "^2.29.3", "svelte-material-icons": "^2.0.2" }, @@ -27,6 +28,7 @@ "@types/leaflet": "^1.7.10", "@types/lodash": "^4.14.182", "@types/lodash-es": "^4.17.6", + "@types/markdown-it": "^12.2.3", "@typescript-eslint/eslint-plugin": "^5.10.1", "@typescript-eslint/parser": "^5.10.1", "autoprefixer": "^10.4.7", @@ -291,6 +293,12 @@ "@types/geojson": "*" } }, + "node_modules/@types/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "dev": true + }, "node_modules/@types/lodash": { "version": "4.14.182", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", @@ -306,6 +314,22 @@ "@types/lodash": "*" } }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "dev": true + }, "node_modules/@types/node": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.32.tgz", @@ -626,8 +650,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-union": { "version": "2.1.0", @@ -1020,6 +1043,17 @@ "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==", "dev": true }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -2078,6 +2112,14 @@ "node": ">=10" } }, + "node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2118,6 +2160,26 @@ "node": ">=12" } }, + "node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3125,6 +3187,11 @@ "node": ">=4.2.0" } }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3458,6 +3525,12 @@ "@types/geojson": "*" } }, + "@types/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "dev": true + }, "@types/lodash": { "version": "4.14.182", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", @@ -3473,6 +3546,22 @@ "@types/lodash": "*" } }, + "@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dev": true, + "requires": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "dev": true + }, "@types/node": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.32.tgz", @@ -3673,8 +3762,7 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-union": { "version": "2.1.0", @@ -3940,6 +4028,11 @@ "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==", "dev": true }, + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" + }, "es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -4636,6 +4729,14 @@ "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true }, + "linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "requires": { + "uc.micro": "^1.0.1" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -4670,6 +4771,23 @@ "sourcemap-codec": "^1.4.8" } }, + "markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "requires": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -5318,6 +5436,11 @@ "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/web/src/hooks.ts b/web/src/hooks.ts index b9efecb3ae7..400bf275fe6 100644 --- a/web/src/hooks.ts +++ b/web/src/hooks.ts @@ -3,58 +3,54 @@ import * as cookie from 'cookie'; import { serverEndpoint } from '$lib/constants'; import { session } from '$app/stores'; +export const handle: Handle = async ({ event, resolve }) => { + const cookies = cookie.parse(event.request.headers.get('cookie') || ''); -export const handle: Handle = async ({ event, resolve, }) => { - const cookies = cookie.parse(event.request.headers.get('cookie') || ''); + if (!cookies.session) { + return await resolve(event); + } - if (!cookies.session) { - return await resolve(event) - } + try { + const { email, isAdmin, firstName, lastName, id, accessToken } = JSON.parse(cookies.session); - try { - const { email, isAdmin, firstName, lastName, id, accessToken } = JSON.parse(cookies.session); + const res = await fetch(`${serverEndpoint}/auth/validateToken`, { + method: 'POST', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }); - const res = await fetch(`${serverEndpoint}/auth/validateToken`, { - method: 'POST', - headers: { - 'Authorization': `Bearer ${accessToken}` - } - }) + if (res.status === 201) { + event.locals.user = { + id, + accessToken, + firstName, + lastName, + isAdmin, + email, + }; + } - if (res.status === 201) { - event.locals.user = { - id, - accessToken, - firstName, - lastName, - isAdmin, - email - }; - } - - const response = await resolve(event); - - return response; - } catch (error) { - console.log('Error parsing session', error); - return await resolve(event); - } + const response = await resolve(event); + return response; + } catch (error) { + console.log('Error parsing session', error); + return await resolve(event); + } }; export const getSession: GetSession = async ({ locals }) => { + if (!locals.user) return {}; - if (!locals.user) return {} - - return { - user: { - id: locals.user.id, - accessToken: locals.user.accessToken, - firstName: locals.user.firstName, - lastName: locals.user.lastName, - isAdmin: locals.user.isAdmin, - email: locals.user.email - } - } -} - + return { + user: { + id: locals.user.id, + accessToken: locals.user.accessToken, + firstName: locals.user.firstName, + lastName: locals.user.lastName, + isAdmin: locals.user.isAdmin, + email: locals.user.email, + }, + }; +}; diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index b5e7bc772ed..b624a204fef 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -1,60 +1,59 @@ import { serverEndpoint } from './constants'; type ISend = { - method: string, - path: string, - data?: any, - token: string - customHeaders?: Record, -} + method: string; + path: string; + data?: any; + token: string; + customHeaders?: Record; +}; type IOption = { - method: string, - headers: Record, - body: any - -} + method: string; + headers: Record; + body: any; +}; async function send({ method, path, data, token, customHeaders }: ISend) { - const opts: IOption = { method, headers: {} } as IOption; + const opts: IOption = { method, headers: {} } as IOption; - if (data) { - opts.headers['Content-Type'] = 'application/json'; - opts.body = JSON.stringify(data); - } + if (data) { + opts.headers['Content-Type'] = 'application/json'; + opts.body = JSON.stringify(data); + } - if (customHeaders) { - console.log(customHeaders); - // opts.headers[customHeader.$1] - } + if (customHeaders) { + console.log(customHeaders); + // opts.headers[customHeader.$1] + } - if (token) { - opts.headers['Authorization'] = `Bearer ${token}`; - } + if (token) { + opts.headers['Authorization'] = `Bearer ${token}`; + } - return fetch(`${serverEndpoint}/${path}`, opts) - .then((r) => r.text()) - .then((json) => { - try { - return JSON.parse(json); - } catch (err) { - return json; - } - }); + return fetch(`${serverEndpoint}/${path}`, opts) + .then((r) => r.text()) + .then((json) => { + try { + return JSON.parse(json); + } catch (err) { + return json; + } + }); } export function getRequest(path: string, token: string, customHeaders?: Record) { - return send({ method: 'GET', path, token, customHeaders }); + return send({ method: 'GET', path, token, customHeaders }); } export function delRequest(path: string, token: string, customHeaders?: Record) { - return send({ method: 'DELETE', path, token, customHeaders }); + return send({ method: 'DELETE', path, token, customHeaders }); } export function postRequest(path: string, data: any, token: string, customHeaders?: Record) { - return send({ method: 'POST', path, data, token, customHeaders }); + return send({ method: 'POST', path, data, token, customHeaders }); } export function putRequest(path: string, data: any, token: string, customHeaders?: Record) { - return send({ method: 'PUT', path, data, token, customHeaders }); -} \ No newline at end of file + return send({ method: 'PUT', path, data, token, customHeaders }); +} diff --git a/web/src/lib/components/asset-viewer/video-viewer.svelte b/web/src/lib/components/asset-viewer/video-viewer.svelte index 1c775ab8b18..3697bc9acb2 100644 --- a/web/src/lib/components/asset-viewer/video-viewer.svelte +++ b/web/src/lib/components/asset-viewer/video-viewer.svelte @@ -67,7 +67,7 @@ {#if isVideoLoading} -

+
{/if} diff --git a/web/src/lib/components/shared/announcement-box.svelte b/web/src/lib/components/shared/announcement-box.svelte new file mode 100644 index 00000000000..e0096daeb85 --- /dev/null +++ b/web/src/lib/components/shared/announcement-box.svelte @@ -0,0 +1,61 @@ + + +
+ console.log('Click outside')}> +
+

🎉 NEW VERSION AVAILABLE 🎉

+
+ +
+
+ Hi friend, there is a new release of IMMICH, please take your time to visit the + release note + and ensure your docker-compose, and .env setup is up-to-date to prevent any misconfigurations, + especially if you use WatchTower or any mechanism that handles updating your application automatically. +
+ + {#if remoteVersion == 'v1.11.0_17-dev'} +
+ This specific version v1.11.0_17-dev includes changes in the docker-compose + setup that added additional containters. Please make sure to update the docker-compose file, pull new images + and check your setup for the latest features and bug fixes. +
+ {/if} +
+ +
Your friend, Alex
+
+ Local Version {localVersion} +
+ Remote Version {remoteVersion} +
+ +
+ +
+
+ +
diff --git a/web/src/lib/components/shared/full-screen-modal.svelte b/web/src/lib/components/shared/full-screen-modal.svelte index 22ca352b280..7a6866a3c3e 100644 --- a/web/src/lib/components/shared/full-screen-modal.svelte +++ b/web/src/lib/components/shared/full-screen-modal.svelte @@ -11,7 +11,7 @@ out:fade={{ duration: 100 }} class="absolute w-full h-full bg-black/40 z-[100] flex place-items-center place-content-center " > -
dispatch('clickOutside')}> +
dispatch('clickOutside')}>
diff --git a/web/src/lib/components/shared/navigation-bar.svelte b/web/src/lib/components/shared/navigation-bar.svelte index af253c7c053..22f9c518c9f 100644 --- a/web/src/lib/components/shared/navigation-bar.svelte +++ b/web/src/lib/components/shared/navigation-bar.svelte @@ -22,7 +22,6 @@ }; const navigateToAdmin = () => { - console.log('Navigating to admin page'); goto('/admin'); }; diff --git a/web/src/lib/components/shared/status-box.svelte b/web/src/lib/components/shared/status-box.svelte index e8b95217fc6..d1af9468e9f 100644 --- a/web/src/lib/components/shared/status-box.svelte +++ b/web/src/lib/components/shared/status-box.svelte @@ -5,6 +5,7 @@ import Cloud from 'svelte-material-icons/Cloud.svelte'; import Dns from 'svelte-material-icons/Dns.svelte'; import LoadingSpinner from './loading-spinner.svelte'; + import { goto } from '$app/navigation'; type ServerInfoType = { diskAvailable: string; @@ -77,7 +78,11 @@

Server

- +

Status

@@ -94,4 +99,10 @@
+
diff --git a/web/src/lib/utils/check-app-version.ts b/web/src/lib/utils/check-app-version.ts new file mode 100644 index 00000000000..3a793db147b --- /dev/null +++ b/web/src/lib/utils/check-app-version.ts @@ -0,0 +1,50 @@ +type CheckAppVersionReponse = { + shouldShowAnnouncement: boolean; + localVersion?: string; + remoteVersion?: string; +}; + +type GithubRelease = { + tag_name: string; +}; + +export const checkAppVersion = async (): Promise => { + const res = await fetch('https://api.github.com/repos/alextran1502/immich/releases/latest', { + headers: { + Accept: 'application/vnd.github.v3+json', + }, + }); + + if (res.status == 200) { + const latestRelease = (await res.json()) as GithubRelease; + const appVersion = localStorage.getItem('appVersion'); + + if (!appVersion) { + return { + shouldShowAnnouncement: true, + remoteVersion: latestRelease.tag_name, + localVersion: 'empty', + }; + } + + if (appVersion != latestRelease.tag_name) { + return { + shouldShowAnnouncement: true, + remoteVersion: latestRelease.tag_name, + localVersion: appVersion, + }; + } + + return { + shouldShowAnnouncement: false, + remoteVersion: latestRelease.tag_name, + localVersion: appVersion, + }; + } else { + return { + shouldShowAnnouncement: false, + remoteVersion: '0', + localVersion: '0', + }; + } +}; diff --git a/web/src/routes/__layout.svelte b/web/src/routes/__layout.svelte index 846a259ac33..d81a21e7041 100644 --- a/web/src/routes/__layout.svelte +++ b/web/src/routes/__layout.svelte @@ -1,7 +1,19 @@
@@ -19,6 +36,10 @@
+ + {#if shouldShowAnnouncement} + + {/if}
{/key}
diff --git a/web/src/routes/auth/login/api/get-users.ts b/web/src/routes/auth/login/api/get-users.ts index 2cbedb3accd..3f48d1638e3 100644 --- a/web/src/routes/auth/login/api/get-users.ts +++ b/web/src/routes/auth/login/api/get-users.ts @@ -1,12 +1,11 @@ import type { RequestHandler } from '@sveltejs/kit'; import { getRequest } from '../../../../lib/api'; - export const get: RequestHandler = async ({ request, locals }) => { - const allUsers = await getRequest('user?isAll=true', locals.user!.accessToken) + const allUsers = await getRequest('user?isAll=true', locals.user!.accessToken); - return { - status: 200, - body: { allUsers } - }; -} \ No newline at end of file + return { + status: 200, + body: { allUsers }, + }; +}; diff --git a/web/src/routes/auth/login/update.ts b/web/src/routes/auth/login/update.ts index 72228346b6e..661826c876b 100644 --- a/web/src/routes/auth/login/update.ts +++ b/web/src/routes/auth/login/update.ts @@ -1,63 +1,63 @@ import type { RequestHandler } from '@sveltejs/kit'; import { putRequest } from '../../../lib/api'; -import * as cookie from 'cookie' - +import * as cookie from 'cookie'; export const post: RequestHandler = async ({ request, locals }) => { + const form = await request.formData(); - const form = await request.formData(); + const firstName = form.get('firstName'); + const lastName = form.get('lastName'); - const firstName = form.get('firstName') - const lastName = form.get('lastName') + if (locals.user) { + const updatedUser = await putRequest( + 'user', + { + id: locals.user.id, + firstName, + lastName, + }, + locals.user.accessToken, + ); - if (locals.user) { - const updatedUser = await putRequest('user', { - id: locals.user.id, - firstName, - lastName - }, locals.user.accessToken) + return { + status: 200, + body: { + user: { + id: updatedUser.id, + accessToken: locals.user.accessToken, + firstName: updatedUser.firstName, + lastName: updatedUser.lastName, + isAdmin: updatedUser.isAdmin, + email: updatedUser.email, + }, + success: 'Update user success', + }, + headers: { + 'Set-Cookie': cookie.serialize( + 'session', + JSON.stringify({ + id: updatedUser.id, + accessToken: locals.user.accessToken, + firstName: updatedUser.firstName, + lastName: updatedUser.lastName, + isAdmin: updatedUser.isAdmin, + email: updatedUser.email, + }), + { + path: '/', + httpOnly: true, + sameSite: 'strict', + maxAge: 60 * 60 * 24 * 30, + }, + ), + }, + }; + } - - - - return { - status: 200, - body: { - user: { - id: updatedUser.id, - accessToken: locals.user.accessToken, - firstName: updatedUser.firstName, - lastName: updatedUser.lastName, - isAdmin: updatedUser.isAdmin, - email: updatedUser.email, - }, - success: 'Update user success' - }, - headers: { - 'Set-Cookie': cookie.serialize('session', JSON.stringify( - { - id: updatedUser.id, - accessToken: locals.user.accessToken, - firstName: updatedUser.firstName, - lastName: updatedUser.lastName, - isAdmin: updatedUser.isAdmin, - email: updatedUser.email, - }), { - path: '/', - httpOnly: true, - sameSite: 'strict', - maxAge: 60 * 60 * 24 * 30, - }) - } - } - } - - - - return { - status: 400, - body: { - error: 'Cannot get access token from cookies' - } - } -} \ No newline at end of file + return { + status: 400, + body: { + error: 'Cannot get access token from cookies', + }, + }; +}; diff --git a/web/src/routes/photos/index.svelte b/web/src/routes/photos/index.svelte index 8c957ad5dd7..4303490023b 100644 --- a/web/src/routes/photos/index.svelte +++ b/web/src/routes/photos/index.svelte @@ -3,6 +3,7 @@ import type { Load } from '@sveltejs/kit'; import { getAssetsInfo } from '$lib/stores/assets'; + import { checkAppVersion } from '$lib/utils/check-app-version'; export const load: Load = async ({ session }) => { if (!session.user) {