use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Helper\ProgressBar;
-use Wallabag\CoreBundle\Entity\Entry;
-use Wallabag\CoreBundle\Tools\Utils;
class ImportCommand extends ContainerAwareCommand
{
{
$this
->setName('wallabag:import')
- ->setDescription('Import entries from JSON file')
- ->addArgument(
- 'userId',
- InputArgument::REQUIRED,
- 'user ID to populate'
- );
+ ->setDescription('Import entries from a JSON export')
+ ->addArgument('username', InputArgument::REQUIRED, 'User to populate')
+ ->addArgument('filepath', InputArgument::REQUIRED, 'Path to the JSON file')
+ ->addOption('importer', null, InputArgument::OPTIONAL, 'The importer to use: v1, v2, instapaper, pinboard, readability, firefox or chrome', 'v1')
+ ->addOption('markAsRead', null, InputArgument::OPTIONAL, 'Mark all entries as read', false)
+ ->addOption('useUserId', null, InputArgument::OPTIONAL, 'Use user id instead of username to find account', false)
+ ;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
- $now = new \DateTime();
- $output->writeln('<comment>Start : '.$now->format('d-m-Y G:i:s').' ---</comment>');
+ $output->writeln('Start : '.(new \DateTime())->format('d-m-Y G:i:s').' ---');
- // Importing CSV on DB via Doctrine ORM
- $this->import($input, $output);
-
- $now = new \DateTime();
- $output->writeln('<comment>End : '.$now->format('d-m-Y G:i:s').' ---</comment>');
- }
-
- protected function import(InputInterface $input, OutputInterface $output)
- {
- // Getting php array of data from CSV
- $data = $this->get($input, $output);
+ if (!file_exists($input->getArgument('filepath'))) {
+ throw new Exception(sprintf('File "%s" not found', $input->getArgument('filepath')));
+ }
$em = $this->getContainer()->get('doctrine')->getManager();
// Turning off doctrine default logs queries for saving memory
$em->getConnection()->getConfiguration()->setSQLLogger(null);
- // Define the size of record, the frequency for persisting the data and the current index of records
- $size = count($data);
- $batchSize = 20;
- $i = 1;
-
- $user = $em->getRepository('WallabagUserBundle:User')
- ->findOneById($input->getArgument('userId'));
+ if ($input->getOption('useUserId')) {
+ $user = $em->getRepository('WallabagUserBundle:User')->findOneById($input->getArgument('username'));
+ } else {
+ $user = $em->getRepository('WallabagUserBundle:User')->findOneByUsername($input->getArgument('username'));
+ }
if (!is_object($user)) {
- throw new Exception('User not found');
+ throw new Exception(sprintf('User "%s" not found', $input->getArgument('username')));
}
- $progress = new ProgressBar($output, $size);
- $progress->start();
-
- foreach ($data as $object) {
- $array = (array) $object;
- $entry = $em->getRepository('WallabagCoreBundle:Entry')
- ->findOneByUrl($array['url']);
-
- if (!is_object($entry)) {
- $entry = new Entry($user);
- $entry->setUrl($array['url']);
- }
-
- $entry->setTitle($array['title']);
- $entry->setArchived($array['is_read']);
- $entry->setStarred($array['is_fav']);
- $entry->setContent($array['content']);
- $entry->setReadingTime(Utils::getReadingTime($array['content']));
-
- $em->persist($entry);
-
- if (($i % $batchSize) === 0) {
- $em->flush();
- $progress->advance($batchSize);
-
- $now = new \DateTime();
- $output->writeln(' of entries imported ... | '.$now->format('d-m-Y G:i:s'));
- }
- ++$i;
+ switch ($input->getOption('importer')) {
+ case 'v2':
+ $import = $this->getContainer()->get('wallabag_import.wallabag_v2.import');
+ break;
+ case 'firefox':
+ $import = $this->getContainer()->get('wallabag_import.firefox.import');
+ break;
+ case 'chrome':
+ $import = $this->getContainer()->get('wallabag_import.chrome.import');
+ break;
+ case 'readability':
+ $import = $this->getContainer()->get('wallabag_import.readability.import');
+ break;
+ case 'instapaper':
+ $import = $this->getContainer()->get('wallabag_import.instapaper.import');
+ break;
+ case 'pinboard':
+ $import = $this->getContainer()->get('wallabag_import.pinboard.import');
+ break;
+ default:
+ $import = $this->getContainer()->get('wallabag_import.wallabag_v1.import');
}
- $em->flush();
- $em->clear();
- $progress->finish();
- }
-
- protected function convert($filename)
- {
- if (!file_exists($filename) || !is_readable($filename)) {
- return false;
- }
+ $import->setMarkAsRead($input->getOption('markAsRead'));
+ $import->setUser($user);
- $header = null;
- $data = array();
+ $res = $import
+ ->setFilepath($input->getArgument('filepath'))
+ ->import();
- if (($handle = fopen($filename, 'r')) !== false) {
- while (($row = fgets($handle)) !== false) {
- $data = json_decode($row);
- }
- fclose($handle);
+ if (true === $res) {
+ $summary = $import->getSummary();
+ $output->writeln('<info>'.$summary['imported'].' imported</info>');
+ $output->writeln('<comment>'.$summary['skipped'].' already saved</comment>');
}
- return $data;
- }
-
- protected function get(InputInterface $input, OutputInterface $output)
- {
- $filename = __DIR__.'/../../../../web/uploads/import/'.$input->getArgument('userId').'.json';
-
- $data = $this->convert($filename);
+ $em->clear();
- return $data;
+ $output->writeln('End : '.(new \DateTime())->format('d-m-Y G:i:s').' ---');
}
}