public function ingest(Media $media, Request $request, ErrorStore $errorStore) { $data = $request->getContent(); if (!isset($data['o:source'])) { $errorStore->addError('o:source', 'No YouTube URL specified'); return; } $uri = new HttpUri($data['o:source']); if (!($uri->isValid() && $uri->isAbsolute())) { $errorStore->addError('o:source', 'Invalid YouTube URL specified'); return; } switch ($uri->getHost()) { case 'www.youtube.com': if ('/watch' !== $uri->getPath()) { $errorStore->addError('o:source', 'Invalid YouTube URL specified, missing "/watch" path'); return; } $query = $uri->getQueryAsArray(); if (!isset($query['v'])) { $errorStore->addError('o:source', 'Invalid YouTube URL specified, missing "v" parameter'); return; } $youtubeId = $query['v']; break; case 'youtu.be': $youtubeId = substr($uri->getPath(), 1); break; default: $errorStore->addError('o:source', 'Invalid YouTube URL specified, not a YouTube URL'); return; } $fileManager = $this->getServiceLocator()->get('Omeka\\File\\Manager'); $file = $this->getServiceLocator()->get('Omeka\\File'); $url = sprintf('http://img.youtube.com/vi/%s/0.jpg', $youtubeId); $this->downloadFile($url, $file->getTempPath()); $hasThumbnails = $fileManager->storeThumbnails($file); $media->setData(['id' => $youtubeId, 'start' => $request->getValue('start'), 'end' => $request->getValue('end')]); if ($hasThumbnails) { $media->setFilename($file->getStorageName()); $media->setHasThumbnails(true); } }
/** * {@inheritDoc} */ public function hydrate(Request $request, EntityInterface $entity, ErrorStore $errorStore) { $data = $request->getContent(); if (Request::CREATE === $request->getOperation()) { // Accept the passed ingester only on CREATE to prevent overwriting // on subsequent UPDATE requests. $ingesterName = $request->getValue('o:ingester'); } else { $ingesterName = $entity->getIngester(); } $ingester = $this->getServiceLocator()->get('Omeka\\MediaIngesterManager')->get($ingesterName); if (Request::CREATE === $request->getOperation()) { if ($ingester instanceof Fallback) { $errorStore->addError('o:ingester', 'Media must set a valid ingester.'); return; } $entity->setIngester($ingesterName); $entity->setRenderer($ingester->getRenderer()); if (isset($data['o:item']['o:id'])) { $item = $this->getAdapter('items')->findEntity($data['o:item']['o:id']); $entity->setItem($item); } if (isset($data['data'])) { $entity->setData($data['data']); } if (isset($data['o:source'])) { $entity->setSource($data['o:source']); } } parent::hydrate($request, $entity, $errorStore); if ($this->shouldHydrate($request, 'o:lang')) { $entity->setLang($request->getValue('o:lang', null)); } if (Request::CREATE === $request->getOperation()) { $ingester->ingest($entity, $request, $errorStore); } elseif ($ingester instanceof MutableIngesterInterface) { $ingester->update($entity, $request, $errorStore); } }