3 namespace Wallabag\ImportBundle\Import
;
5 use Doctrine\ORM\EntityManager
;
7 use Symfony\Component\HttpFoundation\Session\Session
;
8 use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface
;
9 use Wallabag\CoreBundle\Entity\Entry
;
10 use Wallabag\CoreBundle\Entity\Tag
;
11 use Wallabag\CoreBundle\Tools\Utils
;
13 class PocketImport
implements ImportInterface
19 private $skippedEntries = 0;
20 private $importedEntries = 0;
22 public function __construct(TokenStorageInterface
$tokenStorage, Session
$session, EntityManager
$em, $consumerKey)
24 $this->user
= $tokenStorage->getToken()->getUser();
25 $this->session
= $session;
27 $this->consumerKey
= $consumerKey;
33 public function getName()
41 public function getDescription()
43 return 'This importer will import all your <a href="https://getpocket.com">Pocket</a> data.';
49 public function oAuthRequest($redirectUri, $callbackUri)
51 $request = $this->client
->createRequest('POST', 'https://getpocket.com/v3/oauth/request',
53 'body' => json_encode([
54 'consumer_key' => $this->consumerKey
,
55 'redirect_uri' => $redirectUri,
60 $response = $this->client
->send($request);
61 $values = $response->json();
63 // store code in session for callback method
64 $this->session
->set('pocketCode', $values['code']);
66 return 'https://getpocket.com/auth/authorize?request_token='.$values['code'].'&redirect_uri='.$callbackUri;
72 public function oAuthAuthorize()
74 $request = $this->client
->createRequest('POST', 'https://getpocket.com/v3/oauth/authorize',
76 'body' => json_encode([
77 'consumer_key' => $this->consumerKey
,
78 'code' => $this->session
->get('pocketCode'),
83 $response = $this->client
->send($request);
85 return $response->json()['access_token'];
91 public function import($accessToken)
93 $request = $this->client
->createRequest('POST', 'https://getpocket.com/v3/get',
95 'body' => json_encode([
96 'consumer_key' => $this->consumerKey
,
97 'access_token' => $accessToken,
98 'detailType' => 'complete',
105 $response = $this->client
->send($request);
106 $entries = $response->json();
108 $this->parsePocketEntries($entries['list']);
110 $this->session
->getFlashBag()->add(
112 $this->importedEntries
.' entries imported, '.$this->skippedEntries
.' already saved.'
117 * Set the Guzzle client.
119 * @param Client $client
121 public function setClient(Client
$client)
123 $this->client
= $client;
127 * Returns the good title for current entry.
129 * @param $pocketEntry
133 private function guessTitle($pocketEntry)
135 if (isset($pocketEntry['resolved_title']) && $pocketEntry['resolved_title'] != '') {
136 return $pocketEntry['resolved_title'];
137 } elseif (isset($pocketEntry['given_title']) && $pocketEntry['given_title'] != '') {
138 return $pocketEntry['given_title'];
145 * Returns the good URL for current entry.
147 * @param $pocketEntry
151 private function guessURL($pocketEntry)
153 if (isset($pocketEntry['resolved_url']) && $pocketEntry['resolved_url'] != '') {
154 return $pocketEntry['resolved_url'];
157 return $pocketEntry['given_url'];
160 private function assignTagsToEntry(Entry
$entry, $tags)
162 foreach ($tags as $tag) {
163 $label = trim($tag['tag']);
164 $tagEntity = $this->em
165 ->getRepository('WallabagCoreBundle:Tag')
166 ->findOneByLabelAndUserId($label, $this->user
->getId());
168 if (is_object($tagEntity)) {
169 $entry->addTag($tagEntity);
171 $newTag = new Tag($this->user
);
172 $newTag->setLabel($label);
173 $entry->addTag($newTag);
182 private function parsePocketEntries($entries)
184 foreach ($entries as $pocketEntry) {
185 $entry = new Entry($this->user
);
186 $url = $this->guessURL($pocketEntry);
188 $existingEntry = $this->em
189 ->getRepository('WallabagCoreBundle:Entry')
190 ->existByUrlAndUserId($url, $this->user
->getId());
192 if (false !== $existingEntry) {
193 ++
$this->skippedEntries
;
197 $entry->setUrl($url);
198 $entry->setDomainName(parse_url($url, PHP_URL_HOST
));
200 if ($pocketEntry['status'] == 1) {
201 $entry->setArchived(true);
203 if ($pocketEntry['favorite'] == 1) {
204 $entry->setStarred(true);
207 $entry->setTitle($this->guessTitle($pocketEntry));
209 if (isset($pocketEntry['excerpt'])) {
210 $entry->setContent($pocketEntry['excerpt']);
213 if (isset($pocketEntry['has_image']) && $pocketEntry['has_image'] > 0) {
214 $entry->setPreviewPicture($pocketEntry['image']['src']);
217 if (isset($pocketEntry['word_count'])) {
218 $entry->setReadingTime(Utils
::convertWordsToMinutes($pocketEntry['word_count']));
221 if (!empty($pocketEntry['tags'])) {
222 $this->assignTagsToEntry($entry, $pocketEntry['tags']);
225 $this->em
->persist($entry);
226 ++
$this->importedEntries
;