2015-09-30 11:43:25 +02:00
|
|
|
<?php
|
|
|
|
|
2024-02-19 01:30:12 +01:00
|
|
|
namespace Wallabag\Command\Import;
|
2015-09-30 11:43:25 +02:00
|
|
|
|
2023-12-25 11:19:39 +01:00
|
|
|
use Doctrine\DBAL\Driver\Middleware;
|
|
|
|
use Doctrine\DBAL\Logging\Middleware as LoggingMiddleware;
|
2022-12-15 20:57:02 +01:00
|
|
|
use Doctrine\ORM\EntityManagerInterface;
|
2015-09-30 15:10:46 +02:00
|
|
|
use Symfony\Component\Config\Definition\Exception\Exception;
|
2022-12-15 20:57:02 +01:00
|
|
|
use Symfony\Component\Console\Command\Command;
|
2015-09-30 14:22:38 +02:00
|
|
|
use Symfony\Component\Console\Input\InputArgument;
|
2015-09-30 11:43:25 +02:00
|
|
|
use Symfony\Component\Console\Input\InputInterface;
|
2017-07-01 09:52:38 +02:00
|
|
|
use Symfony\Component\Console\Input\InputOption;
|
2015-09-30 11:43:25 +02:00
|
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
2022-08-28 02:01:46 +02:00
|
|
|
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
2020-04-11 14:01:00 +02:00
|
|
|
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
|
2024-02-19 01:30:12 +01:00
|
|
|
use Wallabag\Entity\User;
|
|
|
|
use Wallabag\Import\ChromeImport;
|
|
|
|
use Wallabag\Import\DeliciousImport;
|
|
|
|
use Wallabag\Import\ElcuratorImport;
|
|
|
|
use Wallabag\Import\FirefoxImport;
|
|
|
|
use Wallabag\Import\InstapaperImport;
|
2024-11-11 09:25:31 +01:00
|
|
|
use Wallabag\Import\OmnivoreImport;
|
2024-02-19 01:30:12 +01:00
|
|
|
use Wallabag\Import\PinboardImport;
|
|
|
|
use Wallabag\Import\PocketHtmlImport;
|
|
|
|
use Wallabag\Import\ReadabilityImport;
|
|
|
|
use Wallabag\Import\ShaarliImport;
|
|
|
|
use Wallabag\Import\WallabagV1Import;
|
|
|
|
use Wallabag\Import\WallabagV2Import;
|
|
|
|
use Wallabag\Repository\UserRepository;
|
2015-09-30 11:43:25 +02:00
|
|
|
|
2022-12-15 20:57:02 +01:00
|
|
|
class ImportCommand extends Command
|
2015-09-30 11:43:25 +02:00
|
|
|
{
|
2024-02-02 23:24:33 +01:00
|
|
|
protected static $defaultName = 'wallabag:import';
|
|
|
|
protected static $defaultDescription = 'Import entries from a JSON export';
|
|
|
|
|
2023-07-26 12:49:30 +02:00
|
|
|
public function __construct(
|
2025-04-05 13:59:36 +02:00
|
|
|
private readonly EntityManagerInterface $entityManager,
|
|
|
|
private readonly TokenStorageInterface $tokenStorage,
|
|
|
|
private readonly UserRepository $userRepository,
|
|
|
|
private readonly WallabagV2Import $wallabagV2Import,
|
|
|
|
private readonly FirefoxImport $firefoxImport,
|
|
|
|
private readonly ChromeImport $chromeImport,
|
|
|
|
private readonly ReadabilityImport $readabilityImport,
|
|
|
|
private readonly InstapaperImport $instapaperImport,
|
|
|
|
private readonly PinboardImport $pinboardImport,
|
|
|
|
private readonly DeliciousImport $deliciousImport,
|
|
|
|
private readonly WallabagV1Import $wallabagV1Import,
|
|
|
|
private readonly ElcuratorImport $elcuratorImport,
|
|
|
|
private readonly ShaarliImport $shaarliImport,
|
|
|
|
private readonly PocketHtmlImport $pocketHtmlImport,
|
|
|
|
private readonly OmnivoreImport $omnivoreImport,
|
2023-07-26 12:49:30 +02:00
|
|
|
) {
|
2022-12-15 20:57:02 +01:00
|
|
|
parent::__construct();
|
|
|
|
}
|
|
|
|
|
2015-09-30 11:43:25 +02:00
|
|
|
protected function configure()
|
|
|
|
{
|
|
|
|
$this
|
2017-05-04 11:53:44 +02:00
|
|
|
->addArgument('username', InputArgument::REQUIRED, 'User to populate')
|
2015-12-30 13:26:30 +01:00
|
|
|
->addArgument('filepath', InputArgument::REQUIRED, 'Path to the JSON file')
|
2023-07-26 12:49:30 +02:00
|
|
|
->addOption('importer', null, InputOption::VALUE_OPTIONAL, 'The importer to use: v1, v2, instapaper, pinboard, delicious, readability, firefox, chrome, elcurator, shaarli or pocket', 'v1')
|
2017-06-01 15:44:36 +02:00
|
|
|
->addOption('markAsRead', null, InputOption::VALUE_OPTIONAL, 'Mark all entries as read', false)
|
|
|
|
->addOption('useUserId', null, InputOption::VALUE_NONE, 'Use user id instead of username to find account')
|
2016-12-07 15:16:49 -05:00
|
|
|
->addOption('disableContentUpdate', null, InputOption::VALUE_NONE, 'Disable fetching updated content from URL')
|
2015-12-30 13:26:30 +01:00
|
|
|
;
|
2015-09-30 11:43:25 +02:00
|
|
|
}
|
|
|
|
|
2025-01-18 23:56:06 +01:00
|
|
|
protected function execute(InputInterface $input, OutputInterface $output): int
|
2015-09-30 11:43:25 +02:00
|
|
|
{
|
2017-07-01 09:52:38 +02:00
|
|
|
$output->writeln('Start : ' . (new \DateTime())->format('d-m-Y G:i:s') . ' ---');
|
2015-09-30 11:43:25 +02:00
|
|
|
|
2016-09-11 21:40:08 +02:00
|
|
|
if (!file_exists($input->getArgument('filepath'))) {
|
2024-08-14 16:39:36 +02:00
|
|
|
throw new Exception(\sprintf('File "%s" not found', $input->getArgument('filepath')));
|
2016-09-11 21:40:08 +02:00
|
|
|
}
|
|
|
|
|
2015-09-30 11:43:25 +02:00
|
|
|
// Turning off doctrine default logs queries for saving memory
|
2023-12-25 11:19:39 +01:00
|
|
|
$middlewares = $this->entityManager->getConnection()->getConfiguration()->getMiddlewares();
|
2025-04-05 13:20:44 +02:00
|
|
|
$middlewaresWithoutLogging = array_filter($middlewares, fn (Middleware $middleware) => !$middleware instanceof LoggingMiddleware);
|
2023-12-25 11:19:39 +01:00
|
|
|
$this->entityManager->getConnection()->getConfiguration()->setMiddlewares($middlewaresWithoutLogging);
|
2015-09-30 11:43:25 +02:00
|
|
|
|
2017-05-04 11:53:44 +02:00
|
|
|
if ($input->getOption('useUserId')) {
|
2022-12-15 20:57:02 +01:00
|
|
|
$entityUser = $this->userRepository->findOneById($input->getArgument('username'));
|
2017-05-04 11:53:44 +02:00
|
|
|
} else {
|
2022-12-15 20:57:02 +01:00
|
|
|
$entityUser = $this->userRepository->findOneByUsername($input->getArgument('username'));
|
2017-05-04 11:53:44 +02:00
|
|
|
}
|
2015-09-30 15:10:46 +02:00
|
|
|
|
2020-04-11 14:01:00 +02:00
|
|
|
if (!\is_object($entityUser)) {
|
2024-08-14 16:39:36 +02:00
|
|
|
throw new Exception(\sprintf('User "%s" not found', $input->getArgument('username')));
|
2015-09-30 15:10:46 +02:00
|
|
|
}
|
|
|
|
|
2020-04-11 14:01:00 +02:00
|
|
|
// Authenticate user for paywalled websites
|
|
|
|
$token = new UsernamePasswordToken(
|
|
|
|
$entityUser,
|
|
|
|
'main',
|
|
|
|
$entityUser->getRoles());
|
|
|
|
|
2022-12-15 20:57:02 +01:00
|
|
|
$this->tokenStorage->setToken($token);
|
|
|
|
$user = $this->tokenStorage->getToken()->getUser();
|
2020-04-11 14:01:00 +02:00
|
|
|
|
2025-04-05 13:56:56 +02:00
|
|
|
$import = match ($input->getOption('importer')) {
|
|
|
|
'v2' => $this->wallabagV2Import,
|
|
|
|
'firefox' => $this->firefoxImport,
|
|
|
|
'chrome' => $this->chromeImport,
|
|
|
|
'readability' => $this->readabilityImport,
|
|
|
|
'instapaper' => $this->instapaperImport,
|
|
|
|
'pinboard' => $this->pinboardImport,
|
|
|
|
'delicious' => $this->deliciousImport,
|
|
|
|
'elcurator' => $this->elcuratorImport,
|
|
|
|
'shaarli' => $this->shaarliImport,
|
|
|
|
'pocket' => $this->pocketHtmlImport,
|
|
|
|
'omnivore' => $this->omnivoreImport,
|
|
|
|
default => $this->wallabagV1Import,
|
|
|
|
};
|
2016-04-27 20:30:24 +02:00
|
|
|
|
2016-11-02 07:10:57 +01:00
|
|
|
$import->setMarkAsRead($input->getOption('markAsRead'));
|
2016-12-07 15:16:49 -05:00
|
|
|
$import->setDisableContentUpdate($input->getOption('disableContentUpdate'));
|
2016-11-02 07:10:57 +01:00
|
|
|
$import->setUser($user);
|
2016-04-27 20:30:24 +02:00
|
|
|
|
2016-11-02 07:10:57 +01:00
|
|
|
$res = $import
|
2015-12-30 13:26:30 +01:00
|
|
|
->setFilepath($input->getArgument('filepath'))
|
|
|
|
->import();
|
2015-09-30 11:43:25 +02:00
|
|
|
|
2015-12-30 13:26:30 +01:00
|
|
|
if (true === $res) {
|
2016-11-02 07:10:57 +01:00
|
|
|
$summary = $import->getSummary();
|
2017-07-01 09:52:38 +02:00
|
|
|
$output->writeln('<info>' . $summary['imported'] . ' imported</info>');
|
|
|
|
$output->writeln('<comment>' . $summary['skipped'] . ' already saved</comment>');
|
2015-09-30 11:43:25 +02:00
|
|
|
}
|
|
|
|
|
2022-12-15 20:57:02 +01:00
|
|
|
$this->entityManager->clear();
|
2015-09-30 11:43:25 +02:00
|
|
|
|
2017-07-01 09:52:38 +02:00
|
|
|
$output->writeln('End : ' . (new \DateTime())->format('d-m-Y G:i:s') . ' ---');
|
2022-11-23 15:51:33 +01:00
|
|
|
|
|
|
|
return 0;
|
2015-09-30 11:43:25 +02:00
|
|
|
}
|
|
|
|
}
|