/** * Get image list * * @param integer $userId ID of the user to get the list for * @param string $from Timestamp to get images before * @return array List of images */ public function getImageList($userId, $from = null) { wfProfileIn(__METHOD__); $imageList = []; $db = $this->getDatawareDB(DB_MASTER); $where = ['user_id' => $userId, 'state != ' . ImageReviewStatuses::STATE_DELETED . ' AND state != ' . ImageReviewStatuses::STATE_WIKI_DISABLED]; $from = wfTimestampOrNull(TS_DB, $from); if (!empty($from)) { $where[] = 'last_edited < ' . $db->addQuotes($from); } $result = $db->select(['image_review'], ['wiki_id, page_id, state, flags, priority, last_edited'], $where, __METHOD__, ['ORDER BY' => 'last_edited desc', 'LIMIT' => self::LIMIT_IMAGES]); foreach ($result as $row) { $img = ImagesService::getImageSrc($row->wiki_id, $row->page_id); $wikiRow = WikiFactory::getWikiByID($row->wiki_id); $extension = pathinfo(strtolower($img['page']), PATHINFO_EXTENSION); $isThumb = true; if (empty($img['src'])) { // If we don't have a thumb by this point, we still need to display something, fall back to placeholder $globalTitle = GlobalTitle::newFromId($row->page_id, $row->wiki_id); if (is_object($globalTitle)) { $img['page'] = $globalTitle->getFullUrl(); // @TODO this should be taken from the code instead of being hardcoded $img['src'] = '//images.wikia.com/central/images/8/8c/Wikia_image_placeholder.png'; } else { // This should never happen continue; } } if (in_array($extension, ['gif', 'svg'])) { $img = ImagesService::getImageOriginalUrl($row->wiki_id, $row->page_id); $isThumb = false; } $imageList[] = ['wikiId' => $row->wiki_id, 'pageId' => $row->page_id, 'state' => $row->state, 'src' => $img['src'], 'priority' => $row->priority, 'url' => $img['page'], 'isthumb' => $isThumb, 'flags' => $row->flags, 'wiki_url' => isset($wikiRow->city_url) ? $wikiRow->city_url : '', 'user_page' => '', 'last_edited' => $row->last_edited]; } $db->freeResult($result); wfProfileOut(__METHOD__); return $imageList; }
public function getImageUrl($wikiId, $pageId, $imgSize) { $data = ImagesService::getImageSrc($wikiId, $pageId, $imgSize); $url = !empty($data['src']) ? $data['src'] : null; return $url; }
/** * @param array $wikiInfo * @param int $width Image width * @param int $height Image height * @return array */ protected function getImageData($wikiInfo, $width = null, $height = null) { $imageName = $wikiInfo['image']; $crop = $width != null || $height != null; $width = $width !== null ? $width : static::DEFAULT_WIDTH; $height = $height !== null ? $height : static::DEFAULT_HEIGHT; $imgWidth = null; $imgHeight = null; $img = wfFindFile($imageName); if ($img instanceof WikiaLocalFile) { //found on en-corporate wiki $imgWidth = $img->getWidth(); $imgHeight = $img->getHeight(); if ($crop) { //get original image if no cropping $imageServing = new ImageServing(null, $width, $height); $imgUrl = $imageServing->getUrl($img, $width, $height); } else { $imgUrl = $img->getFullUrl(); } } else { $f = $this->findGlobalFileImage($imageName, $wikiInfo['lang'], $wikiInfo['id']); if ($f && $f->exists()) { $imgWidth = $f->getWidth(); $imgHeight = $f->getHeight(); if ($crop) { $globalTitle = $f->getTitle(); $imageService = new ImagesService(); $response = $imageService->getImageSrc($globalTitle->getCityId(), $globalTitle->getArticleID(), $width, $height); $imgUrl = $response['src']; } else { $imgUrl = $f->getUrl(); } } } if (isset($imgUrl)) { return ['image' => $imgUrl, 'original_dimensions' => ['width' => $imgWidth, 'height' => $imgHeight]]; } return ['image' => '']; }
/** * get image list * @return array imageList */ public function getImageList($timestamp, $state = ImageReviewStatuses::STATE_UNREVIEWED, $order = self::ORDER_LATEST) { $this->wf->ProfileIn(__METHOD__); // get images $db = $this->getDatawareDB(DB_MASTER); $result = $db->query(' SELECT pages.page_title_lower, image_review.wiki_id, image_review.page_id, image_review.state, image_review.flags, image_review.priority FROM ( SELECT image_review.wiki_id, image_review.page_id, image_review.state, image_review.flags, image_review.priority FROM `image_review` WHERE state = ' . $state . ' AND top_200 = false ORDER BY ' . $this->getOrder($order) . ' LIMIT ' . self::LIMIT_IMAGES_FROM_DB . ' ) as image_review LEFT JOIN pages ON (image_review.wiki_id=pages.page_wikia_id) AND (image_review.page_id=pages.page_id)'); $rows = array(); $updateWhere = array(); $iconsWhere = array(); while ($row = $db->fetchObject($result)) { $rows[] = $row; $updateWhere[] = "(wiki_id = {$row->wiki_id} and page_id = {$row->page_id})"; } $db->freeResult($result); # 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'"; } $db->update('image_review', $values, array(implode(' OR ', $updateWhere)), __METHOD__); } $db->commit(); $imageList = $invalidImages = $unusedImages = array(); foreach ($rows as $row) { $record = "(wiki_id = {$row->wiki_id} and page_id = {$row->page_id})"; if (count($imageList) < self::LIMIT_IMAGES) { $img = ImagesService::getImageSrc($row->wiki_id, $row->page_id); if (empty($img['src'])) { $invalidImages[] = $record; } elseif ('ico' == pathinfo(strtolower($img['src']), PATHINFO_EXTENSION)) { $iconsWhere[] = $record; } else { $imageList[] = array('wikiId' => $row->wiki_id, 'pageId' => $row->page_id, 'state' => $row->state, 'src' => $img['src'], 'url' => $img['page'], 'priority' => $row->priority, 'flags' => $row->flags); } } else { $unusedImages[] = $record; } } $commit = false; if (count($invalidImages) > 0) { $db->update('image_review', array('state' => ImageReviewStatuses::STATE_INVALID_IMAGE), array(implode(' OR ', $invalidImages)), __METHOD__); $commit = true; } if (count($iconsWhere) > 0) { $db->update('image_review', array('state' => ImageReviewStatuses::STATE_ICO_IMAGE), array(implode(' OR ', $iconsWhere)), __METHOD__); $commit = true; } if (count($unusedImages) > 0) { $db->update('image_review', array('reviewer_id = null', 'state' => $state), array(implode(' OR ', $unusedImages)), __METHOD__); $commit = true; error_log("ImageReview : returning " . count($unusedImages) . " back to the queue"); } if ($commit) { $db->commit(); } error_log("ImageReview : fetched new " . count($imageList) . " images"); $this->wf->ProfileOut(__METHOD__); return $imageList; }
/** * get image list from reviewer id based on the timestamp * Note: NOT update image state * @param integer $timestamp review_end * @return array images */ public function refetchImageListByTimestamp($timestamp) { wfProfileIn(__METHOD__); $db = $this->getDatawareDB(DB_SLAVE); // try to re-fetch the previuos set of images // TODO: optimize it, so we don't do it on every request $review_start = wfTimestamp(TS_DB, $timestamp); $result = $db->select(array('image_review'), array('wiki_id, page_id, state, flags, priority'), array('review_start' => $review_start, 'reviewer_id' => $this->user_id), __METHOD__, array('ORDER BY' => 'priority desc, last_edited desc', 'LIMIT' => self::LIMIT_IMAGES)); $imageList = array(); while ($row = $db->fetchObject($result)) { $img = ImagesService::getImageSrc($row->wiki_id, $row->page_id); $wikiRow = WikiFactory::getWikiByID($row->wiki_id); $tmp = array('wikiId' => $row->wiki_id, 'pageId' => $row->page_id, 'state' => $row->state, 'src' => $img['src'], 'priority' => $row->priority, 'url' => $img['page'], 'flags' => $row->flags, 'wiki_url' => isset($wikiRow->city_url) ? $wikiRow->city_url : '', 'user_page' => ''); if (!empty($tmp['src']) && !empty($tmp['url'])) { $imageList[] = $tmp; } } $db->freeResult($result); WikiaLogger::instance()->info("ImageReviewLog", ['method' => __METHOD__, 'message' => "Refetched " . count($imageList) . " images based on timestamp"]); wfProfileOut(__METHOD__); return $imageList; }