em = $em; $this->logger = new NullLogger(); $this->contentProxy = $contentProxy; } public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } /** * We define the user in a custom call because on the import command there is no logged in user. * So we can't retrieve user from the `security.token_storage` service. * * @param User $user */ public function setUser(User $user) { $this->user = $user; return $this; } /** * {@inheritdoc} */ public function getName() { return 'wallabag v1'; } /** * {@inheritdoc} */ public function getUrl() { return 'import_wallabag_v1'; } /** * {@inheritdoc} */ public function getDescription() { return 'This importer will import all your wallabag v1 articles. On your config page, click on "JSON export" in the "Export your wallabag data" section. You will have a "wallabag-export-1-xxxx-xx-xx.json" file.'; } /** * {@inheritdoc} */ public function import() { if (!$this->user) { $this->logger->error('WallabagImport: user is not defined'); return false; } if (!file_exists($this->filepath) || !is_readable($this->filepath)) { $this->logger->error('WallabagImport: unable to read file', array('filepath' => $this->filepath)); return false; } $data = json_decode(file_get_contents($this->filepath), true); if (empty($data)) { return false; } $this->parseEntries($data); return true; } /** * {@inheritdoc} */ public function getSummary() { return [ 'skipped' => $this->skippedEntries, 'imported' => $this->importedEntries, ]; } /** * Set file path to the json file. * * @param string $filepath */ public function setFilepath($filepath) { $this->filepath = $filepath; return $this; } /** * @param $entries */ protected function parseEntries($entries) { $i = 1; //Untitled in all languages from v1. This should never have been translated $untitled = array('Untitled', 'Sans titre', 'podle nadpisu', 'Sin título', 'با عنوان', 'per titolo', 'Sem título', 'Без названия', 'po naslovu', 'Без назви', 'No title found', ''); foreach ($entries as $importedEntry) { $existingEntry = $this->em ->getRepository('WallabagCoreBundle:Entry') ->findByUrlAndUserId($importedEntry['url'], $this->user->getId()); if (false !== $existingEntry) { ++$this->skippedEntries; continue; } // @see ContentProxy->updateEntry $entry = new Entry($this->user); $entry->setUrl($importedEntry['url']); if (in_array($importedEntry['title'], $untitled)) { $entry = $this->contentProxy->updateEntry($entry, $importedEntry['url']); } else { $entry->setContent($importedEntry['content']); $entry->setTitle($importedEntry['title']); $entry->setReadingTime(Utils::getReadingTime($importedEntry['content'])); $entry->setDomainName(parse_url($importedEntry['url'], PHP_URL_HOST)); } if (array_key_exists('tags', $importedEntry) && $importedEntry['tags'] != '') { $this->contentProxy->assignTagsToEntry( $entry, $importedEntry['tags'] ); } $entry->setArchived($importedEntry['is_read']); $entry->setStarred($importedEntry['is_fav']); $this->em->persist($entry); ++$this->importedEntries; // flush every 20 entries if (($i % 20) === 0) { $this->em->flush(); } ++$i; } $this->em->flush(); } }