/** * get image list * @return array imageList */ public function getImageList($timestamp, $state = ImageReviewStatuses::STATE_UNREVIEWED, $order = self::ORDER_LATEST) { wfProfileIn(__METHOD__); $oDB = $this->getDatawareDB(DB_MASTER); $oDatabaseHelper = $this->getDatabaseHelper(); $oResults = $oDatabaseHelper->selectImagesForList($this->getOrder($order), self::LIMIT_IMAGES_FROM_DB, $state); $rows = array(); $updateWhere = array(); $iconsWhere = array(); while ($row = $oDB->fetchObject($oResults)) { $rows[] = $row; $updateWhere[] = "(wiki_id = {$row->wiki_id} and page_id = {$row->page_id})"; } $oDB->freeResult($oResults); # update records if (count($updateWhere) > 0) { $review_start = wfTimestamp(TS_DB, $timestamp); switch ($state) { case ImageReviewStatuses::STATE_QUESTIONABLE: $target_state = ImageReviewStatuses::STATE_QUESTIONABLE_IN_REVIEW; break; case ImageReviewStatuses::STATE_REJECTED: $target_state = ImageReviewStatuses::STATE_REJECTED_IN_REVIEW; break; default: $target_state = ImageReviewStatuses::STATE_IN_REVIEW; } $values = array('reviewer_id' => $this->user_id, 'review_start' => $review_start, 'state' => $target_state); if ($state == ImageReviewStatuses::STATE_QUESTIONABLE || $state == ImageReviewStatuses::STATE_REJECTED) { $values[] = "review_end = '0000-00-00 00:00:00'"; } $oDB->update('image_review', $values, array(implode(' OR ', $updateWhere)), __METHOD__); } $oDB->commit(); $imageList = $unusedImages = $aDeleteFromQueueList = []; foreach ($rows as $row) { $record = "(wiki_id = {$row->wiki_id} and page_id = {$row->page_id})"; if (count($imageList) < self::LIMIT_IMAGES) { $bDisplayImage = true; $oImagePage = GlobalTitle::newFromId($row->page_id, $row->wiki_id); if ($oImagePage instanceof GlobalTitle !== true) { $bDisplayImage = false; $sReason = 'Page does not exist'; } elseif ($oImagePage->isRedirect() === true) { $bDisplayImage = false; $sReason = 'Page is a redirect'; } else { $oImageGlobalFile = new GlobalFile($oImagePage); if ($oImageGlobalFile->exists() === false) { $bDisplayImage = false; $sReason = 'File does not exist'; } } if ($bDisplayImage === true && $oImageGlobalFile instanceof GlobalFile) { $sThumbUrl = $oImageGlobalFile->getUrlGenerator()->width(self::IMAGE_REVIEW_THUMBNAIL_SIZE)->height(self::IMAGE_REVIEW_THUMBNAIL_SIZE)->thumbnailDown()->url(); $aImageInfo = array('src' => $sThumbUrl, 'page' => $oImagePage->getFullUrl(), 'extension' => $oImageGlobalFile->getMimeType()); if (strpos('ico', $aImageInfo['extension'])) { $iconsWhere[] = $record; continue; } else { $isThumb = true; // Vignette handles .gif and .svg files $wikiRow = WikiFactory::getWikiByID($row->wiki_id); $imageList[] = array('wikiId' => $row->wiki_id, 'pageId' => $row->page_id, 'state' => $row->state, 'src' => $aImageInfo['src'], 'url' => $aImageInfo['page'], 'priority' => $row->priority, 'flags' => $row->flags, 'isthumb' => $isThumb, 'wiki_url' => isset($wikiRow->city_url) ? $wikiRow->city_url : ''); } } else { $aDeleteFromQueueList[] = ['wiki_id' => $row->wiki_id, 'page_id' => $row->page_id, 'reason' => $sReason]; continue; } } else { $unusedImages[] = $record; } } /** * Invalid images */ if (!empty($aDeleteFromQueueList)) { $this->createDeleteFromQueueTask($aDeleteFromQueueList); } /** * Icons */ if (!empty($iconsWhere)) { $aIconsValues = ['state' => ImageReviewStatuses::STATE_ICO_IMAGE]; $aIconsWhere = [implode('OR', $iconsWhere)]; $this->imageListAdditionalAction('icons', $oDB, $aIconsValues, $aIconsWhere); } /** * Unused images */ if (!empty($unusedImages)) { $aUnusedValues = ['reviewer_id = null', 'state' => $state]; $aUnusedWhere = [implode('OR', $unusedImages)]; $this->imageListAdditionalAction('unused', $oDB, $aUnusedValues, $aUnusedWhere); } /** * Return valid images list */ WikiaLogger::instance()->info("ImageReviewLog", ['method' => __METHOD__, 'message' => 'Fetched ' . count($imageList) . ' new images']); wfProfileOut(__METHOD__); return $imageList; }