/** * Add a new video file into the mediawiki infrastructure so that it can * be accessed as {{whvid|filename.mp4|Preview.jpg}} */ public function addWikiHowVideo($articleId, &$video) { // find name for video; change filename to Filename 1.jpg if // Filename.jpg already existed $regexp = '/[^' . Title::legalChars() . ']+/'; $first = preg_replace($regexp, '', $video['first']); // Let's also remove " and ' since s3 doesn't seem to like $first = preg_replace('/["\']+/', '', $first); $ext = $video['ext']; $newName = $first . '.' . $ext; $i = 1; do { if (!WikiVideo::fileExists($newName)) { break; } $newName = $first . ' Version ' . ++$i . '.' . $ext; } while ($i <= 1000); // Move the file from one s3 bucket to another $ret = WikiVideo::copyFileToProd(WikiVisualTranscoder::AWS_TRANSCODING_OUT_BUCKET, $video['aws_uri_out'], $newName); if ($ret['error']) { return $ret['error']; } // instruct later processing about which mediawiki name was used $video['mediawikiName'] = $newName; // Add preview image $img = $video; $img['ext'] = 'jpg'; $err = Mp4Transcoder::addMediawikiImage($articleId, $img); if ($err) { return 'Unable to add preview image: ' . $err; } else { $video['previewMediawikiName'] = $img['mediawikiName']; // Cleanup temporary preview image if (!empty($img['filename'])) { $rmCmd = "rm " . $img['filename']; system($rmCmd); } } self::d(">>> addWikiHowVideo: video['mediawikiName']=" . $video['mediawikiName'] . ", video['previewMediawikiName']=" . $video['previewMediawikiName']); // Keep a log of where videos were uploaded in wikivideo_video_names table $dbw = WikiVisualTranscoder::getDB('write'); $vidname = $articleID . '/' . $video['name']; $sql = 'INSERT INTO wikivisual_vid_names SET filename=' . $dbw->addQuotes($vidname) . ', wikiname=' . $dbw->addQuotes($video['mediawikiName']); $dbw->query($sql, __METHOD__); return ''; }
/** * Add a new image file into the mediawiki infrastructure so that it can * be accessed as [[Image:filename.jpg]] */ private static function addMediawikiImage($articleID, &$image, $userIsScreenshotter) { // check if we've already uploaded this image $dupTitle = DupImage::checkDupImage($image['filename']); // if we've already uploaded this image, just return that filename if ($dupTitle) { $image['mediawikiName'] = $dupTitle; return true; } // find name for image; change filename to Filename 1.jpg if // Filename.jpg already existed $regexp = '/[^' . Title::legalChars() . ']+/'; $first = preg_replace($regexp, '', $image['first']); $ext = $image['ext']; $newName = $first . '.' . $ext; $i = 1; do { $title = Title::newFromText($newName, NS_IMAGE); if ($title && !$title->exists()) { break; } $newName = $first . ' Version ' . ++$i . '.' . $ext; } while ($i <= 1000); // insert image into wikihow mediawiki repos if (!$userIsScreenshotter) { $comment = '{{' . WikiVisualTranscoder::PHOTO_LICENSE . '}}'; } else { $comment = '{{' . WikiVisualTranscoder::SCREENSHOT_LICENSE . '}}'; } // next 6 lines taken and modified from // extensions/wikihow/eiu/Easyimageupload.body.php $title = Title::makeTitleSafe(NS_IMAGE, $newName); if (!$title) { return false; } $file = new LocalFile($title, RepoGroup::singleton()->getLocalRepo()); if (!$file) { return false; } $ret = $file->upload($image['filename'], $comment, $comment); if (!$ret->ok) { return false; } // instruct later processing about which mediawiki name was used $image['mediawikiName'] = $newName; // Add our uploaded image to the dup table so it's no uploaded again DupImage::addDupImage($image['filename'], $image['mediawikiName']); // Keep a log of where images were uploaded in wikiphoto_image_names table $dbw = WikiVisualTranscoder::getDB('write'); $imgname = $articleID . '/' . $image['name']; $sql = 'INSERT INTO wikivisual_photo_names SET filename=' . $dbw->addQuotes($imgname) . ', wikiname=' . $dbw->addQuotes($image['mediawikiName']); $dbw->query($sql, __METHOD__); return true; }
public function processMedia($aid, $creator, $videoList, $warning, $isHybridMedia) { //transcode or schedule transcode $this->removeOldTranscodingJobs($aid); $err = ''; $s3 = new S3(WH_AWS_WIKIVIDEO_PROD_ACCESS_KEY, WH_AWS_WIKIVIDEO_PROD_SECRET_KEY); $t = Title::newFromId($aid); if (!$t || !$t->exists()) { $err = 'Could not find article ID ' . $aid; } self::d("In Mp4Transcoder->processMedia \$t:" . $t . ", err :" . $err); if (!$err) { $transcodeDir = $aid . "-" . mt_rand(); foreach ($videoList as $video) { $transcodeInPath = $transcodeDir . "/" . $video['name']; $err = WikiVisualTranscoder::postFile($s3, $video['filename'], $transcodeInPath, WikiVisualTranscoder::AWS_TRANSCODING_IN_BUCKET); self::d("Posting " . $transcodeInPath . " to S3, err=" . $err); if (strlen($err)) { break; } $result = $this->createTranscodingJob($transcodeDir, $video['name']); if ($result['Status'] == 'Error') { $err = "Transcoding job creation error. file: {$transcodeInPath}, id: {$result[3]}, msg: {$result['2']}"; break; } self::d("Transcoding job created for " . $aid . " resule=" . $result); $this->dbRecordTranscodingJobStatus($aid, $result); } $url = WikiVisualTranscoder::makeWikihowURL($t); $status = $err ? WikiVisualTranscoder::STATUS_ERROR : WikiVisualTranscoder::STATUS_TRANSCODING; self::d("Transcoding job URL " . $url . ", status = " . $status); return array($err, $url, $status); // if ($err) { // self::dbSetArticleProcessed($aid, $creator, $err, $warning, $url, 0, $numSteps, 0, self::STATUS_ERROR, count($images)); // // We won't take any further actions on these jobs // // Clean up the transcoding jobs and any S3 URIs that might have been created. // //self::removeOldTranscodingJobs($aid); // } else { // self::dbSetArticleProcessed($aid, $creator, '', $warning, $url, count($videoList), 0, 0, self::STATUS_TRANSCODING, count($images)); // } } }
public function main() { date_default_timezone_set('America/Los_Angeles'); if (!$assocVideoExts) { self::$assocVideoExts = Utils::arrToAssoArr(self::$videoExts); self::$assocImgExts = Utils::arrToAssoArr(self::$imgExts); } $opts = getopt('bcd:e:f:', array('backup', 'cleanup', 'staging-dir:', 'exclude-article-id:', 'force:')); // $doBackup = isset ( $opts ['b'] ) || isset ( $opts ['backup'] ); $doCleanup = isset($opts['c']) || isset($opts['cleanup']); self::$stagingDir = @$opts['d'] ? @$opts['d'] : @$opts['staging-dir']; if (empty(self::$stagingDir)) { self::$stagingDir = self::DEFAULT_STAGING_DIR; } self::$debugArticleID = @$opts['f'] ? @$opts['f'] : @$opts['force']; $skipID = @$opts['e'] ? $opts['e'] : @$opts['exclude-article-id']; if ($skipID) { self::$excludeArticles[] = $skipID; } if ($_ENV['USER'] != 'apache') { self::e("script must be run as part of wikivisual-process-media.sh"); exit; } Misc::loginAsUser(self::MEDIA_USER); // if ($doBackup) { // $this->doS3Backup (); // } else if ($doCleanup) { $this->doS3Cleanup(); } else { $this->mp4Transcoder = new Mp4Transcoder(); $this->imageTranscoder = new ImageTranscoder(); $this->processTranscodingArticles(); //1st take care of articles which are under processing. $this->processS3Media(); } }