mediaPlaceManager = $mediaPlaceManager; $this->setTimeSensitivity(IJob::TIME_INSENSITIVE); $this->setInterval(24 * 3600); } protected function run($argument) { $placeMappingDone = $this->config->getAppValue(Application::APP_ID, 'lastPlaceMappingDone', 'false'); if ($placeMappingDone === 'true') { return; } $users = $this->userManager->search(''); if ($users === []) { return; } $lastMappedUser = $this->config->getAppValue(Application::APP_ID, 'lastPlaceMappedUser', ''); if ($lastMappedUser === '') { $lastMappedUser = $users[array_key_first($users)]->getUID(); } $startTime = null; foreach ($users as $user) { if ($startTime === null) { // Skip all user before lastMappedUser. if ($lastMappedUser !== $user->getUID()) { continue; } $startTime = time(); } // Stop if execution time is more than one hour. if (time() - $startTime > 60 * 60) { return; } $this->scanFilesForUser($user->getUID()); $this->config->setAppValue(Application::APP_ID, 'lastPlaceMappedUser', $user->getUID()); } $this->config->setAppValue(Application::APP_ID, 'lastPlaceMappingDone', 'true'); } private function scanFilesForUser(string $userId): void { $userFolder = $this->rootFolder->getUserFolder($userId); $this->scanFolder($userFolder); } private function scanFolder(Folder $folder): void { // Do not scan share and other moveable mounts. if ($folder->getMountPoint() instanceof IMovableMount) { return; } foreach ($folder->getDirectoryListing() as $node) { if ($node instanceof Folder) { $this->scanFolder($node); continue; } if (!str_starts_with($node->getMimeType(), 'image')) { continue; } $this->mediaPlaceManager->setPlaceForFile($node->getId()); } } }