user = $tokenStorage->getToken()->getUser(); $this->session = $session; $this->em = $em; $this->consumerKey = $consumerKey; } /** * {@inheritdoc} */ public function getName() { return 'Pocket'; } /** * {@inheritdoc} */ public function getDescription() { return 'This importer will import all your Pocket data.'; } /** * {@inheritdoc} */ public function oAuthRequest($redirectUri, $callbackUri) { $request = $this->client->createRequest('POST', 'https://getpocket.com/v3/oauth/request', [ 'body' => json_encode([ 'consumer_key' => $this->consumerKey, 'redirect_uri' => $redirectUri, ]), ] ); $response = $this->client->send($request); $values = $response->json(); // store code in session for callback method $this->session->set('pocketCode', $values['code']); return 'https://getpocket.com/auth/authorize?request_token='.$values['code'].'&redirect_uri='.$callbackUri; } /** * {@inheritdoc} */ public function oAuthAuthorize() { $request = $this->client->createRequest('POST', 'https://getpocket.com/v3/oauth/authorize', [ 'body' => json_encode([ 'consumer_key' => $this->consumerKey, 'code' => $this->session->get('pocketCode'), ]), ] ); $response = $this->client->send($request); return $response->json()['access_token']; } /** * {@inheritdoc} */ public function import($accessToken) { $request = $this->client->createRequest('POST', 'https://getpocket.com/v3/get', [ 'body' => json_encode([ 'consumer_key' => $this->consumerKey, 'access_token' => $accessToken, 'detailType' => 'complete', 'state' => 'all', 'sort' => 'oldest', ]), ] ); $response = $this->client->send($request); $entries = $response->json(); $this->parsePocketEntries($entries['list']); $this->session->getFlashBag()->add( 'notice', $this->importedEntries.' entries imported, '.$this->skippedEntries.' already saved.' ); } /** * Set the Guzzle client. * * @param Client $client */ public function setClient(Client $client) { $this->client = $client; } /** * Returns the good title for current entry. * * @param $pocketEntry * * @return string */ private function guessTitle($pocketEntry) { if (isset($pocketEntry['resolved_title']) && $pocketEntry['resolved_title'] != '') { return $pocketEntry['resolved_title']; } elseif (isset($pocketEntry['given_title']) && $pocketEntry['given_title'] != '') { return $pocketEntry['given_title']; } return 'Untitled'; } /** * Returns the good URL for current entry. * * @param $pocketEntry * * @return string */ private function guessURL($pocketEntry) { if (isset($pocketEntry['resolved_url']) && $pocketEntry['resolved_url'] != '') { return $pocketEntry['resolved_url']; } return $pocketEntry['given_url']; } private function assignTagsToEntry(Entry $entry, $tags) { foreach ($tags as $tag) { $label = trim($tag['tag']); $tagEntity = $this->em ->getRepository('WallabagCoreBundle:Tag') ->findOneByLabelAndUserId($label, $this->user->getId()); if (is_object($tagEntity)) { $entry->addTag($tagEntity); } else { $newTag = new Tag($this->user); $newTag->setLabel($label); $entry->addTag($newTag); } $this->em->flush(); } } /** * @param $entries */ private function parsePocketEntries($entries) { foreach ($entries as $pocketEntry) { $entry = new Entry($this->user); $url = $this->guessURL($pocketEntry); $existingEntry = $this->em ->getRepository('WallabagCoreBundle:Entry') ->existByUrlAndUserId($url, $this->user->getId()); if (false !== $existingEntry) { ++$this->skippedEntries; continue; } $entry->setUrl($url); $entry->setDomainName(parse_url($url, PHP_URL_HOST)); if ($pocketEntry['status'] == 1) { $entry->setArchived(true); } if ($pocketEntry['favorite'] == 1) { $entry->setStarred(true); } $entry->setTitle($this->guessTitle($pocketEntry)); if (isset($pocketEntry['excerpt'])) { $entry->setContent($pocketEntry['excerpt']); } if (isset($pocketEntry['has_image']) && $pocketEntry['has_image'] > 0) { $entry->setPreviewPicture($pocketEntry['image']['src']); } if (isset($pocketEntry['word_count'])) { $entry->setReadingTime(Utils::convertWordsToMinutes($pocketEntry['word_count'])); } if (!empty($pocketEntry['tags'])) { $this->assignTagsToEntry($entry, $pocketEntry['tags']); } $this->em->persist($entry); ++$this->importedEntries; } $this->em->flush(); } }