├── .editorconfig ├── .env.example ├── .gitattributes ├── .github ├── CODEOWNERS ├── DISCUSSION_TEMPLATE │ ├── bugs.yml │ └── ideas.yml ├── FUNDING.yml ├── ISSUE_TEMPLATE │ └── config.yml ├── PULL_REQUEST_TEMPLATE.md ├── build │ └── .gitignore ├── copilot-instructions.md ├── dependabot.yml ├── release.yml └── workflows │ ├── .env.mariadb │ ├── .env.postgresql │ ├── .env.sqlite │ ├── CICD.yml │ ├── codeql.yml │ ├── dependency-review.yml │ ├── js_check.yml │ ├── php_dist.yml │ ├── php_tests.yml │ ├── scorecard.yml │ └── v3.sql ├── .gitignore ├── .gitmodules ├── .php-cs-fixer.php ├── .phpstorm.meta.php ├── .prettierrc.json ├── .vscode └── extensions.json ├── Banner.png ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md ├── SECURITY.md ├── app ├── Actions │ ├── Album │ │ ├── Archive32.php │ │ ├── Archive64.php │ │ ├── BaseArchive.php │ │ ├── Create.php │ │ ├── CreateTagAlbum.php │ │ ├── Delete.php │ │ ├── ListAlbums.php │ │ ├── Merge.php │ │ ├── Move.php │ │ ├── PositionData.php │ │ ├── SetHeader.php │ │ ├── SetProtectionPolicy.php │ │ ├── SetSmartProtectionPolicy.php │ │ ├── Transfer.php │ │ └── Unlock.php │ ├── Albums │ │ ├── PositionData.php │ │ └── Top.php │ ├── Db │ │ ├── BaseOptimizer.php │ │ ├── OptimizeDb.php │ │ └── OptimizeTables.php │ ├── Diagnostics │ │ ├── Configuration.php │ │ ├── Diagnostics.php │ │ ├── Errors.php │ │ ├── Info.php │ │ ├── Pipes │ │ │ ├── Checks │ │ │ │ ├── AdminUserExistsCheck.php │ │ │ │ ├── AppUrlMatchCheck.php │ │ │ │ ├── BasicPermissionCheck.php │ │ │ │ ├── CachePasswordCheck.php │ │ │ │ ├── CacheTemporaryUrlCheck.php │ │ │ │ ├── ConfigSanityCheck.php │ │ │ │ ├── CountSizeVariantsCheck.php │ │ │ │ ├── DBIntegrityCheck.php │ │ │ │ ├── DBSupportCheck.php │ │ │ │ ├── ForeignKeyListInfo.php │ │ │ │ ├── GDSupportCheck.php │ │ │ │ ├── IframeCheck.php │ │ │ │ ├── ImageOptCheck.php │ │ │ │ ├── ImagickPdfCheck.php │ │ │ │ ├── IniSettingsCheck.php │ │ │ │ ├── MigrationCheck.php │ │ │ │ ├── OpCacheCheck.php │ │ │ │ ├── PHPVersionCheck.php │ │ │ │ ├── PlaceholderExistsCheck.php │ │ │ │ ├── SmallMediumExistsCheck.php │ │ │ │ ├── StatisticsIntegrityCheck.php │ │ │ │ ├── SupporterCheck.php │ │ │ │ ├── TimezoneCheck.php │ │ │ │ └── UpdatableCheck.php │ │ │ └── Infos │ │ │ │ ├── CountForeignKeyInfo.php │ │ │ │ ├── DockerVersionInfo.php │ │ │ │ ├── ExtensionsInfo.php │ │ │ │ ├── InstallTypeInfo.php │ │ │ │ ├── SystemInfo.php │ │ │ │ └── VersionInfo.php │ │ └── Space.php │ ├── HoneyPot │ │ ├── BasePipe.php │ │ ├── DefaultNotFound.php │ │ ├── EnvAccessTentative.php │ │ ├── FlaggedPathsAccessTentative.php │ │ └── HoneyIsActive.php │ ├── Import │ │ ├── Exec.php │ │ └── FromUrl.php │ ├── InstallUpdate │ │ ├── ApplyUpdate.php │ │ ├── CheckUpdate.php │ │ ├── DefaultConfig.php │ │ ├── PermissionsChecker.php │ │ ├── Pipes │ │ │ ├── AbstractUpdateInstallerPipe.php │ │ │ ├── AllowMigrationCheck.php │ │ │ ├── ArtisanKeyGenerate.php │ │ │ ├── ArtisanMigrate.php │ │ │ ├── ArtisanViewClear.php │ │ │ ├── BranchCheck.php │ │ │ ├── ComposerCall.php │ │ │ ├── GitPull.php │ │ │ ├── QueryExceptionChecker.php │ │ │ └── Spacer.php │ │ └── RequirementsChecker.php │ ├── Metrics │ │ ├── CleanupMetrics.php │ │ └── GetMetrics.php │ ├── Oauth │ │ └── Oauth.php │ ├── Photo │ │ ├── Archive32.php │ │ ├── Archive64.php │ │ ├── BaseArchive.php │ │ ├── Create.php │ │ ├── Delete.php │ │ ├── Duplicate.php │ │ ├── DuplicateFinder.php │ │ ├── Extensions │ │ │ └── ArchiveFileInfo.php │ │ ├── Move.php │ │ ├── Pipes │ │ │ ├── Duplicate │ │ │ │ ├── ReplicateAsPhoto.php │ │ │ │ ├── SaveIfDirty.php │ │ │ │ └── ThrowSkipDuplicate.php │ │ │ ├── Init │ │ │ │ ├── AssertSupportedMedia.php │ │ │ │ ├── FetchLastModifiedTime.php │ │ │ │ ├── FindDuplicate.php │ │ │ │ ├── FindLivePartner.php │ │ │ │ ├── InitParentAlbum.php │ │ │ │ ├── LoadFileMetadata.php │ │ │ │ └── MayLoadFileMetadata.php │ │ │ ├── PhotoPartner │ │ │ │ ├── DeleteOldVideoPartner.php │ │ │ │ └── SetOldChecksum.php │ │ │ ├── Shared │ │ │ │ ├── ExtractColourPalette.php │ │ │ │ ├── HydrateMetadata.php │ │ │ │ ├── NotifyAlbums.php │ │ │ │ ├── Save.php │ │ │ │ ├── SaveStatistics.php │ │ │ │ ├── SetParentAndOwnership.php │ │ │ │ ├── SetStarred.php │ │ │ │ └── UploadSizeVariantsToS3.php │ │ │ ├── Standalone │ │ │ │ ├── CreateOriginalSizeVariant.php │ │ │ │ ├── CreateSizeVariants.php │ │ │ │ ├── EncodePlaceholder.php │ │ │ │ ├── ExtractGoogleMotionPictures.php │ │ │ │ ├── FetchSourceImage.php │ │ │ │ ├── FixTimeStamps.php │ │ │ │ ├── InitNamingStrategy.php │ │ │ │ ├── PlaceGoogleMotionVideo.php │ │ │ │ ├── PlacePhoto.php │ │ │ │ ├── ReplaceOriginalWithBackup.php │ │ │ │ ├── SetChecksum.php │ │ │ │ └── SetOriginalChecksum.php │ │ │ └── VideoPartner │ │ │ │ ├── GetVideoPath.php │ │ │ │ ├── PlaceVideo.php │ │ │ │ └── UpdateLivePartner.php │ │ └── Rotate.php │ ├── Profile │ │ └── UpdateLogin.php │ ├── RSS │ │ └── Generate.php │ ├── Search │ │ ├── AlbumSearch.php │ │ └── PhotoSearch.php │ ├── Sharing │ │ ├── Propagate.php │ │ └── Share.php │ ├── SizeVariant │ │ └── Delete.php │ ├── Statistics │ │ ├── Counts.php │ │ └── Spaces.php │ └── User │ │ ├── Create.php │ │ ├── Notify.php │ │ ├── Save.php │ │ ├── TokenDisable.php │ │ └── TokenReset.php ├── Assets │ ├── ArrayToTextTable.php │ ├── BaseSizeVariantNamingStrategy.php │ ├── Features.php │ ├── Helpers.php │ └── SizeVariantGroupedWithRandomSuffixNamingStrategy.php ├── Casts │ ├── ArrayCast.php │ ├── DateTimeWithTimezoneCast.php │ └── MustNotSetCast.php ├── Console │ ├── Commands │ │ ├── Diagnostics.php │ │ ├── FixPermissions.php │ │ ├── FixTree.php │ │ ├── Ghostbuster.php │ │ ├── ImageProcessing │ │ │ ├── DecodeGpsLocations.php │ │ │ ├── EncodePlaceholders.php │ │ │ ├── ExifLens.php │ │ │ ├── ExtractColourPalette.php │ │ │ ├── GenerateThumbs.php │ │ │ ├── Takedate.php │ │ │ ├── VariantFilesize.php │ │ │ └── VideoData.php │ │ ├── Laravel │ │ │ ├── KeyGenerateCommand.php │ │ │ ├── LangFilesToJson.php │ │ │ ├── Migrate.php │ │ │ └── Optimize.php │ │ ├── Legacy │ │ │ └── ResetAdmin.php │ │ ├── PhotosAddedNotification.php │ │ ├── Sync.php │ │ ├── UserManagment │ │ │ ├── CreateUser.php │ │ │ └── UpdateUser.php │ │ └── Utilities │ │ │ └── Colorize.php │ └── Kernel.php ├── Constants │ ├── AccessPermissionConstants.php │ ├── FileSystem.php │ └── RandomID.php ├── Contracts │ ├── DTO.php │ ├── DiagnosticPipe.php │ ├── DiagnosticStringPipe.php │ ├── Exceptions │ │ ├── ExternalLycheeException.php │ │ ├── Handlers │ │ │ └── HttpExceptionHandler.php │ │ ├── InternalLycheeException.php │ │ └── LycheeException.php │ ├── ExternalRequest.php │ ├── Http │ │ ├── MiddlewareCheck.php │ │ ├── Redirection.php │ │ └── Requests │ │ │ ├── HasAbstractAlbum.php │ │ │ ├── HasAccessPermission.php │ │ │ ├── HasAccessPermissionResource.php │ │ │ ├── HasAlbum.php │ │ │ ├── HasAlbumIds.php │ │ │ ├── HasAlbumSortingCriterion.php │ │ │ ├── HasAlbums.php │ │ │ ├── HasBaseAlbum.php │ │ │ ├── HasCompactBoolean.php │ │ │ ├── HasConfigs.php │ │ │ ├── HasCopyright.php │ │ │ ├── HasDescription.php │ │ │ ├── HasEmail.php │ │ │ ├── HasFromId.php │ │ │ ├── HasLicense.php │ │ │ ├── HasName.php │ │ │ ├── HasNote.php │ │ │ ├── HasOwnerId.php │ │ │ ├── HasParentAlbum.php │ │ │ ├── HasPassword.php │ │ │ ├── HasPhoto.php │ │ │ ├── HasPhotoIds.php │ │ │ ├── HasPhotoLayout.php │ │ │ ├── HasPhotoSortingCriterion.php │ │ │ ├── HasPhotos.php │ │ │ ├── HasQuotaKB.php │ │ │ ├── HasRole.php │ │ │ ├── HasSeStatusBoolean.php │ │ │ ├── HasSizeVariant.php │ │ │ ├── HasTagAlbum.php │ │ │ ├── HasTags.php │ │ │ ├── HasTakenAt.php │ │ │ ├── HasTerms.php │ │ │ ├── HasTimelineAlbum.php │ │ │ ├── HasTimelinePhoto.php │ │ │ ├── HasTitle.php │ │ │ ├── HasUploadDate.php │ │ │ ├── HasUser.php │ │ │ ├── HasUserGroup.php │ │ │ ├── HasUserIds.php │ │ │ ├── HasUsername.php │ │ │ ├── HasVisitorId.php │ │ │ └── RequestAttribute.php │ ├── Image │ │ ├── BinaryBlob.php │ │ ├── ColourPaletteExtractorInterface.php │ │ ├── ImageHandlerInterface.php │ │ ├── MediaFile.php │ │ └── StreamStats.php │ ├── JsonRequest.php │ ├── Laminas │ │ └── DecoratorInterface.php │ ├── Models │ │ ├── AbstractAlbum.php │ │ ├── AbstractSizeVariantNamingStrategy.php │ │ ├── HasRandomID.php │ │ ├── HasUTCBasedTimes.php │ │ └── SizeVariantFactory.php │ ├── PhotoCreate │ │ ├── DuplicatePipe.php │ │ ├── InitPipe.php │ │ ├── PhotoDTO.php │ │ ├── PhotoPartnerPipe.php │ │ ├── PhotoPipe.php │ │ ├── SharedPipe.php │ │ ├── StandalonePipe.php │ │ └── VideoPartnerPipe.php │ ├── Relations │ │ └── BidirectionalRelation.php │ └── Versions │ │ ├── HasIsRelease.php │ │ ├── HasVersion.php │ │ ├── Remote │ │ └── GitRemote.php │ │ └── VersionControl.php ├── DTO │ ├── AbstractDTO.php │ ├── AlbumSortingCriterion.php │ ├── ArrayableDTO.php │ ├── BacktraceRecord.php │ ├── BaseImportReport.php │ ├── DiagnosticData.php │ ├── ImageDimension.php │ ├── ImportEventReport.php │ ├── ImportMode.php │ ├── ImportParam.php │ ├── ImportProgressReport.php │ ├── LycheeGitInfo.php │ ├── PhotoCreate │ │ ├── DuplicateDTO.php │ │ ├── InitDTO.php │ │ ├── PhotoPartnerDTO.php │ │ ├── StandaloneDTO.php │ │ └── VideoPartnerDTO.php │ ├── PhotoSortingCriterion.php │ ├── SortingCriterion.php │ ├── TopAlbumDTO.php │ └── Version.php ├── Eloquent │ ├── FixedQueryBuilder.php │ └── FixedQueryBuilderTrait.php ├── Enum │ ├── AlbumDecorationOrientation.php │ ├── AlbumDecorationType.php │ ├── AspectRatioCSSType.php │ ├── AspectRatioType.php │ ├── CacheTag.php │ ├── ColumnSortingAlbumType.php │ ├── ColumnSortingPhotoType.php │ ├── ColumnSortingType.php │ ├── ConfigType.php │ ├── CountType.php │ ├── DateOrderingType.php │ ├── DbDriverType.php │ ├── DefaultAlbumProtectionType.php │ ├── DownloadVariantType.php │ ├── FileStatus.php │ ├── ImageOverlayType.php │ ├── JobStatus.php │ ├── LicenseType.php │ ├── LiveMetricsAccess.php │ ├── MapProviders.php │ ├── MessageType.php │ ├── MetricsAccess.php │ ├── MetricsAction.php │ ├── OauthProvidersType.php │ ├── OrderSortingType.php │ ├── PhotoLayoutType.php │ ├── PhotoThumbInfoType.php │ ├── SeverityType.php │ ├── SizeVariantType.php │ ├── SmallLargeType.php │ ├── SmartAlbumType.php │ ├── StorageDiskType.php │ ├── ThumbAlbumSubtitleType.php │ ├── ThumbOverlayVisibilityType.php │ ├── TimelineAlbumGranularity.php │ ├── TimelinePhotoGranularity.php │ ├── Traits │ │ └── DecorateBackedEnum.php │ ├── UpdateStatus.php │ ├── UserGroupRole.php │ └── VersionChannelType.php ├── Events │ ├── AlbumRouteCacheUpdated.php │ ├── Metrics │ │ ├── AlbumDownload.php │ │ ├── AlbumShared.php │ │ ├── AlbumVisit.php │ │ ├── BaseAlbumMetricsEvent.php │ │ ├── BaseMetricsEvent.php │ │ ├── BasePhotoMetricsEvent.php │ │ ├── PhotoDownload.php │ │ ├── PhotoFavourite.php │ │ ├── PhotoShared.php │ │ └── PhotoVisit.php │ └── TaggedRouteCacheUpdated.php ├── Exceptions │ ├── AdminUserAlreadySetException.php │ ├── AdminUserRequiredException.php │ ├── BadRequestHeaderException.php │ ├── BaseLycheeException.php │ ├── ConfigurationException.php │ ├── ConfigurationKeyMissingException.php │ ├── ConflictingPropertyException.php │ ├── ExternalComponentFailedException.php │ ├── ExternalComponentMissingException.php │ ├── FileOperationException.php │ ├── FlySystemLycheeException.php │ ├── Handler.php │ ├── Handlers │ │ ├── AccessDBDenied.php │ │ ├── AdminSetterHandler.php │ │ ├── InstallationHandler.php │ │ ├── MigrationHandler.php │ │ ├── NoEncryptionKey.php │ │ └── ViteManifestNotFoundHandler.php │ ├── HttpHoneyPotException.php │ ├── ImageProcessingException.php │ ├── ImportCancelledException.php │ ├── InstallationAlreadyCompletedException.php │ ├── InstallationFailedException.php │ ├── InstallationRequiredException.php │ ├── InsufficientEntropyException.php │ ├── InsufficientFilesystemPermissions.php │ ├── Internal │ │ ├── FailedModelAssumptionException.php │ │ ├── FeaturesDoesNotExistsException.php │ │ ├── FileDeletionException.php │ │ ├── FrameworkException.php │ │ ├── IllegalOrderOfOperationException.php │ │ ├── InvalidConfigOption.php │ │ ├── InvalidOrderDirectionException.php │ │ ├── InvalidQueryModelException.php │ │ ├── InvalidRotationDirectionException.php │ │ ├── InvalidSizeVariantException.php │ │ ├── InvalidSmartIdException.php │ │ ├── LycheeAssertionError.php │ │ ├── LycheeDomainException.php │ │ ├── LycheeInvalidArgumentException.php │ │ ├── LycheeLogicException.php │ │ ├── MissingModelAttributeException.php │ │ ├── MissingValueException.php │ │ ├── NotImplementedException.php │ │ ├── QueryBuilderException.php │ │ ├── RequestFailedException.php │ │ ├── TimeBasedIdException.php │ │ └── ZeroModuloException.php │ ├── InvalidDirectoryException.php │ ├── InvalidPropertyException.php │ ├── LocationDecodingFailed.php │ ├── MassImportException.php │ ├── MediaFileOperationException.php │ ├── MediaFileUnsupportedException.php │ ├── MigrationAlreadyCompletedException.php │ ├── MigrationRequiredException.php │ ├── ModelDBException.php │ ├── NoWriteAccessOnLogsExceptions.php │ ├── OwnerRequiredException.php │ ├── PasswordRequiredException.php │ ├── PhotoCollectionEmptyException.php │ ├── PhotoResyncedException.php │ ├── PhotoSkippedException.php │ ├── QuotaExceededException.php │ ├── ReservedDirectoryException.php │ ├── SecurePaths │ │ ├── InvalidPayloadException.php │ │ ├── InvalidSignatureException.php │ │ ├── SignatureExpiredException.php │ │ └── WrongPathException.php │ ├── SessionExpiredException.php │ ├── UnauthenticatedException.php │ ├── UnauthorizedException.php │ ├── UnexpectedContentType.php │ ├── UnexpectedException.php │ └── VersionControlException.php ├── Facades │ └── Helpers.php ├── Factories │ └── AlbumFactory.php ├── Http │ ├── Controllers │ │ ├── Admin │ │ │ ├── DiagnosticsController.php │ │ │ ├── JobsController.php │ │ │ ├── Maintenance │ │ │ │ ├── Cleaning.php │ │ │ │ ├── DuplicateFinder.php │ │ │ │ ├── FixJobs.php │ │ │ │ ├── FixTree.php │ │ │ │ ├── FlushCache.php │ │ │ │ ├── FullTree.php │ │ │ │ ├── GenSizeVariants.php │ │ │ │ ├── MissingFileSizes.php │ │ │ │ ├── MissingPalettes.php │ │ │ │ ├── Model │ │ │ │ │ └── Album.php │ │ │ │ ├── Optimize.php │ │ │ │ ├── RegisterController.php │ │ │ │ └── StatisticsCheck.php │ │ │ ├── SettingsController.php │ │ │ ├── UpdateController.php │ │ │ ├── UserGroupsController.php │ │ │ ├── UserGroupsManagementController.php │ │ │ └── UserManagementController.php │ │ ├── AuthController.php │ │ ├── Gallery │ │ │ ├── AlbumController.php │ │ │ ├── AlbumsController.php │ │ │ ├── ConfigController.php │ │ │ ├── FrameController.php │ │ │ ├── MapController.php │ │ │ ├── PhotoController.php │ │ │ ├── SearchController.php │ │ │ └── SharingController.php │ │ ├── HoneyPotController.php │ │ ├── Install │ │ │ ├── EnvController.php │ │ │ ├── MigrationController.php │ │ │ ├── PermissionsController.php │ │ │ ├── RequirementsController.php │ │ │ ├── SetUpAdminController.php │ │ │ └── WelcomeController.php │ │ ├── LandingPageController.php │ │ ├── MetricsController.php │ │ ├── OauthController.php │ │ ├── ProfileController.php │ │ ├── RSSController.php │ │ ├── SecurePathController.php │ │ ├── StatisticsController.php │ │ ├── UsersController.php │ │ ├── VersionController.php │ │ ├── VueController.php │ │ └── WebAuthn │ │ │ ├── WebAuthnLoginController.php │ │ │ ├── WebAuthnManageController.php │ │ │ └── WebAuthnRegisterController.php │ ├── Kernel.php │ ├── Middleware │ │ ├── AcceptContentType.php │ │ ├── AdminUserStatus.php │ │ ├── Caching │ │ │ ├── AlbumRouteCacheRefresher.php │ │ │ ├── CacheControl.php │ │ │ └── ResponseCache.php │ │ ├── Checks │ │ │ ├── HasAdminUser.php │ │ │ ├── IsInstalled.php │ │ │ └── IsMigrated.php │ │ ├── ConfigIntegrity.php │ │ ├── ContentType.php │ │ ├── DisableCSP.php │ │ ├── FixStatusCode.php │ │ ├── InstallationStatus.php │ │ ├── Latency.php │ │ ├── LoginRequired.php │ │ ├── MigrationStatus.php │ │ ├── TrimStrings.php │ │ ├── UnlockWithPassword.php │ │ └── VerifyCsrfToken.php │ ├── Redirections │ │ ├── ToAdminSetter.php │ │ ├── ToHome.php │ │ ├── ToInstall.php │ │ └── ToMigration.php │ ├── Requests │ │ ├── AbstractEmptyRequest.php │ │ ├── Album │ │ │ ├── AddAlbumRequest.php │ │ │ ├── AddTagAlbumRequest.php │ │ │ ├── DeleteAlbumsRequest.php │ │ │ ├── DeleteTrackRequest.php │ │ │ ├── GetAlbumRequest.php │ │ │ ├── MergeAlbumsRequest.php │ │ │ ├── MoveAlbumsRequest.php │ │ │ ├── RenameAlbumRequest.php │ │ │ ├── SetAlbumProtectionPolicyRequest.php │ │ │ ├── SetAlbumTrackRequest.php │ │ │ ├── SetAsCoverRequest.php │ │ │ ├── SetAsHeaderRequest.php │ │ │ ├── TargetListAlbumRequest.php │ │ │ ├── TransferAlbumRequest.php │ │ │ ├── UnlockAlbumRequest.php │ │ │ ├── UpdateAlbumRequest.php │ │ │ ├── UpdateTagAlbumRequest.php │ │ │ └── ZipRequest.php │ │ ├── BaseApiRequest.php │ │ ├── Diagnostics │ │ │ └── DiagnosticsRequest.php │ │ ├── Frame │ │ │ └── FrameRequest.php │ │ ├── Install │ │ │ └── SetUpAdminRequest.php │ │ ├── Jobs │ │ │ └── ShowJobsRequest.php │ │ ├── Maintenance │ │ │ ├── CleaningRequest.php │ │ │ ├── CreateThumbsRequest.php │ │ │ ├── FullTreeUpdateRequest.php │ │ │ ├── MaintenanceRequest.php │ │ │ ├── MigrateRequest.php │ │ │ ├── RegisterRequest.php │ │ │ ├── SearchDuplicateRequest.php │ │ │ └── UpdateRequest.php │ │ ├── Map │ │ │ └── MapDataRequest.php │ │ ├── Metrics │ │ │ ├── MetricsRequest.php │ │ │ └── PhotoMetricsRequest.php │ │ ├── Photo │ │ │ ├── CopyPhotosRequest.php │ │ │ ├── DeletePhotosRequest.php │ │ │ ├── EditPhotoRequest.php │ │ │ ├── FromUrlRequest.php │ │ │ ├── MovePhotosRequest.php │ │ │ ├── RenamePhotoRequest.php │ │ │ ├── RotatePhotoRequest.php │ │ │ ├── SetPhotosStarredRequest.php │ │ │ ├── SetPhotosTagsRequest.php │ │ │ └── UploadPhotoRequest.php │ │ ├── Profile │ │ │ ├── ChangeTokenRequest.php │ │ │ ├── ClearOauthRequest.php │ │ │ ├── OauthListRequest.php │ │ │ ├── RegistrationRequest.php │ │ │ └── UpdateProfileRequest.php │ │ ├── Search │ │ │ ├── GetSearchRequest.php │ │ │ └── InitSearchRequest.php │ │ ├── Session │ │ │ └── LoginRequest.php │ │ ├── Settings │ │ │ ├── GetAllConfigsRequest.php │ │ │ ├── SetCSSSettingRequest.php │ │ │ ├── SetConfigsRequest.php │ │ │ └── SetJSSettingRequest.php │ │ ├── Sharing │ │ │ ├── AddSharingRequest.php │ │ │ ├── DeleteSharingRequest.php │ │ │ ├── EditSharingRequest.php │ │ │ ├── ListAllSharingRequest.php │ │ │ ├── ListSharingRequest.php │ │ │ └── PropagateSharingRequest.php │ │ ├── Statistics │ │ │ ├── CountsRequest.php │ │ │ ├── SpacePerAlbumRequest.php │ │ │ ├── SpacePerUserRequest.php │ │ │ └── SpaceSizeVariantRequest.php │ │ ├── Traits │ │ │ ├── Authorize │ │ │ │ ├── AuthorizeCanEditAlbumAlbumsTrait.php │ │ │ │ ├── AuthorizeCanEditAlbumTrait.php │ │ │ │ ├── AuthorizeCanEditPhotoTrait.php │ │ │ │ ├── AuthorizeCanEditPhotosAlbumTrait.php │ │ │ │ └── AuthorizeCanEditPhotosTrait.php │ │ │ ├── HasAbstractAlbumTrait.php │ │ │ ├── HasAccessPermissionResourceTrait.php │ │ │ ├── HasAccessPermissionTrait.php │ │ │ ├── HasAlbumIdsTrait.php │ │ │ ├── HasAlbumSortingCriterionTrait.php │ │ │ ├── HasAlbumTrait.php │ │ │ ├── HasAlbumsTrait.php │ │ │ ├── HasAspectRatioTrait.php │ │ │ ├── HasBaseAlbumTrait.php │ │ │ ├── HasCompactBooleanTrait.php │ │ │ ├── HasConfigsTrait.php │ │ │ ├── HasCopyrightTrait.php │ │ │ ├── HasDescriptionTrait.php │ │ │ ├── HasEmailTrait.php │ │ │ ├── HasFromIdTrait.php │ │ │ ├── HasLicenseTrait.php │ │ │ ├── HasNameTrait.php │ │ │ ├── HasNoteTrait.php │ │ │ ├── HasOwnerIdTrait.php │ │ │ ├── HasParentAlbumTrait.php │ │ │ ├── HasPasswordTrait.php │ │ │ ├── HasPhotoIdsTrait.php │ │ │ ├── HasPhotoLayoutTrait.php │ │ │ ├── HasPhotoSortingCriterionTrait.php │ │ │ ├── HasPhotoTrait.php │ │ │ ├── HasPhotosTrait.php │ │ │ ├── HasQuotaKBTrait.php │ │ │ ├── HasRoleTrait.php │ │ │ ├── HasSeStatusBooleanTrait.php │ │ │ ├── HasSizeVariantTrait.php │ │ │ ├── HasTagAlbumTrait.php │ │ │ ├── HasTagsTrait.php │ │ │ ├── HasTakenAtDateTrait.php │ │ │ ├── HasTermsTrait.php │ │ │ ├── HasTimelineAlbumTrait.php │ │ │ ├── HasTimelinePhotoTrait.php │ │ │ ├── HasTitleTrait.php │ │ │ ├── HasUploadDateTrait.php │ │ │ ├── HasUserGroupTrait.php │ │ │ ├── HasUserIdsTrait.php │ │ │ ├── HasUserTrait.php │ │ │ ├── HasUsernameTrait.php │ │ │ └── HasVisitorIdTrait.php │ │ ├── UserGroup │ │ │ ├── CreateUserGroupRequest.php │ │ │ ├── DeleteUserGroupRequest.php │ │ │ ├── GetUserGroupRequest.php │ │ │ ├── ListUserGroupRequest.php │ │ │ ├── ManageUserGroupRequest.php │ │ │ └── UpdateUserGroupRequest.php │ │ ├── UserManagement │ │ │ ├── AddUserRequest.php │ │ │ ├── DeleteUserRequest.php │ │ │ ├── ManagmentListUsersRequest.php │ │ │ └── SetUserSettingsRequest.php │ │ ├── Users │ │ │ ├── ListUsersRequest.php │ │ │ └── UsersRequest.php │ │ └── WebAuthn │ │ │ ├── DeleteCredentialRequest.php │ │ │ ├── EditCredentialRequest.php │ │ │ └── ListCredentialsRequest.php │ └── Resources │ │ ├── Collections │ │ ├── PositionDataResource.php │ │ ├── RootAlbumResource.php │ │ └── UserGroupDataResource.php │ │ ├── Diagnostics │ │ ├── AlbumTree.php │ │ ├── ChangeLogInfo.php │ │ ├── CleaningState.php │ │ ├── ErrorLine.php │ │ ├── Permissions.php │ │ ├── StatisticsCheckResource.php │ │ ├── TreeState.php │ │ ├── UpdateCheckInfo.php │ │ └── UpdateInfo.php │ │ ├── Editable │ │ ├── EditableBaseAlbumResource.php │ │ ├── EditableConfigResource.php │ │ └── UploadMetaResource.php │ │ ├── Frame │ │ └── FrameData.php │ │ ├── GalleryConfigs │ │ ├── AlbumConfig.php │ │ ├── FooterConfig.php │ │ ├── InitConfig.php │ │ ├── LandingPageResource.php │ │ ├── MapProviderData.php │ │ ├── PhotoLayoutConfig.php │ │ ├── RegisterData.php │ │ ├── RootConfig.php │ │ ├── SettingsConfig.php │ │ └── UploadConfig.php │ │ ├── Models │ │ ├── AbstractAlbumResource.php │ │ ├── AccessPermissionResource.php │ │ ├── AlbumResource.php │ │ ├── AlbumStatisticsResource.php │ │ ├── ColourPaletteResource.php │ │ ├── ConfigCategoryResource.php │ │ ├── ConfigResource.php │ │ ├── Duplicates │ │ │ ├── Duplicate.php │ │ │ └── DuplicateCount.php │ │ ├── JobHistoryResource.php │ │ ├── LightUserResource.php │ │ ├── LiveMetricsResource.php │ │ ├── PhotoResource.php │ │ ├── PhotoStatisticsResource.php │ │ ├── SizeVariantResource.php │ │ ├── SizeVariantsResouce.php │ │ ├── SmartAlbumResource.php │ │ ├── TagAlbumResource.php │ │ ├── TargetAlbumResource.php │ │ ├── ThumbAlbumResource.php │ │ ├── ThumbResource.php │ │ ├── UserGroupResource.php │ │ ├── UserManagementResource.php │ │ ├── UserMemberGroupResource.php │ │ ├── UserResource.php │ │ ├── Utils │ │ │ ├── AlbumProtectionPolicy.php │ │ │ ├── PreComputedPhotoData.php │ │ │ ├── PreFormattedAlbumData.php │ │ │ ├── PreformattedPhotoData.php │ │ │ ├── TimelineData.php │ │ │ └── UserToken.php │ │ └── WebAuthnResource.php │ │ ├── Oauth │ │ └── OauthRegistrationData.php │ │ ├── OpenApi │ │ └── DataToResponse.php │ │ ├── Rights │ │ ├── AlbumRightsResource.php │ │ ├── GlobalRightsResource.php │ │ ├── ModulesRightsResource.php │ │ ├── PhotoRightsResource.php │ │ ├── RootAlbumRightsResource.php │ │ ├── SettingsRightsResource.php │ │ ├── UserGroupRightResource.php │ │ ├── UserManagementRightsResource.php │ │ └── UserRightsResource.php │ │ ├── Root │ │ ├── AuthConfig.php │ │ └── VersionResource.php │ │ ├── Search │ │ ├── InitResource.php │ │ └── ResultsResource.php │ │ ├── Statistics │ │ ├── Album.php │ │ ├── CountsData.php │ │ ├── DayCount.php │ │ ├── Sizes.php │ │ └── UserSpace.php │ │ └── Traits │ │ ├── HasHeaderUrl.php │ │ ├── HasPrepPhotoCollection.php │ │ └── HasTimelineData.php ├── Image │ ├── ColourExtractor │ │ ├── FarzaiExtractor.php │ │ ├── ImageFactoryForColourExtraction.php │ │ └── LeagueExtractor.php │ ├── FileDeleter.php │ ├── Files │ │ ├── AbstractBinaryBlob.php │ │ ├── BaseMediaFile.php │ │ ├── DownloadedFile.php │ │ ├── FlysystemFile.php │ │ ├── InMemoryBuffer.php │ │ ├── LoadTemporaryFileTrait.php │ │ ├── NativeLocalFile.php │ │ ├── ProcessableJobFile.php │ │ ├── TemporaryJobFile.php │ │ ├── TemporaryLocalFile.php │ │ └── UploadedFile.php │ ├── Handlers │ │ ├── BaseImageHandler.php │ │ ├── GdHandler.php │ │ ├── GoogleMotionPictureHandler.php │ │ ├── ImageHandler.php │ │ ├── ImagickHandler.php │ │ └── VideoHandler.php │ ├── PlaceholderEncoder.php │ ├── SizeVariantDefaultFactory.php │ ├── SizeVariantDimensionHelpers.php │ ├── StreamStat.php │ └── StreamStatFilter.php ├── Jobs │ ├── ExtractColoursJob.php │ ├── ProcessImageJob.php │ └── UploadSizeVariantToS3Job.php ├── Legacy │ └── BaseConfigMigration.php ├── Listeners │ ├── AlbumCacheCleaner.php │ ├── CacheListener.php │ ├── MetricsListener.php │ └── TaggedRouteCacheCleaner.php ├── Mail │ └── PhotosAdded.php ├── Metadata │ ├── Cache │ │ ├── RouteCacheConfig.php │ │ ├── RouteCacheManager.php │ │ └── RouteCacher.php │ ├── DiskUsage.php │ ├── Extractor.php │ ├── Geodecoder.php │ ├── Json │ │ ├── ChangeLogsRequest.php │ │ ├── CommitsRequest.php │ │ ├── ExternalRequestFunctions.php │ │ ├── JsonRequestFunctions.php │ │ ├── TagsRequest.php │ │ └── UpdateRequest.php │ ├── Laminas │ │ └── Unicode.php │ └── Versions │ │ ├── FileVersion.php │ │ ├── GitHubVersion.php │ │ ├── InstalledVersion.php │ │ ├── Remote │ │ ├── AbstractGitRemote.php │ │ ├── GitCommits.php │ │ └── GitTags.php │ │ └── Trimable.php ├── ModelFunctions │ ├── HasAbstractAlbumProperties.php │ └── MOVFormat.php ├── Models │ ├── AccessPermission.php │ ├── Album.php │ ├── BaseAlbumImpl.php │ ├── Builders │ │ ├── AccessPermissionBuilder.php │ │ ├── AlbumBuilder.php │ │ ├── BaseAlbumImplBuilder.php │ │ ├── ConfigCategoryBuilder.php │ │ ├── ConfigsBuilder.php │ │ ├── JobHistoryBuilder.php │ │ ├── LiveMetricsBuilder.php │ │ ├── OauthCredentialBuilder.php │ │ ├── PhotoBuilder.php │ │ ├── SizeVariantBuilder.php │ │ ├── StatisticsBuilder.php │ │ ├── TagAlbumBuilder.php │ │ ├── UserBuilder.php │ │ └── UserGroupBuilder.php │ ├── Colour.php │ ├── ConfigCategory.php │ ├── Configs.php │ ├── Extensions │ │ ├── AbstractBaseConfigMigration.php │ │ ├── BaseAlbum.php │ │ ├── BaseConfigMigration.php │ │ ├── BaseConfigMigrationReversed.php │ │ ├── ConfigsHas.php │ │ ├── ForwardsToParentImplementation.php │ │ ├── HasBidirectionalRelationships.php │ │ ├── HasRandomIDAndLegacyTimeBasedID.php │ │ ├── HasUrlGenerator.php │ │ ├── SizeVariants.php │ │ ├── SortingDecorator.php │ │ ├── ThrowsConsistentExceptions.php │ │ ├── Thumb.php │ │ ├── ToArrayThrowsNotImplemented.php │ │ └── UTCBasedTimes.php │ ├── JobHistory.php │ ├── LiveMetrics.php │ ├── OauthCredential.php │ ├── Palette.php │ ├── Photo.php │ ├── SizeVariant.php │ ├── Statistics.php │ ├── TagAlbum.php │ ├── User.php │ └── UserGroup.php ├── Notifications │ └── PhotoAdded.php ├── Policies │ ├── AlbumPolicy.php │ ├── AlbumQueryPolicy.php │ ├── BasePolicy.php │ ├── MetricsPolicy.php │ ├── PhotoPolicy.php │ ├── PhotoQueryPolicy.php │ ├── SettingsPolicy.php │ ├── UserGroupPolicy.php │ └── UserPolicy.php ├── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php ├── Relations │ ├── BaseHasManyPhotos.php │ ├── BidirectionalRelationTrait.php │ ├── HasAlbumThumb.php │ ├── HasManyBidirectionally.php │ ├── HasManyChildAlbums.php │ ├── HasManyChildPhotos.php │ ├── HasManyPhotosByTag.php │ ├── HasManyPhotosRecursively.php │ └── HasManySizeVariants.php ├── Rules │ ├── AlbumIDListRule.php │ ├── AlbumIDRule.php │ ├── BooleanRequireSupportRule.php │ ├── ConfigKeyRequireSupportRule.php │ ├── ConfigKeyRule.php │ ├── ConfigValueRule.php │ ├── CopyrightRule.php │ ├── CurrentPasswordRule.php │ ├── DescriptionRule.php │ ├── EnumRequireSupportRule.php │ ├── ExtensionRule.php │ ├── FileUuidRule.php │ ├── IntegerIDRule.php │ ├── IntegerRequireSupportRule.php │ ├── PasswordRule.php │ ├── RandomIDListRule.php │ ├── RandomIDRule.php │ ├── StringRequireSupportRule.php │ ├── StringRule.php │ ├── TitleRule.php │ ├── UsernameRule.php │ └── ValidateTrait.php ├── Services │ ├── Archives │ │ ├── Zip21Trait.php │ │ └── Zip31Trait.php │ └── Auth │ │ └── SessionOrTokenGuard.php ├── SmartAlbums │ ├── BaseSmartAlbum.php │ ├── OnThisDayAlbum.php │ ├── RecentAlbum.php │ ├── StarredAlbum.php │ ├── UnsortedAlbum.php │ └── Utils │ │ └── MimicModel.php └── View │ └── Components │ └── Meta.php ├── artisan ├── bootstrap ├── PanicAttack.php ├── app.php ├── cache └── initialize.php ├── codecov.yml ├── composer-cache └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cors.php ├── data.php ├── database.php ├── debugbar.php ├── features.php ├── feed.php ├── filesystems.php ├── hashing.php ├── honeypot.php ├── image-optimizer.php ├── log-viewer.php ├── logging.php ├── mail.php ├── markdown.php ├── queue.php ├── scramble.php ├── secure-headers.php ├── services.php ├── session.php ├── trustedproxy.php ├── typescript-transformer.php ├── urls.php ├── view.php └── webauthn.php ├── database ├── .gitignore ├── factories │ ├── AccessPermissionFactory.php │ ├── AlbumFactory.php │ ├── PhotoFactory.php │ ├── SizeVariantFactory.php │ ├── StatisticsFactory.php │ ├── TagAlbumFactory.php │ ├── Traits │ │ └── OwnedBy.php │ ├── UserFactory.php │ └── UserGroupFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2018_08_03_110935_create_albums_table.php │ ├── 2018_08_03_110936_create_photos_table.php │ ├── 2018_08_03_110942_create_configs_table.php │ ├── 2018_08_03_111324_create_logs_table.php │ ├── 2018_08_10_134924_move_settings.php │ ├── 2018_08_15_102039_move_albums.php │ ├── 2018_08_15_103716_move_photos.php │ ├── 2018_10_30_135411_sharing.php │ ├── 2019_02_21_114356_create_pages_table.php │ ├── 2019_02_21_114408_create_page_contents_table.php │ ├── 2019_06_21_180451_create_sym_links_table.php │ ├── 2019_09_28_171753_config_fix.php │ ├── 2019_09_28_190822_photos_fix.php │ ├── 2019_10_01_add_livephoto_cols.php │ ├── 2019_10_02_1400_config_map_display_public.php │ ├── 2019_10_03_214750_frame_refresh_in_sec.php │ ├── 2019_10_06_1400_config_map_providers.php │ ├── 2019_10_06_152017_add_force_32bit_ids.php │ ├── 2019_10_07_0900_config_map_include_sub_albums.php │ ├── 2019_10_09_233402_config_map_mod.php │ ├── 2019_10_11_093442_config_check_update_every.php │ ├── 2019_12_02_2100_config_exiftool.php │ ├── 2019_12_15_0700_add_share_button_visible_option.php │ ├── 2019_12_15_1000_config_check_update_every_cat_fix.php │ ├── 2019_12_25_0600_config_exiftool_ternary.php │ ├── 2020_01_018_2300_config_import_via_symlink.php │ ├── 2020_01_04_1200_config_has_ffmpeg.php │ ├── 2020_01_26_1200_config_public_sorting.php │ ├── 2020_01_28_133201_composer_update.php │ ├── 2020_02_14_0600_location_decoding.php │ ├── 2020_03_11_124417_increase_length_photo_type.php │ ├── 2020_03_17_200000_unhide_configs.php │ ├── 2020_04_19_122905_bump_version.php │ ├── 2020_04_22_155712_bump_version040002.php │ ├── 2020_04_29_000250_bump_version040003.php │ ├── 2020_05_12_114228_rss.php │ ├── 2020_05_12_161427_bump_version040005.php │ ├── 2020_05_19_174233_config_prefer_available_xmp_metadata.php │ ├── 2020_05_26_135052_bump_version040006.php │ ├── 2020_06_04_104605_config_editor_enabled.php │ ├── 2020_07_11_104605_config_lossless_optimization.php │ ├── 2020_07_11_184605_update_licences.php │ ├── 2020_07_26_085322_config_swipe_tolerance.php │ ├── 2020_07_29_132731_config_local_takestamp.php │ ├── 2020_08_21_123622_add_smart_tag_album_cols.php │ ├── 2020_10_09_130043_bump_version040007.php │ ├── 2020_10_15_104504_add_log_max_num_line.php │ ├── 2020_10_15_161346_sort_image_per_album.php │ ├── 2020_11_12_183345_config_password_url_param_for_smart_album.php │ ├── 2020_11_19_231553_bump_version040008.php │ ├── 2020_12_12_203153_migrate_admin_user.php │ ├── 2020_12_12_203831_create_web_authn_tables.php │ ├── 2020_12_18_162100_bump_version040009.php │ ├── 2020_12_18_162155_add_nsfw_album.php │ ├── 2020_12_18_163800_bump_version040010.php │ ├── 2020_12_24_022307_bump_version040100.php │ ├── 2020_12_26_153220_nested_set_for_albums.php │ ├── 2021_01_09_163715_remove_max_min_takestamps.php │ ├── 2021_01_12_122546_bump_version040200.php │ ├── 2021_01_18_103729_add_album_cover.php │ ├── 2021_01_20_113912_bump_version040201.php │ ├── 2021_01_24_231904_fix-rotation.php │ ├── 2021_01_27_085903_config_map_display_direction.php │ ├── 2021_01_30_111736_display_takedate.php │ ├── 2021_02_12_222948_config_upload_processing_limit.php │ ├── 2021_02_13_132245_bump_version040202.php │ ├── 2021_02_18_232639_config_public_photos_hidden.php │ ├── 2021_03_03_175555_config_remove_image_overlay.php │ ├── 2021_04_17_135924_bump_version040300.php │ ├── 2021_05_02_174300_add_filesize_raw_col.php │ ├── 2021_05_12_185726_bump_version040301.php │ ├── 2021_05_13_140700_refactor_size_variants.php │ ├── 2021_05_16_171615_bump_version040302.php │ ├── 2021_05_25_160600_post_revert_fixes.php │ ├── 2021_05_31_201000_convert_filesize_to_bigint.php │ ├── 2021_06_01_181900_refactor_timestamps_anew.php │ ├── 2021_06_01_182000_bump_version040304.php │ ├── 2021_06_06_151613_fix-takedate.php │ ├── 2021_06_23_105939_create_notifications_table.php │ ├── 2021_06_30_121651_add_email_to_users_table.php │ ├── 2021_06_30_122229_config_new_photos_notification.php │ ├── 2021_07_19_134617_bump_version040305.php │ ├── 2021_10_27_133121_fix_confidentiality.php │ ├── 2021_11_16_162058_bump_version040306.php │ ├── 2021_12_03_201242_bump_version040400.php │ ├── 2021_12_04_181200_refactor_models.php │ ├── 2022_01_13_183131_bump_version040500.php │ ├── 2022_01_16_181337_optimize_tables.php │ ├── 2022_02_02_203008_filesize_size_variants.php │ ├── 2022_02_22_194700_fix_sorting_config.php │ ├── 2022_04_06_091900_drop_objectionable_indices.php │ ├── 2022_04_13_094611_add_track_short_path_to_album_table.php │ ├── 2022_04_16_170724_add_missing_indices.php │ ├── 2022_04_16_174503_bump_version040501.php │ ├── 2022_04_18_150400_add_index_for_delete.php │ ├── 2022_04_18_174417_fix_live_photo_short_path.php │ ├── 2022_06_12_075709_add_token_to_user_table.php │ ├── 2022_07_09_130303_create_webauthn_credentials.php │ ├── 2022_07_13_174800_permission_test.php │ ├── 2022_07_24_102214_bump_version040502.php │ ├── 2022_08_03_184746_add_zip_options.php │ ├── 2022_08_06_205701_bump_version040503.php │ ├── 2022_08_06_210757_bump_version040600.php │ ├── 2022_08_27_103010_drop_page_support.php │ ├── 2022_08_27_110209_drop_admin_user_config.php │ ├── 2022_09_27_103710_bump_version040601.php │ ├── 2022_10_23_143201_make_wui_settings_public.php │ ├── 2022_10_28_232159_bump_version040602.php │ ├── 2022_11_07_171403_add_config_descriptions.php │ ├── 2022_11_27_143608_bump_version040603.php │ ├── 2022_12_05_195600_enable_disable_smart_albums.php │ ├── 2022_12_07_141854_rename_capabilities.php │ ├── 2022_12_07_143755_add_default_protection_option.php │ ├── 2022_12_07_164417_config_uniformize_rights.php │ ├── 2022_12_07_175257_rename_attributes_grants.php │ ├── 2022_12_10_183251_increment_user_i_ds.php │ ├── 2022_12_12_100000_enable_disable_album_photo_counters.php │ ├── 2022_12_21_212143_use_webp_for_example.php │ ├── 2022_12_25_103052_bump_version040604.php │ ├── 2022_12_26_101639_allow_username_change.php │ ├── 2022_12_26_111139_bump_version040605.php │ ├── 2022_12_28_164844_remove-demo.php │ ├── 2022_12_31_103416_bump_version040700.php │ ├── 2023_01_09_133603_public_on_this_day.php │ ├── 2023_01_25_140614_change-locale.php │ ├── 2023_02_05_155552_bump_version040701.php │ ├── 2023_02_23_192505_add_auto_fix_orientation_setting.php │ ├── 2023_03_08_103109_bump_version040702.php │ ├── 2023_04_05_150337_create_jobs_table.php │ ├── 2023_04_05_150625_queue-processing.php │ ├── 2023_04_05_220214_create_failed_jobs_table.php │ ├── 2023_04_09_142907_create_job_history_table.php │ ├── 2023_04_18_065457_bump_version040703.php │ ├── 2023_05_01_165730_add_random_photo_settings.php │ ├── 2023_05_04_070132_bump_version040704.php │ ├── 2023_05_04_193000_add_use_last_modified_date_when_no_exit_date_setting.php │ ├── 2023_05_05_052254_create_access_permissions.php │ ├── 2023_05_05_052255_simplify_user_base_album.php │ ├── 2023_05_05_052256_simplify_base_album.php │ ├── 2023_05_05_052257_create_access_permissions_for_smart_albums.php │ ├── 2023_05_05_123230_bump_version040800.php │ ├── 2023_05_15_081406_bump_version040801.php │ ├── 2023_05_15_211448_remove_is_public_album_sorting.php │ ├── 2023_05_18_103903_bump_version040900.php │ ├── 2023_05_19_131139_bump_version040901.php │ ├── 2023_05_21_225616_bump_version040902.php │ ├── 2023_06_20_174639_bump_version040903.php │ ├── 2023_06_24_161541_add_indexes.php │ ├── 2023_06_28_144440_bump_version040904.php │ ├── 2023_07_07_143908_add_ratio_size_variants.php │ ├── 2023_07_16_110146_bump_version041000.php │ ├── 2023_08_07_182802_add_config_ffmpeg_path.php │ ├── 2023_08_11_134652_bump_version041100.php │ ├── 2023_09_03_124836_bump_version041101.php │ ├── 2023_09_16_070405_refactor_type_layout.php │ ├── 2023_09_16_074731_bump_version041200.php │ ├── 2023_09_16_234050_require_single_key_in_config.php │ ├── 2023_09_23_204910_bump_version041300.php │ ├── 2023_09_24_110932_add_date_display_configurations.php │ ├── 2023_09_24_223901_add_config_livewire_chunk_size.php │ ├── 2023_09_24_233717_refactor_type_layout_livewire.php │ ├── 2023_09_25_123925_config_blur_nsfw.php │ ├── 2023_10_01_143159_config_map_provider.php │ ├── 2023_12_18_191723_config_public_search.php │ ├── 2023_12_18_232500_config_pagination_search_limit.php │ ├── 2023_12_19_115547_search_characters_limit.php │ ├── 2023_12_19_122408_add_positive_requirements.php │ ├── 2023_12_20_180854_add_setting_height_width_gallery.php │ ├── 2023_12_23_160356_bump_version050000.php │ ├── 2023_12_25_115454_add_setting_display_thumb_overlay.php │ ├── 2023_12_27_163004_bump_version050001.php │ ├── 2023_12_28_144906_bump_version050002.php │ ├── 2023_12_28_165358_add_subalbum_sorting_per_album.php │ ├── 2023_12_30_220515_add_thumbs_albums_aspect_ratio.php │ ├── 2023_12_30_221215_add_thumbs_albums_aspect_ratio_per_album.php │ ├── 2024_01_03_154055_add_album_no_header_setting.php │ ├── 2024_01_08_155917_bump_version050003.php │ ├── 2024_01_08_163328_left_right_login_and_back.php │ ├── 2024_01_13_124937_create_oauth_credentials_table.php │ ├── 2024_01_17_101240_bump_version050100.php │ ├── 2024_01_22_121406_bump_version050101.php │ ├── 2024_01_23_190637_bump_version050102.php │ ├── 2024_01_23_192800_remove_is_public_photo_sorting.php │ ├── 2024_01_23_192814_remove_keys_and_column.php │ ├── 2024_01_23_232103_remove_album_id_from_jobhistory.php │ ├── 2024_01_24_063519_job_feedback_options.php │ ├── 2024_02_28_004535_add_header_id_col.php │ ├── 2024_04_06_165355_bump_version050200.php │ ├── 2024_04_09_121410_decrease_noise_diagnostics.php │ ├── 2024_04_14_103639_bump_version050201.php │ ├── 2024_04_19_141432_fix_license.php │ ├── 2024_04_20_132955_bump_version050202.php │ ├── 2024_04_26_201931_add_storate_disk_to_size_variants.php │ ├── 2024_04_28_135546_fix_license_again.php │ ├── 2024_04_28_172241_add_album_copyright.php │ ├── 2024_04_28_191004_bump_version050300.php │ ├── 2024_05_13_175529_config_random_thumb_smart_album.php │ ├── 2024_06_08_093403_primary_key_job_history.php │ ├── 2024_06_08_103842_add_config_display_processing_queue.php │ ├── 2024_06_08_183427_bump_version050301.php │ ├── 2024_06_10_103843_add_login_required_option.php │ ├── 2024_06_11_204410_bump_version050400.php │ ├── 2024_06_17_171051_disable_per_smart_album_config.php │ ├── 2024_06_17_172448_remove_global_disable_smart_albums.php │ ├── 2024_06_21_154247_create_user_if_not_exists_on_oauth.php │ ├── 2024_06_23_201042_enforce_login_on_gallery_only.php │ ├── 2024_06_25_153527_bump_version050500.php │ ├── 2024_07_01_231053_path_for_exiftool.php │ ├── 2024_07_03_170506_bump_version050501.php │ ├── 2024_07_06_214241_thumb_min_max_take_date_order.php │ ├── 2024_07_12_183751_add_auto_play_config.php │ ├── 2024_07_26_120007_simplify_config.php │ ├── 2024_07_29_172018_fix_settings.php │ ├── 2024_08_09_205532_white_theme.php │ ├── 2024_08_15_163203_config_low_quality_image_placeholder.php │ ├── 2024_08_31_090626_config_help_popup.php │ ├── 2024_08_31_090740_fix_description_always_hover_hidden_photo.php │ ├── 2024_09_14_143949_add_settings_level.php │ ├── 2024_09_14_153948_fix_more_descriptions.php │ ├── 2024_09_27_144741_add_supporter_fields.php │ ├── 2024_10_05_125328_add_slideshow_timeout.php │ ├── 2024_10_05_125833_lang_is_admin_setting.php │ ├── 2024_10_05_184315_bump_version060000.php │ ├── 2024_10_09_191528_image_processing_backup.php │ ├── 2024_10_09_194010_image_processing_details_and_others.php │ ├── 2024_10_10_101333_set_dropbox_disabled.php │ ├── 2024_10_11_173054_add_space_quota_per_user.php │ ├── 2024_10_11_173106_add_space_quota_configuration.php │ ├── 2024_10_13_134419_oath_group_to_users.php │ ├── 2024_10_14_104644_show_nsfw_in_smart_albums.php │ ├── 2024_10_14_104823_refine_text_enable_unsorted_smart_album.php │ ├── 2024_10_20_125449_move-socials-to-footer.php │ ├── 2024_10_20_173904_add_photo_layout_per_album.php │ ├── 2024_10_23_222857_change_header.php │ ├── 2024_10_23_225332_warning_html_content.php │ ├── 2024_10_29_184020_bump_version060001.php │ ├── 2024_10_30_064336_timeline_options.php │ ├── 2024_11_10_171126_timeline_in_albums.php │ ├── 2024_11_11_141241_remove_config_hide_nsfw_in_smart_albums_and_search.php │ ├── 2024_11_11_141334_add_hide_nsfw_smart_search_config.php │ ├── 2024_11_25_211912_bump_version060100.php │ ├── 2024_11_26_125145_improve_info_timeline.php │ ├── 2024_11_26_131136_bump_version060101.php │ ├── 2024_11_27_085119_bump_version060102.php │ ├── 2024_12_03_221445_set_number_icons_mobile.php │ ├── 2024_12_16_132422_bump_version060200.php │ ├── 2024_12_28_190150_caching_config.php │ ├── 2025_01_24_200235_add_initial_taken_at.php │ ├── 2025_01_25_210255_update_access_permissions_with_groups.php │ ├── 2025_02_02_220404_config_punch_card.php │ ├── 2025_02_06_181434_bump_version060300.php │ ├── 2025_02_15_090409_bump_version060301.php │ ├── 2025_02_16_214804_bump_version060302.php │ ├── 2025_02_17_073346_add_config_generation_bounds.php │ ├── 2025_02_17_075553_add_disable_recursive_permission_check.php │ ├── 2025_02_17_080713_more_privacy_options.php │ ├── 2025_02_21_105541_bump_version060303.php │ ├── 2025_02_27_172817_bump_version060304.php │ ├── 2025_03_01_154728_search_pagination_limit_reduction.php │ ├── 2025_03_16_100923_add-note-mod-frame.php │ ├── 2025_03_19_122649_bump_version060305.php │ ├── 2025_03_20_173343_create_config_categories_table.php │ ├── 2025_03_20_194811_set_expert_option.php │ ├── 2025_03_20_200832_expert_all_settings_options.php │ ├── 2025_03_20_214811_move_configs.php │ ├── 2025_03_23_105010_config_favourite.php │ ├── 2025_03_23_154340_bump_version060400.php │ ├── 2025_03_23_185517_bump_version060401.php │ ├── 2025_03_31_151648_create_new_category.php │ ├── 2025_03_31_160547_limit_download_options.php │ ├── 2025_04_04_075837_bump_version060402.php │ ├── 2025_04_05_121647_drop-symbolic-links.php │ ├── 2025_04_05_153533_add_secure_link_options.php │ ├── 2025_04_06_200147_portrait_landscape_landing_background.php │ ├── 2025_04_06_200737_remove_landing_background.php │ ├── 2025_04_07_211142_create_live_metrics_table.php │ ├── 2025_04_07_211144_add_stats_columns.php │ ├── 2025_04_07_211147_metrics_config.php │ ├── 2025_04_20_143503_bump_version060500.php │ ├── 2025_04_21_150310_bump_version060501.php │ ├── 2025_04_21_185527_config_description_thumbs.php │ ├── 2025_04_24_082940_bump_version060502.php │ ├── 2025_04_27_153213_fix-stats-missing.php │ ├── 2025_04_27_154319_bump_version060503.php │ ├── 2025_04_30_211901_bump_version060600.php │ ├── 2025_05_12_092724_bump_version060601.php │ ├── 2025_05_15_090030_bump_version060602.php │ ├── 2025_05_15_205936_bump_version060603.php │ ├── 2025_05_17_075632_optional-bigger-left-right-icons.php │ ├── 2025_05_25_100158_bump_version060604.php │ ├── 2025_05_26_221704_bump_version060605.php │ ├── 2025_05_27_081037_drop_legacy_id.php │ ├── 2025_05_27_081505_drop_unjustified_from_config.php │ ├── 2025_05_28_174009_add_visibility_override_smart_album.php │ ├── 2025_05_28_194147_fix_livemetrics_album_id.php │ ├── 2025_05_29_174832_add_slideshow_enabled.php │ ├── 2025_05_29_231404_user_registration_enabled.php │ ├── 2025_05_29_231905_rename_oauth_user_create_settings.php │ ├── 2025_05_30_205853_create_user_groups_table.php │ ├── 2025_05_30_210236_create_users_user_groups.php │ ├── 2025_06_03_201052_create_colours_table.php │ ├── 2025_06_03_201058_create_palettes_table.php │ ├── 2025_06_04_193132_optional_color_extraction.php │ └── TemporaryModels │ │ ├── MovePhotos_Photo.php │ │ ├── NestedSetForAlbums_AlbumModel.php │ │ ├── OptimizeTables.php │ │ └── RefactorAlbumModel_AlbumModel.php └── seeds │ └── DatabaseSeeder.php ├── developer-notes.md ├── docker-compose.yaml ├── docker ├── base │ ├── Dockerfile │ ├── nginx.conf │ └── start.sh └── dev │ └── Dockerfile ├── eslint.config.ts ├── index.php ├── lang ├── ar │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── cz │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── de │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── el │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── en │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── es │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── fr │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── hu │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── it │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── ja │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── nl │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── no │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── pl │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── pt │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── ru │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── sk │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── sv │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── vi │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── zh_CN │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php └── zh_TW │ ├── aspect_ratio.php │ ├── changelogs.php │ ├── diagnostics.php │ ├── dialogs.php │ ├── duplicate-finder.php │ ├── fix-tree.php │ ├── gallery.php │ ├── jobs.php │ ├── landing.php │ ├── left-menu.php │ ├── maintenance.php │ ├── profile.php │ ├── settings.php │ ├── sharing.php │ ├── statistics.php │ ├── toasts.php │ ├── user-groups.php │ └── users.php ├── osv-scanner.toml ├── package-lock.json ├── package.json ├── phpstan-baseline.neon ├── phpstan.neon ├── phpstan └── stubs │ ├── image.stub │ └── imageexception.stub ├── phpunit.ci.xml ├── phpunit.xml ├── public ├── .htaccess ├── .user.ini ├── dist │ ├── cat.webp │ └── fonts │ │ ├── socials.eot │ │ ├── socials.svg │ │ ├── socials.ttf │ │ └── socials.woff ├── favicon.ico ├── fonts │ ├── roboto-v29-300.woff2 │ ├── roboto-v29-400.woff2 │ └── roboto-v29-700.woff2 ├── img │ ├── apple-touch-icon-ipad.png │ ├── apple-touch-icon-iphone-plus.png │ ├── apple-touch-icon-iphone.png │ ├── layers-2x.png │ ├── layers.png │ ├── live-photo-icon.png │ ├── marker-icon-2x.png │ ├── marker-icon.png │ ├── marker-shadow.png │ ├── no_cover.svg │ ├── no_images.svg │ ├── noise.png │ ├── password.svg │ ├── placeholder.png │ ├── play-icon.png │ ├── view-angle-icon-2x.png │ └── view-angle-icon.png ├── index.php ├── installer │ └── assets │ │ ├── css │ │ └── style.css │ │ ├── fonts │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ │ └── img │ │ ├── background.png │ │ └── favicon │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ └── favicon-96x96.png ├── robots.txt ├── storage ├── sym │ └── .gitignore ├── uploads │ ├── import │ │ └── index.html │ ├── medium │ │ └── index.html │ ├── medium2x │ │ └── index.html │ ├── original │ │ └── index.html │ ├── small │ │ └── index.html │ ├── small2x │ │ └── index.html │ ├── thumb │ │ └── index.html │ ├── thumb2x │ │ └── index.html │ └── tracks │ │ └── index.html ├── vendor │ └── log-viewer │ │ ├── app.css │ │ ├── app.js │ │ ├── app.js.LICENSE.txt │ │ ├── img │ │ ├── log-viewer-128.png │ │ ├── log-viewer-32.png │ │ └── log-viewer-64.png │ │ └── mix-manifest.json └── web.config ├── rector.php ├── resources ├── fonts │ ├── roboto-v29-300.woff2 │ ├── roboto-v29-400.woff2 │ ├── roboto-v29-700.woff2 │ ├── socials.eot │ ├── socials.svg │ ├── socials.ttf │ └── socials.woff ├── img │ ├── icons │ │ ├── camera.png │ │ ├── focal.png │ │ ├── iso.png │ │ └── lens.png │ └── noise.png ├── js │ ├── app.ts │ ├── components │ │ ├── diagnostics │ │ │ ├── ConfigurationsDiagnostics.vue │ │ │ ├── ErrorsDiagnostics.vue │ │ │ ├── InfoDiagnostics.vue │ │ │ └── SpaceDiagnostics.vue │ │ ├── drawers │ │ │ ├── AlbumEdit.vue │ │ │ ├── AlbumStatistics.vue │ │ │ ├── LiveMetrics.vue │ │ │ ├── PhotoDetails.vue │ │ │ └── PhotoEdit.vue │ │ ├── footers │ │ │ ├── GalleryFooter.vue │ │ │ └── LandingFooter.vue │ │ ├── forms │ │ │ ├── album │ │ │ │ ├── AlbumCreateDialog.vue │ │ │ │ ├── AlbumCreateShareDialog.vue │ │ │ │ ├── AlbumCreateTagDialog.vue │ │ │ │ ├── AlbumDelete.vue │ │ │ │ ├── AlbumMove.vue │ │ │ │ ├── AlbumProperties.vue │ │ │ │ ├── AlbumShare.vue │ │ │ │ ├── AlbumTransfer.vue │ │ │ │ ├── AlbumVisibility.vue │ │ │ │ ├── ConfirmSharingDialog.vue │ │ │ │ ├── SearchTargetAlbum.vue │ │ │ │ ├── SearchTargetUser.vue │ │ │ │ └── Unlock.vue │ │ │ ├── auth │ │ │ │ └── LoginForm.vue │ │ │ ├── basic │ │ │ │ ├── InputPassword.vue │ │ │ │ ├── InputText.vue │ │ │ │ ├── Password.vue │ │ │ │ └── Textarea.vue │ │ │ ├── gallery-dialogs │ │ │ │ ├── AlbumMergeDialog.vue │ │ │ │ ├── DeleteDialog.vue │ │ │ │ ├── MoveDialog.vue │ │ │ │ └── RenameDialog.vue │ │ │ ├── group │ │ │ │ └── AddUserGroupModal.vue │ │ │ ├── photo │ │ │ │ ├── PhotoCopyDialog.vue │ │ │ │ └── PhotoTagDialog.vue │ │ │ ├── profile │ │ │ │ ├── ApiToken.vue │ │ │ │ ├── SetLogin.vue │ │ │ │ ├── SetOauth.vue │ │ │ │ ├── SetSecondFactor.vue │ │ │ │ └── SetSecondFactorLine.vue │ │ │ ├── search │ │ │ │ └── SearchBox.vue │ │ │ ├── settings │ │ │ │ ├── BoolField.vue │ │ │ │ ├── NumberField.vue │ │ │ │ ├── OldField.vue │ │ │ │ ├── ResetField.vue │ │ │ │ ├── SelectField.vue │ │ │ │ ├── SelectLang.vue │ │ │ │ ├── SelectOptionsField.vue │ │ │ │ ├── SliderField.vue │ │ │ │ ├── StringField.vue │ │ │ │ └── ZipSliderField.vue │ │ │ ├── sharing │ │ │ │ ├── BulkSharingModal.vue │ │ │ │ ├── CreateSharing.vue │ │ │ │ └── ShareLine.vue │ │ │ ├── upload │ │ │ │ ├── DropBoxChooser.vue │ │ │ │ └── UploadingLine.vue │ │ │ └── users │ │ │ │ ├── CreateEditUser.vue │ │ │ │ └── ListUser.vue │ │ ├── gallery │ │ │ ├── albumModule │ │ │ │ ├── AlbumHero.vue │ │ │ │ ├── AlbumPanel.vue │ │ │ │ ├── AlbumThumbPanel.vue │ │ │ │ ├── AlbumThumbPanelList.vue │ │ │ │ ├── PhotoThumbPanel.vue │ │ │ │ ├── PhotoThumbPanelControl.vue │ │ │ │ ├── PhotoThumbPanelList.vue │ │ │ │ ├── SensitiveWarning.vue │ │ │ │ └── thumbs │ │ │ │ │ ├── AlbumThumb.vue │ │ │ │ │ ├── AlbumThumbDecorations.vue │ │ │ │ │ ├── AlbumThumbImage.vue │ │ │ │ │ ├── AlbumThumbOverlay.vue │ │ │ │ │ ├── PhotoThumb.vue │ │ │ │ │ ├── ThumbBadge.vue │ │ │ │ │ └── ThumbFavourite.vue │ │ │ ├── photoModule │ │ │ │ ├── ColourSquare.vue │ │ │ │ ├── Dock.vue │ │ │ │ ├── DockButton.vue │ │ │ │ ├── MapInclude.vue │ │ │ │ ├── NextPrevious.vue │ │ │ │ ├── Overlay.vue │ │ │ │ └── PhotoPanel.vue │ │ │ └── searchModule │ │ │ │ ├── ResultPanel.vue │ │ │ │ └── SearchPanel.vue │ │ ├── headers │ │ │ ├── AlbumHeader.vue │ │ │ ├── AlbumsHeader.vue │ │ │ ├── BackLinkButton.vue │ │ │ ├── OpenLeftMenu.vue │ │ │ ├── PhotoHeader.vue │ │ │ └── SearchHeader.vue │ │ ├── icons │ │ │ ├── MiniIcon.vue │ │ │ ├── PiMiniIcon.vue │ │ │ └── SETag.vue │ │ ├── loading │ │ │ └── LoadingProgress.vue │ │ ├── maintenance │ │ │ ├── DuplicateLine.vue │ │ │ ├── FixTreeLine.vue │ │ │ ├── MaintenanceCleaning.vue │ │ │ ├── MaintenanceDuplicateChecker.vue │ │ │ ├── MaintenanceFilesize.vue │ │ │ ├── MaintenanceFixJobs.vue │ │ │ ├── MaintenanceFixTree.vue │ │ │ ├── MaintenanceFlushCache.vue │ │ │ ├── MaintenanceGenSizevariants.vue │ │ │ ├── MaintenanceMissingPalettes.vue │ │ │ ├── MaintenanceOptimize.vue │ │ │ ├── MaintenanceUpdate.vue │ │ │ ├── StatisticsIntegrity.vue │ │ │ └── mini │ │ │ │ ├── LeftWarn.vue │ │ │ │ └── RightWarn.vue │ │ ├── modals │ │ │ ├── AboutLychee.vue │ │ │ ├── DownloadPhoto.vue │ │ │ ├── DropBox.vue │ │ │ ├── ImportFromLink.vue │ │ │ ├── KeybindingsHelp.vue │ │ │ ├── LoginModal.vue │ │ │ ├── RegisterLychee.vue │ │ │ ├── SessionExpiredReload.vue │ │ │ ├── ShareAlbum.vue │ │ │ ├── UploadPanel.vue │ │ │ └── WebauthnModal.vue │ │ ├── settings │ │ │ ├── AllSettings.vue │ │ │ ├── ConfigGroup.vue │ │ │ ├── ConfirmSave.vue │ │ │ ├── CssJs.vue │ │ │ └── General.vue │ │ └── statistics │ │ │ ├── Activity.vue │ │ │ ├── AlbumsTable.vue │ │ │ ├── PunchCard.vue │ │ │ ├── PunchCardCaption.vue │ │ │ ├── SizeVariantMeter.vue │ │ │ └── TotalCard.vue │ ├── composables │ │ ├── album │ │ │ ├── albumRefresher.ts │ │ │ ├── albumStatistics.ts │ │ │ ├── albumsRefresher.ts │ │ │ ├── photoActions.ts │ │ │ ├── scrollable.ts │ │ │ ├── splitter.ts │ │ │ ├── treeOperations.ts │ │ │ └── uploadEvents.ts │ │ ├── contextMenus │ │ │ ├── contextMenu.ts │ │ │ ├── contextMenuAlbumAdd.ts │ │ │ ├── contextMenuAlbumsAdd.ts │ │ │ └── leftMenu.ts │ │ ├── modalsTriggers │ │ │ └── galleryModals.ts │ │ ├── photo │ │ │ ├── basePhoto.ts │ │ │ ├── getNextPreviousPhoto.ts │ │ │ ├── hasNextPreviousPhoto.ts │ │ │ ├── hasRefresher.ts │ │ │ ├── photoRoute.ts │ │ │ └── slideshow.ts │ │ ├── preview │ │ │ └── getPreviewInfo.ts │ │ ├── search │ │ │ ├── searchComputed.ts │ │ │ └── searchRefresher.ts │ │ └── selections │ │ │ └── selections.ts │ ├── config │ │ ├── axios-config.ts │ │ ├── constants.ts │ │ └── csrf-getter.ts │ ├── layouts │ │ ├── PhotoLayout.ts │ │ ├── getWidth.ts │ │ ├── types.d.ts │ │ ├── useGrid.ts │ │ ├── useJustify.ts │ │ ├── useMasonry.ts │ │ └── useSquare.ts │ ├── lychee.d.ts │ ├── menus │ │ └── LeftMenu.vue │ ├── router │ │ └── routes.ts │ ├── services │ │ ├── album-service.ts │ │ ├── auth-service.ts │ │ ├── constants.ts │ │ ├── diagnostics-service.ts │ │ ├── init-service.ts │ │ ├── jobs-service.ts │ │ ├── maintenance-service.ts │ │ ├── metrics-service.ts │ │ ├── oauth-service.ts │ │ ├── photo-service.ts │ │ ├── profile-service.ts │ │ ├── search-service.ts │ │ ├── settings-service.ts │ │ ├── sharing-service.ts │ │ ├── sidebar-map.ts │ │ ├── statistics-service.ts │ │ ├── upload-service.ts │ │ ├── user-group-service.ts │ │ ├── user-management-service.ts │ │ ├── users-service.ts │ │ └── webauthn-service.ts │ ├── shims-vue.d.ts │ ├── stores │ │ ├── Auth.ts │ │ ├── FavouriteState.ts │ │ ├── LeftMenuState.ts │ │ ├── LycheeState.ts │ │ └── ModalsState.ts │ ├── style │ │ ├── preset-full.ts │ │ └── preset.ts │ ├── utils │ │ ├── Helpers.ts │ │ ├── StatsSizeVariantToColours.ts │ │ └── keybindings-utils.ts │ ├── vendor │ │ └── webauthn │ │ │ └── webauthn.ts │ ├── views │ │ ├── App.vue │ │ ├── ChangeLogs.vue │ │ ├── Diagnostics.vue │ │ ├── DuplicatesFinder.vue │ │ ├── Error.vue │ │ ├── FixTree.vue │ │ ├── Jobs.vue │ │ ├── Landing.vue │ │ ├── LoginPage.vue │ │ ├── Maintenance.vue │ │ ├── Permissions.vue │ │ ├── Profile.vue │ │ ├── RegisterPage.vue │ │ ├── Settings.vue │ │ ├── Sharing.vue │ │ ├── Statistics.vue │ │ ├── UserGroups.vue │ │ ├── Users.vue │ │ └── gallery-panels │ │ │ ├── Album.vue │ │ │ ├── Albums.vue │ │ │ ├── Favourites.vue │ │ │ ├── Frame.vue │ │ │ ├── Map.vue │ │ │ └── Search.vue │ └── vite-env.d.ts ├── sass │ ├── app.css │ └── fonts.css └── views │ ├── components │ ├── meta.blade.php │ └── warning-misconfiguration.blade.php │ ├── emails │ └── photos-added.blade.php │ ├── error │ ├── error.blade.php │ └── v1-is-dead.blade.php │ ├── health-up.blade.php │ ├── includes │ ├── footer.blade.php │ └── svg.blade.php │ ├── install │ ├── env.blade.php │ ├── migrate.blade.php │ ├── permissions.blade.php │ ├── requirements.blade.php │ ├── setup-admin.blade.php │ ├── setup-success.blade.php │ ├── view.blade.php │ └── welcome.blade.php │ ├── update │ ├── error.blade.php │ └── results.blade.php │ ├── vendor │ ├── feed │ │ ├── atom.blade.php │ │ ├── json.blade.php │ │ ├── links.blade.php │ │ └── rss.blade.php │ ├── log-viewer │ │ ├── .gitkeep │ │ └── index.blade.php │ └── mail │ │ └── html │ │ └── themes │ │ └── default.css │ └── vueapp.blade.php ├── routes ├── api_v2.php ├── web-admin-v2.php ├── web-install.php └── web_v2.php ├── scripts ├── Rector │ └── VariableCasingRector.php ├── delete_legacy.sh ├── gen_release.php ├── install_files.php ├── post-merge └── pre-commit ├── simple_error_template.html ├── sonar-project.properties ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── bootstrap │ └── cache │ │ └── .gitignore ├── debugbar │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore ├── logs │ └── .gitignore └── tmp │ ├── extract │ └── .gitignore │ ├── jobs │ └── .gitignore │ └── uploads │ └── .gitignore ├── tsconfig.json ├── version.md ├── vite.config.ts └── vite └── index.html /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = false 7 | indent_style = tab 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [composer.json] 12 | indent_style = space 13 | indent_size = 4 14 | trim_trailing_whitespace = true 15 | 16 | 17 | [*.md] 18 | trim_trailing_whitespace = false 19 | 20 | [*.js] 21 | indent_style = tab 22 | indent_size = 4 23 | 24 | [*.yml] 25 | indent_style = space 26 | indent_size = 2 27 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | public/dist/**/* binary 6 | public/dist/*.js binary 7 | public/dist/*.css binary 8 | CHANGELOG.md export-ignore 9 | tests/ export-ignore 10 | docs/ export-ignore 11 | -------------------------------------------------------------------------------- /.github/DISCUSSION_TEMPLATE/ideas.yml: -------------------------------------------------------------------------------- 1 | body: 2 | - type: markdown 3 | attributes: 4 | value: | 5 | Suggest an idea for this project. :) 6 | 7 | Valid ideas will be converted into proper issues to track their advancement. 8 | 9 | - type: textarea 10 | attributes: 11 | label: Enhancement 12 | description: Explain in a few words which functionality or improvements you would like to see in Lychee. 13 | validations: 14 | required: true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: I think I found a bug! 4 | url: https://github.com/LycheeOrg/Lychee/discussions/new?category=bugs 5 | about: Please submit your a bug here. 6 | - name: I have an idea/suggestion. 7 | url: https://github.com/LycheeOrg/Lychee/discussions/new?category=ideas 8 | about: Please submit your ideas here. 9 | - name: I have a question. 10 | url: https://github.com/LycheeOrg/Lychee/discussions/new?category=q-a 11 | about: Please ask and answer questions here. 12 | -------------------------------------------------------------------------------- /.github/build/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /.github/release.yml: -------------------------------------------------------------------------------- 1 | changelog: 2 | exclude: 3 | labels: 4 | - ignore-for-release 5 | authors: 6 | - octocat 7 | - dependabot 8 | categories: 9 | - title: 🏕 Features 10 | labels: 11 | - '*' 12 | exclude: 13 | labels: 14 | - dependencies 15 | - title: 👒 Dependencies 16 | labels: 17 | - dependencies 18 | -------------------------------------------------------------------------------- /.github/workflows/.env.mariadb: -------------------------------------------------------------------------------- 1 | APP_NAME=Lychee 2 | APP_URL=https://localhost 3 | APP_ENV=dev 4 | APP_KEY=SomeRandomString 5 | APP_DEBUG=true 6 | VUEJS_ENABLED=true 7 | LEGACY_API_ENABLED=false 8 | 9 | DB_CONNECTION=mysql 10 | DB_HOST=localhost 11 | DB_PORT=3306 12 | DB_DATABASE=homestead_test 13 | DB_USERNAME=root 14 | DB_PASSWORD=root 15 | DB_LIST_FOREIGN_KEYS=true 16 | 17 | CACHE_DRIVER=array 18 | SESSION_DRIVER=array 19 | QUEUE_CONNECTION=sync 20 | 21 | PHOTO_PIPES=true 22 | -------------------------------------------------------------------------------- /.github/workflows/.env.postgresql: -------------------------------------------------------------------------------- 1 | APP_NAME=Lychee 2 | APP_URL=https://localhost 3 | APP_ENV=dev 4 | APP_KEY=SomeRandomString 5 | APP_DEBUG=true 6 | VUEJS_ENABLED=true 7 | LEGACY_API_ENABLED=false 8 | 9 | DB_CONNECTION=pgsql 10 | DB_HOST=localhost 11 | DB_PORT=5432 12 | DB_DATABASE=postgres 13 | DB_USERNAME=postgres 14 | DB_PASSWORD=postgres 15 | 16 | CACHE_DRIVER=array 17 | SESSION_DRIVER=array 18 | QUEUE_CONNECTION=sync 19 | -------------------------------------------------------------------------------- /.github/workflows/.env.sqlite: -------------------------------------------------------------------------------- 1 | APP_NAME=Lychee 2 | APP_URL=https://localhost 3 | APP_ENV=dev 4 | APP_KEY=SomeRandomString 5 | APP_DEBUG=true 6 | VUEJS_ENABLED=true 7 | LEGACY_API_ENABLED=false 8 | 9 | DB_CONNECTION=sqlite 10 | DB_LIST_FOREIGN_KEYS=true 11 | 12 | CACHE_DRIVER=array 13 | SESSION_DRIVER=array 14 | QUEUE_CONNECTION=sync 15 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "public/Lychee-front"] 2 | path = public/Lychee-front 3 | url = ../Lychee-front 4 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/prettierrc", 3 | "semi": true, 4 | "printWidth": 150 5 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "Vue.volar", 4 | "vitest.explorer", 5 | "dbaeumer.vscode-eslint", 6 | "EditorConfig.EditorConfig", 7 | "esbenp.prettier-vscode", 8 | "mikestead.dotenv", 9 | "bradlc.vscode-tailwindcss", 10 | "aaron-bond.better-comments", 11 | "github.vscode-pull-request-github" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /Banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/Banner.png -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | [See on the LycheeOrg website: https://lycheeorg.dev/docs/contributions.html](https://lycheeorg.dev/docs/contributions.html) 2 | -------------------------------------------------------------------------------- /app/Actions/Album/Archive32.php: -------------------------------------------------------------------------------- 1 | throwNotFound($path); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Actions/InstallUpdate/Pipes/Spacer.php: -------------------------------------------------------------------------------- 1 | where('created_at', '<=', now()->subDays($num_days))->delete(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Actions/Photo/Archive32.php: -------------------------------------------------------------------------------- 1 | replicatePhoto(); 19 | 20 | return $next($state); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Actions/Photo/Pipes/PhotoPartner/DeleteOldVideoPartner.php: -------------------------------------------------------------------------------- 1 | old_video->delete(); 19 | 20 | return $next($state); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Actions/Photo/Pipes/Shared/Save.php: -------------------------------------------------------------------------------- 1 | getPhoto()->save(); 22 | 23 | return $next($state); 24 | } 25 | } -------------------------------------------------------------------------------- /app/Constants/FileSystem.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | public function albums(): Collection; 22 | } 23 | -------------------------------------------------------------------------------- /app/Contracts/Http/Requests/HasBaseAlbum.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | public function configs(): Collection; 20 | } 21 | -------------------------------------------------------------------------------- /app/Contracts/Http/Requests/HasCopyright.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | public function photos(): Collection; 20 | } 21 | -------------------------------------------------------------------------------- /app/Contracts/Http/Requests/HasQuotaKB.php: -------------------------------------------------------------------------------- 1 | height > 0 ? $this->width / $this->height : 0; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Enum/AlbumDecorationOrientation.php: -------------------------------------------------------------------------------- 1 | getCode() : 0, $previous); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Exceptions/Internal/LycheeInvalidArgumentException.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | protected $except = [ 21 | 'password', 22 | 'password_confirmation', 23 | ]; 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Metrics/MetricsRequest.php: -------------------------------------------------------------------------------- 1 | album; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasAccessPermissionResourceTrait.php: -------------------------------------------------------------------------------- 1 | perm_resource; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasAccessPermissionTrait.php: -------------------------------------------------------------------------------- 1 | perm; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasAlbumIdsTrait.php: -------------------------------------------------------------------------------- 1 | album_ids; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasAlbumTrait.php: -------------------------------------------------------------------------------- 1 | album; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasAspectRatioTrait.php: -------------------------------------------------------------------------------- 1 | aspect_ratio; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasBaseAlbumTrait.php: -------------------------------------------------------------------------------- 1 | album; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasCompactBooleanTrait.php: -------------------------------------------------------------------------------- 1 | is_compact; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasCopyrightTrait.php: -------------------------------------------------------------------------------- 1 | copyright; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasDescriptionTrait.php: -------------------------------------------------------------------------------- 1 | description; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasEmailTrait.php: -------------------------------------------------------------------------------- 1 | email; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasFromIdTrait.php: -------------------------------------------------------------------------------- 1 | from_id; 21 | } 22 | } -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasLicenseTrait.php: -------------------------------------------------------------------------------- 1 | license; 23 | } 24 | } -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasNameTrait.php: -------------------------------------------------------------------------------- 1 | name; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasNoteTrait.php: -------------------------------------------------------------------------------- 1 | note; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasOwnerIdTrait.php: -------------------------------------------------------------------------------- 1 | owner_id; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasParentAlbumTrait.php: -------------------------------------------------------------------------------- 1 | parent_album; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasPhotoIdsTrait.php: -------------------------------------------------------------------------------- 1 | photo_ids; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasPhotoLayoutTrait.php: -------------------------------------------------------------------------------- 1 | photo_layout; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasPhotoTrait.php: -------------------------------------------------------------------------------- 1 | photo; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasPhotosTrait.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | protected Collection $photos; 20 | 21 | /** 22 | * @return Collection 23 | */ 24 | public function photos(): Collection 25 | { 26 | return $this->photos; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasQuotaKBTrait.php: -------------------------------------------------------------------------------- 1 | quota_kb; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasRoleTrait.php: -------------------------------------------------------------------------------- 1 | role; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasSizeVariantTrait.php: -------------------------------------------------------------------------------- 1 | size_variant; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasTagAlbumTrait.php: -------------------------------------------------------------------------------- 1 | album; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasTagsTrait.php: -------------------------------------------------------------------------------- 1 | tags; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasTakenAtDateTrait.php: -------------------------------------------------------------------------------- 1 | taken_at; 23 | } 24 | } -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasTermsTrait.php: -------------------------------------------------------------------------------- 1 | terms; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasTimelineAlbumTrait.php: -------------------------------------------------------------------------------- 1 | album_timeline; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasTimelinePhotoTrait.php: -------------------------------------------------------------------------------- 1 | photo_timeline; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasTitleTrait.php: -------------------------------------------------------------------------------- 1 | title; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasUploadDateTrait.php: -------------------------------------------------------------------------------- 1 | upload_date; 23 | } 24 | } -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasUserGroupTrait.php: -------------------------------------------------------------------------------- 1 | user_group; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasUserIdsTrait.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | protected array $user_ids = []; 17 | 18 | /** 19 | * @return array 20 | */ 21 | public function userIds(): array 22 | { 23 | return $this->user_ids; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Requests/Traits/HasUsernameTrait.php: -------------------------------------------------------------------------------- 1 | username; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Requests/WebAuthn/ListCredentialsRequest.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class AccessPermissionBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/BaseAlbumImplBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class BaseAlbumImplBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/ConfigCategoryBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class ConfigCategoryBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/ConfigsBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class ConfigsBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/JobHistoryBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class JobHistoryBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/LiveMetricsBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class LiveMetricsBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/OauthCredentialBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class OauthCredentialBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/PhotoBuilder.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | class PhotoBuilder extends FixedQueryBuilder 21 | { 22 | } -------------------------------------------------------------------------------- /app/Models/Builders/SizeVariantBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class SizeVariantBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/StatisticsBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class StatisticsBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/UserBuilder.php: -------------------------------------------------------------------------------- 1 | 20 | */ 21 | class UserBuilder extends FixedQueryBuilder 22 | { 23 | } -------------------------------------------------------------------------------- /app/Models/Builders/UserGroupBuilder.php: -------------------------------------------------------------------------------- 1 | 17 | */ 18 | class UserGroupBuilder extends FixedQueryBuilder 19 | { 20 | } -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | foreign_method_name; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Rules/CopyrightRule.php: -------------------------------------------------------------------------------- 1 | 10. 13 | */ 14 | trait ValidateTrait 15 | { 16 | /** 17 | * {@inheritDoc} 18 | */ 19 | public function validate(string $attribute, mixed $value, \Closure $fail): void 20 | { 21 | if (!$this->passes($attribute, $value)) { 22 | $fail($this->message()); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /bootstrap/cache: -------------------------------------------------------------------------------- 1 | ../storage/bootstrap/cache -------------------------------------------------------------------------------- /composer-cache/.gitignore: -------------------------------------------------------------------------------- 1 | *.* 2 | .* 3 | -------------------------------------------------------------------------------- /config/urls.php: -------------------------------------------------------------------------------- 1 | [ 5 | // we need this in case the URL of the project changes 6 | 'git' => [ 7 | 'commits' => 'https://api.github.com/repos/LycheeOrg/Lychee/commits', 8 | 'tags' => 'https://api.github.com/repos/LycheeOrg/Lychee/tags', 9 | ], 10 | 'json' => 'https://lycheeorg.dev/update.json', 11 | 'changelogs' => 'https://raw.githubusercontent.com/LycheeOrg/LycheeOrg.github.io/refs/heads/master/docs/releases.md', 12 | ], 13 | 'git' => [ 14 | 'pull' => 'https://github.com/LycheeOrg/Lychee.git', 15 | ], 16 | ]; -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /database/factories/UserGroupFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->unique()->word(), 22 | 'description' => $this->faker->sentence(), 23 | ]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /database/migrations/2019_10_06_152017_add_force_32bit_ids.php: -------------------------------------------------------------------------------- 1 | 'force_32bit_ids', 17 | 'value' => '0', 18 | 'confidentiality' => '0', 19 | 'cat' => 'config', 20 | 'type_range' => self::BOOL, 21 | 'description' => '', 22 | ], 23 | ]; 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /database/migrations/2019_12_02_2100_config_exiftool.php: -------------------------------------------------------------------------------- 1 | 'has_exiftool', 17 | 'value' => '', 18 | 'confidentiality' => '2', 19 | 'cat' => 'Image Processing', 20 | 'type_range' => self::BOOL, 21 | 'description' => '', 22 | ], 23 | ]; 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /database/migrations/2020_01_28_133201_composer_update.php: -------------------------------------------------------------------------------- 1 | 'apply_composer_update', 17 | 'value' => '0', 18 | 'confidentiality' => '3', 19 | 'cat' => 'Admin', 20 | 'type_range' => self::BOOL, 21 | 'description' => '', 22 | ], 23 | ]; 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /database/migrations/2020_10_15_104504_add_log_max_num_line.php: -------------------------------------------------------------------------------- 1 | 'log_max_num_line', 17 | 'value' => '1000', 18 | 'confidentiality' => '2', 19 | 'cat' => 'Admin', 20 | 'type_range' => self::INT, 21 | 'description' => '', 22 | ], 23 | ]; 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /docker/base/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Start PHP-FPM 4 | php-fpm8.4 -D 5 | 6 | # Start Nginx in the foreground 7 | exec nginx -------------------------------------------------------------------------------- /docker/dev/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM lychee-base:latest AS base 2 | 3 | # Install development dependencies 4 | 5 | RUN \ 6 | curl -fsSL https://deb.nodesource.com/setup_23.x -o nodesource_setup.sh \ 7 | && bash nodesource_setup.sh \ 8 | && apt-get install -y git composer nodejs 9 | 10 | RUN \ 11 | rm -rf /var/lib/apt/lists/* \ 12 | && apt-get clean -qy -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | root(); -------------------------------------------------------------------------------- /lang/ar/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (منظر أفقي على إنستغرام)', 10 | '4by5' => '4/5 (منظر عمودي على إنستغرام)', 11 | '2by3' => '2/3 (عمودي)', 12 | '3by2' => '3/2 (أفقي)', 13 | '1by1' => 'مربع', 14 | '1byx9' => '16/9 (أفقي)', 15 | ]; -------------------------------------------------------------------------------- /lang/ar/changelogs.php: -------------------------------------------------------------------------------- 1 | 'سجل التغييرات', 10 | 'description' => 'تحتوي هذه الصفحة على سجل التغييرات حتى أحدث إصدار متاح من Lychee. يتم عرض جميع التغييرات وليس فقط تلك المتعلقة بالإصدار المثبت لديك. نهدف من ذلك إلى تقديم نظرة شاملة لما يمكن توقعه عند الترقية.', 11 | ]; -------------------------------------------------------------------------------- /lang/ar/jobs.php: -------------------------------------------------------------------------------- 1 | 'الوظائف', 10 | 11 | 'no_data' => 'لم يتم تنفيذ أي وظائف حتى الآن.', 12 | 13 | 'ready' => 'جاهز', 14 | 'success' => 'نجاح', 15 | 'failure' => 'فشل', 16 | 'started' => 'بدأ', 17 | ]; -------------------------------------------------------------------------------- /lang/ar/landing.php: -------------------------------------------------------------------------------- 1 | 'المعرض', 10 | 'access_gallery' => 'الوصول إلى المعرض', 11 | 'Powered_by_Lychee' => 'مدعوم من Lychee', 12 | 'copyright' => 'جميع الصور على هذا الموقع تخضع لحقوق النشر بواسطة %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/ar/toasts.php: -------------------------------------------------------------------------------- 1 | 'خطأ', 10 | 'success' => 'نجاح', 11 | ]; -------------------------------------------------------------------------------- /lang/cz/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/cz/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/cz/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/cz/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/cz/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/de/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram Querformat)', 10 | '4by5' => '4/5 (instagram Portrait)', 11 | '2by3' => '2/3 (Portrait)', 12 | '3by2' => '3/2 (Querformat)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (Querformat)', 15 | ]; 16 | -------------------------------------------------------------------------------- /lang/de/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 9 | 'description' => 'Diese Seite enthält die Changelogs bis zur letzten verfügbaren Version von Lychee. Sie ist bewusst nicht auf die Änderungen an Ihrer installierten Version beschränkt. Damit wollen wir Ihnen einen besseren Überblick darüber verschaffen, was Sie erwartet, wenn Sie sich für ein Upgrade entscheiden.', 10 | ]; 11 | -------------------------------------------------------------------------------- /lang/de/jobs.php: -------------------------------------------------------------------------------- 1 | 'Aufträge', 9 | 'no_data' => 'Es wurden noch keine Aufträge ausgeführt.', 10 | 'ready' => 'Fertig', 11 | 'success' => 'Erfolgreich', 12 | 'failure' => 'Fehlgeschlagen', 13 | 'started' => 'Gestartet', 14 | ]; 15 | -------------------------------------------------------------------------------- /lang/de/landing.php: -------------------------------------------------------------------------------- 1 | 'Galerie', 9 | 'access_gallery' => 'Zugang zur Galerie', 10 | 'Powered_by_Lychee' => 'Powered by Lychee', 11 | 'copyright' => 'Alle Bilder auf dieser Website unterliegen dem Copyright von %1$s © %2$s', 12 | ]; 13 | -------------------------------------------------------------------------------- /lang/de/toasts.php: -------------------------------------------------------------------------------- 1 | 'Fehler', 9 | 'success' => 'Erfolgreich', 10 | ]; 11 | -------------------------------------------------------------------------------- /lang/el/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/el/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/el/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/el/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/el/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/en/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/en/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/en/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/en/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/en/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/es/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/es/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/es/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/es/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/es/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/fr/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (Instagram paysage)', 10 | '4by5' => '4/5 (Instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (paysage)', 13 | '1by1' => 'Carré', 14 | '1byx9' => '16/9 (paysage)', 15 | ]; -------------------------------------------------------------------------------- /lang/fr/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Historique des changements', 10 | 'description' => 'Cette page contient l\'historique des changements jusqu’à la dernière version disponible de Lychee et non pas jusqu’à votre version actuelle. Ainsi, nous vous donnons une meilleure visibilité sur ce qui vient dans les future mise a jour si vous décidez de les appliquer.', 11 | ]; 12 | -------------------------------------------------------------------------------- /lang/fr/jobs.php: -------------------------------------------------------------------------------- 1 | 'Tâches', 10 | 'no_data' => 'Aucune tâche n’a encore été exécutée.', 11 | 'ready' => 'Pret', 12 | 'success' => 'Réussi', 13 | 'failure' => 'Erreur', 14 | 'started' => 'En cours', 15 | ]; 16 | -------------------------------------------------------------------------------- /lang/fr/landing.php: -------------------------------------------------------------------------------- 1 | 'Galerie', 10 | 'access_gallery' => 'Accéder à la galerie', 11 | 'Powered_by_Lychee' => 'Propulsé avec Lychee', 12 | 'copyright' => 'Toutes les images de ce site sont protégées par le droit d’auteur de %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/fr/toasts.php: -------------------------------------------------------------------------------- 1 | 'Erreur', 10 | 'success' => 'Réussi', 11 | ]; 12 | -------------------------------------------------------------------------------- /lang/hu/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/hu/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/hu/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/hu/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/hu/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/it/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/it/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/it/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/it/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/it/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/ja/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (Instagram 横向き)', 10 | '4by5' => '4/5 (Instagram 縦向き)', 11 | '2by3' => '2/3 (縦向き)', 12 | '3by2' => '3/2 (横向き)', 13 | '1by1' => 'スクエア', 14 | '1byx9' => '16/9 (横向き)', 15 | ]; -------------------------------------------------------------------------------- /lang/ja/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/ja/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/ja/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/ja/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/nl/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landschap)', 10 | '4by5' => '4/5 (instagram portret)', 11 | '2by3' => '2/3 (portret)', 12 | '3by2' => '3/2 (landschap)', 13 | '1by1' => 'vierkant', 14 | '1byx9' => '16/9 (landschap)', 15 | ]; -------------------------------------------------------------------------------- /lang/nl/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Wijzigingslogboeken', 10 | 'description' => 'Deze pagina bevat de wijzigingslogboeken tot de laatste beschikbare versie van Lychee. Het is opzettelijk niet beperkt tot de wijzigingen in uw geïnstalleerde versie. Hiermee willen we u een beter overzicht geven van wat u kunt verwachten wanneer u besluit te upgraden.', 11 | ]; -------------------------------------------------------------------------------- /lang/nl/jobs.php: -------------------------------------------------------------------------------- 1 | 'Taken', 10 | 11 | 'no_data' => 'Er zijn nog geen taken uitgevoerd.', 12 | 13 | 'ready' => 'Klaar', 14 | 'success' => 'Succes', 15 | 'failure' => 'Mislukt', 16 | 'started' => 'Gestart', 17 | ]; -------------------------------------------------------------------------------- /lang/nl/landing.php: -------------------------------------------------------------------------------- 1 | 'Galerij', 9 | 'access_gallery' => 'Naar de galerij', 10 | 'Powered_by_Lychee' => 'Powered by Lychee', 11 | 'copyright' => 'Alle afbeeldingen op deze website zijn auteursrechtelijk beschermd door %1$s © %2$s', 12 | ]; 13 | -------------------------------------------------------------------------------- /lang/nl/toasts.php: -------------------------------------------------------------------------------- 1 | 'Fout', 10 | 'success' => 'Succes', 11 | ]; -------------------------------------------------------------------------------- /lang/no/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram horisontal)', 9 | '4by5' => '4/5 (instagram vertikal)', 10 | '2by3' => '2/3 (vertikal)', 11 | '3by2' => '3/2 (horisontal)', 12 | '1by1' => 'kvadrat', 13 | '1byx9' => '16/9 (horisontal)', 14 | ]; 15 | -------------------------------------------------------------------------------- /lang/no/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Endringslogger', 9 | 'description' => 'Denne siden inneholder endringsloggene frem til den nyeste tilgjengelige versjonen av Lychee. Den er ikke begrenset til endringene på den installerte versjonen din. Med dette ønsker vi å gi deg en bedre oversikt over hva du kan forvente når du bestemmer deg for å oppgradere.', 10 | ]; 11 | -------------------------------------------------------------------------------- /lang/no/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/no/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/no/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/pl/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram pejzaż)', 10 | '4by5' => '4/5 (instagram portret)', 11 | '2by3' => '2/3 (portret)', 12 | '3by2' => '3/2 (pejzaż)', 13 | '1by1' => 'kwadrat', 14 | '1byx9' => '16/9 (pejzaż)', 15 | ]; -------------------------------------------------------------------------------- /lang/pl/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/pl/jobs.php: -------------------------------------------------------------------------------- 1 | 'Zadania', 10 | 11 | 'no_data' => 'Żadne zadania nie zostały jeszcze wykonane.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/pl/landing.php: -------------------------------------------------------------------------------- 1 | 'Galeria', 10 | 'access_gallery' => 'Dostęp do galerii', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'Wszystkie obrazy na tej stronie podlegają prawom autorskim %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/pl/toasts.php: -------------------------------------------------------------------------------- 1 | 'Błąd', 10 | 'success' => 'Sukces', 11 | ]; -------------------------------------------------------------------------------- /lang/pt/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/pt/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/pt/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/pt/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/pt/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/ru/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (горизонтальный Instagram)', 10 | '4by5' => '4/5 (вертикальный Instagram)', 11 | '2by3' => '2/3 (портретный)', 12 | '3by2' => '3/2 (ландшафтный)', 13 | '1by1' => 'квадрат', 14 | '1byx9' => '16/9 (ландшафтный)', 15 | ]; -------------------------------------------------------------------------------- /lang/ru/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Последние изменния', 9 | 'description' => 'Эта страница содержит список последних изменений вплоть до последней доступной версии Lychee. Намеренно указаны изменения до последней доступной версии Lychee, а не версии, которая у вас установлена. Таким образом мы хотим показать вам, какие изменения следует ожидать после обновления.', 10 | ]; 11 | -------------------------------------------------------------------------------- /lang/ru/jobs.php: -------------------------------------------------------------------------------- 1 | 'Задачи', 9 | 'no_data' => 'Пока не выполнено ни одного задания.', 10 | 'ready' => 'Готово', 11 | 'success' => 'Успешно', 12 | 'failure' => 'Ошибка', 13 | 'started' => 'Запущено', 14 | ]; 15 | -------------------------------------------------------------------------------- /lang/ru/landing.php: -------------------------------------------------------------------------------- 1 | 'Галерея', 10 | 'access_gallery' => 'Доступ к галерее', 11 | 'Powered_by_Lychee' => 'Размещено с Lychee', 12 | 'copyright' => 'Все изображения на этом сайте защищены авторским правом %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/ru/toasts.php: -------------------------------------------------------------------------------- 1 | 'Ошибка', 10 | 'success' => 'Успешно', 11 | ]; -------------------------------------------------------------------------------- /lang/sk/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/sk/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/sk/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/sk/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/sk/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/sv/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/sv/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/sv/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/sv/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/sv/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/vi/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/vi/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/vi/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/vi/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/vi/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /lang/zh_CN/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5:4 (Instagram横图)', 10 | '4by5' => '4:5 (Instagram竖图)', 11 | '2by3' => '2:3 (竖版)', 12 | '3by2' => '3:2 (横版)', 13 | '1by1' => '1:1 (正方形)', 14 | '1byx9' => '16:9 (宽屏)', 15 | ]; -------------------------------------------------------------------------------- /lang/zh_CN/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/zh_CN/jobs.php: -------------------------------------------------------------------------------- 1 | '任务', 10 | 11 | 'no_data' => '尚未执行任何任务。', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/zh_CN/landing.php: -------------------------------------------------------------------------------- 1 | '相册', 10 | 'access_gallery' => '访问相册', 11 | 'Powered_by_Lychee' => '由 Lychee 提供支持', 12 | 'copyright' => '本网站所有图片版权归 %1$s 所有 © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/zh_CN/toasts.php: -------------------------------------------------------------------------------- 1 | '错误', 10 | 'success' => '成功', 11 | ]; -------------------------------------------------------------------------------- /lang/zh_TW/aspect_ratio.php: -------------------------------------------------------------------------------- 1 | '5/4 (instagram landscape)', 10 | '4by5' => '4/5 (instagram portrait)', 11 | '2by3' => '2/3 (portrait)', 12 | '3by2' => '3/2 (landscape)', 13 | '1by1' => 'square', 14 | '1byx9' => '16/9 (landscape)', 15 | ]; -------------------------------------------------------------------------------- /lang/zh_TW/changelogs.php: -------------------------------------------------------------------------------- 1 | 'Change logs', 10 | 'description' => 'This page contains the changelogs up to the latest available version of Lychee. It is voluntarily not limited to the changes on your installed version. With this, we want to give you a better overview of what to expect when you decide to upgrade.', 11 | ]; -------------------------------------------------------------------------------- /lang/zh_TW/jobs.php: -------------------------------------------------------------------------------- 1 | 'Jobs', 10 | 11 | 'no_data' => 'No Jobs have been executed yet.', 12 | 13 | 'ready' => 'Ready', 14 | 'success' => 'Success', 15 | 'failure' => 'Failure', 16 | 'started' => 'Started', 17 | ]; -------------------------------------------------------------------------------- /lang/zh_TW/landing.php: -------------------------------------------------------------------------------- 1 | 'Gallery', 10 | 'access_gallery' => 'Access the gallery', 11 | 'Powered_by_Lychee' => 'Powered by Lychee', 12 | 'copyright' => 'All images on this website are subject to copyright by %1$s © %2$s', 13 | ]; 14 | -------------------------------------------------------------------------------- /lang/zh_TW/toasts.php: -------------------------------------------------------------------------------- 1 | 'Error', 10 | 'success' => 'Success', 11 | ]; -------------------------------------------------------------------------------- /osv-scanner.toml: -------------------------------------------------------------------------------- 1 | [[IgnoredVulns]] 2 | id = "GHSA-67mh-4wv8-2f99" 3 | reason = "We do not use the esbuild dev server. We use the vite one: see https://github.com/vitejs/vite/pull/19389#issuecomment-2651836759" -------------------------------------------------------------------------------- /phpstan-baseline.neon: -------------------------------------------------------------------------------- 1 | parameters: 2 | ignoreErrors: 3 | -------------------------------------------------------------------------------- /phpstan/stubs/imageexception.stub: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/no_images.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/img/noise.png -------------------------------------------------------------------------------- /public/img/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/img/placeholder.png -------------------------------------------------------------------------------- /public/img/play-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/img/play-icon.png -------------------------------------------------------------------------------- /public/img/view-angle-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/img/view-angle-icon-2x.png -------------------------------------------------------------------------------- /public/img/view-angle-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/img/view-angle-icon.png -------------------------------------------------------------------------------- /public/installer/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/installer/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/installer/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/installer/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/installer/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/installer/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/installer/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/installer/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/installer/assets/img/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/installer/assets/img/background.png -------------------------------------------------------------------------------- /public/installer/assets/img/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/installer/assets/img/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/installer/assets/img/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/installer/assets/img/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/installer/assets/img/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/installer/assets/img/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: Twitterbot 2 | Disallow: 3 | Allow: /uploads/small/ 4 | Allow: /uploads/medium/ 5 | Allow: /uploads/big/ 6 | 7 | User-agent: * 8 | Disallow: /data/ 9 | Disallow: /dist/ 10 | Disallow: /docs/ 11 | Disallow: /img/ 12 | Disallow: /php/ 13 | Disallow: /plugins/ 14 | Disallow: /uploads/ 15 | Disallow: /images/ -------------------------------------------------------------------------------- /public/storage: -------------------------------------------------------------------------------- 1 | ../storage/app/public -------------------------------------------------------------------------------- /public/sym/.gitignore: -------------------------------------------------------------------------------- 1 | *.* 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/uploads/import/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/import/index.html -------------------------------------------------------------------------------- /public/uploads/medium/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/medium/index.html -------------------------------------------------------------------------------- /public/uploads/medium2x/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/medium2x/index.html -------------------------------------------------------------------------------- /public/uploads/original/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/original/index.html -------------------------------------------------------------------------------- /public/uploads/small/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/small/index.html -------------------------------------------------------------------------------- /public/uploads/small2x/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/small2x/index.html -------------------------------------------------------------------------------- /public/uploads/thumb/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/thumb/index.html -------------------------------------------------------------------------------- /public/uploads/thumb2x/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/thumb2x/index.html -------------------------------------------------------------------------------- /public/uploads/tracks/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/uploads/tracks/index.html -------------------------------------------------------------------------------- /public/vendor/log-viewer/img/log-viewer-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/vendor/log-viewer/img/log-viewer-128.png -------------------------------------------------------------------------------- /public/vendor/log-viewer/img/log-viewer-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/vendor/log-viewer/img/log-viewer-32.png -------------------------------------------------------------------------------- /public/vendor/log-viewer/img/log-viewer-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/public/vendor/log-viewer/img/log-viewer-64.png -------------------------------------------------------------------------------- /public/vendor/log-viewer/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/app.js": "/app.js?id=035385b07dcacbe9110f48c4eecdea37", 3 | "/app.css": "/app.css?id=66a27926e151e853bb42c8fe0f587a17", 4 | "/img/log-viewer-128.png": "/img/log-viewer-128.png?id=d576c6d2e16074d3f064e60fe4f35166", 5 | "/img/log-viewer-32.png": "/img/log-viewer-32.png?id=f8ec67d10f996aa8baf00df3b61eea6d", 6 | "/img/log-viewer-64.png": "/img/log-viewer-64.png?id=8902d596fc883ca9eb8105bb683568c6" 7 | } 8 | -------------------------------------------------------------------------------- /resources/fonts/roboto-v29-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/fonts/roboto-v29-300.woff2 -------------------------------------------------------------------------------- /resources/fonts/roboto-v29-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/fonts/roboto-v29-400.woff2 -------------------------------------------------------------------------------- /resources/fonts/roboto-v29-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/fonts/roboto-v29-700.woff2 -------------------------------------------------------------------------------- /resources/fonts/socials.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/fonts/socials.eot -------------------------------------------------------------------------------- /resources/fonts/socials.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/fonts/socials.ttf -------------------------------------------------------------------------------- /resources/fonts/socials.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/fonts/socials.woff -------------------------------------------------------------------------------- /resources/img/icons/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/img/icons/camera.png -------------------------------------------------------------------------------- /resources/img/icons/focal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/img/icons/focal.png -------------------------------------------------------------------------------- /resources/img/icons/iso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/img/icons/iso.png -------------------------------------------------------------------------------- /resources/img/icons/lens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/img/icons/lens.png -------------------------------------------------------------------------------- /resources/img/noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/img/noise.png -------------------------------------------------------------------------------- /resources/js/components/forms/settings/ResetField.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/js/components/headers/OpenLeftMenu.vue: -------------------------------------------------------------------------------- 1 | 4 | 13 | -------------------------------------------------------------------------------- /resources/js/components/icons/MiniIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /resources/js/components/icons/PiMiniIcon.vue: -------------------------------------------------------------------------------- 1 | 7 | 15 | -------------------------------------------------------------------------------- /resources/js/components/icons/SETag.vue: -------------------------------------------------------------------------------- 1 | 4 | 14 | -------------------------------------------------------------------------------- /resources/js/components/maintenance/mini/LeftWarn.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/js/components/maintenance/mini/RightWarn.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/js/composables/photo/hasNextPreviousPhoto.ts: -------------------------------------------------------------------------------- 1 | import { Ref } from "vue"; 2 | 3 | export function useHasNextPreviousPhoto(photo: Ref) { 4 | function hasPrevious(): boolean { 5 | return photo.value?.previous_photo_id !== null; 6 | } 7 | 8 | function hasNext(): boolean { 9 | return photo.value?.next_photo_id !== null; 10 | } 11 | 12 | return { hasPrevious, hasNext }; 13 | } 14 | -------------------------------------------------------------------------------- /resources/js/composables/photo/hasRefresher.ts: -------------------------------------------------------------------------------- 1 | import { Ref } from "vue"; 2 | 3 | export function usePhotoRefresher( 4 | photo: Ref, 5 | photos: Ref, 6 | photoId: Ref, 7 | ) { 8 | function refreshPhoto(): void { 9 | photo.value = photos.value?.find((photo: App.Http.Resources.Models.PhotoResource) => photo.id === photoId.value); 10 | } 11 | 12 | return { refreshPhoto }; 13 | } 14 | -------------------------------------------------------------------------------- /resources/js/layouts/types.d.ts: -------------------------------------------------------------------------------- 1 | export interface ChildNodeWithDataStyle extends ChildNode { 2 | dataset: { width: number; height: number }; 3 | style: { top: string; width: string; height: string; left: string }; 4 | } 5 | 6 | export interface Column { 7 | height: number; 8 | left: number; 9 | } 10 | -------------------------------------------------------------------------------- /resources/js/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.vue"; 2 | -------------------------------------------------------------------------------- /resources/js/stores/LeftMenuState.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from "pinia"; 2 | 3 | export type LeftMenuStateStore = ReturnType; 4 | 5 | export const useLeftMenuStateStore = defineStore("leftmenu-store", { 6 | state: () => ({ 7 | // Togglable 8 | left_menu_open: false, 9 | 10 | // Info needed for the menu to be displayed 11 | initData: undefined as App.Http.Resources.Rights.GlobalRightsResource | undefined, 12 | }), 13 | actions: { 14 | toggleLeftMenu() { 15 | this.left_menu_open = !this.left_menu_open; 16 | }, 17 | }, 18 | }); 19 | -------------------------------------------------------------------------------- /resources/js/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | interface ImportMetaEnv { 2 | readonly VITE_LOCAL_DEV: string; 3 | readonly MODE: "development" | "production"; 4 | } 5 | 6 | interface ImportMeta { 7 | readonly env: ImportMetaEnv; 8 | } 9 | -------------------------------------------------------------------------------- /resources/views/install/setup-success.blade.php: -------------------------------------------------------------------------------- 1 | @extends('install.view') 2 | 3 | @section('admin_step') 4 | active 5 | @endsection 6 | 7 | @section('content') 8 | Admin account has been created. 9 | 14 | @endsection -------------------------------------------------------------------------------- /resources/views/install/welcome.blade.php: -------------------------------------------------------------------------------- 1 | @extends('install.view') 2 | 3 | @section('welcome_step') 4 | active 5 | @endsection 6 | 7 | @section('content') 8 |

Welcome to Lychee

9 |

10 | Next 11 | 12 |

13 | @endsection -------------------------------------------------------------------------------- /resources/views/vendor/feed/links.blade.php: -------------------------------------------------------------------------------- 1 | @foreach($feeds as $name => $feed) 2 | 3 | @endforeach 4 | -------------------------------------------------------------------------------- /resources/views/vendor/log-viewer/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LycheeOrg/Lychee/502b1381a96c183df88fab7bbb6b790c34361653/resources/views/vendor/log-viewer/.gitkeep -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | sonar.projectKey=LycheeOrg_Lychee-Laravel 2 | sonar.organization=lycheeorg 3 | 4 | sonar.php.coverage.reportPaths=clover.xml 5 | sonar.sources=app,resources,routes,lang,config 6 | sonar.tests=tests 7 | sonar.coverage.exclusions=database,tests,lang,config,resources 8 | 9 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/debugbar/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/tmp/extract/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/tmp/jobs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/tmp/uploads/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /version.md: -------------------------------------------------------------------------------- 1 | 6.6.5 --------------------------------------------------------------------------------