75 if (class_exists(
'DOMDocument'))
77 $this->dom =
new DOMDocument();
79 set_error_handler(array(
'SimplePie_Misc',
'silence_errors'));
80 $this->dom->loadHTML($this->file->body);
81 restore_error_handler();
96 if ($this->
is_feed($this->file))
103 $sniffer = $this->registry->create(
'Content_Type_Sniffer', array($this->file));
104 if ($sniffer->get_type() !==
'text/html')
149 $sniffer = $this->registry->create(
'Content_Type_Sniffer', array(
$file));
150 $sniffed = $sniffer->get_type();
151 if (in_array($sniffed, array(
'application/rss+xml',
'application/rdf+xml',
'text/rdf',
'application/atom+xml',
'text/xml',
'application/xml')))
172 if ($this->dom === null)
176 $this->http_base = $this->file->url;
178 $elements = $this->dom->getElementsByTagName(
'base');
179 foreach ($elements as $element)
181 if ($element->hasAttribute(
'href'))
183 $base = $this->registry->call(
'Misc',
'absolutize_url', array(trim($element->getAttribute(
'href')), $this->http_base));
189 $this->base_location = method_exists($element,
'getLineNo') ? $element->getLineNo() : 0;
205 return array_values($feeds);
215 if ($this->dom === null)
220 $links = $this->dom->getElementsByTagName($name);
221 foreach ($links as $link)
223 if ($this->checked_feeds === $this->max_checked_feeds)
227 if ($link->hasAttribute(
'href') && $link->hasAttribute(
'rel'))
229 $rel = array_unique($this->registry->call(
'Misc',
'space_seperated_tokens', array(strtolower($link->getAttribute(
'rel')))));
230 $line = method_exists($link,
'getLineNo') ? $link->getLineNo() : 1;
232 if ($this->base_location < $line)
234 $href = $this->registry->call(
'Misc',
'absolutize_url', array(trim($link->getAttribute(
'href')), $this->base));
238 $href = $this->registry->call(
'Misc',
'absolutize_url', array(trim($link->getAttribute(
'href')), $this->http_base));
245 if (!in_array($href, $done) && in_array(
'feed', $rel) || (in_array(
'alternate', $rel) && !in_array(
'stylesheet', $rel) && $link->hasAttribute(
'type') && in_array(strtolower($this->registry->call(
'Misc',
'parse_mime', array($link->getAttribute(
'type')))), array(
'application/rss+xml',
'application/atom+xml'))) && !isset($feeds[$href]))
247 $this->checked_feeds++;
249 'Accept' =>
'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
251 $feed = $this->registry->create(
'File', array($href, $this->timeout, 5, $headers, $this->useragent));
252 if ($feed->success && ($feed->method &
SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
254 $feeds[$href] = $feed;
266 if ($this->dom === null)
271 $links = $this->dom->getElementsByTagName(
'a');
272 foreach ($links as $link)
274 if ($link->hasAttribute(
'href'))
276 $href = trim($link->getAttribute(
'href'));
277 $parsed = $this->registry->call(
'Misc',
'parse_url', array($href));
278 if ($parsed[
'scheme'] ===
'' || preg_match(
'/^(http(s)|feed)?$/i', $parsed[
'scheme']))
280 if ($this->base_location < $link->getLineNo())
282 $href = $this->registry->call(
'Misc',
'absolutize_url', array(trim($link->getAttribute(
'href')), $this->base));
286 $href = $this->registry->call(
'Misc',
'absolutize_url', array(trim($link->getAttribute(
'href')), $this->http_base));
293 $current = $this->registry->call(
'Misc',
'parse_url', array($this->file->url));
295 if ($parsed[
'authority'] ===
'' || $parsed[
'authority'] === $current[
'authority'])
297 $this->local[] = $href;
301 $this->elsewhere[] = $href;
306 $this->local = array_unique($this->local);
307 $this->elsewhere = array_unique($this->elsewhere);
308 if (!empty($this->local) || !empty($this->elsewhere))
317 foreach ($array as $key => $value)
319 if ($this->checked_feeds === $this->max_checked_feeds)
323 if (in_array(strtolower(strrchr($value,
'.')), array(
'.rss',
'.rdf',
'.atom',
'.xml')))
325 $this->checked_feeds++;
328 'Accept' =>
'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
330 $feed = $this->registry->create(
'File', array($value, $this->timeout, 5, $headers, $this->useragent));
331 if ($feed->success && ($feed->method &
SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
346 foreach ($array as $key => $value)
348 if ($this->checked_feeds === $this->max_checked_feeds)
352 if (preg_match(
'/(rss|rdf|atom|xml)/i', $value))
354 $this->checked_feeds++;
356 'Accept' =>
'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
358 $feed = $this->registry->create(
'File', array($value, $this->timeout, 5, null, $this->useragent));
359 if ($feed->success && ($feed->method &
SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))