wiki.techinc.nl/includes/filerepo/file/MediaFileTrait.php
Thiemo Kreuz 1fc8d79ac6 Remove documentation that literally repeats the code
For example, documenting the method getUser() with "get the User
object" does not add any information that's not already there.
But I have to read the text first to understand that it doesn't
document anything that's not already obvious from the code.

Some of this is from a time when we had a PHPCS sniff that was
complaining when a line like `@param User $user` doesn't end
with some descriptive text. Some users started adding text like
`@param User $user The User` back then. Let's please remove
this.

Change-Id: I0ea8d051bc732466c73940de9259f87ffb86ce7a
2020-10-27 19:20:26 +00:00

162 lines
5.1 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
/**
* Trait for functionality related to media files
* @since 1.35
* @ingroup FileRepo
*/
trait MediaFileTrait {
/**
* @param File $file
* @param User $user user object (for permissions check)
* @param array $transforms array of transforms to include in the response
* @return array response data
*/
private function getFileInfo( $file, $user, $transforms ) {
// If there is a problem with the file, there is very little info we can reliably
// return (T228286, T239213), but we do what we can (T201205).
$responseFile = [
'title' => $file->getTitle()->getText(),
'file_description_url' => wfExpandUrl( $file->getDescriptionUrl(), PROTO_RELATIVE ),
'latest' => null,
'preferred' => null,
'original' => null,
];
foreach ( array_keys( $transforms ) as $transformType ) {
$responseFile[$transformType] = null;
}
if ( $file->exists() ) {
if ( $file->userCan( File::DELETED_USER, $user ) ) {
$fileUser = [
'id' => $file->getUser( 'id' ),
'name' => $file->getUser( 'text' ),
];
} else {
$fileUser = [
'id' => null,
'name' => null,
];
}
$responseFile['latest'] = [
'timestamp' => wfTimestamp( TS_ISO_8601, $file->getTimestamp() ),
'user' => $fileUser,
];
// If the file doesn't and shouldn't have a duration, return null instead of 0.
// Testing for 0 first, then checking mediatype, makes gifs behave as desired for
// both still and animated cases.
$duration = $file->getLength();
$mediaTypesWithDurations = [ MEDIATYPE_AUDIO, MEDIATYPE_VIDEO, MEDIATYPE_MULTIMEDIA ];
if ( $duration == 0 && !in_array( $file->getMediaType(), $mediaTypesWithDurations ) ) {
$duration = null;
}
if ( $file->allowInlineDisplay() ) {
foreach ( $transforms as $transformType => $transform ) {
$responseFile[$transformType] = $this->getTransformInfo(
$file,
$duration,
$transform['maxWidth'],
$transform['maxHeight']
);
}
}
$responseFile['original'] = [
'mediatype' => $file->getMediaType(),
'size' => $file->getSize(),
'width' => $file->getWidth() ?: null,
'height' => $file->getHeight() ?: null,
'duration' => $duration,
'url' => wfExpandUrl( $file->getUrl(), PROTO_RELATIVE ),
];
}
return $responseFile;
}
/**
* @param File $file
* @param int $duration File duration (if any)
* @param int $maxWidth Max width to display at
* @param int $maxHeight Max height to display at
* @return array|null Transform info ready to include in response, or null if unavailable
*/
private function getTransformInfo( $file, $duration, $maxWidth, $maxHeight ) {
$transformInfo = null;
try {
list( $width, $height ) = $file->getDisplayWidthHeight( $maxWidth, $maxHeight );
$transform = $file->transform( [ 'width' => $width, 'height' => $height ] );
if ( $transform && !$transform->isError() ) {
// $file->getSize() returns original size. Only include if dimensions match.
$size = null;
if ( $file->getWidth() == $transform->getWidth() &&
$file->getHeight() == $transform->getHeight()
) {
$size = $file->getSize();
}
$transformInfo = [
'mediatype' => $transform->getFile()->getMediaType(),
'size' => $size,
'width' => $transform->getWidth() ?: null,
'height' => $transform->getHeight() ?: null,
'duration' => $duration,
'url' => wfExpandUrl( $transform->getUrl(), PROTO_RELATIVE ),
];
}
} catch ( MWException $e ) {
// Caller decides what to do on failure
}
return $transformInfo;
}
/**
* Returns the corresponding $wgImageLimits entry for the selected user option
*
* @param User $user
* @param string $optionName Name of a option to check, typically imagesize or thumbsize
* @return int[]
* @since 1.35
*/
public static function getImageLimitsFromOption( $user, $optionName ) {
global $wgImageLimits;
$option = $user->getIntOption( $optionName );
if ( !isset( $wgImageLimits[$option] ) ) {
$option = User::getDefaultOption( $optionName );
}
// The user offset might still be incorrect, specially if
// $wgImageLimits got changed (see T10858).
if ( !isset( $wgImageLimits[$option] ) ) {
// Default to the first offset in $wgImageLimits
$option = 0;
}
// if nothing is set, fallback to a hardcoded default
return $wgImageLimits[$option] ?? [ 800, 600 ];
}
}