diff --git a/vendor/PicoFeed/Parser.php b/vendor/PicoFeed/Parser.php index 667c20d..3af694e 100644 --- a/vendor/PicoFeed/Parser.php +++ b/vendor/PicoFeed/Parser.php @@ -105,4 +105,58 @@ abstract class Parser // crc32b seems to be faster and shorter than other hash algorithms return hash('crc32b', implode(func_get_args())); } + + + public function parseDate($value) + { + // Format => truncate to this length if not null + $formats = array( + DATE_ATOM => null, + DATE_RSS => null, + DATE_COOKIE => null, + DATE_ISO8601 => null, + DATE_RFC822 => null, + DATE_RFC850 => null, + DATE_RFC1036 => null, + DATE_RFC1123 => null, + DATE_RFC2822 => null, + DATE_RFC3339 => null, + 'D, d M Y H:i:s' => 25, + 'D, d M Y h:i:s' => 25, + 'D M d Y H:i:s' => 24, + 'Y-m-d H:i:s' => 19, + 'Y-m-d\TH:i:s' => 19, + 'd/m/Y H:i:s' => 19, + 'D, d M Y' => 16, + 'Y-m-d' => 10, + 'd-m-Y' => 10, + 'm-d-Y' => 10, + 'd.m.Y' => 10, + 'm.d.Y' => 10, + 'd/m/Y' => 10, + 'm/d/Y' => 10, + ); + + $value = trim($value); + + foreach ($formats as $format => $length) { + $timestamp = $this->getValidDate($format, substr($value, 0, $length)); + if ($timestamp > 0) return $timestamp; + } + + return time(); + } + + + public function getValidDate($format, $value) + { + $date = \DateTime::createFromFormat($format, $value); + + if ($date !== false) { + $errors = \DateTime::getLastErrors(); + if ($errors['error_count'] === 0 && $errors['warning_count'] === 0) return $date->getTimestamp(); + } + + return 0; + } } diff --git a/vendor/PicoFeed/Parsers/Atom.php b/vendor/PicoFeed/Parsers/Atom.php index 4959c51..59b3719 100644 --- a/vendor/PicoFeed/Parsers/Atom.php +++ b/vendor/PicoFeed/Parsers/Atom.php @@ -20,7 +20,7 @@ class Atom extends \PicoFeed\Parser $this->url = $this->getUrl($xml); $this->title = $this->stripWhiteSpace((string) $xml->title); $this->id = (string) $xml->id; - $this->updated = strtotime((string) $xml->updated); + $this->updated = $this->parseDate((string) $xml->updated); $author = (string) $xml->author->name; foreach ($xml->entry as $entry) { @@ -36,7 +36,7 @@ class Atom extends \PicoFeed\Parser $item->url = $this->getUrl($entry); $item->id = $this->generateId($id !== $item->url ? $id : $item->url, $this->url); $item->title = $this->stripWhiteSpace((string) $entry->title); - $item->updated = strtotime((string) $entry->updated); + $item->updated = $this->parseDate((string) $entry->updated); $item->author = $author; $item->content = $this->filterHtml($this->getContent($entry), $item->url); diff --git a/vendor/PicoFeed/Parsers/Rss10.php b/vendor/PicoFeed/Parsers/Rss10.php index 7e534ec..43c0b3c 100644 --- a/vendor/PicoFeed/Parsers/Rss10.php +++ b/vendor/PicoFeed/Parsers/Rss10.php @@ -26,7 +26,7 @@ class Rss10 extends \PicoFeed\Parser if (isset($namespaces['dc'])) { $ns_dc = $xml->channel->children($namespaces['dc']); - $this->updated = isset($ns_dc->date) ? strtotime($ns_dc->date) : time(); + $this->updated = isset($ns_dc->date) ? $this->parseDate($ns_dc->date) : time(); } else { @@ -48,8 +48,8 @@ class Rss10 extends \PicoFeed\Parser if (! $item->url && ! empty($namespace->origLink)) $item->url = (string) $namespace->origLink; if (! $item->author && ! empty($namespace->creator)) $item->author = (string) $namespace->creator; - if (! $item->updated && ! empty($namespace->date)) $item->updated = strtotime((string) $namespace->date); - if (! $item->updated && ! empty($namespace->updated)) $item->updated = strtotime((string) $namespace->updated); + if (! $item->updated && ! empty($namespace->date)) $item->updated = $this->parseDate((string) $namespace->date); + if (! $item->updated && ! empty($namespace->updated)) $item->updated = $this->parseDate((string) $namespace->updated); if (! $item->content && ! empty($namespace->encoded)) $item->content = (string) $namespace->encoded; } @@ -57,18 +57,15 @@ class Rss10 extends \PicoFeed\Parser if (empty($item->updated)) $item->updated = $this->updated; if (empty($item->content)) { - $item->content = isset($entry->description) ? (string) $entry->description : ''; } if (empty($item->author)) { if (isset($entry->author)) { - $item->author = (string) $entry->author; } else if (isset($xml->channel->webMaster)) { - $item->author = (string) $xml->channel->webMaster; } } diff --git a/vendor/PicoFeed/Parsers/Rss20.php b/vendor/PicoFeed/Parsers/Rss20.php index bb7e82b..1a0f3f0 100644 --- a/vendor/PicoFeed/Parsers/Rss20.php +++ b/vendor/PicoFeed/Parsers/Rss20.php @@ -39,8 +39,7 @@ class Rss20 extends \PicoFeed\Parser $this->title = $this->stripWhiteSpace((string) $xml->channel->title); $this->id = $this->url; - $this->updated = isset($xml->channel->pubDate) ? (string) $xml->channel->pubDate : (string) $xml->channel->lastBuildDate; - $this->updated = $this->updated ? strtotime($this->updated) : time(); + $this->updated = $this->parseDate(isset($xml->channel->pubDate) ? (string) $xml->channel->pubDate : (string) $xml->channel->lastBuildDate); // RSS feed might be empty if (! $xml->channel->item) { @@ -63,8 +62,8 @@ class Rss20 extends \PicoFeed\Parser if (! $item->url && ! empty($namespace->origLink)) $item->url = (string) $namespace->origLink; if (! $item->author && ! empty($namespace->creator)) $item->author = (string) $namespace->creator; - if (! $item->updated && ! empty($namespace->date)) $item->updated = strtotime((string) $namespace->date); - if (! $item->updated && ! empty($namespace->updated)) $item->updated = strtotime((string) $namespace->updated); + if (! $item->updated && ! empty($namespace->date)) $item->updated = $this->parseDate((string) $namespace->date); + if (! $item->updated && ! empty($namespace->updated)) $item->updated = $this->parseDate((string) $namespace->updated); if (! $item->content && ! empty($namespace->encoded)) $item->content = (string) $namespace->encoded; } @@ -78,7 +77,7 @@ class Rss20 extends \PicoFeed\Parser } } - if (empty($item->updated)) $item->updated = strtotime((string) $entry->pubDate) ?: $this->updated; + if (empty($item->updated)) $item->updated = $this->parseDate((string) $entry->pubDate) ?: $this->updated; if (empty($item->content)) { $item->content = isset($entry->description) ? (string) $entry->description : '';