diff options
Diffstat (limited to 'src/Wallabag/ImportBundle/Import/WallabagV1Import.php')
-rw-r--r-- | src/Wallabag/ImportBundle/Import/WallabagV1Import.php | 174 |
1 files changed, 21 insertions, 153 deletions
diff --git a/src/Wallabag/ImportBundle/Import/WallabagV1Import.php b/src/Wallabag/ImportBundle/Import/WallabagV1Import.php index 1d773d3b..6cf3467a 100644 --- a/src/Wallabag/ImportBundle/Import/WallabagV1Import.php +++ b/src/Wallabag/ImportBundle/Import/WallabagV1Import.php | |||
@@ -2,50 +2,8 @@ | |||
2 | 2 | ||
3 | namespace Wallabag\ImportBundle\Import; | 3 | namespace Wallabag\ImportBundle\Import; |
4 | 4 | ||
5 | use Psr\Log\LoggerInterface; | 5 | class WallabagV1Import extends WallabagImport |
6 | use Psr\Log\NullLogger; | ||
7 | use Doctrine\ORM\EntityManager; | ||
8 | use Wallabag\CoreBundle\Entity\Entry; | ||
9 | use Wallabag\UserBundle\Entity\User; | ||
10 | use Wallabag\CoreBundle\Tools\Utils; | ||
11 | use Wallabag\CoreBundle\Helper\ContentProxy; | ||
12 | |||
13 | class WallabagV1Import implements ImportInterface | ||
14 | { | 6 | { |
15 | protected $user; | ||
16 | protected $em; | ||
17 | protected $logger; | ||
18 | protected $contentProxy; | ||
19 | protected $skippedEntries = 0; | ||
20 | protected $importedEntries = 0; | ||
21 | protected $filepath; | ||
22 | protected $markAsRead; | ||
23 | |||
24 | public function __construct(EntityManager $em, ContentProxy $contentProxy) | ||
25 | { | ||
26 | $this->em = $em; | ||
27 | $this->logger = new NullLogger(); | ||
28 | $this->contentProxy = $contentProxy; | ||
29 | } | ||
30 | |||
31 | public function setLogger(LoggerInterface $logger) | ||
32 | { | ||
33 | $this->logger = $logger; | ||
34 | } | ||
35 | |||
36 | /** | ||
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. | ||
39 | * | ||
40 | * @param User $user | ||
41 | */ | ||
42 | public function setUser(User $user) | ||
43 | { | ||
44 | $this->user = $user; | ||
45 | |||
46 | return $this; | ||
47 | } | ||
48 | |||
49 | /** | 7 | /** |
50 | * {@inheritdoc} | 8 | * {@inheritdoc} |
51 | */ | 9 | */ |
@@ -67,125 +25,35 @@ class WallabagV1Import implements ImportInterface | |||
67 | */ | 25 | */ |
68 | public function getDescription() | 26 | public function getDescription() |
69 | { | 27 | { |
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.'; | 28 | return 'import.wallabag_v1.description'; |
71 | } | ||
72 | |||
73 | /** | ||
74 | * {@inheritdoc} | ||
75 | */ | ||
76 | public function import() | ||
77 | { | ||
78 | if (!$this->user) { | ||
79 | $this->logger->error('WallabagImport: user is not defined'); | ||
80 | |||
81 | return false; | ||
82 | } | ||
83 | |||
84 | if (!file_exists($this->filepath) || !is_readable($this->filepath)) { | ||
85 | $this->logger->error('WallabagImport: unable to read file', array('filepath' => $this->filepath)); | ||
86 | |||
87 | return false; | ||
88 | } | ||
89 | |||
90 | $data = json_decode(file_get_contents($this->filepath), true); | ||
91 | |||
92 | if (empty($data)) { | ||
93 | return false; | ||
94 | } | ||
95 | |||
96 | $this->parseEntries($data); | ||
97 | |||
98 | return true; | ||
99 | } | 29 | } |
100 | 30 | ||
101 | /** | 31 | /** |
102 | * {@inheritdoc} | 32 | * {@inheritdoc} |
103 | */ | 33 | */ |
104 | public function getSummary() | 34 | protected function prepareEntry($entry = [], $markAsRead = false) |
105 | { | 35 | { |
106 | return [ | 36 | $data = [ |
107 | 'skipped' => $this->skippedEntries, | 37 | 'title' => $entry['title'], |
108 | 'imported' => $this->importedEntries, | 38 | 'html' => $entry['content'], |
39 | 'url' => $entry['url'], | ||
40 | 'content_type' => '', | ||
41 | 'language' => '', | ||
42 | 'is_archived' => $entry['is_read'] || $markAsRead, | ||
43 | 'is_starred' => $entry['is_fav'], | ||
44 | 'tags' => '', | ||
109 | ]; | 45 | ]; |
110 | } | ||
111 | |||
112 | /** | ||
113 | * Set file path to the json file. | ||
114 | * | ||
115 | * @param string $filepath | ||
116 | */ | ||
117 | public function setFilepath($filepath) | ||
118 | { | ||
119 | $this->filepath = $filepath; | ||
120 | |||
121 | return $this; | ||
122 | } | ||
123 | |||
124 | /** | ||
125 | * Set whether articles must be all marked as read. | ||
126 | * | ||
127 | * @param bool $markAsRead | ||
128 | */ | ||
129 | public function setMarkAsRead($markAsRead) | ||
130 | { | ||
131 | $this->markAsRead = $markAsRead; | ||
132 | 46 | ||
133 | return $this; | 47 | // force content to be refreshed in case on bad fetch in the v1 installation |
134 | } | 48 | if (in_array($entry['title'], $this->untitled)) { |
135 | 49 | $data['title'] = ''; | |
136 | /** | 50 | $data['html'] = ''; |
137 | * @param $entries | 51 | } |
138 | */ | ||
139 | protected function parseEntries($entries) | ||
140 | { | ||
141 | $i = 1; | ||
142 | |||
143 | //Untitled in all languages from v1. This should never have been translated | ||
144 | $untitled = array('Untitled', 'Sans titre', 'podle nadpisu', 'Sin título', 'با عنوان', 'per titolo', 'Sem título', 'Без названия', 'po naslovu', 'Без назви', 'No title found', ''); | ||
145 | |||
146 | foreach ($entries as $importedEntry) { | ||
147 | $existingEntry = $this->em | ||
148 | ->getRepository('WallabagCoreBundle:Entry') | ||
149 | ->findByUrlAndUserId($importedEntry['url'], $this->user->getId()); | ||
150 | |||
151 | if (false !== $existingEntry) { | ||
152 | ++$this->skippedEntries; | ||
153 | continue; | ||
154 | } | ||
155 | |||
156 | // @see ContentProxy->updateEntry | ||
157 | $entry = new Entry($this->user); | ||
158 | $entry->setUrl($importedEntry['url']); | ||
159 | |||
160 | if (in_array($importedEntry['title'], $untitled)) { | ||
161 | $entry = $this->contentProxy->updateEntry($entry, $importedEntry['url']); | ||
162 | } else { | ||
163 | $entry->setContent($importedEntry['content']); | ||
164 | $entry->setTitle($importedEntry['title']); | ||
165 | $entry->setReadingTime(Utils::getReadingTime($importedEntry['content'])); | ||
166 | $entry->setDomainName(parse_url($importedEntry['url'], PHP_URL_HOST)); | ||
167 | } | ||
168 | |||
169 | if (array_key_exists('tags', $importedEntry) && $importedEntry['tags'] != '') { | ||
170 | $this->contentProxy->assignTagsToEntry( | ||
171 | $entry, | ||
172 | $importedEntry['tags'] | ||
173 | ); | ||
174 | } | ||
175 | |||
176 | $entry->setArchived($importedEntry['is_read'] || $this->markAsRead); | ||
177 | $entry->setStarred($importedEntry['is_fav']); | ||
178 | |||
179 | $this->em->persist($entry); | ||
180 | ++$this->importedEntries; | ||
181 | 52 | ||
182 | // flush every 20 entries | 53 | if (array_key_exists('tags', $entry) && $entry['tags'] != '') { |
183 | if (($i % 20) === 0) { | 54 | $data['tags'] = $entry['tags']; |
184 | $this->em->flush(); | ||
185 | } | ||
186 | ++$i; | ||
187 | } | 55 | } |
188 | 56 | ||
189 | $this->em->flush(); | 57 | return $data; |
190 | } | 58 | } |
191 | } | 59 | } |