/** * {@inheritdoc} */ public function load(ObjectManager $manager) { $feedLogReddit = new FeedLog(); $feedLogReddit->setItemsNumber(25); $feedLogReddit->setFeed($this->getReference('feed-reddit')); $manager->persist($feedLogReddit); $this->addReference('feedlog-reddit', $feedLogReddit); $feedLog1HackerNews = new FeedLog(); $feedLog1HackerNews->setItemsNumber(30); $feedLog1HackerNews->setFeed($this->getReference('feed-hackernews')); $manager->persist($feedLog1HackerNews); $this->addReference('feedlog1-hackernews', $feedLog1HackerNews); $feedLogBonjourMadame = new FeedLog(); $feedLogBonjourMadame->setItemsNumber(20); $feedLogBonjourMadame->setFeed($this->getReference('feed-bonjourmadame')); $manager->persist($feedLogBonjourMadame); $this->addReference('feedlog-bonjourmadame', $feedLogBonjourMadame); $feedLog2HackerNews = new FeedLog(); $feedLog2HackerNews->setItemsNumber(3); $feedLog2HackerNews->setFeed($this->getReference('feed-hackernews')); $manager->persist($feedLog2HackerNews); $this->addReference('feedlog2-hackernews', $feedLog2HackerNews); $manager->flush(); }
protected function execute(InputInterface $input, OutputInterface $output) { $lock = new LockHandler($this->getName()); if (!$lock->lock()) { $output->writeLn('<error>The command is already running in another process.</error>'); return 0; } $feeds = array(); $container = $this->getContainer(); $dm = $container->get('doctrine.odm.mongodb.document_manager'); // define host for generating route $context = $container->get('router')->getContext(); $context->setHost($container->getParameter('domain')); $feedRepo = $dm->getRepository('Api43FeedBundle:Feed'); $feedItemRepo = $dm->getRepository('Api43FeedBundle:FeedItem'); $progress = $this->getHelperSet()->get('progress'); // retrieve feed to work on if ($slug = $input->getOption('slug')) { $feed = $feedRepo->findOneBySlug($slug); if (!$feed) { return $output->writeLn('<error>Unable to find Feed document:</error> <comment>' . $slug . '</comment>'); } $feeds = array($feed); } elseif (in_array($input->getOption('age'), array('new', 'old'))) { $feedsWithItems = $feedItemRepo->findAllFeedWithItems(); // retrieve feed that HAVE items if ('old' == $input->getOption('age')) { $feeds = $feedRepo->findByIds($feedsWithItems, 'in'); } // retrieve feeds that DOESN'T have items if ('new' == $input->getOption('age')) { $feeds = $feedRepo->findByIds($feedsWithItems, 'notIn'); } } else { return $output->writeLn('<error>You must add some options to the task :</error> an <comment>age</comment> or a <comment>slug</comment>'); } if ($input->getOption('with-trace')) { $output->writeln('<info>Feeds to check</info>: ' . count($feeds)); } $totalCached = 0; $feedUpdated = array(); foreach ($feeds as $feed) { if ($input->getOption('with-trace')) { $output->writeln('<info>Working on</info>: ' . $feed->getName() . ' (parser: <comment>' . $feed->getParser() . '</comment>)'); } $rssFeed = $container->get('simple_pie_proxy')->setUrl($feed->getLink())->init(); // update feed description, in case it was empty if (0 === strlen($feed->getDescription()) && 0 !== strlen($rssFeed->get_description())) { $feed->setDescription(html_entity_decode($rssFeed->get_description(), ENT_COMPAT, 'UTF-8')); $dm->persist($feed); $dm->flush($feed); } $parser = $container->get('content_extractor')->init($feed->getParser(), $feed, true); $cachedLinks = $feedItemRepo->getAllLinks($feed->getId()); $cached = 0; // show progress bar in trace mode only if ($input->getOption('with-trace')) { $total = $rssFeed->get_item_quantity(); $progress->start($output, $total); } foreach ($rssFeed->get_items() as $item) { // if an item already exists, we skip it // or if the item doesn't have a link, we won't cache it - will be useless if (isset($cachedLinks[$item->get_permalink()]) || null === $item->get_permalink()) { continue; } $parsedContent = $parser->parseContent($item->get_permalink(), $item->get_description()); // if readable content failed, use default one from feed item $content = $parsedContent->content; if (false === $content) { $content = $item->get_content(); } // if there is no date in the feed, we use the current one $date = $item->get_date(); if (null === $date) { $date = date('j F Y, g:i:s a'); } $feedItem = new FeedItem(); $feedItem->setTitle(html_entity_decode($item->get_title(), ENT_COMPAT, 'UTF-8')); $feedItem->setLink($parsedContent->url); $feedItem->setContent($content); $feedItem->setPermalink($item->get_permalink()); $feedItem->setPublishedAt($date); $feedItem->setFeed($feed); $dm->persist($feedItem); ++$cached; if ($input->getOption('with-trace')) { $progress->advance(); } } if ($cached) { if ($input->getOption('with-trace')) { $progress->finish(); } // save the last time items where updated $feed->setLastItemCachedAt(date('j F Y, g:i:s a')); $dm->persist($feed); $totalCached += $cached; $feedLog = new FeedLog(); $feedLog->setItemsNumber($cached); $feedLog->setFeed($feed); $dm->persist($feedLog); // store feed url updated, to ping hub later $feedUpdated[] = $feed->getSlug(); } if ($input->getOption('with-trace')) { $output->writeln('<info>New cached items</info>: ' . $cached); } $dm->flush(); } if (!empty($feedUpdated)) { if ($input->getOption('with-trace')) { $output->writeln('<info>Ping hubs...</info>'); } // send an event about new feed updated $event = new FeedItemEvent($feedUpdated); $container->get('event_dispatcher')->dispatch(Api43FeedEvents::AFTER_ITEM_CACHED, $event); } $output->writeLn('<comment>' . $totalCached . '</comment> items cached.'); // update nb items for each udpated feed foreach ($feedUpdated as $slug) { $feed = $feedRepo->findOneByslug($slug); $nbItems = $feedItemRepo->countByFeedId($feed->getId()); $feed->setNbItems($nbItems); $dm->persist($feed); if ($input->getOption('with-trace')) { $output->writeln('<info>' . $feed->getName() . '</info> items updated: <comment>' . $nbItems . '</comment>'); } } $dm->flush(); $dm->clear(); }