AzuraCast/src/Controller/Api/Stations/ServicesController.php

209 lines
7.0 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Controller\Api\Stations;
use App\Entity;
use App\Exception\Supervisor\NotRunningException;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Radio\AutoDJ;
use App\Radio\Backend\Liquidsoap;
use App\Radio\Configuration;
use Doctrine\ORM\EntityManagerInterface;
use OpenApi\Annotations as OA;
use Psr\Http\Message\ResponseInterface;
/**
* @OA\Get(path="/station/{station_id}/status",
* operationId="getServiceStatus",
* tags={"Stations: Service Control"},
* description="Retrieve the current status of all serivces associated with the radio broadcast.",
* @OA\Parameter(ref="#/components/parameters/station_id_required"),
* @OA\Response(
* response=200,
* description="Success",
* @OA\Schema(ref="#/components/schemas/Api_StationServiceStatus")
* ),
* @OA\Response(response=403, description="Access Forbidden", @OA\Schema(ref="#/components/schemas/Api_Error")),
* security={{"api_key": {}}}
* )
*
* @OA\Post(path="/station/{station_id}/restart",
* operationId="restartServices",
* tags={"Stations: Service Control"},
* description="Restart all services associated with the radio broadcast.",
* @OA\Parameter(ref="#/components/parameters/station_id_required"),
* @OA\Response(response=200, description="Success", @OA\Schema(ref="#/components/schemas/Api_Status")),
* @OA\Response(response=403, description="Access Forbidden", @OA\Schema(ref="#/components/schemas/Api_Error")),
* security={{"api_key": {}}}
* )
*
* @OA\Post(path="/station/{station_id}/frontend/{action}",
* operationId="doFrontendServiceAction",
* tags={"Stations: Service Control"},
* description="Perform service control actions on the radio frontend (Icecast, SHOUTcast, etc.)",
* @OA\Parameter(ref="#/components/parameters/station_id_required"),
* @OA\Parameter(
* name="action",
* description="The action to perform (start, stop, restart)",
* in="path",
* required=false,
* @OA\Schema(
* type="string",
* default="restart"
* )
* ),
* @OA\Response(response=200, description="Success", @OA\Schema(ref="#/components/schemas/Api_Status")),
* @OA\Response(response=403, description="Access Forbidden", @OA\Schema(ref="#/components/schemas/Api_Error")),
* security={{"api_key": {}}}
* )
*
* @OA\Post(path="/station/{station_id}/backend/{action}",
* operationId="doBackendServiceAction",
* tags={"Stations: Service Control"},
* description="Perform service control actions on the radio backend (Liquidsoap)",
* @OA\Parameter(ref="#/components/parameters/station_id_required"),
* @OA\Parameter(
* name="action",
* description="The action to perform (for all: start, stop, restart; for Liquidsoap only: skip, disconnect)",
* in="path",
* required=false,
* @OA\Schema(
* type="string",
* default="restart"
* )
* ),
* @OA\Response(response=200, description="Success", @OA\Schema(ref="#/components/schemas/Api_Status")),
* @OA\Response(response=403, description="Access Forbidden", @OA\Schema(ref="#/components/schemas/Api_Error")),
* security={{"api_key": {}}}
* )
*/
class ServicesController
{
public function __construct(
protected EntityManagerInterface $em,
protected Configuration $configuration
) {
}
public function statusAction(ServerRequest $request, Response $response): ResponseInterface
{
$station = $request->getStation();
$backend = $request->getStationBackend();
$frontend = $request->getStationFrontend();
return $response->withJson(
new Entity\Api\StationServiceStatus(
$backend->isRunning($station),
$frontend->isRunning($station),
$station->getHasStarted(),
$station->getNeedsRestart()
)
);
}
public function restartAction(ServerRequest $request, Response $response): ResponseInterface
{
$station = $request->getStation();
$this->configuration->writeConfiguration($station, true);
return $response->withJson(new Entity\Api\Status(true, __('Station restarted.')));
}
public function frontendAction(
ServerRequest $request,
Response $response,
$do = 'restart'
): ResponseInterface {
$station = $request->getStation();
$frontend = $request->getStationFrontend();
switch ($do) {
case 'stop':
$frontend->stop($station);
return $response->withJson(new Entity\Api\Status(true, __('Service stopped.')));
case 'start':
$frontend->start($station);
return $response->withJson(new Entity\Api\Status(true, __('Service started.')));
case 'reload':
$frontend->write($station);
$frontend->reload($station);
return $response->withJson(new Entity\Api\Status(true, __('Service reloaded.')));
case 'restart':
default:
try {
$frontend->stop($station);
} catch (NotRunningException) {
}
$frontend->write($station);
$frontend->start($station);
return $response->withJson(new Entity\Api\Status(true, __('Service restarted.')));
}
}
public function backendAction(
ServerRequest $request,
Response $response,
AutoDJ $autodj,
$do = 'restart'
): ResponseInterface {
$station = $request->getStation();
$backend = $request->getStationBackend();
switch ($do) {
case 'skip':
if ($backend instanceof Liquidsoap) {
$backend->skip($station);
}
return $response->withJson(new Entity\Api\Status(true, __('Song skipped.')));
case 'disconnect':
if ($backend instanceof Liquidsoap) {
$backend->disconnectStreamer($station);
}
return $response->withJson(new Entity\Api\Status(true, __('Streamer disconnected.')));
case 'stop':
$backend->stop($station);
return $response->withJson(new Entity\Api\Status(true, __('Service stopped.')));
case 'start':
$backend->start($station);
return $response->withJson(new Entity\Api\Status(true, __('Service started.')));
case 'reload':
$backend->write($station);
$backend->reload($station);
return $response->withJson(new Entity\Api\Status(true, __('Service reloaded.')));
case 'restart':
default:
try {
$backend->stop($station);
} catch (NotRunningException) {
}
$backend->write($station);
$backend->start($station);
return $response->withJson(new Entity\Api\Status(true, __('Service restarted.')));
}
}
}