* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library 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 this library. If not, see . */ namespace OCA\Radio\Controller; use OCA\Radio\AppInfo\Application; use OCA\Radio\Service\FavoriteService; use OCA\Radio\Service\UserService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\DataDownloadResponse; use OCP\Defaults; use OCP\HintException; use OCP\IDateTimeFormatter; use OCP\IRequest; class ExportController extends Controller { use Errors; public function __construct( IRequest $request, private readonly FavoriteService $service, private readonly UserService $user, private readonly Defaults $defaults, private readonly IDateTimeFormatter $dateTime, ) { parent::__construct(Application::APP_ID, $request); } #[NoAdminRequired] public function index(): DataDownloadResponse { $user = $this->user->getUser(); if (is_null($user)) { throw new HintException('User not logged in'); } $xml = new \SimpleXMLElement(''); $xml->addAttribute('encoding', 'UTF-8'); $trackList = $xml->addChild('trackList'); if ($trackList instanceof \SimpleXMLElement) { foreach ($this->service->findAll($user->getUID()) as $station) { $track = $trackList->addChild('track'); if ($track instanceof \SimpleXMLElement) { $track->addChild('location', $station->getUrlresolved()); $track->addChild('title', $station->getName()); $track->addChild('image', $station->getFavicon()); } } } $dom = new \DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; /** @psalm-suppress ArgumentTypeCoercion */ $dom->loadXML($xml->asXML()); $returnstring = $dom->saveXML(); $userName = $user->getDisplayName(); $productName = $this->defaults->getName(); $date = $this->dateTime->formatDate(time()); $export_name = sprintf('%s Radio Favorites (%s) (%s).xspf', $productName, $userName, $date); return new DataDownloadResponse($returnstring, $export_name, 'application/xspf+xml'); } }