X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2FWallabag%2FImportBundle%2FImport%2FBrowserImport.php;h=3987e80f0722856df2067fcbcc380554aea6eaf5;hb=92a66835624acf6fd14f5adc5f8aab399658592e;hp=68fa8bf83877c98354f662613e56973a6912440c;hpb=12d93e6896f2d99b6329b7979ee7b6d11e457c3a;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/ImportBundle/Import/BrowserImport.php b/src/Wallabag/ImportBundle/Import/BrowserImport.php index 68fa8bf8..3987e80f 100644 --- a/src/Wallabag/ImportBundle/Import/BrowserImport.php +++ b/src/Wallabag/ImportBundle/Import/BrowserImport.php @@ -3,8 +3,7 @@ namespace Wallabag\ImportBundle\Import; use Wallabag\CoreBundle\Entity\Entry; -use Wallabag\UserBundle\Entity\User; -use Wallabag\CoreBundle\Helper\ContentProxy; +use Wallabag\CoreBundle\Event\EntrySavedEvent; abstract class BrowserImport extends AbstractImport { @@ -45,6 +44,8 @@ abstract class BrowserImport extends AbstractImport $data = json_decode(file_get_contents($this->filepath), true); if (empty($data)) { + $this->logger->error('Wallabag Browser: no entries in imported file'); + return false; } @@ -72,87 +73,39 @@ abstract class BrowserImport extends AbstractImport } /** - * Parse and insert all given entries. - * - * @param $entries + * {@inheritdoc} */ - protected function parseEntries($entries) + public function parseEntry(array $importedEntry) { - $i = 1; + if ((!\array_key_exists('guid', $importedEntry) || (!\array_key_exists('id', $importedEntry))) && \is_array(reset($importedEntry))) { + if ($this->producer) { + $this->parseEntriesForProducer($importedEntry); - foreach ($entries as $importedEntry) { - if ((array) $importedEntry !== $importedEntry) { - continue; + return; } - $entry = $this->parseEntry($importedEntry); - - if (null === $entry) { - continue; - } + $this->parseEntries($importedEntry); - // flush every 20 entries - if (($i % 20) === 0) { - $this->em->flush(); - } - ++$i; + return; } - $this->em->flush(); - } + if (\array_key_exists('children', $importedEntry)) { + if ($this->producer) { + $this->parseEntriesForProducer($importedEntry['children']); - /** - * Parse entries and send them to the queue. - * It should just be a simple loop on all item, no call to the database should be done - * to speedup queuing. - * - * Faster parse entries for Producer. - * We don't care to make check at this time. They'll be done by the consumer. - * - * @param array $entries - */ - protected function parseEntriesForProducer(array $entries) - { - foreach ($entries as $importedEntry) { - if ((array) $importedEntry !== $importedEntry) { - continue; + return; } - // set userId for the producer (it won't know which user is connected) - $importedEntry['userId'] = $this->user->getId(); - - if ($this->markAsRead) { - $importedEntry = $this->setEntryAsRead($importedEntry); - } - - ++$this->queuedEntries; - - $this->producer->publish(json_encode($importedEntry)); - } - } - - /** - * {@inheritdoc} - */ - public function parseEntry(array $importedEntry) - { - if ((!array_key_exists('guid', $importedEntry) || (!array_key_exists('id', $importedEntry))) && is_array(reset($importedEntry))) { - $this->parseEntries($importedEntry); - - return; - } - - if (array_key_exists('children', $importedEntry)) { $this->parseEntries($importedEntry['children']); return; } - if (!array_key_exists('uri', $importedEntry) && !array_key_exists('url', $importedEntry)) { + if (!\array_key_exists('uri', $importedEntry) && !\array_key_exists('url', $importedEntry)) { return; } - $url = array_key_exists('uri', $importedEntry) ? $importedEntry['uri'] : $importedEntry['url']; + $url = \array_key_exists('uri', $importedEntry) ? $importedEntry['uri'] : $importedEntry['url']; $existingEntry = $this->em ->getRepository('WallabagCoreBundle:Entry') @@ -171,16 +124,16 @@ abstract class BrowserImport extends AbstractImport $entry->setTitle($data['title']); // update entry with content (in case fetching failed, the given entry will be return) - $entry = $this->fetchContent($entry, $data['url'], $data); + $this->fetchContent($entry, $data['url'], $data); - if (array_key_exists('tags', $data)) { - $this->contentProxy->assignTagsToEntry( + if (\array_key_exists('tags', $data)) { + $this->tagsAssigner->assignTagsToEntry( $entry, $data['tags'] ); } - $entry->setArchived($data['is_archived']); + $entry->updateArchived($data['is_archived']); if (!empty($data['created_at'])) { $dt = new \DateTime(); @@ -194,38 +147,79 @@ abstract class BrowserImport extends AbstractImport } /** - * {@inheritdoc} + * Parse and insert all given entries. + * + * @param array $entries */ - protected function prepareEntry(array $entry = []) + protected function parseEntries(array $entries) { - $url = array_key_exists('uri', $entry) ? $entry['uri'] : $entry['url']; - $date = array_key_exists('date_added', $entry) ? $entry['date_added'] : $entry['dateAdded']; - $title = array_key_exists('name', $entry) ? $entry['name'] : $entry['title']; - - if (16 === strlen($date)) { - // firefox ... - $date = (int) ceil($date / 1000000); - } else if (17 === strlen($date)) { - // chrome ... - $date = (int) ceil($date / 10000000); - } else { - $date = ''; + $i = 1; + $entryToBeFlushed = []; + + foreach ($entries as $importedEntry) { + if ((array) $importedEntry !== $importedEntry) { + continue; + } + + $entry = $this->parseEntry($importedEntry); + + if (null === $entry) { + continue; + } + + // @see AbstractImport + $entryToBeFlushed[] = $entry; + + // flush every 20 entries + if (0 === ($i % 20)) { + $this->em->flush(); + + foreach ($entryToBeFlushed as $entry) { + $this->eventDispatcher->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry)); + } + + $entryToBeFlushed = []; + } + ++$i; } - $data = [ - 'title' => $title, - 'html' => '', - 'url' => $url, - 'is_archived' => $this->markAsRead, - 'tags' => '', - 'created_at' => $date, - ]; - - if (array_key_exists('tags', $entry) && $entry['tags'] != '') { - $data['tags'] = $entry['tags']; + $this->em->flush(); + + if (!empty($entryToBeFlushed)) { + foreach ($entryToBeFlushed as $entry) { + $this->eventDispatcher->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry)); + } } + } - return $data; + /** + * Parse entries and send them to the queue. + * It should just be a simple loop on all item, no call to the database should be done + * to speedup queuing. + * + * Faster parse entries for Producer. + * We don't care to make check at this time. They'll be done by the consumer. + * + * @param array $entries + */ + protected function parseEntriesForProducer(array $entries) + { + foreach ($entries as $importedEntry) { + if ((array) $importedEntry !== $importedEntry) { + continue; + } + + // set userId for the producer (it won't know which user is connected) + $importedEntry['userId'] = $this->user->getId(); + + if ($this->markAsRead) { + $importedEntry = $this->setEntryAsRead($importedEntry); + } + + ++$this->queuedEntries; + + $this->producer->publish(json_encode($importedEntry)); + } } /** @@ -237,4 +231,6 @@ abstract class BrowserImport extends AbstractImport return $importedEntry; } + + abstract protected function prepareEntry(array $entry = []); }