AzuraCast/src/Controller/Api/Stations/Playlists/ExportAction.php

70 lines
2.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Controller\Api\Stations\Playlists;
use App\Entity\Repository\StationPlaylistRepository;
use App\Http\Response;
use App\Http\ServerRequest;
use InvalidArgumentException;
use Psr\Http\Message\ResponseInterface;
final class ExportAction
{
public function __construct(
private readonly StationPlaylistRepository $playlistRepo
) {
}
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $id,
string $format = 'pls'
): ResponseInterface {
$record = $this->playlistRepo->requireForStation($id, $request->getStation());
$exportFileName = 'playlist_' . $record->getShortName() . '.' . $format;
$exportLines = [];
switch (strtolower($format)) {
case 'm3u':
$contentType = 'application/x-mpegURL';
foreach ($record->getMediaItems() as $mediaItem) {
$exportLines[] = $mediaItem->getMedia()->getPath();
}
break;
case 'pls':
$contentType = 'audio/x-scpls';
$exportLines[] = '[playlist]';
$i = 0;
foreach ($record->getMediaItems() as $mediaItem) {
$i++;
$media = $mediaItem->getMedia();
$exportLines[] = 'File' . $i . '=' . $media->getPath();
$exportLines[] = 'Title' . $i . '=' . $media->getArtist() . ' - ' . $media->getTitle();
$exportLines[] = 'Length' . $i . '=' . $media->getLength();
$exportLines[] = '';
}
$exportLines[] = 'NumberOfEntries=' . $i;
$exportLines[] = 'Version=2';
break;
default:
throw new InvalidArgumentException('Invalid format specified.');
}
$response->getBody()->write(implode("\n", $exportLines));
return $response->withHeader('Content-Type', $contentType)
->withHeader('Content-Disposition', 'attachment; filename=' . $exportFileName);
}
}