channel; return new PodcastData( self::stringOrNull($channel->title), self::getXPathContent($xml, '/rss/channel/itunes:author'), self::stringOrNull($channel->link), self::stringOrNull($channel->description), self::getXPathContent($xml, '/rss/channel/image/url') ?? self::getXPathAttribute($xml, '/rss/channel/itunes:image/@href'), $fetchedAtUnix ?? (new \DateTime())->getTimestamp(), null, self::getXPathContent($xml, '/rss/channel/atom:link/@href') ); } /** * @param null|\SimpleXMLElement|string $value */ public static function stringOrNull($value): ?string { if ($value) { return (string) $value; } return null; } public function getAtomLink(): ?string { return $this->atomLink; } /** * @return PodcastDataType */ public function toArrayWithExtras() { return array_merge(parent::toArray(), [ 'atomLink' => $this->atomLink, ]); } private static function getXPathContent(\SimpleXMLElement $xml, string $xpath): ?string { $match = $xml->xpath($xpath); if ($match) { return (string) $match[0]; } return null; } private static function getXPathAttribute(\SimpleXMLElement $xml, string $xpath): ?string { $match = $xml->xpath($xpath); if ($match) { return (string) $match[0][0]; } return null; } }