summaryrefslogtreecommitdiff
path: root/maintenance/importImages.php
diff options
context:
space:
mode:
Diffstat (limited to 'maintenance/importImages.php')
-rw-r--r--maintenance/importImages.php130
1 files changed, 78 insertions, 52 deletions
diff --git a/maintenance/importImages.php b/maintenance/importImages.php
index 8d92383d..54fd4e2d 100644
--- a/maintenance/importImages.php
+++ b/maintenance/importImages.php
@@ -31,12 +31,15 @@
* @author Mij <mij@bitchx.it>
*/
-$optionsWithArgs = array( 'extensions', 'comment', 'comment-file', 'comment-ext', 'user', 'license', 'sleep', 'limit', 'from', 'source-wiki-url' );
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/importImages.inc' );
+$optionsWithArgs = array(
+ 'extensions', 'comment', 'comment-file', 'comment-ext', 'summary', 'user',
+ 'license', 'sleep', 'limit', 'from', 'source-wiki-url', 'timestamp',
+);
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/importImages.inc';
$processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
-echo( "Import Images\n\n" );
+echo "Import Images\n\n";
# Need a path
if ( count( $args ) == 0 ) {
@@ -61,7 +64,7 @@ $extensions = isset( $options['extensions'] )
: $wgFileExtensions;
# Search the path provided for candidates for import
-$files = findFiles( $dir, $extensions );
+$files = findFiles( $dir, $extensions, isset( $options['search-recursively'] ) );
# Initialise the user for this operation
$user = isset( $options['user'] )
@@ -98,20 +101,24 @@ if ( $limit ) {
$limit = (int)$limit;
}
+$timestamp = isset( $options['timestamp'] ) ? $options['timestamp'] : false;
+
# Get the upload comment. Provide a default one in case there's no comment given.
-$comment = 'Importing image file';
+$comment = 'Importing file';
if ( isset( $options['comment-file'] ) ) {
- $comment = file_get_contents( $options['comment-file'] );
+ $comment = file_get_contents( $options['comment-file'] );
if ( $comment === false || $comment === null ) {
die( "failed to read comment file: {$options['comment-file']}\n" );
}
} elseif ( isset( $options['comment'] ) ) {
- $comment = $options['comment'];
+ $comment = $options['comment'];
}
$commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
+$summary = isset( $options['summary'] ) ? $options['summary'] : '';
+
# Get the license specifier
$license = isset( $options['license'] ) ? $options['license'] : '';
@@ -125,7 +132,7 @@ if ( $count > 0 ) {
# Validate a title
$title = Title::makeTitleSafe( NS_FILE, $base );
if ( !is_object( $title ) ) {
- echo( "{$base} could not be imported; a valid title cannot be produced\n" );
+ echo "{$base} could not be imported; a valid title cannot be produced\n";
continue;
}
@@ -141,7 +148,7 @@ if ( $count > 0 ) {
if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
$user->clearInstanceCache( 'name' ); // reload from DB!
if ( $user->isBlocked() ) {
- echo( $user->getName() . " was blocked! Aborting.\n" );
+ echo $user->getName() . " was blocked! Aborting.\n";
break;
}
}
@@ -150,10 +157,10 @@ if ( $count > 0 ) {
$image = wfLocalFile( $title );
if ( $image->exists() ) {
if ( isset( $options['overwrite'] ) ) {
- echo( "{$base} exists, overwriting..." );
+ echo "{$base} exists, overwriting...";
$svar = 'overwritten';
} else {
- echo( "{$base} exists, skipping\n" );
+ echo "{$base} exists, skipping\n";
$skipped++;
continue;
}
@@ -165,23 +172,24 @@ if ( $count > 0 ) {
$dupes = $repo->findBySha1( $sha1 );
if ( $dupes ) {
- echo( "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n" );
+ echo "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n";
$skipped++;
continue;
}
}
- echo( "Importing {$base}..." );
+ echo "Importing {$base}...";
$svar = 'added';
}
if ( isset( $options['source-wiki-url'] ) ) {
/* find comment text directly from source wiki, through MW's API */
$real_comment = getFileCommentFromSourceWiki( $options['source-wiki-url'], $base );
- if ( $real_comment === false )
+ if ( $real_comment === false ) {
$commentText = $comment;
- else
+ } else {
$commentText = $real_comment;
+ }
/* find user directly from source wiki, through MW's API */
$real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
@@ -191,7 +199,7 @@ if ( $count > 0 ) {
$wgUser = User::newFromName( $real_user );
if ( $wgUser === false ) {
# user does not exist in target wiki
- echo ( "failed: user '$real_user' does not exist in target wiki." );
+ echo "failed: user '$real_user' does not exist in target wiki.";
continue;
}
}
@@ -202,11 +210,11 @@ if ( $count > 0 ) {
if ( $commentExt ) {
$f = findAuxFile( $file, $commentExt );
if ( !$f ) {
- echo( " No comment file with extension {$commentExt} found for {$file}, using default comment. " );
+ echo " No comment file with extension {$commentExt} found for {$file}, using default comment. ";
} else {
$commentText = file_get_contents( $f );
if ( !$commentText ) {
- echo( " Failed to load comment file {$f}, using default comment. " );
+ echo " Failed to load comment file {$f}, using default comment. ";
}
}
}
@@ -218,23 +226,37 @@ if ( $count > 0 ) {
# Import the file
if ( isset( $options['dry'] ) ) {
- echo( " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... " );
+ echo " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... ";
} else {
- $archive = $image->publish( $file );
+ $props = FSFile::getPropsFromPath( $file );
+ $flags = 0;
+ $publishOptions = array();
+ $handler = MediaHandler::getHandler( $props['mime'] );
+ if ( $handler ) {
+ $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+ } else {
+ $publishOptions['headers'] = array();
+ }
+ $archive = $image->publish( $file, $flags, $publishOptions );
if ( !$archive->isGood() ) {
- echo( "failed. (" .
+ echo "failed. (" .
$archive->getWikiText() .
- ")\n" );
+ ")\n";
$failed++;
continue;
}
}
+ $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
+ if ( !isset( $options['summary'] ) ) {
+ $summary = $commentText;
+ }
+
if ( isset( $options['dry'] ) ) {
- echo( "done.\n" );
- } elseif ( $image->recordUpload( $archive->value, $commentText, $license ) ) {
+ echo "done.\n";
+ } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, $props, $timestamp ) ) {
# We're done!
- echo( "done.\n" );
+ echo "done.\n";
$doProtect = false;
@@ -257,21 +279,21 @@ if ( $count > 0 ) {
sleep( 2.0 ); # Why this sleep?
wfWaitForSlaves();
- echo( "\nSetting image restrictions ... " );
+ echo "\nSetting image restrictions ... ";
$cascade = false;
$restrictions = array();
- foreach( $title->getRestrictionTypes() as $type ) {
+ foreach ( $title->getRestrictionTypes() as $type ) {
$restrictions[$type] = $protectLevel;
}
$page = WikiPage::factory( $title );
$status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, '', $user );
- echo( ( $status->isOK() ? 'done' : 'failed' ) . "\n" );
+ echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
}
} else {
- echo( "failed. (at recordUpload stage)\n" );
+ echo "failed. (at recordUpload stage)\n";
$svar = 'failed';
}
@@ -288,23 +310,24 @@ if ( $count > 0 ) {
}
# Print out some statistics
- echo( "\n" );
+ echo "\n";
foreach ( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
'failed' => 'Failed' ) as $var => $desc ) {
- if ( $$var > 0 )
- echo( "{$desc}: {$$var}\n" );
+ if ( $$var > 0 ) {
+ echo "{$desc}: {$$var}\n";
+ }
}
} else {
- echo( "No suitable files could be found for import.\n" );
+ echo "No suitable files could be found for import.\n";
}
exit( 0 );
function showUsage( $reason = false ) {
if ( $reason ) {
- echo( $reason . "\n" );
+ echo $reason . "\n";
}
echo <<<TEXT
@@ -314,25 +337,28 @@ USAGE: php importImages.php [options] <dir>
<dir> : Path to the directory containing images to be imported
Options:
---extensions=<exts> Comma-separated list of allowable extensions, defaults to \$wgFileExtensions
---overwrite Overwrite existing images with the same name (default is to skip them)
---limit=<num> Limit the number of images to process. Ignored or skipped images are not counted.
---from=<name> Ignore all files until the one with the given name. Useful for resuming
- aborted imports. <name> should be the file's canonical database form.
---skip-dupes Skip images that were already uploaded under a different name (check SHA1)
---sleep=<sec> Sleep between files. Useful mostly for debugging.
---user=<username> Set username of uploader, default 'Maintenance script'
---check-userblock Check if the user got blocked during import.
---comment=<text> Set upload summary comment, default 'Importing image file'.
---comment-file=<file> Set upload summary comment the the content of <file>.
---comment-ext=<ext> Causes the comment for each file to be loaded from a file with the same name
- but the extension <ext>. If a global comment is also given, it is appended.
---license=<code> Use an optional license template
---dry Dry run, don't import anything
+--extensions=<exts> Comma-separated list of allowable extensions, defaults to \$wgFileExtensions
+--overwrite Overwrite existing images with the same name (default is to skip them)
+--limit=<num> Limit the number of images to process. Ignored or skipped images are not counted.
+--from=<name> Ignore all files until the one with the given name. Useful for resuming
+ aborted imports. <name> should be the file's canonical database form.
+--skip-dupes Skip images that were already uploaded under a different name (check SHA1)
+--search-recursively Search recursively for files in subdirectories
+--sleep=<sec> Sleep between files. Useful mostly for debugging.
+--user=<username> Set username of uploader, default 'Maintenance script'
+--check-userblock Check if the user got blocked during import.
+--comment=<text> Set file description, default 'Importing file'.
+--comment-file=<file> Set description to the content of <file>.
+--comment-ext=<ext> Causes the description for each file to be loaded from a file with the same name
+ but the extension <ext>. If a global description is also given, it is appended.
+--license=<code> Use an optional license template
+--dry Dry run, don't import anything
--protect=<protect> Specify the protect value (autoconfirmed,sysop)
+--summary=<summary> Upload summary, description will be used if not provided
+--timestamp=<timestamp> Override upload time/date, all MediaWiki timestamp formats are accepted
--unprotect Unprotects all uploaded images
---source-wiki-url if specified, take User and Comment data for each imported file from this URL.
- For example, --source-wiki-url="http://en.wikipedia.org/"
+--source-wiki-url If specified, take User and Comment data for each imported file from this URL.
+ For example, --source-wiki-url="http://en.wikipedia.org/"
TEXT;
exit( 1 );