title = File::normalizeTitle( $title, 'exception' ); $this->name = $repo->getNameFromTitle( $title ); } else { $this->name = basename( $path ); $this->title = File::normalizeTitle( $this->name, 'exception' ); } $this->repo = $repo; if ( $path ) { $this->path = $path; } else { $this->assertRepoDefined(); $this->path = $repo->getRootDirectory() . '/' . $repo->getHashPath( $this->name ) . $this->name; } if ( $mime ) { $this->mime = $mime; } $this->pageDims = []; } /** * @param int $page * @return array|false */ private function cachePageDimensions( $page = 1 ) { $page = (int)$page; if ( $page < 1 ) { $page = 1; } if ( !isset( $this->pageDims[$page] ) ) { if ( !$this->getHandler() ) { return false; } if ( $this->getHandler()->isMultiPage( $this ) ) { $this->pageDims[$page] = $this->handler->getPageDimensions( $this, $page ); } else { $info = $this->getSizeAndMetadata(); return [ 'width' => $info['width'], 'height' => $info['height'] ]; } } return $this->pageDims[$page]; } /** * @param int $page * @return int */ public function getWidth( $page = 1 ) { $dim = $this->cachePageDimensions( $page ); return $dim['width'] ?? 0; } /** * @param int $page * @return int */ public function getHeight( $page = 1 ) { $dim = $this->cachePageDimensions( $page ); return $dim['height'] ?? 0; } /** * @return string|false */ public function getMimeType() { if ( !isset( $this->mime ) ) { $refPath = $this->getLocalRefPath(); if ( $refPath !== false ) { $magic = MediaWikiServices::getInstance()->getMimeAnalyzer(); $this->mime = $magic->guessMimeType( $refPath ); } else { $this->mime = false; } } return $this->mime; } /** * @return int */ public function getBitDepth() { $info = $this->getSizeAndMetadata(); return $info['bits'] ?? 0; } /** * @return string|false */ public function getMetadata() { $info = $this->getSizeAndMetadata(); return $info['metadata'] ? serialize( $info['metadata'] ) : false; } public function getMetadataArray(): array { $info = $this->getSizeAndMetadata(); return $info['metadata']; } private function getSizeAndMetadata() { if ( $this->sizeAndMetadata === null ) { if ( !$this->getHandler() ) { $this->sizeAndMetadata = [ 'width' => 0, 'height' => 0, 'metadata' => [] ]; } else { $this->sizeAndMetadata = $this->getHandler()->getSizeAndMetadataWithFallback( $this, $this->getLocalRefPath() ); } } return $this->sizeAndMetadata; } /** * @return string|false */ public function getURL() { if ( $this->repo ) { return $this->repo->getZoneUrl( 'public' ) . '/' . $this->repo->getHashPath( $this->name ) . rawurlencode( $this->name ); } else { return false; } } /** * @return false|int */ public function getSize() { $this->assertRepoDefined(); return $this->repo->getFileSize( $this->path ); } /** * Optimize getLocalRefPath() by using an existing local reference. * The file at the path of $fsFile should not be deleted (or at least * not until the end of the request). This is mostly a performance hack. * * @param FSFile $fsFile * @return void */ public function setLocalReference( FSFile $fsFile ) { $this->fsFile = $fsFile; } }