2021-12-14 18:32:47 +00:00
< ? php
declare ( strict_types = 1 );
2012-08-24 00:03:46 +00:00
2023-01-10 22:44:09 +00:00
namespace Shimmie2 ;
2019-05-28 16:59:38 +00:00
class BulkAddCSV extends Extension
{
2020-02-04 00:46:36 +00:00
/** @var BulkAddCSVTheme */
2023-06-27 14:56:49 +00:00
protected Themelet $theme ;
2020-02-04 00:46:36 +00:00
2019-05-28 16:59:38 +00:00
public function onPageRequest ( PageRequestEvent $event )
{
2023-06-25 13:19:02 +00:00
global $page , $user ;
2019-05-28 16:59:38 +00:00
if ( $event -> page_matches ( " bulk_add_csv " )) {
2019-09-29 18:00:51 +00:00
if ( $user -> can ( Permissions :: BULK_ADD ) && $user -> check_auth_token () && isset ( $_POST [ 'csv' ])) {
2023-06-25 13:19:02 +00:00
shm_set_timeout ( null );
2019-05-28 16:59:38 +00:00
$this -> add_csv ( $_POST [ 'csv' ]);
$this -> theme -> display_upload_results ( $page );
}
}
}
2012-08-24 00:03:46 +00:00
2019-05-28 16:59:38 +00:00
public function onCommand ( CommandEvent $event )
{
if ( $event -> cmd == " help " ) {
2023-12-16 10:42:32 +00:00
print " \t bulk-add-csv [/path/to.csv] \n " ;
print " \t \t Import this .csv file (refer to documentation) \n \n " ;
2019-05-28 16:59:38 +00:00
}
if ( $event -> cmd == " bulk-add-csv " ) {
global $user ;
2019-08-07 19:53:59 +00:00
2019-05-28 16:59:38 +00:00
//Nag until CLI is admin by default
2019-09-29 18:00:51 +00:00
if ( ! $user -> can ( Permissions :: BULK_ADD )) {
2019-05-28 16:59:38 +00:00
print " Not running as an admin, which can cause problems. \n " ;
print " Please add the parameter: -u admin_username " ;
} elseif ( count ( $event -> args ) == 1 ) {
$this -> add_csv ( $event -> args [ 0 ]);
}
}
}
2012-08-24 00:03:46 +00:00
2019-05-28 16:59:38 +00:00
public function onAdminBuilding ( AdminBuildingEvent $event )
{
$this -> theme -> display_admin_block ();
}
2012-08-24 00:03:46 +00:00
2019-05-28 16:59:38 +00:00
/**
* Generate the necessary DataUploadEvent for a given image and tags .
*/
private function add_image ( string $tmpname , string $filename , string $tags , string $source , string $rating , string $thumbfile )
{
2023-02-22 23:37:37 +00:00
$event = add_image ( $tmpname , $filename , $tags , $source );
2019-05-28 16:59:38 +00:00
if ( $event -> image_id == - 1 ) {
throw new UploadException ( " File type not recognised " );
} else {
2023-01-10 22:44:09 +00:00
if ( class_exists ( " Shimmie2 \R atingSetEvent " ) && in_array ( $rating , [ " s " , " q " , " e " ])) {
2020-01-28 21:19:59 +00:00
send_event ( new RatingSetEvent ( Image :: by_id ( $event -> image_id ), $rating ));
2019-05-28 16:59:38 +00:00
}
if ( file_exists ( $thumbfile )) {
2019-06-15 16:18:52 +00:00
copy ( $thumbfile , warehouse_path ( Image :: THUMBNAIL_DIR , $event -> hash ));
2019-05-28 16:59:38 +00:00
}
}
}
2012-08-24 00:03:46 +00:00
2019-05-28 16:59:38 +00:00
private function add_csv ( string $csvfile )
{
if ( ! file_exists ( $csvfile )) {
$this -> theme -> add_status ( " Error " , " $csvfile not found " );
return ;
}
if ( ! is_file ( $csvfile ) || strtolower ( substr ( $csvfile , - 4 )) != " .csv " ) {
$this -> theme -> add_status ( " Error " , " $csvfile doesn't appear to be a csv file " );
return ;
}
2019-08-07 19:53:59 +00:00
2019-05-28 16:59:38 +00:00
$linenum = 1 ;
$list = " " ;
$csvhandle = fopen ( $csvfile , " r " );
2019-08-07 19:53:59 +00:00
2019-05-28 16:59:38 +00:00
while (( $csvdata = fgetcsv ( $csvhandle , 0 , " , " )) !== false ) {
if ( count ( $csvdata ) != 5 ) {
if ( strlen ( $list ) > 0 ) {
$this -> theme -> add_status ( " Error " , " <b>Encountered malformed data. Line $linenum $csvfile </b><br> " . $list );
fclose ( $csvhandle );
return ;
} else {
$this -> theme -> add_status ( " Error " , " <b>Encountered malformed data. Line $linenum $csvfile </b><br>Check <a href= \" " . make_link ( " ext_doc/bulk_add_csv " ) . " \" >here</a> for the expected format " );
fclose ( $csvhandle );
return ;
}
}
$fullpath = $csvdata [ 0 ];
$tags = trim ( $csvdata [ 1 ]);
$source = $csvdata [ 2 ];
$rating = $csvdata [ 3 ];
$thumbfile = $csvdata [ 4 ];
2023-02-22 23:37:37 +00:00
$shortpath = pathinfo ( $fullpath , PATHINFO_BASENAME );
2019-05-28 16:59:38 +00:00
$list .= " <br> " . html_escape ( " $shortpath ( " . str_replace ( " " , " , " , $tags ) . " )... " );
if ( file_exists ( $csvdata [ 0 ]) && is_file ( $csvdata [ 0 ])) {
try {
2023-02-22 23:37:37 +00:00
$this -> add_image ( $fullpath , $shortpath , $tags , $source , $rating , $thumbfile );
2019-05-28 16:59:38 +00:00
$list .= " ok \n " ;
2023-01-11 11:15:26 +00:00
} catch ( \Exception $ex ) {
2019-05-28 16:59:38 +00:00
$list .= " failed:<br> " . $ex -> getMessage ();
}
} else {
$list .= " failed:<br> File doesn't exist " . html_escape ( $csvdata [ 0 ]);
}
$linenum += 1 ;
}
2019-08-07 19:53:59 +00:00
2019-05-28 16:59:38 +00:00
if ( strlen ( $list ) > 0 ) {
$this -> theme -> add_status ( " Adding $csvfile " , $list );
}
fclose ( $csvhandle );
}
2012-08-24 00:03:46 +00:00
}