data['entity_id']; if ($entityId === false) { throw new Exception('Bundle creation cancelled'); } $kind = $this->data['kind']; $title = $this->data['title']; $slug = Str::slug($title); $date = now(); $path = sprintf('%s/%s/%s', static::$section, $kind, $slug); $bundle = new Bundle($path, $this->disk); if ($bundle->exists()) { throw new BundleAlreadyExists( sprintf('A bundle already exists in %s', $path) ); } $wikidata = app()->make(WikidataClient::class); $extractor = app()->make(WikidataExtractor::class); $completeEntity = $wikidata->getEntityData($entityId, true)['entities'][$entityId]; $extractor->extract($completeEntity, $entityId); $bundle->metadata('wikidata/included')->setMany($extractor->included()); $bundle->metadata('wikidata/excluded')->setMany($extractor->excluded()); $bundle->metadata('wikidata/unused')->setMany($extractor->unused()); $bundle->metadata('wikidata/entity')->setMany($extractor->everythingElse()); $frenchTitle = $bundle->metadata('wikidata/entity')->get('labels.fr.value', null); $originalTitle = $bundle->metadata('wikidata/entity')->get('labels.en.value', null); if (!empty($originalTitle)) { $bundle->metadata()->set('title', $originalTitle); if (!empty($frenchTitle) && $frenchTitle !== $originalTitle) { $bundle->metadata()->set('subTitle', $frenchTitle); } } $bundle->metadata()->setMany([ 'date' => $date->toIso8601String(), ]); $bundle->markdown()->set(''); $bundle->save(); return $path; } /** * Return a boolean value indicating if the creator can actually make the * bundle using known data. */ public function canCreateBundle(): bool { return !empty($this->data['kind']) && !empty($this->data['title']) && array_key_exists('entity_id', $this->data); } /** * Return an array describing what kind of data the creator needs in * addition to the one it already has */ public function formSpecs(): ?array { $specs = []; if (empty($this->data['kind'])) { $specs['kind'] = fn () => select('Media kind', $this->listKinds()); } if (empty($this->data['title'])) { $specs['title'] = fn () => text('Work title', '', '', true); } if (!empty($this->data['kind']) && !empty($this->data['title']) && empty($this->data['entity_id'])) { $options = app()->make(WikidataClient::class)->searchEntityId($this->data['title']); if (!empty($options)) { $specs['entity_id'] = fn () => select('Confirm searched work', $options); } else { $specs['entity_id'] = fn () => confirm( 'No entityId was found in Wikidata for this work. Do you want to create the bundle anyway?' ); } } return $specs; } /** * Return a boolean value indicating if this creator in particular can * create bundles for specified section */ public static function handles(string $section, ?array $data = []): bool { return $section === static::$section; } private function listKinds() { $bundles = Bundle::findBundles($this->disk, static::$section); $kinds = []; foreach ($bundles as $bundle) { $kinds[basename($bundle->getPath())] = $bundle->metadata()->get('title'); } asort($kinds, SORT_NATURAL); return $kinds; } }