ReCast is a multi platform restreaming tool, you can stream with one servers to multiple services
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

245 lines
7.5 KiB

<?php
namespace App\Controller;
use App\Component\Forms\Endpoint as EndpointForm;
use App\Component\Forms\Streams as StreamsForm;
use App\Component\ServiceManager;
use App\Entity\Endpoint;
use App\Entity\User;
use App\Repository\EndpointRepository;
use App\Repository\StreamsRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Class Streams
* @Route("/api/streams")
* @author Soner Sayakci <shyim@posteo.de>
*/
class Streams extends Controller
{
/**
* @var StreamsRepository
*/
private $repository;
/**
* @var EndpointRepository
*/
private $endpointRepository;
/**
* Streams constructor.
* @param StreamsRepository $repository
* @param EndpointRepository $endpointRepository
* @author Soner Sayakci <shyim@posteo.de>
*/
public function __construct(StreamsRepository $repository, EndpointRepository $endpointRepository)
{
$this->repository = $repository;
$this->endpointRepository = $endpointRepository;
}
/**
* @Route(path="/list")
* @author Soner Sayakci <shyim@posteo.de>
*/
public function streams() : Response
{
/** @var User $user */
$user = $this->getUser();
return new JsonResponse($this->repository->getStreams($user));
}
/**
* @Route(path="/one")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
* @author Soner Sayakci <shyim@posteo.de>
*/
public function one(Request $request) : Response
{
$stream = $this->repository->find($request->query->get('id'));
if ($stream === null || $stream->getUserId() !== $this->getUser()->getId()) {
return new Response('Access denied', 401);
}
$host = $request->getHost();
$data = $stream->jsonSerialize();
$data['streamUrl'] = sprintf('rtmp://%s/%s', $host, $stream->getUser()->getUsername() . '/' . $stream->getName());
return new JsonResponse($data);
}
/**
* @Route(path="/update")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @author Soner Sayakci <shyim@posteo.de>
*/
public function update(Request $request) : Response
{
$requestBody = $request->request->all();
$stream = !empty($requestBody['id']) ? $this->repository->find($requestBody['id']) : new \App\Entity\Streams();
if ($stream->getUserId() && $stream->getUserId() !== $this->getUser()->getId()) {
return new Response('Access denied', 401);
}
$stream->setUser($this->getUser());
$stream->setName($requestBody['name']);
$stream->setActive($requestBody['active']);
$manager = $this->get('doctrine.orm.entity_manager');
$manager->persist($stream);
$manager->flush();
return new JsonResponse($stream);
}
/**
* @Route(path="/regenerate")
* @author Soner Sayakci <shyim@posteo.de>
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @throws \Doctrine\ORM\TransactionRequiredException
*/
public function regenerate(Request $request) : Response
{
$manager = $this->get('doctrine.orm.entity_manager');
$streams = $manager->find(\App\Entity\Streams::class, $request->request->get('id'));
if ($streams && $streams->getUserId() === $this->getUser()->getId()) {
$streams->setStreamKey(uniqid('', true));
$manager->persist($streams);
$manager->flush();
}
return new JsonResponse();
}
/**
* @Route(path="/delete")
* @author Soner Sayakci <shyim@posteo.de>
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @throws \Doctrine\ORM\TransactionRequiredException
*/
public function delete(Request $request) : Response
{
$manager = $this->get('doctrine.orm.entity_manager');
$streams = $manager->find(\App\Entity\Streams::class, $request->request->get('id'));
if ($streams && $streams->getUserId() === $this->getUser()->getId()) {
$manager->remove($streams);
$manager->flush();
}
return new JsonResponse();
}
/**
* @Route(path="/services")
* @param ServiceManager $manager
* @return JsonResponse
* @author Soner Sayakci <shyim@posteo.de>
*/
public function services(ServiceManager $manager): JsonResponse
{
return new JsonResponse($manager->getTemplateData());
}
/**
* @Route(path="/{id}/endpoints/")
* @author Soner Sayakci <shyim@posteo.de>
* @param int $id
* @return JsonResponse
*/
public function listEndpoints(int $id): JsonResponse
{
return new JsonResponse($this->endpointRepository->getEndpoints($this->getUser(), $id));
}
/**
* @Route(path="/endpoint/{id}")
* @author Soner Sayakci <shyim@posteo.de>
* @param int $id
* @return JsonResponse
*/
public function endpoint(int $id)
{
return new JsonResponse($this->endpointRepository->find($id));
}
/**
* @Route(path="/{id}/endpoints/update")
* @param Request $request
* @param int $id
* @return Response
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @author Soner Sayakci <shyim@posteo.de>
*/
public function updateEndpoint(Request $request, int $id): Response
{
$requestBody = $request->request->all();
$stream = $this->repository->find($id);
if ($stream === null || $stream->getUserId() !== $this->getUser()->getId()) {
return new JsonResponse([]);
}
$endpoint = !empty($requestBody['id']) ? $this->endpointRepository->find($requestBody['id']) : new Endpoint();
$endpoint->setName($requestBody['name']);
$endpoint->setType($requestBody['type']);
$endpoint->setServer($requestBody['server']);
$endpoint->setStreamKey($requestBody['streamKey']);
$endpoint->setStream($stream);
$manager = $this->get('doctrine.orm.entity_manager');
$manager->persist($endpoint);
$manager->flush();
return new JsonResponse($endpoint);
}
/**
* @Route(path="/deleteEndpoint")
* @author Soner Sayakci <shyim@posteo.de>
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
* @throws \Doctrine\ORM\TransactionRequiredException
*/
public function deleteEndpoint(Request $request) : Response
{
$manager = $this->get('doctrine.orm.entity_manager');
$endpoint = $manager->find(Endpoint::class, $request->request->get('id'));
if ($endpoint && $endpoint->getStream()->getUserId() === $this->getUser()->getId()) {
$manager->remove($endpoint);
$manager->flush();
}
return new JsonResponse();
}
}