nextcloud-gpodder/lib/Core/PodcastData/PodcastData.php
2022-10-28 09:50:44 +02:00

123 lines
2.4 KiB
PHP

<?php
declare(strict_types=1);
namespace OCA\GPodderSync\Core\PodcastData;
use DateTime;
use SimpleXMLElement;
class PodcastData {
private string $title;
private string $author;
private string $link;
private string $description;
private string $image;
private int $fetchedAtUnix;
public function __construct(
string $title,
string $author,
string $link,
string $description,
string $image,
int $fetchedAtUnix,
) {
$this->title = $title;
$this->author = $author;
$this->link = $link;
$this->description = $description;
$this->image = $image;
$this->fetchedAtUnix = $fetchedAtUnix;
}
public static function parseXml(string $xmlString): PodcastData {
$xml = new SimpleXMLElement($xmlString);
$channel = $xml->channel;
return new PodcastData(
title: (string)$channel->title,
author: self::getXPathContent($xml, '/rss/channel/itunes:author'),
link: (string)$channel->link,
description: (string)$channel->description,
image:
self::getXPathContent($xml, '/rss/channel/image/url')
?? self::getXPathAttribute($xml, '/rss/channel/itunes:image/@href'),
fetchedAtUnix: (new DateTime())->getTimestamp(),
);
}
private static function getXPathContent(SimpleXMLElement $xml, string $xpath) {
$match = $xml->xpath($xpath);
if ($match) {
return (string)$match[0];
}
return null;
}
private static function getXPathAttribute(SimpleXMLElement $xml, string $xpath) {
$match = $xml->xpath($xpath);
if ($match) {
return (string)$match[0][0];
}
return null;
}
/**
* @return string
*/
public function getTitle(): string {
return $this->title;
}
/**
* @return string
*/
public function getAuthor(): string {
return $this->author;
}
/**
* @return string
*/
public function getLink(): string {
return $this->link;
}
/**
* @return string
*/
public function getDescription(): string {
return $this->description;
}
/**
* @return string
*/
public function getImage(): string {
return $this->image;
}
/**
* @return int
*/
public function getFetchedAtUnix(): int {
return $this->fetchedAtUnix;
}
public function __toString() : String {
return $this->title;
}
public function toArray(): array {
return
[
'title' => $this->title,
'author' => $this->author,
'link' => $this->link,
'description' => $this->description,
'image' => $this->image,
'fetchedAtUnix' => $this->fetchedAtUnix,
];
}
}