diff --git a/CHANGELOG b/CHANGELOG
index f36ebea3b631c5e028f4a7714cf7aad29e579498..768b53c3869ecef71ef53c88cd4ac19b1dde0488 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,55 @@ This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.
 
 .. towncrier
 
+0.19.1 (2018-06-28)
+-------------------
+
+Upgrade instructions are available at
+https://docs.funkwhale.audio/index.html
+
+Enhancements:
+
+- The currently playing track is now highlighted with an orange play icon (#832)
+- Support for importing files with no album tag (#122)
+- Redirect from / to /library when user is logged in (#864)
+- Added a SUBSONIC_DEFAULT_TRANSCODING_FORMAT env var to support clients that don't provide the format parameter (#867)
+- Added button to search for objects on Discogs (#368)
+- Added copy-to-clipboard button with Subsonic password input (#814)
+- Added opus to the list of supported mimetypes and extensions (#868)
+- Aligned search headers with search results in the sidebar (#708)
+- Clicking on the currently selected playlist in the Playlist popup will now close the popup (#807)
+- Favorites radio will not be visible if the user does not have any favorites (#419)
+
+
+Bugfixes:
+
+- Ensure empty but optional fields in file metadata don't error during import (#850)
+- Fix broken upload for specific files when using S3 storage (#857)
+- Fixed broken translation on home and track detail page (#833)
+- Fixed broken user admin for users with non-digit or letters in their username (#869)
+- Fixed invalid file extension for transcoded tracks (#848)
+- Fixed issue with French translation for "Start radio" (#849)
+- Fixed issue with player changing height when hovering over the volume slider (#838)
+- Fixed secondary menus truncated on narrow screens (#855)
+- Fixed wrong og:image url when using S3 storage (#851)
+- Hide pod statistics on about page if those are disabled (#835)
+- Use ASCII filename before upload to S3 to avoid playback issues (#847)
+
+
+Contributors to this release (commiters and reviewers):
+
+- Ciarán Ainsworth
+- Creak
+- ealgase
+- Eliot Berriot
+- Esteban
+- Freyja Wildes
+- hellekin
+- Johannes H.
+- Mehdi
+- Reg
+
+
 0.19.0 (2019-05-16)
 -------------------
 
diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index de69d61b38ae954babd34da2b9eec03d9fb52bf7..ca7495165ca79d14ada4ce2fd3b814ea18777c0b 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -706,3 +706,6 @@ RSA_KEY_SIZE = 2048
 CREATE_IMAGE_THUMBNAILS = env.bool("CREATE_IMAGE_THUMBNAILS", default=True)
 # we rotate actor keys at most every two days by default
 ACTOR_KEY_ROTATION_DELAY = env.int("ACTOR_KEY_ROTATION_DELAY", default=3600 * 48)
+SUBSONIC_DEFAULT_TRANSCODING_FORMAT = (
+    env("SUBSONIC_DEFAULT_TRANSCODING_FORMAT", default="mp3") or None
+)
diff --git a/api/funkwhale_api/__init__.py b/api/funkwhale_api/__init__.py
index 903b9e39f3b1de38adbe8064532840769d68b39a..7805b764635fcb706ddbbc8d0118261700bb83ac 100644
--- a/api/funkwhale_api/__init__.py
+++ b/api/funkwhale_api/__init__.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-__version__ = "0.19.0"
+__version__ = "0.19.1"
 __version_info__ = tuple(
     [
         int(num) if num.isdigit() else num
diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py
index 88d7ece7c575d29bdcec0e7bbb8a056292ffd7d2..52f37c8704c1d2d7931eb28593db0812a1c96d1f 100644
--- a/api/funkwhale_api/subsonic/views.py
+++ b/api/funkwhale_api/subsonic/views.py
@@ -247,10 +247,6 @@ class SubsonicViewSet(viewsets.GenericViewSet):
         if not upload:
             return response.Response(status=404)
 
-        format = data.get("format", "raw")
-        if format == "raw":
-            format = None
-
         max_bitrate = data.get("maxBitRate")
         try:
             max_bitrate = min(max(int(max_bitrate), 0), 320) or None
@@ -259,6 +255,16 @@ class SubsonicViewSet(viewsets.GenericViewSet):
 
         if max_bitrate:
             max_bitrate = max_bitrate * 1000
+
+        format = data.get("format", "raw") or None
+        if max_bitrate and not format:
+            # specific bitrate requested, but no format specified
+            # so we use a default one, cf #867. This helps with clients
+            # that don't send the format parameter, such as DSub.
+            format = settings.SUBSONIC_DEFAULT_TRANSCODING_FORMAT
+        elif format == "raw":
+            format = None
+
         return music_views.handle_serve(
             upload=upload,
             user=request.user,
diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py
index 73f968ff47130daefa5312d1aa61e10a9a15ddde..cde07ac53d86f8298461597ae0f5559c1386bf79 100644
--- a/api/tests/subsonic/test_views.py
+++ b/api/tests/subsonic/test_views.py
@@ -261,23 +261,48 @@ def test_stream_format(format, expected, logged_in_api_client, factories, mocker
 
 
 @pytest.mark.parametrize(
-    "max_bitrate,expected", [(0, None), (192, 192000), (2000, 320000)]
+    "max_bitrate,format,default_transcoding_format,expected_bitrate,expected_format",
+    [
+        # no max bitrate, no format, so no transcoding should happen
+        (0, "", "ogg", None, None),
+        # same using "raw" format
+        (0, "raw", "ogg", None, None),
+        # specified bitrate, but no format, so fallback to default transcoding format
+        (192, "", "ogg", 192000, "ogg"),
+        # specified bitrate, but over limit
+        (2000, "", "ogg", 320000, "ogg"),
+        # specified format, we use that one
+        (192, "opus", "ogg", 192000, "opus"),
+        # No default transcoding format set and no format requested
+        (192, "", None, 192000, None),
+    ],
 )
-def test_stream_bitrate(max_bitrate, expected, logged_in_api_client, factories, mocker):
+def test_stream_transcode(
+    max_bitrate,
+    format,
+    default_transcoding_format,
+    expected_bitrate,
+    expected_format,
+    logged_in_api_client,
+    factories,
+    mocker,
+    settings,
+):
+    settings.SUBSONIC_DEFAULT_TRANSCODING_FORMAT = default_transcoding_format
     url = reverse("api:subsonic-stream")
     mocked_serve = mocker.patch.object(
         music_views, "handle_serve", return_value=Response()
     )
     upload = factories["music.Upload"](playable=True)
     response = logged_in_api_client.get(
-        url, {"id": upload.track.pk, "maxBitRate": max_bitrate}
+        url, {"id": upload.track.pk, "maxBitRate": max_bitrate, "format": format}
     )
 
     mocked_serve.assert_called_once_with(
         upload=upload,
         user=logged_in_api_client.user,
-        format=None,
-        max_bitrate=expected,
+        format=expected_format,
+        max_bitrate=expected_bitrate,
         proxy_media=True,
     )
     assert response.status_code == 200
diff --git a/changes/changelog.d/122.enhancement b/changes/changelog.d/122.enhancement
deleted file mode 100644
index 2776824c7406e3adb2af3bd77c3397ed0f0c7cac..0000000000000000000000000000000000000000
--- a/changes/changelog.d/122.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-Support for importing files with no album tag (#122)
diff --git a/changes/changelog.d/368.enhancement b/changes/changelog.d/368.enhancement
deleted file mode 100644
index 7e8f78c0a8be20794c0042e32ad2ad55e2f221be..0000000000000000000000000000000000000000
--- a/changes/changelog.d/368.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-Added button to search for objects on Discogs (#368)
diff --git a/changes/changelog.d/419.enhancement b/changes/changelog.d/419.enhancement
deleted file mode 100644
index f4716b53e5e23ab6ab047ab033b2a6d02bf04c2b..0000000000000000000000000000000000000000
--- a/changes/changelog.d/419.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-Favorites radio will not be visible if the user does not have any favorites (#419)
\ No newline at end of file
diff --git a/changes/changelog.d/708.enhancement b/changes/changelog.d/708.enhancement
deleted file mode 100644
index f3217e5a9b3e5c90d4e1af0370dc58e3e28d98ef..0000000000000000000000000000000000000000
--- a/changes/changelog.d/708.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-Aligned search headers with search results in the sidebar (#708)
\ No newline at end of file
diff --git a/changes/changelog.d/807.enhancement b/changes/changelog.d/807.enhancement
deleted file mode 100644
index bab8f9647e6b9a7e360dfd17c8b7ff6dd3682041..0000000000000000000000000000000000000000
--- a/changes/changelog.d/807.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-Clicking on the currently selected playlist in the Playlist popup will now close the popup (#807)
\ No newline at end of file
diff --git a/changes/changelog.d/814.enhancement b/changes/changelog.d/814.enhancement
deleted file mode 100644
index c93b1983c954bbcec69ee5f3b0f6912d00ed7b5f..0000000000000000000000000000000000000000
--- a/changes/changelog.d/814.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-Added copy-to-clipboard button with Subsonic password input (#814)
diff --git a/changes/changelog.d/832.enhancement b/changes/changelog.d/832.enhancement
deleted file mode 100644
index 1a270b88eaf9fa8a584b894a9bc611aab980feb3..0000000000000000000000000000000000000000
--- a/changes/changelog.d/832.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-The currently playing track is now highlighted with an orange play icon (#832)
\ No newline at end of file
diff --git a/changes/changelog.d/833.bugfix b/changes/changelog.d/833.bugfix
deleted file mode 100644
index 06ce086f56832952ddf685e46ade30ddecfbb936..0000000000000000000000000000000000000000
--- a/changes/changelog.d/833.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fixed broken translation on home and track detail page (#833)
diff --git a/changes/changelog.d/835.bugfix b/changes/changelog.d/835.bugfix
deleted file mode 100644
index 1a9921ee7d638387357272c4b0ffb86e32eaf3d3..0000000000000000000000000000000000000000
--- a/changes/changelog.d/835.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Hide pod statistics on about page if those are disabled (#835)
diff --git a/changes/changelog.d/838.bugfix b/changes/changelog.d/838.bugfix
deleted file mode 100644
index 3394897565b9c801597460d0fc9b53cf17abfca7..0000000000000000000000000000000000000000
--- a/changes/changelog.d/838.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fixed issue with player changing height when hovering over the volume slider (#838)
diff --git a/changes/changelog.d/847.bugfix b/changes/changelog.d/847.bugfix
deleted file mode 100644
index d156467212c807a15e554805cd73acf8b727750e..0000000000000000000000000000000000000000
--- a/changes/changelog.d/847.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Use ASCII filename before upload to S3 to avoid playback issues (#847)
diff --git a/changes/changelog.d/848.bugfix b/changes/changelog.d/848.bugfix
deleted file mode 100644
index 478a8d42cc1fc6dbcf217a0bdb1721146c6744a4..0000000000000000000000000000000000000000
--- a/changes/changelog.d/848.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fixed invalid file extension for transcoded tracks (#848)
diff --git a/changes/changelog.d/849.bugfix b/changes/changelog.d/849.bugfix
deleted file mode 100644
index 61f1c2a2e591a237365b328391988e1ed4b935ed..0000000000000000000000000000000000000000
--- a/changes/changelog.d/849.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fixed issue with French translation for "Start radio" (#849)
diff --git a/changes/changelog.d/850.bugfix b/changes/changelog.d/850.bugfix
deleted file mode 100644
index 0e26ce773fcfc55a4c1f07708b58b6d6ebea5735..0000000000000000000000000000000000000000
--- a/changes/changelog.d/850.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Ensure empty but optional fields in file metadata don't error during import (#850)
diff --git a/changes/changelog.d/851.bugfix b/changes/changelog.d/851.bugfix
deleted file mode 100644
index e6866b3e1f99b5c47ff6d764394da4ef501e1a7c..0000000000000000000000000000000000000000
--- a/changes/changelog.d/851.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fixed wrong og:image url when using S3 storage (#851)
diff --git a/changes/changelog.d/855.bugfix b/changes/changelog.d/855.bugfix
deleted file mode 100644
index 171865ed7737266f59f5d9757b5457a0581e8276..0000000000000000000000000000000000000000
--- a/changes/changelog.d/855.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fixed secondary menus truncated on narrow screens (#855)
diff --git a/changes/changelog.d/857.bugfix b/changes/changelog.d/857.bugfix
deleted file mode 100644
index 5d525e3d9fd16f0cd0fff579be8edefb181c4b66..0000000000000000000000000000000000000000
--- a/changes/changelog.d/857.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fix broken upload for specific files when using S3 storage (#857)
diff --git a/changes/changelog.d/864.enhancement b/changes/changelog.d/864.enhancement
deleted file mode 100644
index f903ac85054911c5f131f290f4ad1e9aacb77161..0000000000000000000000000000000000000000
--- a/changes/changelog.d/864.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-Redirect from / to /library when user is logged in (#864)
diff --git a/changes/changelog.d/868.enhancement b/changes/changelog.d/868.enhancement
deleted file mode 100644
index 13fc3953010bc4bdae53552ba19134ef7e0424f4..0000000000000000000000000000000000000000
--- a/changes/changelog.d/868.enhancement
+++ /dev/null
@@ -1 +0,0 @@
-Added opus to the list of supported mimetypes and extensions (#868)
diff --git a/changes/changelog.d/869.bugfix b/changes/changelog.d/869.bugfix
deleted file mode 100644
index 7d56f3175a19da41b146b8f68fd18fe61b147652..0000000000000000000000000000000000000000
--- a/changes/changelog.d/869.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fixed broken user admin for users with non-digit or letters in their username (#869)
diff --git a/scripts/get-contributions-stats.py b/scripts/get-contributions-stats.py
index bc6d1b3bf76e1af12981efad31eb4583fafa09da..6680e434b74c476fd06f6802edea5268049c0a13 100644
--- a/scripts/get-contributions-stats.py
+++ b/scripts/get-contributions-stats.py
@@ -1,5 +1,6 @@
 import argparse
 import requests
+import os
 
 GITLAB_URL = "https://dev.funkwhale.audio"
 GITLAB_PROJECT_ID = 17
@@ -82,6 +83,14 @@ def get_translations_stats(translations):
     return stats
 
 
+def get_group_usernames(group):
+    url = GITLAB_URL + "/api/v4/groups/{}/members".format(group)
+    response = requests.get(url, headers={"PRIVATE-TOKEN": os.environ["PRIVATE_TOKEN"]})
+    response.raise_for_status()
+    data = response.json()
+    return [r["name"] for r in data]
+
+
 def main():
     parser = argparse.ArgumentParser()
     parser.add_argument("ref_name")
@@ -90,9 +99,15 @@ def main():
     since = get_tag_date(args.last_tag)
     commits = get_commits(args.ref_name, since)
     commits_stats = get_commit_stats(commits)
-
+    groups = [(588, "funkwhale/reviewers-python"), (589, "funkwhale/reviewers-front")]
+    reviewers = []
+    for id, _ in groups:
+        reviewers += get_group_usernames(id)
+    print("\nReviewers:\n")
+    for reviewer in reviewers:
+        print(reviewer)
     commiter_names = commits_stats["commiters"].keys()
-    print("Commiters:")
+    print("\nCommiters:\n")
     for commiter in sorted(commits_stats["commiters"].keys(), key=lambda v: v.upper()):
         print(commiter)
     translations = get_translations(since)
@@ -100,7 +115,7 @@ def main():
     translators_ids = sorted(translations_stats["translators"].keys())
     # There is no way to query user/author info via weblate API and we need the names…
     print(
-        "Execute the following SQL query on the weblate server to get the translators names:"
+        "\nExecute the following SQL query on the weblate server to get the translators names:"
     )
     print("$ weblate dbshell")
     print(