diff options
Diffstat (limited to 'formats/MrssFormat.php')
-rw-r--r-- | formats/MrssFormat.php | 288 |
1 files changed, 146 insertions, 142 deletions
diff --git a/formats/MrssFormat.php b/formats/MrssFormat.php index 386b7d37..45c2181f 100644 --- a/formats/MrssFormat.php +++ b/formats/MrssFormat.php @@ -1,4 +1,5 @@ <?php + /** * MrssFormat - RSS 2.0 + Media RSS * http://www.rssboard.org/rss-specification @@ -24,146 +25,149 @@ * - Since the Media RSS extension has its own namespace, the output is a valid * RSS 2.0 feed that works with feed readers that don't support the extension. */ -class MrssFormat extends FormatAbstract { - const MIME_TYPE = 'application/rss+xml'; - - protected const ATOM_NS = 'http://www.w3.org/2005/Atom'; - protected const MRSS_NS = 'http://search.yahoo.com/mrss/'; - - const ALLOWED_IMAGE_EXT = array( - '.gif', '.jpg', '.png' - ); - - public function stringify(){ - $urlPrefix = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://'; - $urlHost = (isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : ''; - $urlPath = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : ''; - $urlRequest = (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : ''; - - $feedUrl = $urlPrefix . $urlHost . $urlRequest; - - $extraInfos = $this->getExtraInfos(); - $uri = !empty($extraInfos['uri']) ? $extraInfos['uri'] : REPOSITORY; - - $document = new DomDocument('1.0', $this->getCharset()); - $document->formatOutput = true; - $feed = $document->createElement('rss'); - $document->appendChild($feed); - $feed->setAttribute('version', '2.0'); - $feed->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:atom', self::ATOM_NS); - $feed->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:media', self::MRSS_NS); - - $channel = $document->createElement('channel'); - $feed->appendChild($channel); - - $title = $extraInfos['name']; - $channelTitle = $document->createElement('title'); - $channel->appendChild($channelTitle); - $channelTitle->appendChild($document->createTextNode($title)); - - $link = $document->createElement('link'); - $channel->appendChild($link); - $link->appendChild($document->createTextNode($uri)); - - $description = $document->createElement('description'); - $channel->appendChild($description); - $description->appendChild($document->createTextNode($extraInfos['name'])); - - $icon = $extraInfos['icon']; - if (!empty($icon) && in_array(substr($icon, -4), self::ALLOWED_IMAGE_EXT)) { - $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'); - $linkSelf->setAttribute('href', $feedUrl); - - foreach($this->getItems() as $item) { - $itemTimestamp = $item->getTimestamp(); - $itemTitle = $item->getTitle(); - $itemUri = $item->getURI(); - $itemContent = $item->getContent() ? $this->sanitizeHtml($item->getContent()) : ''; - $entryID = $item->getUid(); - $isPermaLink = 'false'; - - if (empty($entryID) && !empty($itemUri)) { // Fallback to provided URI - $entryID = $itemUri; - $isPermaLink = 'true'; - } - - if (empty($entryID)) // Fallback to title and content - $entryID = hash('sha1', $itemTitle . $itemContent); - - $entry = $document->createElement('item'); - $channel->appendChild($entry); - - if (!empty($itemTitle)) { - $entryTitle = $document->createElement('title'); - $entry->appendChild($entryTitle); - $entryTitle->appendChild($document->createTextNode($itemTitle)); - } - - if (!empty($itemUri)) { - $entryLink = $document->createElement('link'); - $entry->appendChild($entryLink); - $entryLink->appendChild($document->createTextNode($itemUri)); - } - - $entryGuid = $document->createElement('guid'); - $entryGuid->setAttribute('isPermaLink', $isPermaLink); - $entry->appendChild($entryGuid); - $entryGuid->appendChild($document->createTextNode($entryID)); - - if (!empty($itemTimestamp)) { - $entryPublished = $document->createElement('pubDate'); - $entry->appendChild($entryPublished); - $entryPublished->appendChild($document->createTextNode(gmdate(DATE_RFC2822, $itemTimestamp))); - } - - if (!empty($itemContent)) { - $entryDescription = $document->createElement('description'); - $entry->appendChild($entryDescription); - $entryDescription->appendChild($document->createTextNode($itemContent)); - } - - foreach($item->getEnclosures() as $enclosure) { - $entryEnclosure = $document->createElementNS(self::MRSS_NS, 'content'); - $entry->appendChild($entryEnclosure); - $entryEnclosure->setAttribute('url', $enclosure); - $entryEnclosure->setAttribute('type', getMimeType($enclosure)); - } - - $entryCategories = ''; - foreach($item->getCategories() as $category) { - $entryCategory = $document->createElement('category'); - $entry->appendChild($entryCategory); - $entryCategory->appendChild($document->createTextNode($category)); - } - } - - $toReturn = $document->saveXML(); - - // Remove invalid non-UTF8 characters - ini_set('mbstring.substitute_character', 'none'); - $toReturn = mb_convert_encoding($toReturn, $this->getCharset(), 'UTF-8'); - return $toReturn; - } +class MrssFormat extends FormatAbstract +{ + const MIME_TYPE = 'application/rss+xml'; + + protected const ATOM_NS = 'http://www.w3.org/2005/Atom'; + protected const MRSS_NS = 'http://search.yahoo.com/mrss/'; + + const ALLOWED_IMAGE_EXT = [ + '.gif', '.jpg', '.png' + ]; + + public function stringify() + { + $urlPrefix = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://'; + $urlHost = (isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : ''; + $urlPath = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : ''; + $urlRequest = (isset($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : ''; + + $feedUrl = $urlPrefix . $urlHost . $urlRequest; + + $extraInfos = $this->getExtraInfos(); + $uri = !empty($extraInfos['uri']) ? $extraInfos['uri'] : REPOSITORY; + + $document = new DomDocument('1.0', $this->getCharset()); + $document->formatOutput = true; + $feed = $document->createElement('rss'); + $document->appendChild($feed); + $feed->setAttribute('version', '2.0'); + $feed->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:atom', self::ATOM_NS); + $feed->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:media', self::MRSS_NS); + + $channel = $document->createElement('channel'); + $feed->appendChild($channel); + + $title = $extraInfos['name']; + $channelTitle = $document->createElement('title'); + $channel->appendChild($channelTitle); + $channelTitle->appendChild($document->createTextNode($title)); + + $link = $document->createElement('link'); + $channel->appendChild($link); + $link->appendChild($document->createTextNode($uri)); + + $description = $document->createElement('description'); + $channel->appendChild($description); + $description->appendChild($document->createTextNode($extraInfos['name'])); + + $icon = $extraInfos['icon']; + if (!empty($icon) && in_array(substr($icon, -4), self::ALLOWED_IMAGE_EXT)) { + $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'); + $linkSelf->setAttribute('href', $feedUrl); + + foreach ($this->getItems() as $item) { + $itemTimestamp = $item->getTimestamp(); + $itemTitle = $item->getTitle(); + $itemUri = $item->getURI(); + $itemContent = $item->getContent() ? $this->sanitizeHtml($item->getContent()) : ''; + $entryID = $item->getUid(); + $isPermaLink = 'false'; + + if (empty($entryID) && !empty($itemUri)) { // Fallback to provided URI + $entryID = $itemUri; + $isPermaLink = 'true'; + } + + if (empty($entryID)) { // Fallback to title and content + $entryID = hash('sha1', $itemTitle . $itemContent); + } + + $entry = $document->createElement('item'); + $channel->appendChild($entry); + + if (!empty($itemTitle)) { + $entryTitle = $document->createElement('title'); + $entry->appendChild($entryTitle); + $entryTitle->appendChild($document->createTextNode($itemTitle)); + } + + if (!empty($itemUri)) { + $entryLink = $document->createElement('link'); + $entry->appendChild($entryLink); + $entryLink->appendChild($document->createTextNode($itemUri)); + } + + $entryGuid = $document->createElement('guid'); + $entryGuid->setAttribute('isPermaLink', $isPermaLink); + $entry->appendChild($entryGuid); + $entryGuid->appendChild($document->createTextNode($entryID)); + + if (!empty($itemTimestamp)) { + $entryPublished = $document->createElement('pubDate'); + $entry->appendChild($entryPublished); + $entryPublished->appendChild($document->createTextNode(gmdate(DATE_RFC2822, $itemTimestamp))); + } + + if (!empty($itemContent)) { + $entryDescription = $document->createElement('description'); + $entry->appendChild($entryDescription); + $entryDescription->appendChild($document->createTextNode($itemContent)); + } + + foreach ($item->getEnclosures() as $enclosure) { + $entryEnclosure = $document->createElementNS(self::MRSS_NS, 'content'); + $entry->appendChild($entryEnclosure); + $entryEnclosure->setAttribute('url', $enclosure); + $entryEnclosure->setAttribute('type', getMimeType($enclosure)); + } + + $entryCategories = ''; + foreach ($item->getCategories() as $category) { + $entryCategory = $document->createElement('category'); + $entry->appendChild($entryCategory); + $entryCategory->appendChild($document->createTextNode($category)); + } + } + + $toReturn = $document->saveXML(); + + // Remove invalid non-UTF8 characters + ini_set('mbstring.substitute_character', 'none'); + $toReturn = mb_convert_encoding($toReturn, $this->getCharset(), 'UTF-8'); + return $toReturn; + } } |