2015-12-30 13:26:30 +01:00
< ? php
namespace Wallabag\ImportBundle\Import ;
use Psr\Log\LoggerInterface ;
use Psr\Log\NullLogger ;
use Doctrine\ORM\EntityManager ;
use Wallabag\CoreBundle\Entity\Entry ;
use Wallabag\UserBundle\Entity\User ;
use Wallabag\CoreBundle\Tools\Utils ;
2016-02-11 13:27:17 +01:00
use Wallabag\CoreBundle\Helper\ContentProxy ;
2015-12-30 13:26:30 +01:00
class WallabagV1Import implements ImportInterface
{
2016-01-20 14:37:01 +01:00
protected $user ;
protected $em ;
protected $logger ;
2016-02-11 15:48:20 +01:00
protected $contentProxy ;
2016-01-20 14:37:01 +01:00
protected $skippedEntries = 0 ;
protected $importedEntries = 0 ;
protected $filepath ;
2016-02-12 15:59:13 +01:00
protected $markAsRead ;
2015-12-30 13:26:30 +01:00
2016-02-11 13:27:17 +01:00
public function __construct ( EntityManager $em , ContentProxy $contentProxy )
2015-12-30 13:26:30 +01:00
{
$this -> em = $em ;
$this -> logger = new NullLogger ();
2016-02-11 13:27:17 +01:00
$this -> contentProxy = $contentProxy ;
2015-12-30 13:26:30 +01:00
}
public function setLogger ( LoggerInterface $logger )
{
$this -> logger = $logger ;
}
/**
* We define the user in a custom call because on the import command there is no logged in user .
* So we can ' t retrieve user from the `security.token_storage` service .
*
* @ param User $user
*/
public function setUser ( User $user )
{
$this -> user = $user ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function getName ()
{
2016-01-05 22:38:09 +01:00
return 'wallabag v1' ;
2015-12-30 13:26:30 +01:00
}
2015-12-31 11:24:46 +01:00
/**
* { @ inheritdoc }
*/
public function getUrl ()
{
return 'import_wallabag_v1' ;
}
2015-12-30 13:26:30 +01:00
/**
* { @ inheritdoc }
*/
public function getDescription ()
{
2016-01-06 06:34:57 +01:00
return 'This importer will import all your wallabag v1 articles. On your config page, click on "JSON export" in the "Export your wallabag data" section. You will have a "wallabag-export-1-xxxx-xx-xx.json" file.' ;
2015-12-30 13:26:30 +01:00
}
/**
* { @ inheritdoc }
*/
public function import ()
{
if ( ! $this -> user ) {
2016-01-20 14:37:01 +01:00
$this -> logger -> error ( 'WallabagImport: user is not defined' );
2015-12-30 13:26:30 +01:00
return false ;
}
if ( ! file_exists ( $this -> filepath ) || ! is_readable ( $this -> filepath )) {
2016-01-20 14:37:01 +01:00
$this -> logger -> error ( 'WallabagImport: unable to read file' , array ( 'filepath' => $this -> filepath ));
2015-12-30 13:26:30 +01:00
return false ;
}
2015-12-31 11:24:46 +01:00
$data = json_decode ( file_get_contents ( $this -> filepath ), true );
if ( empty ( $data )) {
return false ;
}
$this -> parseEntries ( $data );
2015-12-30 13:26:30 +01:00
return true ;
}
/**
* { @ inheritdoc }
*/
public function getSummary ()
{
return [
'skipped' => $this -> skippedEntries ,
'imported' => $this -> importedEntries ,
];
}
/**
* Set file path to the json file .
*
* @ param string $filepath
*/
public function setFilepath ( $filepath )
{
$this -> filepath = $filepath ;
return $this ;
}
2016-02-12 15:59:13 +01:00
/**
* Set whether articles must be all marked as read .
*
* @ param bool $markAsRead
*/
public function setMarkAsRead ( $markAsRead )
{
$this -> markAsRead = $markAsRead ;
return $this ;
}
2015-12-30 13:26:30 +01:00
/**
* @ param $entries
*/
2016-01-20 14:37:01 +01:00
protected function parseEntries ( $entries )
2015-12-30 13:26:30 +01:00
{
2015-12-31 11:24:46 +01:00
$i = 1 ;
2016-02-11 15:48:20 +01:00
//Untitled in all languages from v1. This should never have been translated
$untitled = array ( 'Untitled' , 'Sans titre' , 'podle nadpisu' , 'Sin título' , 'با عنوان' , 'per titolo' , 'Sem título' , 'Без названия' , 'po naslovu' , 'Без назви' , 'No title found' , '' );
2015-12-31 11:24:46 +01:00
2015-12-30 13:26:30 +01:00
foreach ( $entries as $importedEntry ) {
$existingEntry = $this -> em
-> getRepository ( 'WallabagCoreBundle:Entry' )
2016-01-15 15:28:22 +01:00
-> findByUrlAndUserId ( $importedEntry [ 'url' ], $this -> user -> getId ());
2015-12-30 13:26:30 +01:00
if ( false !== $existingEntry ) {
++ $this -> skippedEntries ;
continue ;
}
// @see ContentProxy->updateEntry
$entry = new Entry ( $this -> user );
$entry -> setUrl ( $importedEntry [ 'url' ]);
2016-02-19 14:22:20 +01:00
2016-02-11 13:39:21 +01:00
if ( in_array ( $importedEntry [ 'title' ], $untitled )) {
2016-02-11 15:48:20 +01:00
$entry = $this -> contentProxy -> updateEntry ( $entry , $importedEntry [ 'url' ]);
2016-02-11 13:27:17 +01:00
} else {
$entry -> setContent ( $importedEntry [ 'content' ]);
$entry -> setTitle ( $importedEntry [ 'title' ]);
$entry -> setReadingTime ( Utils :: getReadingTime ( $importedEntry [ 'content' ]));
$entry -> setDomainName ( parse_url ( $importedEntry [ 'url' ], PHP_URL_HOST ));
}
2016-02-19 14:22:20 +01:00
2016-02-12 14:49:41 +01:00
if ( array_key_exists ( 'tags' , $importedEntry ) && $importedEntry [ 'tags' ] != '' ) {
2016-02-19 14:22:20 +01:00
$this -> contentProxy -> assignTagsToEntry (
$entry ,
$importedEntry [ 'tags' ]
);
2016-02-12 14:49:41 +01:00
}
2016-02-19 14:22:20 +01:00
2016-02-12 15:59:13 +01:00
$entry -> setArchived ( $importedEntry [ 'is_read' ] || $this -> markAsRead );
2015-12-30 13:26:30 +01:00
$entry -> setStarred ( $importedEntry [ 'is_fav' ]);
$this -> em -> persist ( $entry );
++ $this -> importedEntries ;
2015-12-31 11:24:46 +01:00
// flush every 20 entries
if (( $i % 20 ) === 0 ) {
2016-01-03 10:59:55 +01:00
$this -> em -> flush ();
2015-12-31 11:24:46 +01:00
}
++ $i ;
2015-12-30 13:26:30 +01:00
}
$this -> em -> flush ();
}
}