nextcloud-gpodder/lib/Core/PodcastData/PodcastData.php

182 lines
3.7 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace OCA\GPodderSync\Core\PodcastData;
use DateTime;
2022-09-17 15:20:26 +00:00
use JsonSerializable;
use SimpleXMLElement;
2022-09-17 15:20:26 +00:00
class PodcastData implements JsonSerializable {
2022-09-17 19:03:14 +00:00
private ?string $title;
private ?string $author;
private ?string $link;
private ?string $description;
private ?string $imageUrl;
private int $fetchedAtUnix;
2022-09-17 19:03:14 +00:00
private ?string $imageBlob;
public function __construct(
2022-09-17 19:03:14 +00:00
?string $title,
?string $author,
?string $link,
?string $description,
?string $imageUrl,
int $fetchedAtUnix,
2022-09-17 19:03:14 +00:00
?string $imageBlob = null,
) {
$this->title = $title;
$this->author = $author;
$this->link = $link;
$this->description = $description;
2022-09-17 19:03:14 +00:00
$this->imageUrl = $imageUrl;
$this->fetchedAtUnix = $fetchedAtUnix;
2022-09-17 19:03:14 +00:00
$this->imageBlob = $imageBlob;
}
2022-09-17 15:20:26 +00:00
/**
* @return PodcastData
* @throws Exception if the XML data could not be parsed.
*/
2022-09-17 15:03:02 +00:00
public static function parseRssXml(string $xmlString, ?int $fetchedAtUnix = null): PodcastData {
$xml = new SimpleXMLElement($xmlString);
$channel = $xml->channel;
return new PodcastData(
2022-09-17 19:03:14 +00:00
title: self::stringOrNull($channel->title),
author: self::getXPathContent($xml, '/rss/channel/itunes:author'),
link: self::stringOrNull($channel->link),
description: self::stringOrNull($channel->description),
imageUrl:
self::getXPathContent($xml, '/rss/channel/image/url')
?? self::getXPathAttribute($xml, '/rss/channel/itunes:image/@href'),
2022-09-17 15:03:02 +00:00
fetchedAtUnix: $fetchedAtUnix ?? (new DateTime())->getTimestamp(),
);
}
2022-09-17 19:03:14 +00:00
private static function stringOrNull(mixed $value): ?string {
if ($value) {
return (string)$value;
}
return null;
}
2022-09-17 15:20:26 +00:00
private static function getXPathContent(SimpleXMLElement $xml, string $xpath): ?string {
$match = $xml->xpath($xpath);
if ($match) {
return (string)$match[0];
}
return null;
}
2022-09-17 15:20:26 +00:00
private static function getXPathAttribute(SimpleXMLElement $xml, string $xpath): ?string {
$match = $xml->xpath($xpath);
if ($match) {
return (string)$match[0][0];
}
return null;
}
/**
2022-09-17 19:03:14 +00:00
* @return string|null
*/
2022-09-17 19:03:14 +00:00
public function getTitle(): ?string {
return $this->title;
}
/**
2022-09-17 19:03:14 +00:00
* @return string|null
*/
2022-09-17 19:03:14 +00:00
public function getAuthor(): ?string {
return $this->author;
}
/**
2022-09-17 19:03:14 +00:00
* @return string|null
*/
2022-09-17 19:03:14 +00:00
public function getLink(): ?string {
return $this->link;
}
/**
2022-09-17 19:03:14 +00:00
* @return string|null
*/
2022-09-17 19:03:14 +00:00
public function getDescription(): ?string {
return $this->description;
}
/**
2022-09-17 19:03:14 +00:00
* @return string|null
*/
2022-09-17 19:03:14 +00:00
public function getImageUrl(): ?string {
return $this->imageUrl;
}
/**
2022-09-17 19:03:14 +00:00
* @return int|null
*/
2022-09-17 19:03:14 +00:00
public function getFetchedAtUnix(): ?int {
return $this->fetchedAtUnix;
}
2022-09-17 19:03:14 +00:00
/**
* @return string|null
*/
public function getImageBlob(): ?string {
return $this->imageBlob;
}
/**
* @param string $blob
* @return void
*/
public function setImageBlob(?string $blob): void {
$this->imageBlob = $blob;
}
2022-09-17 15:03:02 +00:00
/**
* @return string
*/
2022-09-17 19:03:14 +00:00
public function __toString() : string {
return $this->title ?? '/no title/';
}
2022-09-17 15:03:02 +00:00
/**
2022-09-17 15:20:26 +00:00
* @return array<string,mixed>
2022-09-17 15:03:02 +00:00
*/
public function toArray(): array {
return
[
'title' => $this->title,
'author' => $this->author,
'link' => $this->link,
'description' => $this->description,
2022-09-17 19:03:14 +00:00
'imageUrl' => $this->imageUrl,
'imageBlob' => $this->imageBlob,
'fetchedAtUnix' => $this->fetchedAtUnix,
];
}
2022-09-17 15:03:02 +00:00
2022-09-17 15:20:26 +00:00
/**
* @return array<string,mixed>
*/
public function jsonSerialize(): mixed {
return $this->toArray();
}
2022-09-17 15:03:02 +00:00
/**
* @return PodcastData
*/
public static function fromArray(array $data): PodcastData {
return new PodcastData(
title: $data['title'],
author: $data['author'],
link: $data['link'],
description: $data['description'],
2022-09-17 19:03:14 +00:00
imageUrl: $data['imageUrl'],
2022-09-17 15:03:02 +00:00
fetchedAtUnix: $data['fetchedAtUnix'],
2022-09-17 19:03:14 +00:00
imageBlob: $data['imageBlob'],
2022-09-17 15:03:02 +00:00
);
}
}