mirror of
https://github.com/RSS-Bridge/rss-bridge.git
synced 2025-07-30 21:30:14 +02:00
feat: support itunes namespace in top channel feed (#3776)
Also preserves other properties.
This commit is contained in:
@@ -17,44 +17,61 @@ class AtomFormat extends FormatAbstract
|
||||
public function stringify()
|
||||
{
|
||||
$document = new \DomDocument('1.0', $this->getCharset());
|
||||
$document->formatOutput = true;
|
||||
|
||||
$feedUrl = get_current_url();
|
||||
|
||||
$extraInfos = $this->getExtraInfos();
|
||||
if (empty($extraInfos['uri'])) {
|
||||
$uri = REPOSITORY;
|
||||
} else {
|
||||
$uri = $extraInfos['uri'];
|
||||
}
|
||||
|
||||
$document->formatOutput = true;
|
||||
$feed = $document->createElementNS(self::ATOM_NS, 'feed');
|
||||
$document->appendChild($feed);
|
||||
$feed->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:media', self::MRSS_NS);
|
||||
|
||||
$title = $document->createElement('title');
|
||||
$feed->appendChild($title);
|
||||
$title->setAttribute('type', 'text');
|
||||
$title->appendChild($document->createTextNode($extraInfos['name']));
|
||||
$feedArray = $this->getFeed();
|
||||
foreach ($feedArray as $feedKey => $feedValue) {
|
||||
if (in_array($feedKey, ['donationUri'])) {
|
||||
continue;
|
||||
}
|
||||
if ($feedKey === 'name') {
|
||||
$title = $document->createElement('title');
|
||||
$feed->appendChild($title);
|
||||
$title->setAttribute('type', 'text');
|
||||
$title->appendChild($document->createTextNode($feedValue));
|
||||
} elseif ($feedKey === 'icon') {
|
||||
if ($feedValue) {
|
||||
$icon = $document->createElement('icon');
|
||||
$feed->appendChild($icon);
|
||||
$icon->appendChild($document->createTextNode($feedValue));
|
||||
|
||||
$logo = $document->createElement('logo');
|
||||
$feed->appendChild($logo);
|
||||
$logo->appendChild($document->createTextNode($feedValue));
|
||||
}
|
||||
} elseif ($feedKey === 'uri') {
|
||||
if ($feedValue) {
|
||||
$linkAlternate = $document->createElement('link');
|
||||
$feed->appendChild($linkAlternate);
|
||||
$linkAlternate->setAttribute('rel', 'alternate');
|
||||
$linkAlternate->setAttribute('type', 'text/html');
|
||||
$linkAlternate->setAttribute('href', $feedValue);
|
||||
|
||||
$linkSelf = $document->createElement('link');
|
||||
$feed->appendChild($linkSelf);
|
||||
$linkSelf->setAttribute('rel', 'self');
|
||||
$linkSelf->setAttribute('type', 'application/atom+xml');
|
||||
$linkSelf->setAttribute('href', $feedUrl);
|
||||
}
|
||||
} elseif ($feedKey === 'itunes') {
|
||||
// todo: skip?
|
||||
} else {
|
||||
$element = $document->createElement($feedKey);
|
||||
$feed->appendChild($element);
|
||||
$element->appendChild($document->createTextNode($feedValue));
|
||||
}
|
||||
}
|
||||
|
||||
$id = $document->createElement('id');
|
||||
$feed->appendChild($id);
|
||||
$id->appendChild($document->createTextNode($feedUrl));
|
||||
|
||||
$uriparts = parse_url($uri);
|
||||
if (empty($extraInfos['icon'])) {
|
||||
$iconUrl = $uriparts['scheme'] . '://' . $uriparts['host'] . '/favicon.ico';
|
||||
} else {
|
||||
$iconUrl = $extraInfos['icon'];
|
||||
}
|
||||
$icon = $document->createElement('icon');
|
||||
$feed->appendChild($icon);
|
||||
$icon->appendChild($document->createTextNode($iconUrl));
|
||||
|
||||
$logo = $document->createElement('logo');
|
||||
$feed->appendChild($logo);
|
||||
$logo->appendChild($document->createTextNode($iconUrl));
|
||||
|
||||
$feedTimestamp = gmdate(DATE_ATOM, $this->lastModified);
|
||||
$updated = $document->createElement('updated');
|
||||
$feed->appendChild($updated);
|
||||
@@ -69,17 +86,7 @@ class AtomFormat extends FormatAbstract
|
||||
$author->appendChild($authorName);
|
||||
$authorName->appendChild($document->createTextNode($feedAuthor));
|
||||
|
||||
$linkAlternate = $document->createElement('link');
|
||||
$feed->appendChild($linkAlternate);
|
||||
$linkAlternate->setAttribute('rel', 'alternate');
|
||||
$linkAlternate->setAttribute('type', 'text/html');
|
||||
$linkAlternate->setAttribute('href', $uri);
|
||||
|
||||
$linkSelf = $document->createElement('link');
|
||||
$feed->appendChild($linkSelf);
|
||||
$linkSelf->setAttribute('rel', 'self');
|
||||
$linkSelf->setAttribute('type', 'application/atom+xml');
|
||||
$linkSelf->setAttribute('href', $feedUrl);
|
||||
|
||||
foreach ($this->getItems() as $item) {
|
||||
$itemArray = $item->toArray();
|
||||
|
@@ -8,7 +8,7 @@ class HtmlFormat extends FormatAbstract
|
||||
{
|
||||
$queryString = $_SERVER['QUERY_STRING'];
|
||||
|
||||
$extraInfos = $this->getExtraInfos();
|
||||
$feedArray = $this->getFeed();
|
||||
$formatFactory = new FormatFactory();
|
||||
$buttons = [];
|
||||
$linkTags = [];
|
||||
@@ -29,9 +29,9 @@ class HtmlFormat extends FormatAbstract
|
||||
];
|
||||
}
|
||||
|
||||
if (Configuration::getConfig('admin', 'donations') && $extraInfos['donationUri'] !== '') {
|
||||
if (Configuration::getConfig('admin', 'donations') && $feedArray['donationUri']) {
|
||||
$buttons[] = [
|
||||
'href' => e($extraInfos['donationUri']),
|
||||
'href' => e($feedArray['donationUri']),
|
||||
'value' => 'Donate to maintainer',
|
||||
];
|
||||
}
|
||||
@@ -39,7 +39,7 @@ class HtmlFormat extends FormatAbstract
|
||||
$items = [];
|
||||
foreach ($this->getItems() as $item) {
|
||||
$items[] = [
|
||||
'url' => $item->getURI() ?: $extraInfos['uri'],
|
||||
'url' => $item->getURI() ?: $feedArray['uri'],
|
||||
'title' => $item->getTitle() ?? '(no title)',
|
||||
'timestamp' => $item->getTimestamp(),
|
||||
'author' => $item->getAuthor(),
|
||||
@@ -51,9 +51,9 @@ class HtmlFormat extends FormatAbstract
|
||||
|
||||
$html = render_template(__DIR__ . '/../templates/html-format.html.php', [
|
||||
'charset' => $this->getCharset(),
|
||||
'title' => $extraInfos['name'],
|
||||
'title' => $feedArray['name'],
|
||||
'linkTags' => $linkTags,
|
||||
'uri' => $extraInfos['uri'],
|
||||
'uri' => $feedArray['uri'],
|
||||
'buttons' => $buttons,
|
||||
'items' => $items,
|
||||
]);
|
||||
|
@@ -25,18 +25,18 @@ class JsonFormat extends FormatAbstract
|
||||
|
||||
public function stringify()
|
||||
{
|
||||
$host = $_SERVER['HTTP_HOST'] ?? '';
|
||||
$extraInfos = $this->getExtraInfos();
|
||||
$feedArray = $this->getFeed();
|
||||
|
||||
$data = [
|
||||
'version' => 'https://jsonfeed.org/version/1',
|
||||
'title' => empty($extraInfos['name']) ? $host : $extraInfos['name'],
|
||||
'home_page_url' => empty($extraInfos['uri']) ? REPOSITORY : $extraInfos['uri'],
|
||||
'feed_url' => get_current_url(),
|
||||
'version' => 'https://jsonfeed.org/version/1',
|
||||
'title' => $feedArray['name'],
|
||||
'home_page_url' => $feedArray['uri'],
|
||||
'feed_url' => get_current_url(),
|
||||
];
|
||||
|
||||
if (!empty($extraInfos['icon'])) {
|
||||
$data['icon'] = $extraInfos['icon'];
|
||||
$data['favicon'] = $extraInfos['icon'];
|
||||
if ($feedArray['icon']) {
|
||||
$data['icon'] = $feedArray['icon'];
|
||||
$data['favicon'] = $feedArray['icon'];
|
||||
}
|
||||
|
||||
$items = [];
|
||||
|
@@ -35,16 +35,8 @@ class MrssFormat extends FormatAbstract
|
||||
public function stringify()
|
||||
{
|
||||
$document = new \DomDocument('1.0', $this->getCharset());
|
||||
|
||||
$feedUrl = get_current_url();
|
||||
$extraInfos = $this->getExtraInfos();
|
||||
if (empty($extraInfos['uri'])) {
|
||||
$uri = REPOSITORY;
|
||||
} else {
|
||||
$uri = $extraInfos['uri'];
|
||||
}
|
||||
|
||||
$document->formatOutput = true;
|
||||
|
||||
$feed = $document->createElement('rss');
|
||||
$document->appendChild($feed);
|
||||
$feed->setAttribute('version', '2.0');
|
||||
@@ -54,51 +46,74 @@ class MrssFormat extends FormatAbstract
|
||||
$channel = $document->createElement('channel');
|
||||
$feed->appendChild($channel);
|
||||
|
||||
$title = $extraInfos['name'];
|
||||
$channelTitle = $document->createElement('title');
|
||||
$channel->appendChild($channelTitle);
|
||||
$channelTitle->appendChild($document->createTextNode($title));
|
||||
$feedArray = $this->getFeed();
|
||||
$uri = $feedArray['uri'];
|
||||
$title = $feedArray['name'];
|
||||
|
||||
$link = $document->createElement('link');
|
||||
$channel->appendChild($link);
|
||||
$link->appendChild($document->createTextNode($uri));
|
||||
foreach ($feedArray as $feedKey => $feedValue) {
|
||||
if (in_array($feedKey, ['atom', 'donationUri'])) {
|
||||
continue;
|
||||
}
|
||||
if ($feedKey === 'name') {
|
||||
$channelTitle = $document->createElement('title');
|
||||
$channel->appendChild($channelTitle);
|
||||
$channelTitle->appendChild($document->createTextNode($title));
|
||||
|
||||
$description = $document->createElement('description');
|
||||
$channel->appendChild($description);
|
||||
$description->appendChild($document->createTextNode($extraInfos['name']));
|
||||
$description = $document->createElement('description');
|
||||
$channel->appendChild($description);
|
||||
$description->appendChild($document->createTextNode($title));
|
||||
} elseif ($feedKey === 'uri') {
|
||||
$link = $document->createElement('link');
|
||||
$channel->appendChild($link);
|
||||
$link->appendChild($document->createTextNode($uri));
|
||||
|
||||
$allowedIconExtensions = [
|
||||
'.gif',
|
||||
'.jpg',
|
||||
'.png',
|
||||
];
|
||||
$icon = $extraInfos['icon'];
|
||||
if (!empty($icon) && in_array(substr($icon, -4), $allowedIconExtensions)) {
|
||||
$feedImage = $document->createElement('image');
|
||||
$channel->appendChild($feedImage);
|
||||
$iconUrl = $document->createElement('url');
|
||||
$iconUrl->appendChild($document->createTextNode($icon));
|
||||
$feedImage->appendChild($iconUrl);
|
||||
$iconTitle = $document->createElement('title');
|
||||
$iconTitle->appendChild($document->createTextNode($title));
|
||||
$feedImage->appendChild($iconTitle);
|
||||
$iconLink = $document->createElement('link');
|
||||
$iconLink->appendChild($document->createTextNode($uri));
|
||||
$feedImage->appendChild($iconLink);
|
||||
$linkAlternate = $document->createElementNS(self::ATOM_NS, 'link');
|
||||
$channel->appendChild($linkAlternate);
|
||||
$linkAlternate->setAttribute('rel', 'alternate');
|
||||
$linkAlternate->setAttribute('type', 'text/html');
|
||||
$linkAlternate->setAttribute('href', $uri);
|
||||
|
||||
$linkSelf = $document->createElementNS(self::ATOM_NS, 'link');
|
||||
$channel->appendChild($linkSelf);
|
||||
$linkSelf->setAttribute('rel', 'self');
|
||||
$linkSelf->setAttribute('type', 'application/atom+xml');
|
||||
$feedUrl = get_current_url();
|
||||
$linkSelf->setAttribute('href', $feedUrl);
|
||||
} elseif ($feedKey === 'icon') {
|
||||
$allowedIconExtensions = [
|
||||
'.gif',
|
||||
'.jpg',
|
||||
'.png',
|
||||
'.ico',
|
||||
];
|
||||
$icon = $feedValue;
|
||||
if ($icon && in_array(substr($icon, -4), $allowedIconExtensions)) {
|
||||
$feedImage = $document->createElement('image');
|
||||
$channel->appendChild($feedImage);
|
||||
$iconUrl = $document->createElement('url');
|
||||
$iconUrl->appendChild($document->createTextNode($icon));
|
||||
$feedImage->appendChild($iconUrl);
|
||||
$iconTitle = $document->createElement('title');
|
||||
$iconTitle->appendChild($document->createTextNode($title));
|
||||
$feedImage->appendChild($iconTitle);
|
||||
$iconLink = $document->createElement('link');
|
||||
$iconLink->appendChild($document->createTextNode($uri));
|
||||
$feedImage->appendChild($iconLink);
|
||||
}
|
||||
} elseif ($feedKey === 'itunes') {
|
||||
$feed->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:itunes', self::ITUNES_NS);
|
||||
foreach ($feedValue as $itunesKey => $itunesValue) {
|
||||
$itunesProperty = $document->createElementNS(self::ITUNES_NS, $itunesKey);
|
||||
$channel->appendChild($itunesProperty);
|
||||
$itunesProperty->appendChild($document->createTextNode($itunesValue));
|
||||
}
|
||||
} else {
|
||||
$element = $document->createElement($feedKey);
|
||||
$channel->appendChild($element);
|
||||
$element->appendChild($document->createTextNode($feedValue));
|
||||
}
|
||||
}
|
||||
|
||||
$linkAlternate = $document->createElementNS(self::ATOM_NS, 'link');
|
||||
$channel->appendChild($linkAlternate);
|
||||
$linkAlternate->setAttribute('rel', 'alternate');
|
||||
$linkAlternate->setAttribute('type', 'text/html');
|
||||
$linkAlternate->setAttribute('href', $uri);
|
||||
|
||||
$linkSelf = $document->createElementNS(self::ATOM_NS, 'link');
|
||||
$channel->appendChild($linkSelf);
|
||||
$linkSelf->setAttribute('rel', 'self');
|
||||
$linkSelf->setAttribute('type', 'application/atom+xml');
|
||||
$linkSelf->setAttribute('href', $feedUrl);
|
||||
|
||||
foreach ($this->getItems() as $item) {
|
||||
$itemArray = $item->toArray();
|
||||
$itemTimestamp = $item->getTimestamp();
|
||||
@@ -135,6 +150,7 @@ class MrssFormat extends FormatAbstract
|
||||
$entry->appendChild($itunesProperty);
|
||||
$itunesProperty->appendChild($document->createTextNode($itunesValue));
|
||||
}
|
||||
|
||||
if (isset($itemArray['enclosure'])) {
|
||||
$itunesEnclosure = $document->createElement('enclosure');
|
||||
$entry->appendChild($itunesEnclosure);
|
||||
@@ -142,7 +158,9 @@ class MrssFormat extends FormatAbstract
|
||||
$itunesEnclosure->setAttribute('length', $itemArray['enclosure']['length']);
|
||||
$itunesEnclosure->setAttribute('type', $itemArray['enclosure']['type']);
|
||||
}
|
||||
} if (!empty($itemUri)) {
|
||||
}
|
||||
|
||||
if (!empty($itemUri)) {
|
||||
$entryLink = $document->createElement('link');
|
||||
$entry->appendChild($entryLink);
|
||||
$entryLink->appendChild($document->createTextNode($itemUri));
|
||||
|
@@ -6,11 +6,11 @@ class PlaintextFormat extends FormatAbstract
|
||||
|
||||
public function stringify()
|
||||
{
|
||||
$data = [];
|
||||
$feed = $this->getFeed();
|
||||
foreach ($this->getItems() as $item) {
|
||||
$data[] = $item->toArray();
|
||||
$feed['items'][] = $item->toArray();
|
||||
}
|
||||
$text = print_r($data, true);
|
||||
$text = print_r($feed, true);
|
||||
// Remove invalid non-UTF8 characters
|
||||
ini_set('mbstring.substitute_character', 'none');
|
||||
$text = mb_convert_encoding($text, $this->getCharset(), 'UTF-8');
|
||||
|
Reference in New Issue
Block a user