Files
Cloud-CMS/lib/Controller/MediaManager.php
Matt Batchelder 05ce0da296 Initial Upload
2025-12-02 10:32:59 -05:00

138 lines
4.1 KiB
PHP

<?php
/*
* Copyright (C) 2023 Xibo Signage Ltd
*
* Xibo - Digital Signage - https://xibosignage.com
*
* This file is part of Xibo.
*
* Xibo is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* Xibo 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Xibo\Controller;
use Slim\Http\Response as Response;
use Slim\Http\ServerRequest as Request;
use Xibo\Factory\MediaFactory;
use Xibo\Factory\ModuleFactory;
use Xibo\Helper\ByteFormatter;
use Xibo\Storage\StorageServiceInterface;
use Xibo\Support\Exception\NotFoundException;
/**
* Class MediaManager
* @package Xibo\Controller
*/
class MediaManager extends Base
{
private StorageServiceInterface $store;
private ModuleFactory $moduleFactory;
private MediaFactory $mediaFactory;
/**
* Set common dependencies.
*/
public function __construct(
StorageServiceInterface $store,
ModuleFactory $moduleFactory,
MediaFactory $mediaFactory
) {
$this->store = $store;
$this->moduleFactory = $moduleFactory;
$this->mediaFactory = $mediaFactory;
}
/**
* @param Request $request
* @param Response $response
* @return \Psr\Http\Message\ResponseInterface|Response
* @throws \Xibo\Support\Exception\ControllerNotImplemented
* @throws \Xibo\Support\Exception\GeneralException
*/
public function displayPage(Request $request, Response $response)
{
$this->getState()->template = 'media-manager-page';
$this->getState()->setData([
'library' => $this->getLibraryUsage()
]);
return $this->render($request, $response);
}
/**
* Get the library usage
* @return array
* @throws \Xibo\Support\Exception\NotFoundException
*/
private function getLibraryUsage(): array
{
// Set up some suffixes
$suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
$params = [];
// Library Size in Bytes
$sql = '
SELECT COUNT(`mediaId`) AS countOf,
IFNULL(SUM(`FileSize`), 0) AS SumSize,
`type`
FROM `media`
WHERE 1 = 1 ';
$this->mediaFactory->viewPermissionSql(
'Xibo\Entity\Media',
$sql,
$params,
'`media`.mediaId',
'`media`.userId',
[],
'media.permissionsFolderId'
);
$sql .= ' GROUP BY type ';
$sql .= ' ORDER BY 2 ';
$results = $this->store->select($sql, $params);
$libraryUsage = [];
$totalCount = 0;
$totalSize = 0;
foreach ($results as $library) {
$bytes = doubleval($library['SumSize']);
$totalSize += $bytes;
$totalCount += $library['countOf'];
try {
$title = $this->moduleFactory->getByType($library['type'])->name;
} catch (NotFoundException) {
$title = $library['type'] === 'module' ? __('Widget cache') : ucfirst($library['type']);
}
$libraryUsage[] = [
'title' => $title,
'count' => $library['countOf'],
'size' => $bytes,
];
}
// Decide what our units are going to be, based on the size
$base = ($totalSize === 0) ? 0 : floor(log($totalSize) / log(1024));
return [
'countOf' => $totalCount,
'size' => ByteFormatter::format($totalSize, 1, true),
'types' => $libraryUsage,
'typesSuffix' => $suffixes[$base],
'typesBase' => $base,
];
}
}