コード例 #1
0
 /**
  * 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 '';
 }
コード例 #2
0
 /**
  * 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;
 }
コード例 #3
0
 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));
         // 			}
     }
 }
コード例 #4
0
 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();
     }
 }