76 lines
2.1 KiB
PHP
76 lines
2.1 KiB
PHP
|
<?php
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
namespace OCA\RePod\Controller;
|
||
|
|
||
|
use OCA\GPodderSync\Core\PodcastData\PodcastDataReader;
|
||
|
use OCA\GPodderSync\Core\PodcastData\PodcastMetricsReader;
|
||
|
use OCA\RePod\AppInfo\Application;
|
||
|
use OCA\RePod\Service\UserService;
|
||
|
use OCP\AppFramework\Controller;
|
||
|
use OCP\AppFramework\Http\DataDownloadResponse;
|
||
|
use OCP\IL10N;
|
||
|
use OCP\IRequest;
|
||
|
|
||
|
class OpmlController extends Controller
|
||
|
{
|
||
|
public function __construct(
|
||
|
IRequest $request,
|
||
|
private IL10N $l10n,
|
||
|
private PodcastDataReader $podcastDataReader,
|
||
|
private PodcastMetricsReader $podcastMetricsReader,
|
||
|
private UserService $userService
|
||
|
) {
|
||
|
parent::__construct(Application::APP_ID, $request);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @NoAdminRequired
|
||
|
* @NoCSRFRequired
|
||
|
*/
|
||
|
public function export(): DataDownloadResponse {
|
||
|
// https://github.com/AntennaPod/AntennaPod/blob/master/core/src/main/java/de/danoeh/antennapod/core/export/opml/OpmlWriter.java
|
||
|
$xml = new \SimpleXMLElement('<opml/>', namespaceOrPrefix: 'http://xmlpull.org/v1/doc/features.html#indent-output');
|
||
|
$xml->addAttribute('version', '2.0');
|
||
|
|
||
|
$dateCreated = new \DateTime();
|
||
|
$head = $xml->addChild('head');
|
||
|
|
||
|
if (isset($head)) {
|
||
|
$head->addChild('title', $this->l10n->t('RePod Subscriptions'));
|
||
|
$head->addChild('dateCreated', $dateCreated->format(\DateTime::RFC822));
|
||
|
}
|
||
|
|
||
|
$body = $xml->addChild('body');
|
||
|
|
||
|
if (isset($body)) {
|
||
|
$subscriptions = $this->podcastMetricsReader->metrics($this->userService->getUserUID());
|
||
|
|
||
|
foreach ($subscriptions as $subscription) {
|
||
|
$podcast = $this->podcastDataReader->getCachedOrFetchPodcastData($subscription->getUrl(), $this->userService->getUserUID());
|
||
|
|
||
|
if ($podcast) {
|
||
|
$outline = $body->addChild('outline');
|
||
|
|
||
|
if (isset($outline)) {
|
||
|
$title = $podcast->getTitle();
|
||
|
$link = $podcast->getLink();
|
||
|
|
||
|
if ($title) {
|
||
|
$outline->addAttribute('text', $title);
|
||
|
$outline->addAttribute('title', $title);
|
||
|
}
|
||
|
|
||
|
if ($link) {
|
||
|
$outline->addAttribute('xmlUrl', $link);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return new DataDownloadResponse((string) $xml->asXML(), 'repod-'.$dateCreated->getTimestamp().'.opml', ' application/xml');
|
||
|
}
|
||
|
}
|