sources['test-source'] = new Source( new SourceId('test-source'), 'Test Source', 'A test source', 'https://example.com', [ 'imageSelector' => 'img.manga-image', 'nextPageSelector' => null, 'chapterUrlFormat' => 'https://example.com/manga/{slug}/chapter-{chapterNumber}', 'scrapingType' => 'html', 'chapterSelector' => '.chapter-item', ], true, new \DateTimeImmutable(), new \DateTimeImmutable() ); } public function getById(string $id): ?Source { return $this->sources[$id] ?? null; } /** * @return Source[] */ public function getAll(): array { return array_values($this->sources); } public function save(Source $source): void { $this->sources[$source->getId()->getValue()] = $source; } public function validateSourcesExist(array $sourceIds): bool { foreach ($sourceIds as $sourceId) { $source = $this->sources[$sourceId] ?? null; if (!$source || !$source->isActive()) { return false; } } return true; } /** * @return Source[] */ public function getByIds(array $sourceIds): array { $sources = []; foreach ($sourceIds as $sourceId) { if (isset($this->sources[$sourceId])) { $sources[] = $this->sources[$sourceId]; } } return $sources; } /** * @return Source[] */ public function getAllActive(): array { return array_filter( array_values($this->sources), fn (Source $source) => $source->isActive() ); } public function clear(): void { $this->sources = []; } }