]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/ImportBundle/Import/InstapaperImport.php
Add Instapaper import
[github/wallabag/wallabag.git] / src / Wallabag / ImportBundle / Import / InstapaperImport.php
diff --git a/src/Wallabag/ImportBundle/Import/InstapaperImport.php b/src/Wallabag/ImportBundle/Import/InstapaperImport.php
new file mode 100644 (file)
index 0000000..356acf2
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+
+namespace Wallabag\ImportBundle\Import;
+
+use Wallabag\CoreBundle\Entity\Entry;
+
+class InstapaperImport extends AbstractImport
+{
+    private $filepath;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return 'Instapaper';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUrl()
+    {
+        return 'import_instapaper';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDescription()
+    {
+        return 'import.instapaper.description';
+    }
+
+    /**
+     * Set file path to the json file.
+     *
+     * @param string $filepath
+     */
+    public function setFilepath($filepath)
+    {
+        $this->filepath = $filepath;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function import()
+    {
+        if (!$this->user) {
+            $this->logger->error('InstapaperImport: user is not defined');
+
+            return false;
+        }
+
+        if (!file_exists($this->filepath) || !is_readable($this->filepath)) {
+            $this->logger->error('InstapaperImport: unable to read file', ['filepath' => $this->filepath]);
+
+            return false;
+        }
+
+        $entries = [];
+        $handle = fopen($this->filepath, 'r');
+        while (($data = fgetcsv($handle, 10240)) !== false) {
+            if ('URL' === $data[0]) {
+                continue;
+            }
+
+            $entries[] = [
+                'url' => $data[0],
+                'title' => $data[1],
+                'status' => $data[3],
+                'is_archived' => $data[3] === 'Archive' || $data[3] === 'Starred',
+                'is_starred' => $data[3] === 'Starred',
+                'content_type' => '',
+                'language' => '',
+            ];
+        }
+        fclose($handle);
+
+        if ($this->producer) {
+            $this->parseEntriesForProducer($entries);
+
+            return true;
+        }
+
+        $this->parseEntries($entries);
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function parseEntry(array $importedEntry)
+    {
+        $existingEntry = $this->em
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->findByUrlAndUserId($importedEntry['url'], $this->user->getId());
+
+        if (false !== $existingEntry) {
+            ++$this->skippedEntries;
+
+            return;
+        }
+
+        $entry = new Entry($this->user);
+        $entry->setUrl($importedEntry['url']);
+        $entry->setTitle($importedEntry['title']);
+
+        // update entry with content (in case fetching failed, the given entry will be return)
+        $entry = $this->fetchContent($entry, $importedEntry['url'], $importedEntry);
+
+        $entry->setArchived($importedEntry['is_archived']);
+        $entry->setStarred($importedEntry['is_starred']);
+
+        $this->em->persist($entry);
+        ++$this->importedEntries;
+
+        return $entry;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function setEntryAsRead(array $importedEntry)
+    {
+        $importedEntry['is_archived'] = 1;
+
+        return $importedEntry;
+    }
+}