/** * {@inheritdoc} */ public function postClear(FeedInterface $feed, StateInterface $state) { $tokens = ['@item' => $this->getItemLabel(), '@items' => $this->getItemLabelPlural(), '%title' => $feed->label()]; if ($state->deleted) { $state->setMessage($this->formatPlural($state->deleted, 'Deleted @count @item from %title.', 'Deleted @count @items from %title.', $tokens)); } else { $state->setMessage($this->t('There are no @items to delete.', $tokens)); } }
/** * {@inheritdoc} */ public function fetch(FeedInterface $feed, StateInterface $state) { $sink = $this->generateSink(); $configuration = $this->getConfiguration(); $yt_state = ['channel_id' => $feed->getSource(), 'api_key' => $configuration['api_key'], 'import_limit' => $configuration['import_limit'], 'page_limit' => $configuration['page_limit'], 'pageToken' => '']; $url = FeedsYoutubeHandler::buildURL($yt_state); $response = $this->get($url, $sink, $this->getCacheKey($feed)); // 304, nothing to see here. if ($response->getStatusCode() == Response::HTTP_NOT_MODIFIED) { $state->setMessage($this->t('The feed has not been updated.')); throw new EmptyFeedException(); } return new HttpFetcherResult($sink, $response->getHeaders()); }
/** * {@inheritdoc} */ public function fetch(FeedInterface $feed, StateInterface $state) { $response = $this->get($feed->getSource(), $this->getCacheKey($feed)); $feed->setSource($response->getEffectiveUrl()); // 304, nothing to see here. if ($response->getStatusCode() == 304) { $state->setMessage($this->t('The feed has not been updated.')); throw new EmptyFeedException(); } // Copy the temp stream to a real file. $download_file = drupal_tempnam('temporary://', 'feeds_http_fetcher'); $dest_stream = Utils::create(fopen($download_file, 'w+')); Utils::copyToStream($response->getBody(), $dest_stream); $response->getBody()->close(); $dest_stream->close(); return new HttpFetcherResult($download_file, $response->getHeaders()); }
/** * {@inheritdoc} */ public function process(FeedInterface $feed, ItemInterface $item, StateInterface $state) { $existing_entity_id = $this->existingEntityId($feed, $item); $skip_existing = $this->configuration['update_existing'] == static::SKIP_EXISTING; // Bulk load existing entities to save on db queries. if ($skip_existing && $existing_entity_id) { return; } // Delay building a new entity until necessary. if ($existing_entity_id) { $entity = $this->storageController->load($existing_entity_id); } $hash = $this->hash($item); $changed = $existing_entity_id && $hash !== $entity->get('feeds_item')->hash; // Do not proceed if the item exists, has not changed, and we're not // forcing the update. if ($existing_entity_id && !$changed && !$this->configuration['skip_hash_check']) { return; } // Build a new entity. if (!$existing_entity_id) { $entity = $this->newEntity($feed); } try { // Set field values. $this->map($feed, $entity, $item); $this->entityValidate($entity); // This will throw an exception on failure. $this->entitySaveAccess($entity); // Set the values that we absolutely need. $entity->get('feeds_item')->target_id = $feed->id(); $entity->get('feeds_item')->hash = $hash; $entity->get('feeds_item')->imported = REQUEST_TIME; // And... Save! We made it. $this->storageController->save($entity); // Track progress. $existing_entity_id ? $state->updated++ : $state->created++; } catch (\Exception $e) { $state->failed++; $state->setMessage($e->getMessage(), 'warning'); } }