3 namespace Wallabag\ImportBundle\Import
;
5 use Doctrine\ORM\EntityManager
;
7 use Symfony\Component\HttpFoundation\Session\Session
;
8 use Wallabag\CoreBundle\Entity\Entry
;
9 use Wallabag\CoreBundle\Entity\Tag
;
10 use Wallabag\CoreBundle\Tools\Utils
;
12 class PocketImport
implements ImportInterface
18 private $skippedEntries = 0;
19 private $importedEntries = 0;
21 public function __construct($tokenStorage, Session
$session, EntityManager
$em, $consumerKey)
23 $this->user
= $tokenStorage->getToken()->getUser();
24 $this->session
= $session;
26 $this->consumerKey
= $consumerKey;
29 public function getName()
34 public function getDescription()
36 return 'This importer will import all your <a href="https://getpocket.com">Pocket</a> data.';
40 * Create a new Client.
44 private function createClient()
49 'content-type' => 'application/json',
50 'X-Accept' => 'application/json',
57 * Returns the good title for current entry.
63 private function guessTitle($pocketEntry)
65 if (isset($pocketEntry['resolved_title']) && $pocketEntry['resolved_title'] != '') {
66 return $pocketEntry['resolved_title'];
67 } elseif (isset($pocketEntry['given_title']) && $pocketEntry['given_title'] != '') {
68 return $pocketEntry['given_title'];
75 * Returns the good URL for current entry.
81 private function guessURL($pocketEntry)
83 if (isset($pocketEntry['resolved_url']) && $pocketEntry['resolved_url'] != '') {
84 return $pocketEntry['resolved_url'];
87 return $pocketEntry['given_url'];
90 private function assignTagsToEntry(Entry
$entry, $tags)
92 foreach ($tags as $tag) {
93 $label = trim($tag['tag']);
94 $tagEntity = $this->em
95 ->getRepository('WallabagCoreBundle:Tag')
96 ->findOneByLabelAndUserId($label, $this->user
->getId());
98 if (is_object($tagEntity)) {
99 $entry->addTag($tagEntity);
101 $newTag = new Tag($this->user
);
102 $newTag->setLabel($label);
103 $entry->addTag($newTag);
112 private function parsePocketEntries($entries)
114 foreach ($entries as $pocketEntry) {
115 $entry = new Entry($this->user
);
116 $url = $this->guessURL($pocketEntry);
118 $existingEntry = $this->em
119 ->getRepository('WallabagCoreBundle:Entry')
120 ->findOneByUrlAndUserId($url, $this->user
->getId());
122 if (count($existingEntry) > 0) {
123 ++
$this->skippedEntries
;
127 $entry->setUrl($url);
128 $entry->setDomainName(parse_url($url, PHP_URL_HOST
));
130 if ($pocketEntry['status'] == 1) {
131 $entry->setArchived(true);
133 if ($pocketEntry['favorite'] == 1) {
134 $entry->setStarred(true);
137 $entry->setTitle($this->guessTitle($pocketEntry));
139 if (isset($pocketEntry['excerpt'])) {
140 $entry->setContent($pocketEntry['excerpt']);
143 if (isset($pocketEntry['has_image']) && $pocketEntry['has_image'] > 0) {
144 $entry->setPreviewPicture($pocketEntry['image']['src']);
147 if (isset($pocketEntry['word_count'])) {
148 $entry->setReadingTime(Utils
::convertWordsToMinutes($pocketEntry['word_count']));
151 if (!empty($pocketEntry['tags'])) {
152 $this->assignTagsToEntry($entry, $pocketEntry['tags']);
155 $this->em
->persist($entry);
156 ++
$this->importedEntries
;
162 public function oAuthRequest($redirectUri, $callbackUri)
164 $client = $this->createClient();
165 $request = $client->createRequest('POST', 'https://getpocket.com/v3/oauth/request',
167 'body' => json_encode([
168 'consumer_key' => $this->consumerKey
,
169 'redirect_uri' => $redirectUri,
174 $response = $client->send($request);
175 $values = $response->json();
177 // store code in session for callback method
178 $this->session
->set('pocketCode', $values['code']);
180 return 'https://getpocket.com/auth/authorize?request_token='.$values['code'].'&redirect_uri='.$callbackUri;
183 public function oAuthAuthorize()
185 $client = $this->createClient();
187 $request = $client->createRequest('POST', 'https://getpocket.com/v3/oauth/authorize',
189 'body' => json_encode([
190 'consumer_key' => $this->consumerKey
,
191 'code' => $this->session
->get('pocketCode'),
196 $response = $client->send($request);
198 return $response->json()['access_token'];
201 public function import($accessToken)
203 $client = $this->createClient();
205 $request = $client->createRequest('POST', 'https://getpocket.com/v3/get',
207 'body' => json_encode([
208 'consumer_key' => $this->consumerKey
,
209 'access_token' => $accessToken,
210 'detailType' => 'complete',
217 $response = $client->send($request);
218 $entries = $response->json();
220 $this->parsePocketEntries($entries['list']);
222 $this->session
->getFlashBag()->add(
224 $this->importedEntries
.' entries imported, '.$this->skippedEntries
.' already saved.'