├── API.md ├── CHANGELOG.md ├── FAQ.md ├── LICENSE.md └── README.md /API.md: -------------------------------------------------------------------------------- 1 | # API Public Beta 2 | 3 | Fever 1.14 introduces the new Fever API. This API is in public beta and currently supports basic syncing and consuming of content. A subsequent update will allow for adding, editing and deleting feeds and groups. The API’s primary focus is maintaining a local cache of the data in a remote Fever installation. 4 | 5 | I am [soliciting feedback](https://feedafever.com/contact) from interested developers and as such the beta API may expand to reflect that feedback. The current API is incomplete but stable. Existing features may be expanded on but will not be removed or modified. New features may be added. 6 | 7 | I’ve created a [simple HTML widget](https://feedafever.com/gateway/public/api-widget.html.zip) that allows you to query the Fever API and view the response. 8 | 9 | ## Authentication 10 | 11 | Without further ado, the Fever API endpoint URL looks like: 12 | 13 | ``` 14 | http://yourdomain.com/fever/?api 15 | ``` 16 | 17 | All requests must be authenticated with a `POST`ed `api_key`. The value of `api_key` should be the md5 checksum of the Fever accounts email address and password concatenated with a colon. An example of a valid value for `api_key` using PHP’s native `md5()` function: 18 | 19 | ``` 20 | $email = 'you@yourdomain.com'; 21 | $pass = 'b3stp4s4wd3v4'; 22 | $api_key = md5($email.':'.$pass); 23 | 24 | ``` 25 | 26 | A user may specify that `https` be used to connect to their Fever installation for additional security but you should not assume that all Fever installations support `https`. 27 | 28 | The default response is a JSON object containing two members: 29 | 30 | * `api_version` contains the version of the API responding (positive integer) 31 | * `auth` whether the request was successfully authenticated (boolean integer) 32 | 33 | The API can also return XML by passing `xml` as the optional value of the `api` argument like so: 34 | 35 | ``` 36 | http://yourdomain.com/fever/?api=xml 37 | ``` 38 | 39 | The top level XML element is named `response`. 40 | 41 | The response to each successfully authenticated request will have `auth` set to `1` and include at least one additional member: 42 | 43 | * `last_refreshed_on_time` contains the time of the most recently refreshed (not _updated_) feed (Unix timestamp/integer) 44 | 45 | ## Read 46 | 47 | When reading from the Fever API you add arguments to the query string of the API endpoint URL. If you attempt to `POST` these arguments (and their optional values) Fever will not recognize the request. 48 | 49 | ### Groups 50 | 51 | ``` 52 | http://yourdomain.com/fever/?api&groups 53 | ``` 54 | 55 | A request with the `groups` argument will return two additional members: 56 | 57 | * `groups` contains an array of `group` objects 58 | * `feeds_groups` contains an array of `feeds_group` objects 59 | 60 | A `group` object has the following members: 61 | 62 | * `id` (positive integer) 63 | * `title` (utf-8 string) 64 | 65 | The `feeds_group` object is documented under “Feeds/Groups Relationships.” 66 | 67 | The “Kindling” super group is not included in this response and is composed of all feeds with an `is_spark` equal to `0`. The “Sparks” super group is not included in this response and is composed of all feeds with an `is_spark` equal to `1`. 68 | 69 | ### Feeds 70 | 71 | ``` 72 | http://yourdomain.com/fever/?api&feeds 73 | ``` 74 | 75 | A request with the `feeds` argument will return two additional members: 76 | 77 | * `feeds` contains an array of `group` objects 78 | * `feeds_groups` contains an array of `feeds_group` objects 79 | 80 | A `feed` object has the following members: 81 | 82 | * `id` (positive integer) 83 | * `favicon_id` (positive integer) 84 | * `title` (utf-8 string) 85 | * `url` (utf-8 string) 86 | * `site_url` (utf-8 string) 87 | * `is_spark` (boolean integer) 88 | * `last_updated_on_time` (Unix timestamp/integer) 89 | 90 | The `feeds_group` object is documented under “Feeds/Groups Relationships.” 91 | 92 | The “All Items” super feed is not included in this response and is composed of all items from all feeds that belong to a given group. For the “Kindling” super group and all user created groups the items should be limited to feeds with an `is_spark` equal to `0`. For the “Sparks” super group the items should be limited to feeds with an `is_spark` equal to `1`. 93 | 94 | ### Feeds/Groups Relationships 95 | 96 | A request with either the `groups` or `feeds` arguments will return an additional member: 97 | 98 | A `feeds_group` object has the following members: 99 | 100 | * `group_id` (positive integer) 101 | * `feed_ids` (string/comma-separated list of positive integers) 102 | 103 | ### Favicons 104 | 105 | ``` 106 | http://yourdomain.com/fever/?api&favicons 107 | ``` 108 | 109 | A request with the `favicons` argument will return one additional member: 110 | 111 | * `favicons` contains an array of `favicon` objects 112 | 113 | A `favicon` object has the following members: 114 | 115 | * `id` (positive integer) 116 | * `data` (base64 encoded image data; prefixed by image type) 117 | 118 | An example `data` value: 119 | 120 | ``` 121 | image/gif;base64,R0lGODlhAQABAIAAAObm5gAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== 122 | ``` 123 | 124 | The `data` member of a `favicon` object can be used with the `data:` protocol to embed an image in CSS or HTML. A PHP/HTML example: 125 | 126 | ``` 127 | echo ''; 128 | ``` 129 | 130 | ### Items 131 | 132 | ``` 133 | http://yourdomain.com/fever/?api&items 134 | ``` 135 | 136 | A request with the `items` argument will return two additional members: 137 | 138 | * `items` contains an array of `item` objects 139 | * `total_items` contains the total number of items stored in the database (added in API version 2) 140 | 141 | An `item` object has the following members: 142 | 143 | * `id` (positive integer) 144 | * `feed_id` (positive integer) 145 | * `title` (utf-8 string) 146 | * `author` (utf-8 string) 147 | * `html` (utf-8 string) 148 | * `url` (utf-8 string) 149 | * `is_saved` (boolean integer) 150 | * `is_read` (boolean integer) 151 | * `created_on_time` (Unix timestamp/integer) 152 | 153 | Most servers won’t have enough memory allocated to PHP to dump all items at once. Three optional arguments control determine the items included in the response. 154 | 155 | * Use the `since_id` argument with the highest id of locally cached items to request 50 additional items. Repeat until the `items` array in the response is empty. 156 | 157 | * Use the `max_id` argument with the lowest id of locally cached items (or `0` initially) to request 50 previous items. Repeat until the `items` array in the response is empty. (added in API version 2) 158 | 159 | * Use the `with_ids` argument with a comma-separated list of item ids to request (a maximum of 50) specific items. (added in API version 2) 160 | 161 | ### Hot Links 162 | 163 | ``` 164 | http://yourdomain.com/fever/?api&links 165 | ``` 166 | 167 | A request with the `links` argument will return one additional member: 168 | 169 | * `links` contains an array of `link` objects 170 | 171 | A `link` object has the following members: 172 | 173 | * `id` (positive integer) 174 | * `feed_id` (positive integer) only use when `is_item` equals `1` 175 | * `item_id` (positive integer) only use when `is_item` equals `1` 176 | * `temperature` (positive float) 177 | * `is_item` (boolean integer) 178 | * `is_local` (boolean integer) used to determine if the source feed and favicon should be displayed 179 | * `is_saved` (boolean integer) only use when `is_item` equals `1` 180 | * `title` (utf-8 string) 181 | * `url` (utf-8 string) 182 | * `item_ids` (string/comma-separated list of positive integers) 183 | 184 | When requesting hot links you can control the range and offset by specifying a length of days for each as well as a page to fetch additional hot links. A request with just the `links` argument is equivalent to: 185 | 186 | ``` 187 | http://yourdomain.com/fever/?api&links&offset=0&range=7&page=1 188 | ``` 189 | 190 | Or the first page (`page=1`) of Hot links for the past week (`range=7`) starting now (`offset=0`). 191 | 192 | ### Link Caveats 193 | 194 | Fever calculates Hot link temperatures in real-time. The API assumes you have an up-to-date local cache of items, feeds and favicons with which to construct a meaningful Hot view. Because they are ephemeral Hot links should not be cached in the same relational manner as items, feeds, groups and favicons. 195 | 196 | Because Fever saves items and not individual links you can only "save" a Hot link when `is_item` equals `1`. 197 | 198 | ## Sync 199 | 200 | The `unread_item_ids` and `saved_item_ids` arguments can be used to keep your local cache synced with the remote Fever installation. 201 | 202 | ``` 203 | http://yourdomain.com/fever/?api&unread_item_ids 204 | ``` 205 | 206 | A request with the `unread_item_ids` argument will return one additional member: 207 | 208 | * `unread_item_ids` (string/comma-separated list of positive integers) 209 | 210 | ``` 211 | http://yourdomain.com/fever/?api&saved_item_ids 212 | ``` 213 | 214 | A request with the `saved_item_ids` argument will return one additional member: 215 | 216 | * `saved_item_ids` (string/comma-separated list of positive integers) 217 | 218 | One of these members will be returned as appropriate when marking an item as read, unread, saved, or unsaved and when marking a feed or group as read. 219 | 220 | Because groups and feeds will be limited in number compared to items, they should be synced by comparing an array of locally cached feed or group ids to an array of feed or group ids returned by their respective API request. 221 | 222 | ## Write 223 | 224 | The public beta of the API does not provide a way to add, edit or delete feeds or groups but you can mark items, feeds and groups as read and save or unsave items. You can also unread recently read items. When writing to the Fever API you add arguments to the `POST` data you submit to the API endpoint URL. 225 | 226 | Adding `unread_recently_read=1` to your `POST` data will mark recently read items as unread. 227 | 228 | You can update an individual item by adding the following three arguments to your `POST` data: 229 | 230 | * `mark=item` 231 | * `as=?` where `?` is replaced with `read`, `saved` or `unsaved` 232 | * `id=?` where `?` is replaced with the `id` of the item to modify 233 | 234 | Marking a feed or group as read is similar but requires one additional argument to prevent marking new, unreceived items as read: 235 | 236 | * `mark=?` where `?` is replaced with `feed` or `group` 237 | * `as=read` 238 | * `id=?` where `?` is replaced with the `id` of the feed or group to modify 239 | * `before=?` where `?` is replaced with the Unix timestamp of the the local client’s most recent `items` API request 240 | 241 | You can mark the “Kindling” super group (and the “Sparks” super group) as read by adding the following four arguments to your `POST` data: 242 | 243 | * `mark=group` 244 | * `as=read` 245 | * `id=0` 246 | * `before=?` where `?` is replaced with the Unix timestamp of the the local client’s last `items` API request 247 | 248 | Similarly you can mark just the “Sparks” super group as read by adding the following four arguments to your `POST` data: 249 | 250 | * `mark=group` 251 | * `as=read` 252 | * `id=-1` 253 | * `before=?` where `?` is replaced with the Unix timestamp of the the local client’s last `items` API request -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | This document contains the full history of Fever. 4 | 5 | Note that this repository's codebase only contains a copy of v1.39 and onwards. 6 | 7 | ## v1.43 (2025-03-03) 8 | 9 | - Fix broken feed item link accidentally introduced in Fever v1.42. 10 | 11 | ## v1.42 (2025-02-28) 12 | 13 | - Add suport for feed item image elements. Reader will search the following nodes for images to prepend to the feed item description: 14 | - `` 15 | - `` 16 | - `` 17 | - `` 18 | - Trim feed item description. 19 | - Fix apperance of search input for Chrome and Firefox on desktop and mobile. 20 | 21 | ## v1.41 (2023-08-27) 22 | 23 | - Add support to optionally check for updates from GitHub: 24 | - This feature will only check for an update. It will _not_ update your installation. 25 | - If the global constant `FEVER_GITHUB_REPOSITORY` is defined (`/`), Fever will check the latest release from the given GitHub repository via the GitHub REST API. 26 | - The optional global constant `FEVER_GITHUB_API_TOKEN ` can be used to extend the rate limit. 27 | - These two constants can be added to one of your configuration files (`config/db.php` or `config/key.php`). 28 | - Replace URL to `feedafever.com/anon/` with `rel="noreferrer"` attribute 29 | - Replace URL to `todone.txt` with URL to `CHANGELOG.md` at GitHub repository 30 | - Fix user agent sniffing: 31 | - Some browsers (such as Firefox) on mobile/tablet devices might not include the `AppleWebKit` segment but might instead include a `Mobile` or `Tablet` platform segment. 32 | - Fix mobile portrait detection: 33 | - Replace deprecated event `Window:orientationchange` with `ScreenOrientation:change`. 34 | - Replace portrait detection to compare width against height instead of looking for specific (outdated) widths. 35 | - Add Laravel Valet environment file (`.valetrc`) 36 | - Clean-up quoted and interpolated strings 37 | - Update PHP compatibility: 38 | - Indent doc strings supported by PHP 7.3 39 | 40 | 41 | ## v1.40 (2023-02-08) 42 | 43 | - Disabled gateway requests to feedafever.com 44 | - Replaced URL to `todone.txt` with git repository's `CHANGELOG.md` 45 | - Move copyright from default and mobile page footer views to its own view file 46 | - Update `DOCTYPE` and HTML meta tags and fix CSS styles 47 | - Replace usage of class-string with `::class` constant in `Fever` class 48 | - Add visibility and static keyword to classes to PHP files 49 | - Fix parsing of "set-cookie" response header 50 | - Fix mixing strings and integers 51 | - Update third-party libraries: 52 | - Update PCLZip 2.6.0 → 2.8.3 53 | - Update SimplePie ~1.1.0 → 1.5.8 54 | - Update PHP compatibility: 55 | - Avoid throwing PDO exceptions; the default as of PHP 8.0 56 | - Fix optional arguments; deprecated in PHP 8.0 57 | - Replace `join()` with `implode()` and fix parameter order; deprecated in PHP 7.4 58 | - Replace curly braces for offset access; deprecated in PHP 7.4 59 | - Fix switch break; deprecated in PHP 7.3 60 | - Rename constructors; deprecated in PHP 7.0 61 | - Remove magic quotes; deprecated in PHP 5.4 62 | - Update `is_development_copy()` to replace `.dev` with `.test` since the former became a real TLD in 2019 63 | 64 | 65 | ## v1.39 (2014-09-22) 66 | 67 | - updated mobile CSS for the iPhones 6 68 | - fix for `html:` namespacing prefix throwing off entity decoding in Atom feeds 69 | - improved gateway connectivity error reporting 70 | - "reload interface after browser refresh" now defaults to off because I'm tired of getting support requests about the default behavior 71 | - added feeds to the list of database tables regularly optimized and repaired 72 | - now explicitly closes database connection before exiting 73 | 74 | 75 | ## v1.38 (2014-02-10) 76 | 77 | - fixed bug where only the first PDO-powered MySQL query would work (affected a tiny fraction of servers) 78 | - added PHP 5.1 requirement for PDO support (required for, at least, query & fetch) 79 | - optimized all PNGs with http://imageoptim.com (update archive down from 1.3MB to 1.1MB) 80 | 81 | 82 | ## v1.37 (2014-02-05) 83 | 84 | - fixed PHP 4.x SIDB fatal errors (due to using PHP 5-only control structures) 85 | 86 | 87 | ## v1.36 (2014-02-05) 88 | 89 | - reports anonymous server capabilities to feedafever.com during gateway requests so I can make informed decisions about future development 90 | data collected (see `Fever->capabilities()` for implementation): 91 | - `fever_version` 92 | - `php_version` 93 | - `mysql_client_version` 94 | - `mysql_server_version` 95 | - `has_pdo_mysql` 96 | - `has_mysqli` 97 | - `has_mysql` 98 | - `has_iconv` 99 | - `has_mbstring` 100 | - `has_gd_png` 101 | - `has_curl` 102 | - removed use of deprecated e flag with `preg_replace` 103 | - increased request timeout when requesting updates to accommodate the larger zip (caused by @2x assets) 104 | - added SIDB to eliminate dependency on the deprecated `mysql_*` family of functions 105 | - removed two lingering `allow_call_time_pass_reference` errors 106 | - fixed a problem with links never heating up on OS X Mavericks Server 107 | 108 | 109 | ## v1.35 (2014-01-27) 110 | 111 | - dummied out desktop refresh functions in mobile JavaScript to eliminate undefined errors 112 | - only links `override.css` or `override-mobile.css` if they exist 113 | - manually added `@2x` assets with `@media` query--like a schlep 114 | - removed automatic `.htaccess` retinafication technique 115 | 116 | 117 | ## v1.34 (2014-01-25) 118 | 119 | - STOPGAP: deleted retinafication .htaccess file on problem servers 120 | 121 | If you updated to 1.33 and images or CSS now 404, you 122 | have a problem server. I believe the problem involves 123 | `mod_rewrite`'s default RewriteBase or possibly Apache's 124 | include paths. Not sure how to fix just yet. Manually 125 | defining the RewriteBase to the expected value results 126 | in 500 errors in problem servers. Hence this stopgap. 127 | 128 | 129 | ## v1.33 (2014-01-24) 130 | 131 | 132 | - added ?mobile query to force the mobile view on non-mobile (or unsupported) devices 133 | - added retina support to desktop and mobile views 134 | - added hooks for persistent style customization 135 | 136 | Just add an `override.css` or `override-mobile.css` to the root `fever/` directory. 137 | Copy selectors from existing CSS and use `!important` where necessary. 138 | NOTE: Persists through updates but otherwise unsupported. 139 | 140 | 141 | ## v1.32 (2014-01-16) 142 | 143 | 144 | - added support for `media:credit` (mapped to item author) 145 | - fixed missing space in curl options on Extras page 146 | - removed `-webkit-text-size-adjust` from desktop stylesheets (Safari/Chrome resize should now match Firefox) 147 | 148 | 149 | ## v1.31 (2013-04-14) 150 | 151 | 152 | - reverted to original "reload interface after browser refresh" behavior until I have time to revisit properly (can still be disabled entirely in your Fever Preferences under the Refreshing tab) 153 | 154 | 155 | ## v1.30 (2013-04-14) 156 | 157 | 158 | - updated cURL cron example to include single quotes around the refresh url (absence causes problems on some hosts) 159 | - rewrote encoding handling for non-UTF-8 feeds 160 | - added a special case for rel="hub" links in Atom feeds 161 | 162 | 163 | ## v1.29 (2013-04-13) 164 | 165 | 166 | NOTE: If your Feedlet stops working with this update grab the current version from your Extras page (accessible in the action menu below the Fever logo) 167 | 168 | - fixed bug that caused Sparks previously associated with a group to be deleted when the group was deleted 169 | - updated curl command to provide a user agent to prevent 500 errors on some hosts 170 | - added a Changelog link to the Fever menu 171 | - added a basic subscribe link for use with browser extensions (requires login), eg. `http://yourdomain.com/fever/?subscribe&url=` 172 | - fixed Feedlet on wired.com homepage and feed list 173 | - fixed the Feedlet 500 error that occurs on some hosts 174 | - updated "Show read" default to avoid confusion when adding groups and feeds for the first time 175 | - updated "reload interface after browser refresh" behavior to never replace the currently open item 176 | - iPhone: updated iPhone stylesheets for 4" devices (no retina yet, sorry!) 177 | - added support for protocol agnostic urls in feeds 178 | - updated multiple select box behavior to make use of all space available to them 179 | - updated DOM parsing to handle illogically marked up images with spaces inside the the src quotes 180 | - updated XML parser to better handle 'WINDOWS-1256' encoding 181 | - fixed a couple of SQL bugs that could prevent importing OPML, emptying feeds and emptying the favicon cache (hat-tip: Matt Long) 182 | 183 | 184 | ## v1.28 (2013-02-06) 185 | 186 | - updated XML parser to better handle 'WINDOWS-1250' encoding 187 | - updated `__config` table definition (setting default values for MEDIUMTEXT causes an error on some versions of MySQL preventing installation) 188 | 189 | 190 | ## v1.27 (2012-10-19) 191 | 192 | - updated all instances of `date()` in copyright notices to `gmdate()` to remove warnings in newer verisions of PHP 193 | - removed letterbox from webclip on 4" iOS devices (need to delete and re-add to home screen to take effect) 194 | - updated `HTTP_HTTPS` server variable detection 195 | - updated Service Url help text 196 | 197 | 198 | ## v1.26 (2012-08-14) 199 | 200 | - iPad: fixed group/feed list overlap when zoomed in on items 201 | - iPad: restored scroll-to-top-of-new-feed functionality 202 | - iPad: updated webclip icons for retina 203 | - added new keyboard shortcuts for Hot (1), Kindling (2), Saved (3), Sparks (4), and Search results (5) 204 | - updated keyboard shortcut to prevent interaction with the Pocket Chrome extension 205 | - updated sharing service url filtering, prefix a url with # to connect to the sharing url in the background (no new window or tab) 206 | 207 | 208 | ## v1.25 (2012-07-14) 209 | 210 | - updated string encoding functions to accomodate changes made to the default value of optional arguments in PHP 5.4 (fixes garbled extended characters) 211 | - added some additional default database values to accomodate servers running in MySQL strict mode 212 | 213 | 214 | ## v1.24 (2012-04-19) 215 | 216 | - API v3: Sparks are now filtered out of the `feeds_groups` response (past group relationships are retained, just not exposed through the API) 217 | - API v3: added comma separated `feed_ids` and `group_ids` to `items` API GET request to limit the items returned to specific feed(s)/group(s) 218 | - API v3: added `mark_item_as_unread()` support 219 | - updated `request.php` to support gzipped content (requires cURL 7.1+) 220 | - fixed bug where editing a Spark feed caused it to lose its previous group association 221 | - updated `refresh_feed()` to better detect `site_url`s marked-up in unusual formats 222 | - fixed unescaped single quotes in database password 223 | 224 | 225 | ## v1.23 (2012-01-11) 226 | 227 | - iPad: optimizations for iOS 5 (two finger scroll group/feed lists) 228 | - fixed scrollable group/feed lists ugliness on Lion 229 | - option keyboard shortcut limited to Macs instead of just excluding Windows (Linux-friendly) 230 | - Feedlet: updated routing to prompt for login if not already logged in instead of failing silently (reverts to old, server-parsing method in these instances) 231 | - Feedlet: updated to match link elements with multiple values in their rel attribute 232 | - iPhone: updated login form so that clicking "Go" on the iPhone's keyboard submits login rather than reminder by default 233 | - iPhone: eliminated harmless error from line 775 in `iphone.js` on login screen 234 | - addressed "Call-time pass-by-reference" warnings in convenience functions in `util.php` 235 | 236 | 237 | ## v1.22 238 | 239 | - updated MySQL version detection to better support alphanumeric version strings 240 | - added keyboard shortcut Shift+R to refresh the current group or feed 241 | - iPhone: fixed bug that caused a recently read feed to display the parent group's unread items when reselected 242 | 243 | 244 | ## v1.21 245 | 246 | - iPhone: after returning from a zoomed Elsewhere view you can now pinch or doubletap to restore the intended Fever UI scale 247 | - updated all email inputs to `type="email"` to prevent undesired auto-capitalization on iOS devices 248 | 249 | 250 | ## v1.20 251 | 252 | - iPhone: added checks to better prevent conflicting animations from leaving the UI an unusable state 253 | - iPhone: added checks to better prevent near-simultaneous content requests from leaving the UI an unusable state 254 | - iPhone: added preference to view links in another MobileSafari tab (for non-WebClip users) 255 | - iPhone: fixed bug in "Mark as read on scroll past headline" logic affecting recent versions of MobileSafari 256 | - iPhone: updated copyright logic in footer on login screen 257 | 258 | 259 | ## v1.19 260 | 261 | - fixed up/down arrow key bug (should scroll page when items/hot links have focus, not skip to next item/link) 262 | 263 | 264 | ## v1.18 265 | 266 | - added compatibility with MySQL 5.5 (which drops support for deprecated TYPE keyword and requires ENGINE keyword when creating tables) 267 | - activated the "Delete..." item in the Sparks contextual menu allowing you to unsubscribe from all Sparks at once 268 | - added additional activation error message 269 | - improved vim-like h-j-k-l keyboard behavior 270 | - silenced some PHP warnings in a third-party library 271 | 272 | 273 | ## v1.17 274 | 275 | - iOS: updated webclip for Retina Display (delete existing Fever webclip and Add to Home Screen from Safari again) 276 | - iPad: added mark as read button to bottom of group/feed list (since you can't scroll to autoread the last few items) 277 | - iPad: eliminated some :hover states so double-tapping is no longer necessary for the majority of frequent functions 278 | - iPad: set viewport width to prevent CSS sprite tiling issues from rounding errors 279 | - iPad: disabled feed/group scrolling 280 | - iPad: hid Help popovers 281 | 282 | 283 | ## v1.16 284 | 285 | - removed some errant Sharing debug code 286 | - added `text-rendering: optimizeLegibility;` to `shared.css` 287 | - API: added `remove_control_characters()` to prevent invalid XML/JSON output (hattip: Tom Krush) 288 | 289 | 290 | ## v1.15 291 | 292 | - API: added `max_id` and `with_ids` arguments to items request, see the updated API documentation http://feedafever.com/api 293 | - updated `request.php` to default to using sockets when curl is installed but disabled via `php.ini` 294 | - eliminated possible false negative when checking that a feed is really a feed before parsing 295 | - API: updated API key comparison, now case-insensitive 296 | - updated %e sharing token, now has its whitespace collapsed when used with the `javascript:` pseudocol 297 | - API: added `total_items` containing the total number of items stored in the remote Fever installation to API requests for `items` 298 | 299 | 300 | ## v1.14 301 | 302 | - added beginnings of a basic API (documentation http://feedafever.com/api) 303 | - added custom iPad webclip icon 304 | - fixed redundant `data:` prefix in the default cached favicon data 305 | - disabled ?errors query command on cron-based refresh 306 | - removed some errant PHP shortags in the Saved Items feed that were preventing the feed from working on servers that don't support short tags 307 | - fixed missing hyphen before `k` curl option for https hosts (thanks Andreas) 308 | - fixed a bug where marking a group/feed as read via keyboard shortcut didn't update internal pointers to the new focused group/feed 309 | 310 | 311 | ## v1.13 312 | (bug fixes) 313 | - reverted to original "back out of group/feed" behavior (the last few items would never be marked as read since you have to scroll to the top to back out) 314 | - special-cased the new o-shortcut so that typing "o" in the search input doesn't try to open a selected item 315 | 316 | 317 | ## v1.12 318 | 319 | - updated "back out of group/feed" behavior of iPhone-optimized version to only mark onscreen items as read 320 | - added two independent "Mark as read" preferences to iPhone-optimized version of Fever, on "scroll past headline" and "back out of group/feed" 321 | - added additional keyboard shortcut to open currently selected item or link (o) 322 | - expanded mobile detection to include all WebKit-based WebOS browsers 323 | - nulled out `document.write()` to prevent blank pages when auto-paging by scrolling 324 | - improved title detection of links from Reddit feeds (thanks to http://karanlyons.com) 325 | 326 | 327 | ## v1.11 328 | 329 | - fixed a bug in the rendering of multi-byte characters in group names (mostly in the add/edit/export forms) 330 | - fixed a bug that allowed the Sparks "All items/unread" supergroup context menu "Mark group as read" to mark all Kindling items as read 331 | - updated `ago()` calculations to switch from weeks unit to months after 12 weeks (most likely visible in Saved) 332 | - fixed the Alt key to no longer toggle item content on Windows (was breaking Alt-tabbing to other applications) 333 | - fixed inconsistent url truncation 334 | - fixed `debug()` output for SELECT durations by adding `number_format()`ing to prevent useless E-5s 335 | - fixed a bug preventing keyboard-based auto-pagination from working consistently 336 | - updated saved items rss feed to place item titles in a cdata (to better handle poorly-/un- encoded entities) 337 | 338 | Feeds that were brought to my attention that now work properly (or better) in Fever 1.11: 339 | 340 | - http://www.buzzfeed.com/index.xml 341 | 342 | 343 | ## v1.10 344 | 345 | - fixed bug that broke pagination when "mark items as read as they scroll past" Preference was unchecked 346 | - fixed bug where a previously selected read group defaulted to Kindling without listing its unread feeds 347 | - added an item retention preference to the Refreshing tab to further limit Fever's database usage, default is (and has always been) 10 weeks 348 | - added preliminary unofficial support for Internet Explorer via Google's new Chrome Frame plugin (http://code.google.com/chrome/chromeframe/) 349 | - updated sharing JavaScript to only open a new window when the service url starts with http or https (better support for sending links to `Tweetie.app` with `tweetie:%t%20%u`) 350 | - updated `infiniterator()` method to correctly handle servers with a `max_execution_time` that is less than or equal to 0 (unlimited) 351 | - updated sharing JavaScript to support the `javascript:` pseudocol (replacement tokens may be used in single-quoted strings) 352 | - updated keyboard shortcut JavaScript to prevent conflicts with native shortcuts on Windows platform 353 | 354 | 355 | ## v1.09 356 | 357 | - iPhone: fixed a few minor JavaScript errors 358 | - added Alt/Option key as an additional item content toggle (to accommodate newer MacBook Pros) 359 | - updated third-party service integration to be user customizable (including their keyboard shortcuts) 360 | - updated `install_paths()` method to better detect https 361 | - updated CSS to move the "Choose OPML" button out of the way of the "import groups" checkbox in Firefox 362 | - added "Send to Instapaper" option for items and keyboard shortcut (I) 363 | - added "Send to Delicious" option for items and keyboard shortcut (D) 364 | - added "Twitter" option for items and keyboard shortcut (T) 365 | - added "Email" option for items (uses default email client) and keyboard shortcut (E) 366 | - added item contextual menu 367 | - updated auto-scroll during toggling of excerpts to occur only when the top of an item is off screen 368 | - added optional Saved Items feed (see the new Sharing tab in Preferences to enable) 369 | - added Sharing tab to Preferences 370 | 371 | 372 | ## v1.08 373 | 374 | - added keyboard shortcuts for "Visit site" and "Visit site and mark as read" (V and Shift + V respectively) 375 | - added "Visit site and mark as read" to feed context menu 376 | - added additional styling to `ins`/`del` family of tags 377 | - added partial support for `xml:base` 378 | - updated the Hot view to use the title/description of an available source item, even if the original item is beyond the specified timeframe (does not affect temperature calculation) 379 | - added the ability to save Hot links that are directly associated with an item in a feed you are already subscribed to 380 | - added the url of a feed that requires authentication as a tool tip (in case clarification is necessary) 381 | - updated feedlet to visually differentiate between legitimate feeds and guesses based on link url and text 382 | - updated feedlet to sniff out links that could point to feeds even when embedded feeds are found in a pages head (was one or the other before) 383 | - added search term highlighting in search results 384 | - fixed bug in displaying search terms with double-quotes in them 385 | - updated `resolve()` to leave `javascript:` protocol links alone 386 | - updated `request()` to treat the Location header as case-insensitive 387 | - updated `refresh_feed()` to ensure that the same feed isn't unnecessarily refreshed multiple times when updating initial undefined values 388 | - updated Fever's query functions to free up memory only when actually used (slaps forehead) 389 | 390 | Feeds that were brought to my attention that now work properly (or better) in Fever 1.08: 391 | 392 | - http://www.tbray.org/ongoing/ongoing.atom 393 | - http://www.intertwingly.net/blog/index.atom 394 | - http://bitworking.org/news/feed/ 395 | - http://blog.tagesanzeiger.ch/mamablog/index.php/feed/atom/ 396 | 397 | 398 | ## v1.07 399 | 400 | - iPhone: added preliminary support for automatic background refreshing on the iPhone--current implementation may not refresh the stalest feeds--will revisit if necessary (uses `ignore_user_abort(true)` to continue with refresh request without maintaining a persistent connection) 401 | - iPhone: added limited Feedlet support to iPhone version 402 | - marking Spark items as read no longer incorrectly decrements the total unread count displayed in Kindling and the browser title bar (since Sparks don't contribute to these numbers) 403 | - Fever now ignores this broken png favicon to prevent choking the caching process: http://www.imjustcreative.com/favicon.ico 404 | - rewrote `blacklist()` to eliminate dropped connections when modifying the blacklist 405 | - updated Fever's query functions to free up memory wherever possible 406 | - Fever now manually removes `