/** * @return array - list of vertical videos (premium videos) */ public function getModuleVideos() { $filter = 'all'; $paddedLimit = $this->getPaddedVideoLimit($this->limit); $mediaService = new \MediaQueryService(); $videoList = $mediaService->getVideoList($this->sort, $filter, $paddedLimit); $videosWithDetails = $this->getVideoDetailFromLocalWiki($videoList); foreach ($videosWithDetails as $video) { if ($this->atVideoLimit()) { break; } $this->addVideo($video); } return $this->videos; }
/** * Display info about the video below the video player: provider, views, expiration date (if any) */ public function getVideoInfoLine($file) { wfProfileIn(__METHOD__); $app = F::app(); $captionDetails = array('expireDate' => $file->getExpirationDate(), 'provider' => $file->getProviderName(), 'providerUrl' => $file->getProviderHomeUrl(), 'detailUrl' => $file->getProviderDetailUrl(), 'views' => MediaQueryService::getTotalVideoViewsByTitle($file->getTitle()->getDBKey()), 'regionalRestrictions' => $file->getRegionalRestrictions()); $caption = $app->renderView('FilePageController', 'videoCaption', $captionDetails); wfProfileOut(__METHOD__); return $caption; }
private function videoEntry(Title $title) { $entries = array(); $articleVideos = $this->mMediaService->getMediaFromArticle($title, MediaQueryService::MEDIA_TYPE_VIDEO); foreach ($articleVideos as $videoTitleData) { $metaData = $videoTitleData['meta']; if ($metaData['canEmbed'] === 0) { continue; } $description = !empty($videoTitleData['desc']) ? $videoTitleData['desc'] : (!empty($metaData['description']) ? $metaData['description'] : $videoTitleData['title']); $entry = "\t\t<video:video>\n" . "\t\t\t<video:title><![CDATA[{$videoTitleData['title']}]]></video:title>\n" . "\t\t\t<video:description><![CDATA[{$description}]]></video:description>\n" . (!empty($videoTitleData['thumbUrl']) ? "\t\t\t<video:thumbnail_loc>{$videoTitleData['thumbUrl']}</video:thumbnail_loc>\n" : "") . ($metaData['srcType'] == 'player' ? "\t\t\t<video:player_loc allow_embed=\"yes\" " . (!empty($metaData['autoplayParam']) ? "autoplay=\"{$metaData['autoplayParam']}\"" : "") . ">" . htmlentities($metaData['srcParam']) . "</video:player_loc>\n" : "\t\t\t<video:content_loc>" . htmlentities($metaData['srcParam']) . "</video:content_loc>\n") . (!empty($metaData['duration']) ? "\t\t\t<video:duration>{$metaData['duration']}</video:duration>\n" : "") . "\t\t\t<video:family_friendly>yes</video:family_friendly>\n" . "\t\t</video:video>\n"; $entries[] = $entry; } return implode("\t\n", $entries); }
private function videoEntry(Title $title) { wfProfileIn(__METHOD__); $file = wfFindFile($title); $videoTitleData = $this->mMediaService->getMediaData($title, 500); $isVideo = WikiaFileHelper::isFileTypeVideo($file); if (!$isVideo) { wfProfileOut(__METHOD__); return ''; } $metaData = $videoTitleData['meta']; if ($videoTitleData['type'] != MediaQueryService::MEDIA_TYPE_VIDEO || $metaData['canEmbed'] === 0) { wfProfileOut(__METHOD__); return ''; } $description = !empty($videoTitleData['desc']) ? $videoTitleData['desc'] . ' ' : (!empty($metaData['description']) ? $metaData['description'] . ' ' : ''); $description .= $videoTitleData['title']; $entry = "\t\t<video:video>\n" . "\t\t\t<video:title><![CDATA[{$videoTitleData['title']}]]></video:title>\n" . "\t\t\t<video:description><![CDATA[{$description}]]></video:description>\n" . (!empty($videoTitleData['thumbUrl']) ? "\t\t\t<video:thumbnail_loc>{$videoTitleData['thumbUrl']}</video:thumbnail_loc>\n" : "") . ($metaData['srcType'] == 'player' ? "\t\t\t<video:player_loc allow_embed=\"yes\" " . (!empty($metaData['autoplayParam']) ? "autoplay=\"{$metaData['autoplayParam']}\"" : "") . ">" . htmlentities($metaData['srcParam']) . "</video:player_loc>\n" : "\t\t\t<video:content_loc>" . htmlentities($metaData['srcParam']) . "</video:content_loc>\n") . (!empty($metaData['duration']) ? "\t\t\t<video:duration>{$metaData['duration']}</video:duration>\n" : "") . "\t\t\t<video:family_friendly>yes</video:family_friendly>\n" . "\t\t</video:video>\n"; wfProfileOut(__METHOD__); return $entry; }
function query() { global $wgRequest, $wgHTTPProxy; $query = $wgRequest->getText('query'); $page = $wgRequest->getVal('page', 1); $sourceId = $wgRequest->getVal('sourceId'); if ($sourceId == 1) { $flickrAPI = new phpFlickr('bac0bd138f5d0819982149f67c0ca734'); $proxyArr = explode(':', $wgHTTPProxy); $flickrAPI->setProxy($proxyArr[0], $proxyArr[1]); $flickrResult = $flickrAPI->photos_search(array('tags' => $query, 'tag_mode' => 'all', 'page' => $page, 'per_page' => 8, 'license' => '4,5', 'sort' => 'interestingness-desc')); $tmpl = new EasyTemplate(dirname(__FILE__) . '/templates/'); $tmpl->set_vars(array('results' => $flickrResult, 'query' => addslashes($query))); return $tmpl->render('results_flickr'); } else { if ($sourceId == 0) { if ((int) $page == 0) { $page = 1; } $mediaService = new MediaQueryService(); $results = $mediaService->searchInTitle($query, $page, 8); $tmpl = new EasyTemplate(dirname(__FILE__) . '/templates/'); $tmpl->set_vars(array('results' => $results, 'query' => addslashes($query))); return $tmpl->render('results_thiswiki'); } } }
/** * Return thumbs of images search result */ public static function getSearchResultThumbs($query, $limit = 50) { wfProfileIn(__METHOD__); $images = array(); if (!empty($query)) { $mediaService = new MediaQueryService(); $results = $mediaService->searchInTitle($query, 1, $limit); if (!empty($results['images'])) { foreach ($results['images'] as $img) { $oImageTitle = Title::newFromText($img['title'], NS_FILE); $thumb = self::getResultsThumbnailUrl($oImageTitle); if ($thumb) { $images[] = array('name' => $oImageTitle->getText(), 'thumb' => $thumb); } } } } wfProfileOut(__METHOD__); return $images; }
public function execute() { $this->test = $this->hasOption('test'); $this->verbose = $this->hasOption('verbose'); $workingVideos = 0; $deletedVideos = 0; $privateVideos = 0; $otherErrorVideos = 0; $log = WikiaLogger::instance(); // Only write to memcache, no reads. We want to make sure to always talk to each of the provider's API directly. // Since each time a request is made to these APIs the response is cached for 1 day, disallow memcache reads // so we can be sure to not be pulling stale data. F::app()->wg->AllowMemcacheReads = false; F::app()->wg->AllowMemcacheWrites = true; $this->debug("(debugging output enabled)\n "); $allVideos = $this->getVideos(); foreach ($allVideos as $provider => $videos) { $class = ucfirst($provider) . "ApiWrapper"; foreach ($videos as $video) { try { // No need to assign this object to anything, we're just trying to catch exceptions during its creation new $class($video['video_id']); // If an exception isn't thrown by this point, we know the video is still good $this->debug("Found working video: " . $video['video_title']); $workingVideos++; } catch (Exception $e) { $removeVideo = true; $loggingParams = ["video_title" => $video["video_title"], "video_id" => $video["video_id"], "error" => $e->getMessage(), "exception" => get_class($e), "status_code" => $e->getStatusCode()]; $log->info("Video with error encountered", $loggingParams); if ($e instanceof VideoNotFoundException) { $this->debug("Found deleted video: " . $video['video_title']); $deletedVideos++; $status = self::STATUS_DELETED; } elseif ($e instanceof VideoIsPrivateException) { $this->debug("Found private video: " . $video['video_title']); $privateVideos++; $status = self::STATUS_PRIVATE; } else { $this->debug("Found other video: " . $video['video_title']); $this->debug($e->getMessage()); $otherErrorVideos++; $status = self::STATUS_OTHER_ERROR; $removeVideo = false; } if (!$this->test) { wfSetWikiaPageProp(WPP_VIDEO_STATUS, $video['page_id'], $status); if ($removeVideo) { $this->setRemovedValue($video, $removeVideo); } } } } } if (!$this->test) { $mediaService = new MediaQueryService(); $mediaService->clearCacheTotalVideos(); $memcKeyRecent = wfMemcKey('videomodule', 'local_videos', VideosModule::CACHE_VERSION, "recent"); F::app()->wg->Memc->delete($memcKeyRecent); } echo "\n========SUMMARY========\n"; echo "Found {$workingVideos} working videos\n"; echo "Found {$deletedVideos} deleted videos\n"; echo "Found {$privateVideos} private videos\n"; echo "Found {$otherErrorVideos} other videos\n"; }
/** * Add given number of recently uploaded images to slideshow */ private function addRecentlyUploaded($limit) { wfProfileIn(__METHOD__); $uploadedImages = MediaQueryService::getRecentlyUploaded($limit); // remove images already added to slideshow $this->mFiles = array(); $this->mData['imagesShown'] = array(); // add recently uploaded images to slideshow if (!empty($uploadedImages)) { /** @var Title $image */ foreach ($uploadedImages as $image) { $this->add($image); // store list of images (to be used by front-end) $this->mData['imagesShown'][] = array('name' => $image->getText(), 'caption' => '', 'link' => '', 'linktext' => '', 'recentlyUploaded' => true, 'shorttext' => ''); // Only add real images (bug #5586) if ($image->getNamespace() == NS_FILE) { $this->mParser->mOutput->addImage($image->getDBkey()); } } } wfProfileOut(__METHOD__); }
/** * Get list of videos (controller that provides access to MediaQueryService::getVideoList method) * @requestParam string sort [recent/popular/trend] * @requestParam integer limit (maximum = 100) * @requestParam integer page * @requestParam string|array providers - Only videos hosted by these providers will be returned. Default: all providers. * @requestParam string|array category - Only videos tagged with these categories will be returned. Default: any categories. * @requestParam integer width - the width of the thumbnail to return * @requestParam integer height - the height of the thumbnail to return * @requestParam integer detail [0/1] - check for getting video detail * @responseParam array * [array('title'=>value, 'provider'=>value, 'addedAt'=>value,'addedBy'=>value, 'duration'=>value, 'viewsTotal'=>value)] */ public function getVideoList() { wfProfileIn(__METHOD__); $params = $this->getVideoListParams(); // Key to cache the data under in memcache $cacheKey = $this->getVideoListCacheKey($params); $cacheOptions = ['cacheTTL' => \WikiaResponse::CACHE_STANDARD, 'negativeCacheTTL' => 0]; // Retrieve the result and if not null, cache it $videoList = \WikiaDataAccess::cacheWithOptions($cacheKey, function () use($params) { $mediaService = new \MediaQueryService(); $videoList = $mediaService->getVideoList($params['sort'], $params['filter'], $params['limit'], $params['page'], $params['providers'], $params['category']); // get video detail if (!empty($params['detail'])) { $videoOptions = ['thumbWidth' => $params['width'], 'thumbHeight' => $params['height']]; $helper = new \VideoHandlerHelper(); foreach ($videoList as &$videoInfo) { $videoDetail = $helper->getVideoDetail($videoInfo, $videoOptions); if (!empty($videoDetail)) { $videoInfo = array_merge($videoInfo, $videoDetail); } } unset($videoInfo); } return $videoList; }, $cacheOptions); $this->response->setVal('videos', $videoList); $this->response->setCacheValidity(\WikiaResponse::CACHE_STANDARD); wfProfileOut(__METHOD__); }
private function getVideoInfo($title) { $mediaService = new MediaQueryService(); $mediaInfo = $mediaService->getMediaData($title); if (!empty($mediaInfo)) { if ($mediaInfo['type'] === 'video') { $type = 'video'; $provider = $mediaInfo['meta']['provider']; $thumbUrl = $mediaInfo['thumbUrl']; $videoId = $mediaInfo['meta']['videoId']; return [$type, ['provider' => $provider, 'thumb_url' => $thumbUrl, 'videoId' => $videoId]]; } } return [null, null]; }
/** * @static * @param Title $fileTitle * @param array $config ( contextWidth, contextHeight, imageMaxWidth, userAvatarWidth ) * TODO - this method is very specific to lightbox. This needs to be refactored back out to lightbox, and return just the basic objects (file, user, tect) * @return array */ public static function getMediaDetail($fileTitle, $config = array()) { $data = array('mediaType' => '', 'videoEmbedCode' => '', 'playerAsset' => '', 'imageUrl' => '', 'fileUrl' => '', 'rawImageUrl' => '', 'description' => '', 'userThumbUrl' => '', 'userId' => '', 'userName' => '', 'userPageUrl' => '', 'articles' => array(), 'providerName' => '', 'videoViews' => 0, 'exists' => false, 'isAdded' => true, 'extraHeight' => 0); if (!empty($fileTitle)) { if ($fileTitle->getNamespace() != NS_FILE) { $fileTitle = Title::newFromText($fileTitle->getDBKey(), NS_FILE); } $file = self::getFileFromTitle($fileTitle, true); if (!empty($file)) { $config = self::getMediaDetailConfig($config); $data['exists'] = true; $data['mediaType'] = self::isFileTypeVideo($file) ? 'video' : 'image'; $width = (int) $file->getWidth(); $height = (int) $file->getHeight(); if ($data['mediaType'] == 'video') { $width = $config['contextWidth'] ? $config['contextWidth'] : $width; $height = $config['contextHeight'] ? $config['contextHeight'] : $height; if (isset($config['maxHeight'])) { $file->setEmbedCodeMaxHeight($config['maxHeight']); } $options = ['autoplay' => true, 'isAjax' => true, 'isInline' => !empty($config['isInline'])]; $data['videoEmbedCode'] = $file->getEmbedCode($width, $options); $data['playerAsset'] = $file->getPlayerAssetUrl(); $data['videoViews'] = MediaQueryService::getTotalVideoViewsByTitle($fileTitle->getDBKey()); $data['providerName'] = $file->getProviderName(); $data['duration'] = $file->getMetadataDuration(); $data['isAdded'] = self::isAdded($file); $mediaPage = self::getMediaPage($fileTitle); // Extra height is needed for lightbox when more elements must be fitted if (strtolower($data['providerName']) == 'crunchyroll') { $data['extraHeight'] = CrunchyrollVideoHandler::CRUNCHYROLL_WIDGET_HEIGHT_PX; } } else { $width = !empty($config['imageMaxWidth']) ? min($config['imageMaxWidth'], $width) : $width; $mediaPage = new ImagePage($fileTitle); } $thumb = $file->transform(array('width' => $width, 'height' => $height), 0); $user = User::newFromId($file->getUser('id')); // get article list $mediaQuery = new ArticlesUsingMediaQuery($fileTitle); $articleList = $mediaQuery->getArticleList(); if ($data['isAdded']) { $data['fileUrl'] = $fileTitle->getFullUrl(); } else { $data['fileUrl'] = self::getFullUrlPremiumVideo($fileTitle->getDBkey()); } $data['imageUrl'] = $thumb->getUrl(); $data['rawImageUrl'] = $file->getUrl(); $data['userId'] = $user->getId(); $data['userName'] = $user->getName(); $data['userThumbUrl'] = AvatarService::getAvatarUrl($user, $config['userAvatarWidth']); $data['userPageUrl'] = $user->getUserPage()->getFullURL(); $data['description'] = $mediaPage->getContent(); $data['articles'] = $articleList; $data['width'] = $width; $data['height'] = $height; } } return $data; }
/** * check if premium video exists * @return integer $videoExist [0/1] */ public function premiumVideosExist() { $mediaService = new MediaQueryService(); $videoExist = (bool) $mediaService->getTotalPremiumVideos(); return $videoExist; }
public function onThumbnailVideoHTML($options, $linkAttribs, $imageAttribs, File $file, &$html) { $this->wf->profileIn(__METHOD__); if (self::$isWikiaMobile) { /** * WikiaMobile: lazy loading images in a SEO-friendly manner * @author Federico "Lox" Lucignano <federico@wikia-inc.com * @author Artur Klajnerok <*****@*****.**> */ $origImg = Xml::element('img', $imageAttribs, '', true); if (empty($imageAttribs['alt'])) { unset($imageAttribs['alt']); } $imageParams = array('type' => 'video', 'full' => $imageAttribs['src']); if (!empty($linkAttribs['data-video-name'])) { $imageParams['name'] = $linkAttribs['data-video-name']; } if (!empty($options['caption'])) { $imageParams['capt'] = true; } if ($file instanceof File) { $size = WikiaMobileMediaService::calculateMediaSize($file->getWidth(), $file->getHeight()); $thumb = $file->transform($size); $imageAttribs['src'] = wfReplaceImageServer($thumb->getUrl(), $file->getTimestamp()); $imageAttribs['width'] = $size['width']; $imageAttribs['height'] = $size['height']; } $data = array('attributes' => $imageAttribs, 'parameters' => array($imageParams), 'anchorAttributes' => $linkAttribs, 'noscript' => $origImg); if ($file instanceof File) { $title = $file->getTitle()->getDBKey(); $titleText = $file->getTitle()->getText(); $data['content'] = Xml::element('span', array('class' => 'videoInfo'), "{$titleText} (" . $file->getHandler()->getFormattedDuration() . ", " . $this->wf->MsgForContent('wikiamobile-video-views-counter', MediaQueryService::getTotalVideoViewsByTitle($title)) . ')'); } $html = $this->app->sendRequest('WikiaMobileMediaService', 'renderImageTag', $data, true)->toString(); } $this->wf->profileOut(__METHOD__); return true; }
public function getCaruselElement() { wfProfileIn(__METHOD__); $video = $this->getVal('video'); if (empty($video)) { $title = $this->getVal('videoTitle'); $rvs = F::build('RelatedVideosService'); $video = $rvs->getRelatedVideoDataFromTitle(array('title' => $title)); } $preloaded = $this->getVal('preloaded'); $videoTitle = F::build('Title', array($video['id'], NS_FILE), 'newFromText'); $videoFile = wfFindFile($videoTitle); if ($videoFile) { $videoThumbObj = $videoFile->transform(array('width' => $video['thumbnailData']['width'], 'height' => $video['thumbnailData']['height'])); $videoThumb = $videoThumbObj->toHtml(array('custom-url-link' => $video['fullUrl'], 'linkAttribs' => array('class' => 'video-thumbnail lightbox', 'data-video-name' => $video['title'], 'data-external' => $video['external'], 'data-ref' => $video['prefixedUrl']), 'duration' => true, 'src' => $preloaded ? false : wfBlankImgUrl(), 'constHeight' => RelatedVideosService::$height, 'usePreloading' => true, 'disableRDF' => true)); $video['views'] = MediaQueryService::getTotalVideoViewsByTitle($videoTitle->getDBKey()); // Add ellipses if title is too long $maxDescriptionLength = 45; $video['truncatedTitle'] = strlen($video['title']) > $maxDescriptionLength ? substr($video['title'], 0, $maxDescriptionLength) . '…' : $video['title']; $video['viewsMsg'] = wfMsg('related-videos-video-views', $this->wg->ContLang->formatNum($video['views'])); $userGroups = $this->wg->User->getEffectiveGroups(); $isAdmin = in_array('admin', $userGroups) || in_array('staff', $userGroups); $this->removeTooltip = wfMsg('related-videos-tooltip-remove'); $this->videoThumb = $videoThumb; $this->video = $video; $this->preloaded = $preloaded; $this->isAdmin = $isAdmin; } else { Wikia::log(__METHOD__, false, 'A video file not found. ID: ' . $video['id']); } // set cache control to 1 day $this->response->setCacheValidity(86400, 86400, array(WikiaResponse::CACHE_TARGET_BROWSER, WikiaResponse::CACHE_TARGET_VARNISH)); wfProfileOut(__METHOD__); }
/** * @static * @param Title $fileTitle * @param array $config ( contextWidth, contextHeight, imageMaxWidth, userAvatarWidth ) * TODO - this method is very specific to lightbox. This needs to be refactored back out to lightbox, and return just the basic objects (file, user, tect) */ public static function getMediaDetail($fileTitle, $config = array()) { $data = array('mediaType' => '', 'videoEmbedCode' => '', 'playerAsset' => '', 'imageUrl' => '', 'fileUrl' => '', 'rawImageUrl' => '', 'description' => '', 'userThumbUrl' => '', 'userId' => '', 'userName' => '', 'userPageUrl' => '', 'articles' => array(), 'providerName' => '', 'videoViews' => 0, 'exists' => false); if (!empty($fileTitle)) { if ($fileTitle->getNamespace() != NS_FILE) { $fileTitle = F::build('Title', array($fileTitle->getDBKey(), NS_FILE), 'newFromText'); } $file = wfFindFile($fileTitle); if (!empty($file)) { $config = self::getMediaDetailConfig($config); $data['exists'] = true; $data['mediaType'] = self::isFileTypeVideo($file) ? 'video' : 'image'; $width = $file->getWidth(); $height = $file->getHeight(); if ($data['mediaType'] == 'video') { $width = $config['contextWidth'] ? $config['contextWidth'] : $width; $height = $config['contextHeight'] ? $config['contextHeight'] : $height; if (isset($config['maxHeight'])) { $file->setEmbedCodeMaxHeight($config['maxHeight']); } $data['videoEmbedCode'] = $file->getEmbedCode($width, true, true); $data['playerAsset'] = $file->getPlayerAssetUrl(); $data['videoViews'] = MediaQueryService::getTotalVideoViewsByTitle($fileTitle->getDBKey()); $mediaPage = F::build('WikiaVideoPage', array($fileTitle)); $data['providerName'] = $file->getProviderName(); } else { $width = $width > $config['imageMaxWidth'] ? $config['imageMaxWidth'] : $width; $mediaPage = F::build('ImagePage', array($fileTitle)); } $thumb = $file->transform(array('width' => $width, 'height' => $height), 0); $user = F::build('User', array($file->getUser('id')), 'newFromId'); // get article list $mediaQuery = F::build('ArticlesUsingMediaQuery', array($fileTitle)); $articleList = $mediaQuery->getArticleList(); $data['imageUrl'] = $thumb->getUrl(); $data['fileUrl'] = $fileTitle->getLocalUrl(); $data['rawImageUrl'] = $file->getUrl(); $data['userId'] = $user->getId(); $data['userName'] = $user->getName(); $data['userThumbUrl'] = F::build('AvatarService', array($user, $config['userAvatarWidth']), 'getAvatarUrl'); $data['userPageUrl'] = $user->getUserPage()->getFullURL(); $data['description'] = $mediaPage->getContent(); $data['articles'] = $articleList; } } return $data; }
/** * Render default page header (with edit dropdown, history dropdown, ...) * * @param: array $params * key: showSearchBox (default: false) */ public function executeIndex($params) { global $wgTitle, $wgArticle, $wgOut, $wgUser, $wgContLang, $wgSupressPageTitle, $wgSupressPageSubtitle, $wgSuppressNamespacePrefix, $wgEnableWallExt; wfProfileIn(__METHOD__); $this->isUserLoggedIn = $wgUser->isLoggedIn(); // check for video add button permissions $this->showAddVideoBtn = $wgUser->isAllowed('videoupload'); // page namespace $ns = $wgTitle->getNamespace(); /** start of wikia changes @author nAndy */ $this->isWallEnabled = !empty($wgEnableWallExt) && $ns == NS_USER_WALL; /** end of wikia changes */ // currently used skin $skin = RequestContext::getMain()->getSkin(); // action button (edit / view soruce) and dropdown for it $this->prepareActionButton(); // dropdown actions $this->dropdown = $this->getDropdownActions(); /** start of wikia changes @author nAndy */ $response = $this->getResponse(); if ($response instanceof WikiaResponse) { wfRunHooks('PageHeaderIndexAfterActionButtonPrepared', array($response, $ns, $skin)); /** @author Jakub */ $this->extraButtons = array(); wfRunHooks('PageHeaderIndexExtraButtons', array($response)); } else { // it happened on TimQ's devbox that $response was probably null fb#28747 WikiaLogger::instance()->error('Response not an instance of WikiaResponse', ['ex' => new Exception()]); } /** end of wikia changes */ // for not existing pages page header is a bit different $this->pageExists = !empty($wgTitle) && $wgTitle->exists(); // default title "settings" (RT #145371), don't touch special pages if ($ns != NS_SPECIAL) { $this->displaytitle = true; $this->title = $wgOut->getPageTitle(); } else { // on special pages titles are already properly encoded (BugId:5983) $this->displaytitle = true; } // perform namespace and special page check // use service to get data $service = PageStatsService::newFromTitle($wgTitle); // comments - moved here to display comments even on deleted/non-existant pages $this->comments = $service->getCommentsCount(); if ($this->pageExists) { // mainpage? if (WikiaPageType::isMainPage()) { $this->isMainPage = true; } // number of pages on this wiki $this->tallyMsg = wfMessage('oasis-total-articles-mainpage', SiteStats::articles())->parse(); } // remove namespaces prefix from title $namespaces = array(NS_MEDIAWIKI, NS_TEMPLATE, NS_CATEGORY, NS_FILE); if (in_array($ns, array_merge($namespaces, $wgSuppressNamespacePrefix))) { $this->title = $wgTitle->getText(); $this->displaytitle = false; } // talk pages if ($wgTitle->isTalkPage()) { // remove comments & FB like button $this->comments = false; // Talk: <page name without namespace prefix> $this->displaytitle = true; $this->title = Xml::element('strong', array(), $wgContLang->getNsText(NS_TALK) . ':'); $this->title .= htmlspecialchars($wgTitle->getText()); // back to subject article link switch ($ns) { case NS_TEMPLATE_TALK: $msgKey = 'oasis-page-header-back-to-template'; break; case NS_MEDIAWIKI_TALK: $msgKey = 'oasis-page-header-back-to-mediawiki'; break; case NS_CATEGORY_TALK: $msgKey = 'oasis-page-header-back-to-category'; break; case NS_FILE_TALK: $msgKey = 'oasis-page-header-back-to-file'; break; default: $msgKey = 'oasis-page-header-back-to-article'; } $this->pageTalkSubject = Wikia::link($wgTitle->getSubjectPage(), wfMsg($msgKey), array('accesskey' => 'c')); } // forum namespace if ($ns == NS_FORUM) { // remove comments button $this->comments = false; // remove namespace prefix $this->title = $wgTitle->getText(); $this->displaytitle = false; } // mainpage if (WikiaPageType::isMainPage()) { // change page title to just "Home" $this->title = wfMsg('oasis-home'); } // render page type info switch ($ns) { case NS_MEDIAWIKI: $this->pageType = wfMsg('oasis-page-header-subtitle-mediawiki'); break; case NS_TEMPLATE: $this->pageType = wfMsg('oasis-page-header-subtitle-template'); break; case NS_SPECIAL: $this->pageType = wfMsg('oasis-page-header-subtitle-special'); // remove comments button (fix FB#3404 - Marooned) $this->comments = false; if ($wgTitle->isSpecial('Newimages')) { $this->isNewFiles = true; } if ($wgTitle->isSpecial('Videos')) { $this->isSpecialVideos = true; $mediaService = new MediaQueryService(); $this->tallyMsg = wfMessage('specialvideos-wiki-videos-tally', $mediaService->getTotalVideos())->parse(); } if ($wgTitle->isSpecial('LicensedVideoSwap')) { $this->pageType = ""; } break; case NS_CATEGORY: $this->pageType = wfMsg('oasis-page-header-subtitle-category'); break; case NS_FORUM: $this->pageType = wfMsg('oasis-page-header-subtitle-forum'); break; } // render subpage info $this->pageSubject = $skin->subPageSubtitle(); if (in_array($wgTitle->getNamespace(), BodyController::getUserPagesNamespaces())) { $title = explode(':', $this->title, 2); // User:Foo/World_Of_Warcraft:_Residers_in_Shadows (BAC-494) if (count($title) >= 2 && $wgTitle->getNsText() == str_replace(' ', '_', $title[0])) { // in case of error page (showErrorPage) $title is just a string (cannot explode it) $this->title = $title[1]; } } // render MW subtitle (contains old revision data) $this->subtitle = $wgOut->getSubtitle(); // render redirect info (redirected from) if (!empty($wgArticle->mRedirectedFrom)) { $this->pageRedirect = trim($this->subtitle, '()'); $this->subtitle = ''; } // render redirect page (redirect to) if ($wgTitle->isRedirect()) { $this->pageType = $this->subtitle; $this->subtitle = ''; } if (!empty($wgSupressPageTitle)) { $this->title = ''; $this->subtitle = ''; } if (!empty($wgSupressPageSubtitle)) { $this->subtitle = ''; $this->pageSubtitle = ''; } else { // render pageType, pageSubject and pageSubtitle as one message $subtitle = array_filter(array($this->pageType, $this->pageTalkSubject, $this->pageSubject, $this->pageRedirect)); /* * support for language variants * this adds links which automatically convert the content to that variant * * @author tor@wikia-inc.com * @author macbre@wikia-inc.com */ $variants = $this->skinTemplate->get('content_navigation')['variants']; if (!empty($variants)) { foreach ($variants as $variant) { $subtitle[] = Xml::element('a', array('href' => $variant['href'], 'rel' => 'nofollow', 'id' => $variant['id']), $variant['text']); } } $pipe = wfMsg('pipe-separator'); $this->pageSubtitle = implode(" {$pipe} ", $subtitle); } // force AjaxLogin popup for "Add a page" button (moved from the template) $this->loginClass = !empty($this->wg->DisableAnonymousEditing) ? ' require-login' : ''; // render monetization module if (!empty($params['monetizationModules'])) { $this->monetizationModules = $params['monetizationModules']; } wfProfileOut(__METHOD__); }
/** * Get all categories associated with a given video, compare them with the categories we're using as filters * on the Special:Videos page, and clear the cache for total videos in categories which match. * @param $title * @param null||array $categories */ private static function clearCategories($title, $categories = null) { if (is_null($categories)) { $categories = array_map(function ($category) { return explode(":", $category)[1]; }, array_keys($title->getParentCategories())); } $helper = new MediaQueryService(); foreach ($categories as $category) { if (in_array($category, SpecialVideosHelper::$verticalCategoryFilters)) { $helper->clearCacheTotalVideosByCategory($category); } } }
public static function onThumbnailVideoHTML($options, $linkAttribs, $imageAttribs, File $file, &$html) { global $wgRTEParserEnabled; if (!empty($wgRTEParserEnabled)) { return true; } if (is_null(self::$isWikiaMobile)) { self::init(); } if (self::$isWikiaMobile) { wfProfileIn(__METHOD__); /** * WikiaMobile: lazy loading images in a SEO-friendly manner * @author Federico "Lox" Lucignano <federico@wikia-inc.com * @author Artur Klajnerok <*****@*****.**> */ $origImg = Xml::element('img', $imageAttribs, '', true); if (empty($imageAttribs['alt'])) { unset($imageAttribs['alt']); } //Not all 'files' have getProviderName defined if (is_callable([$file, 'getProviderName'])) { $provider = $file->getProviderName(); } else { $provider = ''; } $imageParams = array('type' => 'video', 'provider' => $provider, 'full' => $imageAttribs['src']); if (!empty($imageAttribs['data-video-key'])) { $imageParams['name'] = htmlspecialchars($imageAttribs['data-video-key']); } if (!empty($options['caption'])) { $imageParams['capt'] = 1; } // TODO: this resizes every video thumbnail with a width over 64px regardless of where it appears. // We may want to add the ability to allow custom image widths (like on the file page history table for example) $size = WikiaMobileMediaService::calculateMediaSize($file->getWidth(), $file->getHeight()); $thumb = $file->transform($size); $imageAttribs['src'] = wfReplaceImageServer($thumb->getUrl(), $file->getTimestamp()); $imageAttribs['width'] = $size['width']; $imageAttribs['height'] = $size['height']; $data = ['attributes' => $imageAttribs, 'parameters' => [$imageParams], 'anchorAttributes' => $linkAttribs, 'noscript' => $origImg, 'isSmall' => WikiaMobileMediaService::isSmallImage($imageAttribs['width'], $imageAttribs['height'])]; $title = $file->getTitle()->getDBKey(); $titleText = $file->getTitle()->getText(); $views = MediaQueryService::getTotalVideoViewsByTitle($title); $data['content'] = Xml::element('span', ['class' => 'videoInfo'], "{$titleText} (" . $file->getHandler()->getFormattedDuration() . ", " . wfMessage('wikiamobile-video-views-counter', $views)->inContentLanguage()->text() . ')'); $html = F::app()->sendRequest('WikiaMobileMediaService', 'renderImageTag', $data, true)->toString(); wfProfileOut(__METHOD__); } return true; }