Notable changes
* Add Python 3.8 support, drop 3.3 and 3.4. Python 3.5 is now the minimum required version.
* Add [Pixelfed](https://pixelfed.org/)! Heavily based on Mastodon.
* Standardize Instagram's and Facebook's scraping into new common `scraped_to_activities()`, `scraped_to_activity()`, and `merge_scraped_reactions()` methods.
* Atom:
* Add the `summary` element ([157](https://github.com/snarfed/granary/issues/157)).
* REST API:
* Bug fix: URL-encode Unicode characters in `Link` HTTP headers (eg `rel=self`, `rel=header`).
* Facebook:
* Scraping now uses [mbasic.facebook.com](https://mbasic.facebook.com/) instead of [m.facebook.com](https://m.facebook.com/).
* Flickr:
* Add support for adding tags to existing photos ([bridgy857](https://github.com/snarfed/bridgy/issues/857)).
* `get_comment()`: skip fetching comments from API if `activity` kwarg is provided and contains the requested comment.
* GitHub:
* Handle [HTTP 451 Unavailable for Legal Reasons](https://en.wikipedia.org/wiki/HTTP_451) responses ([eg for DMCA takedowns](https://developer.github.com/changes/2016-03-17-the-451-status-code-is-now-supported/)) gracefully.
* Add create/preview support for reactions on pull review request comments (ie URLs with `discussion_r...` fragments).
* HTML/microformats2:
* Add `aria-hidden="true"` to empty links ([bridgy947](https://github.com/snarfed/bridgy/issues/947)).
* Bug fix: escape `&`, `<`, and `>` characters in bare mf2 `content` properties ([aaronpk/XRay102](https://github.com/aaronpk/XRay/issues/102)).
* `json_to_object()`: convert `nickname` to `username`.
* JSON Feed:
* Gracefully handle when `content_html` and `content_text` are [incorrectly](https://jsonfeed.org/version/1#items) lists instead of strings.
* Instagram:
* Include threaded (ie nested) comments in scraping ([bridgy958](https://github.com/snarfed/bridgy/issues/958)).
* Mastodon:
* Bug fix for alt text with image attachments ([bridgy975](https://github.com/snarfed/bridgy/issues/975)).
* Omit empty `limit` param [for compatibility with Pleroma](https://git.pleroma.social/pleroma/pleroma/-/issues/2198) ([bridgy#977](https://github.com/snarfed/bridgy/issues/977)).
* Meetup:
* `create()`: handle API errors and return the error message in the `CreationResult` ([bridgy921](https://github.com/snarfed/bridgy/issues/921)).
* Twitter:
* Bug fix: URL-encode list names in API calls.
* Bug fix: propagate alt text into AS1 `photo.displayName` so that it gets all the way into microformats2 JSON and HTML ([183](https://github.com/snarfed/granary/issues/183)).
* Reddit:
* Implement `post_id()`.
* Cache user data fetched from the API for 5m to avoid repeating user profile API requests ([bridgy1021](https://github.com/snarfed/bridgy/issues/1021)).
when fetching multiple comments or posts from the same author
* Bug fix: use 'displayName' instead of 'name' in AS1 objects for submissions.
* Bug fix: use tag URIs for activity ids.
* ActivityStreams 2:
* `to_as1()`: for `Create` activities, include the activity actor's data in the object's author ([snarfed/bridgy-fed75](https://github.com/snarfed/bridgy-fed/issues/75)).
* `to_as1()`: convert `preferredUsername` to `username`.
* `from_as1()`: convert `username` to `preferredUsername`.
* `from_as1()`: bug fix, make `context` kwarg actually work.