]>
Commit | Line | Data |
---|---|---|
b1d05721 JB |
1 | <?php |
2 | ||
3 | namespace Wallabag\ImportBundle\Import; | |
4 | ||
5 | use Psr\Log\LoggerInterface; | |
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; | |
0783c99a TC |
11 | use Wallabag\CoreBundle\Helper\ContentProxy; |
12 | ||
b1d05721 JB |
13 | |
14 | class WallabagV1Import implements ImportInterface | |
15 | { | |
6785f4aa NL |
16 | protected $user; |
17 | protected $em; | |
18 | protected $logger; | |
0783c99a | 19 | private $contentProxy; |
6785f4aa NL |
20 | protected $skippedEntries = 0; |
21 | protected $importedEntries = 0; | |
22 | protected $filepath; | |
b1d05721 | 23 | |
0783c99a | 24 | public function __construct(EntityManager $em, ContentProxy $contentProxy) |
b1d05721 JB |
25 | { |
26 | $this->em = $em; | |
27 | $this->logger = new NullLogger(); | |
0783c99a | 28 | $this->contentProxy = $contentProxy; |
b1d05721 JB |
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 | /** | |
50 | * {@inheritdoc} | |
51 | */ | |
52 | public function getName() | |
53 | { | |
d1af8ad4 | 54 | return 'wallabag v1'; |
b1d05721 JB |
55 | } |
56 | ||
7019c7cf JB |
57 | /** |
58 | * {@inheritdoc} | |
59 | */ | |
60 | public function getUrl() | |
61 | { | |
62 | return 'import_wallabag_v1'; | |
63 | } | |
64 | ||
b1d05721 JB |
65 | /** |
66 | * {@inheritdoc} | |
67 | */ | |
68 | public function getDescription() | |
69 | { | |
b88cf91f | 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.'; |
b1d05721 JB |
71 | } |
72 | ||
73 | /** | |
74 | * {@inheritdoc} | |
75 | */ | |
76 | public function import() | |
77 | { | |
78 | if (!$this->user) { | |
6785f4aa | 79 | $this->logger->error('WallabagImport: user is not defined'); |
b1d05721 JB |
80 | |
81 | return false; | |
82 | } | |
83 | ||
84 | if (!file_exists($this->filepath) || !is_readable($this->filepath)) { | |
6785f4aa | 85 | $this->logger->error('WallabagImport: unable to read file', array('filepath' => $this->filepath)); |
b1d05721 JB |
86 | |
87 | return false; | |
88 | } | |
89 | ||
7019c7cf JB |
90 | $data = json_decode(file_get_contents($this->filepath), true); |
91 | ||
92 | if (empty($data)) { | |
93 | return false; | |
94 | } | |
95 | ||
96 | $this->parseEntries($data); | |
b1d05721 JB |
97 | |
98 | return true; | |
99 | } | |
100 | ||
101 | /** | |
102 | * {@inheritdoc} | |
103 | */ | |
104 | public function getSummary() | |
105 | { | |
106 | return [ | |
107 | 'skipped' => $this->skippedEntries, | |
108 | 'imported' => $this->importedEntries, | |
109 | ]; | |
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 | * @param $entries | |
126 | */ | |
6785f4aa | 127 | protected function parseEntries($entries) |
b1d05721 | 128 | { |
7019c7cf | 129 | $i = 1; |
0783c99a TC |
130 | /** |
131 | * Untitled in all languages from v1. This should never have been translated | |
132 | */ | |
133 | $untitled = array('Untitled','Sans titre','podle nadpisu','Sin título','با عنوان','per titolo','Sem título','Без названия','po naslovu','Без назви'); | |
7019c7cf | 134 | |
b1d05721 JB |
135 | foreach ($entries as $importedEntry) { |
136 | $existingEntry = $this->em | |
137 | ->getRepository('WallabagCoreBundle:Entry') | |
78833672 | 138 | ->findByUrlAndUserId($importedEntry['url'], $this->user->getId()); |
b1d05721 JB |
139 | |
140 | if (false !== $existingEntry) { | |
141 | ++$this->skippedEntries; | |
142 | continue; | |
143 | } | |
144 | ||
145 | // @see ContentProxy->updateEntry | |
146 | $entry = new Entry($this->user); | |
147 | $entry->setUrl($importedEntry['url']); | |
0783c99a TC |
148 | if (in_array($importedEntry['title'],$untitled)) { |
149 | $entry = $this->contentProxy->updateEntry($entry, $entry->getUrl()); | |
150 | } else { | |
151 | $entry->setContent($importedEntry['content']); | |
152 | $entry->setTitle($importedEntry['title']); | |
153 | $entry->setReadingTime(Utils::getReadingTime($importedEntry['content'])); | |
154 | $entry->setDomainName(parse_url($importedEntry['url'], PHP_URL_HOST)); | |
155 | } | |
b1d05721 JB |
156 | $entry->setArchived($importedEntry['is_read']); |
157 | $entry->setStarred($importedEntry['is_fav']); | |
b1d05721 JB |
158 | |
159 | $this->em->persist($entry); | |
160 | ++$this->importedEntries; | |
7019c7cf JB |
161 | |
162 | // flush every 20 entries | |
163 | if (($i % 20) === 0) { | |
8eedc8cf | 164 | $this->em->flush(); |
7019c7cf JB |
165 | } |
166 | ++$i; | |
b1d05721 JB |
167 | } |
168 | ||
169 | $this->em->flush(); | |
170 | } | |
171 | } |