3 namespace Wallabag\ImportBundle\Import
;
5 use Psr\Log\LoggerInterface
;
6 use Psr\Log\NullLogger
;
7 use Doctrine\ORM\EntityManager
;
8 use Wallabag\CoreBundle\Entity\Entry
;
9 use Wallabag\CoreBundle\Entity\Tag
;
10 use Wallabag\UserBundle\Entity\User
;
11 use Wallabag\CoreBundle\Tools\Utils
;
12 use Wallabag\CoreBundle\Helper\ContentProxy
;
14 class WallabagV1Import
implements ImportInterface
19 protected $contentProxy;
20 protected $skippedEntries = 0;
21 protected $importedEntries = 0;
24 public function __construct(EntityManager
$em, ContentProxy
$contentProxy)
27 $this->logger
= new NullLogger();
28 $this->contentProxy
= $contentProxy;
31 public function setLogger(LoggerInterface
$logger)
33 $this->logger
= $logger;
37 * We define the user in a custom call because on the import command there is no logged in user.
38 * So we can't retrieve user from the `security.token_storage` service.
42 public function setUser(User
$user)
52 public function getName()
60 public function getUrl()
62 return 'import_wallabag_v1';
68 public function getDescription()
70 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.';
76 public function import()
79 $this->logger
->error('WallabagImport: user is not defined');
84 if (!file_exists($this->filepath
) || !is_readable($this->filepath
)) {
85 $this->logger
->error('WallabagImport: unable to read file', array('filepath' => $this->filepath
));
90 $data = json_decode(file_get_contents($this->filepath
), true);
96 $this->parseEntries($data);
104 public function getSummary()
107 'skipped' => $this->skippedEntries
,
108 'imported' => $this->importedEntries
,
113 * Set file path to the json file.
115 * @param string $filepath
117 public function setFilepath($filepath)
119 $this->filepath
= $filepath;
127 protected function parseEntries($entries)
131 //Untitled in all languages from v1. This should never have been translated
132 $untitled = array('Untitled', 'Sans titre', 'podle nadpisu', 'Sin título', 'با عنوان', 'per titolo', 'Sem título', 'Без названия', 'po naslovu', 'Без назви', 'No title found', '');
134 foreach ($entries as $importedEntry) {
135 $existingEntry = $this->em
136 ->getRepository('WallabagCoreBundle:Entry')
137 ->findByUrlAndUserId($importedEntry['url'], $this->user
->getId());
139 if (false !== $existingEntry) {
140 ++
$this->skippedEntries
;
144 // @see ContentProxy->updateEntry
145 $entry = new Entry($this->user
);
146 $entry->setUrl($importedEntry['url']);
147 if (in_array($importedEntry['title'], $untitled)) {
148 $entry = $this->contentProxy
->updateEntry($entry, $importedEntry['url']);
150 $entry->setContent($importedEntry['content']);
151 $entry->setTitle($importedEntry['title']);
152 $entry->setReadingTime(Utils
::getReadingTime($importedEntry['content']));
153 $entry->setDomainName(parse_url($importedEntry['url'], PHP_URL_HOST
));
155 if (array_key_exists('tags', $importedEntry) && $importedEntry['tags'] != '') {
156 $tags = explode(',', $importedEntry['tags']);
157 $this->assignTagsToEntry($entry, $tags);
159 $entry->setArchived($importedEntry['is_read']);
160 $entry->setStarred($importedEntry['is_fav']);
162 $this->em
->persist($entry);
163 ++
$this->importedEntries
;
165 // flush every 20 entries
166 if (($i %
20) === 0) {
175 private function assignTagsToEntry(Entry
$entry, $tags)
177 foreach ($tags as $tag) {
179 $tagEntity = $this->em
180 ->getRepository('WallabagCoreBundle:Tag')
181 ->findOneByLabel($label);
182 if (is_object($tagEntity)) {
183 $entry->addTag($tagEntity);
186 $newTag->setLabel($label);
187 $entry->addTag($newTag);