diff --git a/common.php b/common.php index f4f4ee5..b194aab 100644 --- a/common.php +++ b/common.php @@ -34,6 +34,10 @@ defined('AUTO_UPDATE_BACKUP_DIRECTORY') or define('AUTO_UPDATE_BACKUP_DIRECTORY' require __DIR__.'/check_setup.php'; +if (DEBUG) { + PicoFeed\Logging\Logger::enable(); +} + PicoDb\Database::bootstrap('db', function() { $db = new PicoDb\Database(array( diff --git a/models/feed.php b/models/feed.php index ddc3a2d..1155801 100644 --- a/models/feed.php +++ b/models/feed.php @@ -59,7 +59,7 @@ function get_favicons(array $feed_ids) return Database::get('db') ->table('favicons') ->in('feed_id', $feed_ids) - ->listing('feed_id', 'icon'); + ->hashmap('feed_id', 'icon'); } // Get all favicons for a list of items @@ -83,7 +83,7 @@ function get_all_favicons() return Database::get('db') ->table('favicons') - ->listing('feed_id', 'icon'); + ->hashmap('feed_id', 'icon'); } // Update feed information @@ -290,7 +290,7 @@ function get_ids($limit = LIMIT_ALL) $query->limit((int) $limit); } - return $query->listing('id', 'id'); + return $query->hashmap('id', 'id'); } // get number of feeds with errors diff --git a/models/item.php b/models/item.php index 7d77d9d..612d0ea 100644 --- a/models/item.php +++ b/models/item.php @@ -71,7 +71,7 @@ function get_all_status() ->table('items') ->in('status', array('read', 'unread')) ->orderBy('updated', 'desc') - ->listing('id', 'status'); + ->hashmap('id', 'status'); } // Get all items by status diff --git a/vendor/autoload.php b/vendor/autoload.php index 42e1071..59313d8 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -4,4 +4,4 @@ require_once __DIR__ . '/composer' . '/autoload_real.php'; -return ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb::getLoader(); +return ComposerAutoloaderInita3275f8a3fafdaf0ccb719369aca304a::getLoader(); diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 80a189b..f7187d5 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -36,6 +36,7 @@ return array( 'PicoFeed\\Filter\\Tag' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php', 'PicoFeed\\Logging\\Logger' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Logging/Logger.php', 'PicoFeed\\Parser\\Atom' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php', + 'PicoFeed\\Parser\\DateParser' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php', 'PicoFeed\\Parser\\Feed' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php', 'PicoFeed\\Parser\\Item' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/Item.php', 'PicoFeed\\Parser\\MalformedXmlException' => $vendorDir . '/fguillot/picofeed/lib/PicoFeed/Parser/MalformedXmlException.php', diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 8a6f371..97a8bfd 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb +class ComposerAutoloaderInita3275f8a3fafdaf0ccb719369aca304a { private static $loader; @@ -19,9 +19,9 @@ class ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInita3275f8a3fafdaf0ccb719369aca304a', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); - spl_autoload_unregister(array('ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInita3275f8a3fafdaf0ccb719369aca304a', 'loadClassLoader')); $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { @@ -42,14 +42,14 @@ class ComposerAutoloaderInitdd123afa0ab8d569c051c35ab70311cb $includeFiles = require __DIR__ . '/autoload_files.php'; foreach ($includeFiles as $file) { - composerRequiredd123afa0ab8d569c051c35ab70311cb($file); + composerRequirea3275f8a3fafdaf0ccb719369aca304a($file); } return $loader; } } -function composerRequiredd123afa0ab8d569c051c35ab70311cb($file) +function composerRequirea3275f8a3fafdaf0ccb719369aca304a($file) { require $file; } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 0d1419d..f0a6931 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -38,84 +38,6 @@ "description": "The most easy to use validator library for PHP :)", "homepage": "https://github.com/fguillot/simpleValidator" }, - { - "name": "fguillot/json-rpc", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/fguillot/JsonRPC.git", - "reference": "86e8339205616ad9b09d581957cc084a99c0ed27" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fguillot/JsonRPC/zipball/86e8339205616ad9b09d581957cc084a99c0ed27", - "reference": "86e8339205616ad9b09d581957cc084a99c0ed27", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2014-11-22 20:32:14", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "JsonRPC": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Unlicense" - ], - "authors": [ - { - "name": "Frédéric Guillot", - "homepage": "http://fredericguillot.com" - } - ], - "description": "A simple Json-RPC client/server library that just works", - "homepage": "https://github.com/fguillot/JsonRPC" - }, - { - "name": "fguillot/picodb", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/fguillot/picoDb.git", - "reference": "268b3389d2bc3c92ef749a63440d17bd75e2a628" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fguillot/picoDb/zipball/268b3389d2bc3c92ef749a63440d17bd75e2a628", - "reference": "268b3389d2bc3c92ef749a63440d17bd75e2a628", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2015-01-03 00:32:58", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "PicoDb": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "WTFPL" - ], - "authors": [ - { - "name": "Frédéric Guillot", - "homepage": "http://fredericguillot.com" - } - ], - "description": "Minimalist database query builder", - "homepage": "https://github.com/fguillot/picoDb" - }, { "name": "fguillot/picofarad", "version": "dev-master", @@ -155,6 +77,45 @@ "description": "Minimalist micro-framework", "homepage": "https://github.com/fguillot/picoFarad" }, + { + "name": "fguillot/json-rpc", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://github.com/fguillot/JsonRPC.git", + "reference": "f2d92d5a27749e1cfced841f96203f3275a5c16c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fguillot/JsonRPC/zipball/f2d92d5a27749e1cfced841f96203f3275a5c16c", + "reference": "f2d92d5a27749e1cfced841f96203f3275a5c16c", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2015-01-19 03:42:02", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "JsonRPC": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Unlicense" + ], + "authors": [ + { + "name": "Frédéric Guillot", + "homepage": "http://fredericguillot.com" + } + ], + "description": "A simple Json-RPC client/server library that just works", + "homepage": "https://github.com/fguillot/JsonRPC" + }, { "name": "fguillot/picofeed", "version": "dev-master", @@ -162,18 +123,18 @@ "source": { "type": "git", "url": "https://github.com/fguillot/picoFeed.git", - "reference": "f3ed9fef18b4cd0d25a1fd389c8a2e2370bcb51b" + "reference": "8858f63e5380e8b1df4d8a4bbc5618931cddde7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fguillot/picoFeed/zipball/d3785fc54d0bf9d521fd85e369cc5600f66099cc", - "reference": "f3ed9fef18b4cd0d25a1fd389c8a2e2370bcb51b", + "url": "https://api.github.com/repos/fguillot/picoFeed/zipball/8858f63e5380e8b1df4d8a4bbc5618931cddde7d", + "reference": "8858f63e5380e8b1df4d8a4bbc5618931cddde7d", "shasum": "" }, "require": { "php": ">=5.3.0" }, - "time": "2015-01-18 00:05:29", + "time": "2015-01-18 02:06:19", "type": "library", "installation-source": "dist", "autoload": { @@ -193,5 +154,44 @@ ], "description": "Modern library to write or read feeds (RSS/Atom)", "homepage": "http://fguillot.github.io/picoFeed" + }, + { + "name": "fguillot/picodb", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://github.com/fguillot/picoDb.git", + "reference": "9588cf60e74dd6ff63d96f7eb91c4f74b47a11b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fguillot/picoDb/zipball/9588cf60e74dd6ff63d96f7eb91c4f74b47a11b1", + "reference": "9588cf60e74dd6ff63d96f7eb91c4f74b47a11b1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2015-01-20 00:52:01", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "PicoDb": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "WTFPL" + ], + "authors": [ + { + "name": "Frédéric Guillot", + "homepage": "http://fredericguillot.com" + } + ], + "description": "Minimalist database query builder", + "homepage": "https://github.com/fguillot/picoDb" } ] diff --git a/vendor/fguillot/json-rpc/src/JsonRPC/Client.php b/vendor/fguillot/json-rpc/src/JsonRPC/Client.php index 814297b..03803af 100644 --- a/vendor/fguillot/json-rpc/src/JsonRPC/Client.php +++ b/vendor/fguillot/json-rpc/src/JsonRPC/Client.php @@ -82,6 +82,12 @@ class Client 'Content-Type: application/json', 'Accept: application/json' ); + /** + * SSL certificates verification + * @access public + * @var boolean + */ + public $ssl_verify_peer = true; /** * Constructor @@ -288,6 +294,7 @@ class Client curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->ssl_verify_peer); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); if ($this->username && $this->password) { diff --git a/vendor/fguillot/picodb/lib/PicoDb/Table.php b/vendor/fguillot/picodb/lib/PicoDb/Table.php index 0dbc93f..806cb5b 100644 --- a/vendor/fguillot/picodb/lib/PicoDb/Table.php +++ b/vendor/fguillot/picodb/lib/PicoDb/Table.php @@ -21,6 +21,7 @@ class Table private $values = array(); private $distinct = false; private $group_by = array(); + private $filter_callback = null; private $db; /** @@ -137,7 +138,7 @@ class Table * @param string $value Column 2 * @return array */ - public function listing($key, $value) + public function hashmap($key, $value) { $listing = array(); @@ -153,6 +154,19 @@ class Table return $listing; } + /** + * Add callback to alter the resultset + * + * @access public + * @param array|callable $callback + * @return \PicoDb\Table + */ + public function filter($callback) + { + $this->filter_callback = $callback; + return $this; + } + /** * Fetch all rows * @@ -162,7 +176,13 @@ class Table public function findAll() { $rq = $this->db->execute($this->buildSelectQuery(), $this->values); - return $rq->fetchAll(PDO::FETCH_ASSOC); + $results = $rq->fetchAll(PDO::FETCH_ASSOC); + + if (is_callable($this->filter_callback)) { + return call_user_func($this->filter_callback, $results); + } + + return $results; } /** diff --git a/vendor/fguillot/picofeed/docs/debugging.markdown b/vendor/fguillot/picofeed/docs/debugging.markdown index a9f8ab1..1356e0f 100644 --- a/vendor/fguillot/picofeed/docs/debugging.markdown +++ b/vendor/fguillot/picofeed/docs/debugging.markdown @@ -4,7 +4,23 @@ Debugging Logging ------- -PicoFeed log in memory the execution flow, if a feed doesn't work correctly it's easy to see what is wrong. +PicoFeed can log **in memory** the execution flow, if a feed doesn't work correctly it's easy to see what is wrong. + +### Enable/disable logging + +The logging is **disabled by default** to avoid unnecessary memory usage. + +Enable logging: + +```php +use PicoFeed\Logging\Logger; + +Logger::enable(); + +// or change the flag value + +Logger::$enable = true; +``` ### Reading messages diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php index e91cfd8..9f358a6 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Client.php @@ -335,39 +335,6 @@ abstract class Client return isset($response['headers'][$header]) ? $response['headers'][$header] : ''; } - /** - * Parse HTTP headers - * - * @access public - * @param array $lines List of headers - * @return array - */ - public function parseHeaders(array $lines) - { - $status = 200; - $headers = array(); - - foreach ($lines as $line) { - - if (strpos($line, 'HTTP') === 0) { - $status = (int) substr($line, 9, 3); - } - else if (strpos($line, ':') !== false) { - - @list($name, $value) = explode(': ', $line); - if ($value) $headers[trim($name)] = trim($value); - } - } - - Logger::setMessage(get_called_class().' HTTP status code: '.$status); - - foreach ($headers as $name => $value) { - Logger::setMessage(get_called_class().' HTTP header: '.$name.' => '.$value); - } - - return array($status, new HttpHeaders($headers)); - } - /** * Set the Last-Modified HTTP header * diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php index c5c83dd..21ecf5a 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Curl.php @@ -233,7 +233,7 @@ class Curl extends Client { $this->executeContext(); - list($status, $headers) = $this->parseHeaders(explode("\r\n", $this->headers[$this->headers_counter - 1])); + list($status, $headers) = HttpHeaders::parse(explode("\r\n", $this->headers[$this->headers_counter - 1])); // When restricted with open_basedir if ($this->needToHandleRedirection($follow_location, $status)) { diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/HttpHeaders.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/HttpHeaders.php index 4453a78..cde8f75 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/HttpHeaders.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/HttpHeaders.php @@ -3,11 +3,13 @@ namespace PicoFeed\Client; use ArrayAccess; +use PicoFeed\Logging\Logger; /** - * Class to handle http headers case insensitivity + * Class to handle HTTP headers case insensitivity * * @author Bernhard Posselt + * @author Frederic Guillot * @package Client */ class HttpHeaders implements ArrayAccess @@ -40,4 +42,38 @@ class HttpHeaders implements ArrayAccess { unset($this->headers[strtolower($offset)]); } + + /** + * Parse HTTP headers + * + * @static + * @access public + * @param array $lines List of headers + * @return array + */ + public static function parse(array $lines) + { + $status = 200; + $headers = array(); + + foreach ($lines as $line) { + + if (strpos($line, 'HTTP') === 0) { + $status = (int) substr($line, 9, 3); + } + else if (strpos($line, ':') !== false) { + + @list($name, $value) = explode(': ', $line); + if ($value) $headers[trim($name)] = trim($value); + } + } + + Logger::setMessage(get_called_class().' HTTP status code: '.$status); + + foreach ($headers as $name => $value) { + Logger::setMessage(get_called_class().' HTTP header: '.$name.' => '.$value); + } + + return array($status, new self($headers)); + } } diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php index a74cc39..ba2fd8e 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Stream.php @@ -117,7 +117,7 @@ class Stream extends Client throw new TimeoutException('Operation timeout'); } - list($status, $headers) = $this->parseHeaders($metadata['wrapper_data']); + list($status, $headers) = HttpHeaders::parse($metadata['wrapper_data']); fclose($stream); diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logger.php b/vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logger.php index 4afe500..fe52953 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logger.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Logging/Logger.php @@ -31,6 +31,26 @@ class Logger */ private static $timezone = 'UTC'; + /** + * Enable or disable logging + * + * @static + * @access public + * @var boolean + */ + public static $enable = false; + + /** + * Enable logging + * + * @static + * @access public + */ + public static function enable() + { + self::$enable = true; + } + /** * Add a new message * @@ -40,9 +60,10 @@ class Logger */ public static function setMessage($message) { - $date = new DateTime('now', new DateTimeZone(self::$timezone)); - - self::$messages[] = '['.$date->format('Y-m-d H:i:s').'] '.$message; + if (self::$enable) { + $date = new DateTime('now', new DateTimeZone(self::$timezone)); + self::$messages[] = '['.$date->format('Y-m-d H:i:s').'] '.$message; + } } /** diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php index 0fbc302..9f2f108 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php @@ -131,7 +131,7 @@ class Atom extends Parser */ public function findFeedDate(SimpleXMLElement $xml, Feed $feed) { - $feed->date = $this->parseDate((string) $xml->updated); + $feed->date = $this->date->getTimestamp((string) $xml->updated); } /** @@ -143,8 +143,8 @@ class Atom extends Parser */ public function findItemDate(SimpleXMLElement $entry, Item $item) { - $published = isset($entry->published) ? $this->parseDate((string) $entry->published) : 0; - $updated = isset($entry->updated) ? $this->parseDate((string) $entry->updated) : 0; + $published = isset($entry->published) ? $this->date->getTimestamp((string) $entry->published) : 0; + $updated = isset($entry->updated) ? $this->date->getTimestamp((string) $entry->updated) : 0; $item->date = max($published, $updated) ?: time(); } diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php new file mode 100644 index 0000000..89f189e --- /dev/null +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php @@ -0,0 +1,109 @@ + length ] + * + * @access public + * @var array + */ + public $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, + 'j M Y H:i:s' => 20, + '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, + ); + + /** + * Try to parse all date format for broken feeds + * + * @access public + * @param string $value Original date format + * @return integer Timestamp + */ + public function getTimestamp($value) + { + $value = trim($value); + + foreach ($this->formats as $format => $length) { + + $truncated_value = $value; + if ($length !== null) { + $truncated_value = substr($truncated_value, 0, $length); + } + + $timestamp = $this->getValidDate($format, $truncated_value); + if ($timestamp > 0) { + return $timestamp; + } + } + + $date = new DateTime('now', new DateTimeZone($this->timezone)); + return $date->getTimestamp(); + } + + /** + * Get a valid date from a given format + * + * @access public + * @param string $format Date format + * @param string $value Original date value + * @return integer Timestamp + */ + public function getValidDate($format, $value) + { + $date = DateTime::createFromFormat($format, $value, new DateTimeZone($this->timezone)); + + if ($date !== false) { + + $errors = DateTime::getLastErrors(); + + if ($errors['error_count'] === 0 && $errors['warning_count'] === 0) { + return $date->getTimestamp(); + } + } + + return 0; + } +} diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php index 42815d1..7ada6d1 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Parser.php @@ -3,8 +3,6 @@ namespace PicoFeed\Parser; use SimpleXMLElement; -use DateTime; -use DateTimeZone; use PicoFeed\Encoding\Encoding; use PicoFeed\Filter\Filter; use PicoFeed\Logging\Logger; @@ -27,6 +25,14 @@ abstract class Parser */ private $config; + /** + * DateParser object + * + * @access protected + * @var \PicoFeed\Parser\DateParser + */ + protected $date; + /** * Hash algorithm used to generate item id, any value supported by PHP, see hash_algos() * @@ -35,14 +41,6 @@ abstract class Parser */ private $hash_algo = 'sha256'; - /** - * Timezone used to parse feed dates - * - * @access private - * @var string - */ - private $timezone = 'UTC'; - /** * Feed content (XML data) * @@ -101,6 +99,7 @@ abstract class Parser */ public function __construct($content, $http_encoding = '', $fallback_url = '') { + $this->date = new DateParser; $this->fallback_url = $fallback_url; $xml_encoding = XmlParser::getEncodingFromXmlTag($content); @@ -276,87 +275,6 @@ abstract class Parser return hash($this->hash_algo, implode(func_get_args())); } - /** - * Try to parse all date format for broken feeds - * - * @access public - * @param string $value Original date format - * @return integer Timestamp - */ - 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, - 'j M Y H:i:s' => 20, - '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) { - - $truncated_value = $value; - if ($length !== null) { - $truncated_value = substr($truncated_value, 0, $length); - } - - $timestamp = $this->getValidDate($format, $truncated_value); - if ($timestamp > 0) { - return $timestamp; - } - } - - $date = new DateTime('now', new DateTimeZone($this->timezone)); - return $date->getTimestamp(); - } - - /** - * Get a valid date from a given format - * - * @access public - * @param string $format Date format - * @param string $value Original date value - * @return integer Timestamp - */ - public function getValidDate($format, $value) - { - $date = DateTime::createFromFormat($format, $value, new DateTimeZone($this->timezone)); - - if ($date !== false) { - - $errors = DateTime::getLastErrors(); - - if ($errors['error_count'] === 0 && $errors['warning_count'] === 0) { - return $date->getTimestamp(); - } - } - - return 0; - } - /** * Return true if the given language is "Right to Left" * @@ -412,7 +330,10 @@ abstract class Parser */ public function setTimezone($timezone) { - $this->timezone = $timezone ?: $this->timezone; + if ($timezone) { + $this->date->timezone = $timezone; + } + return $this; } diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php index 2e763fb..da57327 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php @@ -33,7 +33,7 @@ class Rss10 extends Rss20 */ public function findFeedDate(SimpleXMLElement $xml, Feed $feed) { - $feed->date = $this->parseDate(XmlParser::getNamespaceValue($xml->channel, $this->namespaces, 'date')); + $feed->date = $this->date->getTimestamp(XmlParser::getNamespaceValue($xml->channel, $this->namespaces, 'date')); } /** diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php index 16c9f63..114308f 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php @@ -134,7 +134,7 @@ class Rss20 extends Parser public function findFeedDate(SimpleXMLElement $xml, Feed $feed) { $date = isset($xml->channel->pubDate) ? $xml->channel->pubDate : $xml->channel->lastBuildDate; - $feed->date = $this->parseDate((string) $date); + $feed->date = $this->date->getTimestamp((string) $date); } /** @@ -156,7 +156,7 @@ class Rss20 extends Parser $date = (string) $entry->pubDate; } - $item->date = $this->parseDate($date); + $item->date = $this->date->getTimestamp($date); } /** diff --git a/vendor/fguillot/picofeed/picofeed b/vendor/fguillot/picofeed/picofeed index b1fa133..3055ae1 100755 --- a/vendor/fguillot/picofeed/picofeed +++ b/vendor/fguillot/picofeed/picofeed @@ -8,6 +8,8 @@ use PicoFeed\Reader\Reader; use PicoFeed\Logging\Logger; use PicoFeed\PicoFeedException; +Logger::enable(); + function get_feed($url, $disable_filtering = false) { try { diff --git a/vendor/fguillot/picofeed/tests/Parser/DateParserTest.php b/vendor/fguillot/picofeed/tests/Parser/DateParserTest.php new file mode 100644 index 0000000..df648ce --- /dev/null +++ b/vendor/fguillot/picofeed/tests/Parser/DateParserTest.php @@ -0,0 +1,48 @@ +assertEquals(1359066183, $parser->getTimestamp('Thu, 24 Jan 2013 22:23:03 +0000')); + $this->assertEquals(1362992761, $parser->getTimestamp('2013-03-11T09:06:01+00:00')); + $this->assertEquals(1363752990, $parser->getTimestamp('2013-03-20T04:16:30+00:00')); + $this->assertEquals(1359066183, $parser->getTimestamp('Thu, 24 Jan 2013 22:23:03 +0000')); + $this->assertEquals(1380929699, $parser->getTimestamp('Sat, 04 Oct 2013 02:34:59 +0300')); + $this->assertEquals(1054633161, $parser->getTimestamp('Tue, 03 Jun 2003 09:39:21 GMT')); + $this->assertEquals(1071340202, $parser->getTimestamp('2003-12-13T18:30:02Z')); + $this->assertEquals(1364234797, $parser->getTimestamp('Mon, 25 Mar 2013 19:06:37 +0100')); + $this->assertEquals(1360054941, $parser->getTimestamp('2013-02-05T09:02:21.880-08:00')); + $this->assertEquals(1286834400, $parser->getTimestamp('Tue, 12 Oct 2010 00:00:00 IST')); + $this->assertEquals('2014-12-15 19:49', date('Y-m-d H:i', $parser->getTimestamp('15 Dec 2014 19:49:07 +0100'))); + $this->assertEquals('2012-05-15', date('Y-m-d', $parser->getTimestamp('Tue, 15 May 2012 24:05:00 UTC'))); + $this->assertEquals('2013-09-12', date('Y-m-d', $parser->getTimestamp('Thu, 12 Sep 2013 7:00:00 UTC'))); + $this->assertEquals('2012-01-31', date('Y-m-d', $parser->getTimestamp('01.31.2012'))); + $this->assertEquals('2012-01-31', date('Y-m-d', $parser->getTimestamp('01/31/2012'))); + $this->assertEquals('2012-01-31', date('Y-m-d', $parser->getTimestamp('2012-01-31'))); + $this->assertEquals('2010-02-24', date('Y-m-d', $parser->getTimestamp('2010-02-245T15:27:52Z'))); + $this->assertEquals('2010-08-20', date('Y-m-d', $parser->getTimestamp('2010-08-20Thh:08:ssZ'))); + $this->assertEquals(1288648057, $parser->getTimestamp('Mon, 01 Nov 2010 21:47:37 UT')); + $this->assertEquals(1346069615, $parser->getTimestamp('Mon Aug 27 2012 12:13:35 GMT-0700 (PDT)')); + $this->assertEquals(time(), $parser->getTimestamp('Tue, 3 Febuary 2010 00:00:00 IST')); + $this->assertEquals(time(), $parser->getTimestamp('############# EST')); + $this->assertEquals(time(), $parser->getTimestamp('Wed, 30 Nov -0001 00:00:00 +0000')); + $this->assertEquals(time(), $parser->getTimestamp('čet, 24 maj 2012 00:00:00')); + $this->assertEquals(time(), $parser->getTimestamp('-0-0T::Z')); + $this->assertEquals(time(), $parser->getTimestamp('Wed, 18 2012')); + $this->assertEquals(time(), $parser->getTimestamp("'2009-09-30 CDT16:09:54")); + $this->assertEquals(time(), $parser->getTimestamp('ary 8 Jan 2013 00:00:00 GMT')); + $this->assertEquals(time(), $parser->getTimestamp('Sat, 11 00:00:01 GMT')); + $this->assertEquals(1370631743, $parser->getTimestamp('Fri Jun 07 2013 19:02:23 GMT+0000 (UTC)')); + $this->assertEquals(1377412225, $parser->getTimestamp('25/08/2013 06:30:25 م')); + $this->assertEquals(time(), $parser->getTimestamp('+0400')); + } +} diff --git a/vendor/fguillot/picofeed/tests/Parser/ParserTest.php b/vendor/fguillot/picofeed/tests/Parser/ParserTest.php index 5d786b8..41ee04b 100644 --- a/vendor/fguillot/picofeed/tests/Parser/ParserTest.php +++ b/vendor/fguillot/picofeed/tests/Parser/ParserTest.php @@ -6,46 +6,6 @@ use PHPUnit_Framework_TestCase; class ParserTest extends PHPUnit_Framework_TestCase { - public function testParseDate() - { - $parser = new Rss20(''); - - date_default_timezone_set('UTC'); - - $this->assertEquals(1359066183, $parser->parseDate('Thu, 24 Jan 2013 22:23:03 +0000')); - $this->assertEquals(1362992761, $parser->parseDate('2013-03-11T09:06:01+00:00')); - $this->assertEquals(1363752990, $parser->parseDate('2013-03-20T04:16:30+00:00')); - $this->assertEquals(1359066183, $parser->parseDate('Thu, 24 Jan 2013 22:23:03 +0000')); - $this->assertEquals(1380929699, $parser->parseDate('Sat, 04 Oct 2013 02:34:59 +0300')); - $this->assertEquals(1054633161, $parser->parseDate('Tue, 03 Jun 2003 09:39:21 GMT')); - $this->assertEquals(1071340202, $parser->parseDate('2003-12-13T18:30:02Z')); - $this->assertEquals(1364234797, $parser->parseDate('Mon, 25 Mar 2013 19:06:37 +0100')); - $this->assertEquals(1360054941, $parser->parseDate('2013-02-05T09:02:21.880-08:00')); - $this->assertEquals(1286834400, $parser->parseDate('Tue, 12 Oct 2010 00:00:00 IST')); - $this->assertEquals('2014-12-15 19:49', date('Y-m-d H:i', $parser->parseDate('15 Dec 2014 19:49:07 +0100'))); - $this->assertEquals('2012-05-15', date('Y-m-d', $parser->parseDate('Tue, 15 May 2012 24:05:00 UTC'))); - $this->assertEquals('2013-09-12', date('Y-m-d', $parser->parseDate('Thu, 12 Sep 2013 7:00:00 UTC'))); - $this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('01.31.2012'))); - $this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('01/31/2012'))); - $this->assertEquals('2012-01-31', date('Y-m-d', $parser->parseDate('2012-01-31'))); - $this->assertEquals('2010-02-24', date('Y-m-d', $parser->parseDate('2010-02-245T15:27:52Z'))); - $this->assertEquals('2010-08-20', date('Y-m-d', $parser->parseDate('2010-08-20Thh:08:ssZ'))); - $this->assertEquals(1288648057, $parser->parseDate('Mon, 01 Nov 2010 21:47:37 UT')); - $this->assertEquals(1346069615, $parser->parseDate('Mon Aug 27 2012 12:13:35 GMT-0700 (PDT)')); - $this->assertEquals(time(), $parser->parseDate('Tue, 3 Febuary 2010 00:00:00 IST')); - $this->assertEquals(time(), $parser->parseDate('############# EST')); - $this->assertEquals(time(), $parser->parseDate('Wed, 30 Nov -0001 00:00:00 +0000')); - $this->assertEquals(time(), $parser->parseDate('čet, 24 maj 2012 00:00:00')); - $this->assertEquals(time(), $parser->parseDate('-0-0T::Z')); - $this->assertEquals(time(), $parser->parseDate('Wed, 18 2012')); - $this->assertEquals(time(), $parser->parseDate("'2009-09-30 CDT16:09:54")); - $this->assertEquals(time(), $parser->parseDate('ary 8 Jan 2013 00:00:00 GMT')); - $this->assertEquals(time(), $parser->parseDate('Sat, 11 00:00:01 GMT')); - $this->assertEquals(1370631743, $parser->parseDate('Fri Jun 07 2013 19:02:23 GMT+0000 (UTC)')); - $this->assertEquals(1377412225, $parser->parseDate('25/08/2013 06:30:25 م')); - $this->assertEquals(time(), $parser->parseDate('+0400')); - } - public function testChangeHashAlgo() { $parser = new Rss20('');