Verified Commit 0703598c authored by Agate's avatar Agate 💬

Merge branch 'release/0.19.0'

parents 29739e2c dfef5e38
This diff is collapsed.
# -*- coding: utf-8 -*-
__version__ = "0.19.0-rc2"
__version__ = "0.19.0"
__version_info__ = tuple(
int(num) if num.isdigit() else num
Improved error handling and display during import (#252, #718, #583, #501, #544)
Fixed issue with querying the albums api endpoint (#356)
\ No newline at end of file
Added albums view. Similar to artists view, it's viewable by clicking on the "Albums" link on the top bar. (#356)
\ No newline at end of file
Change the document title to display current track information. (#359)
Improved readability of logo (#385)
Show remaining storage space during import and prevent file upload if not enough space is remaining (#550)
Fixed unplayable radios for anonymous users (#563)
Support S3-compatible storages for media files (#565)
Preload next track in queue (#572)
Added twitter:* meta tags to detect tracks and albums players automatically on more sites (#578)
Improved responsiveness of embedded player
\ No newline at end of file
Use attributedTo instead of actor in library ActivityPub payload (#619)
Added standardized translation context for all strings in the frontend to give accurate hints to translators.
Support metadata update on tracks, albums and artists and broadcast those on the federation (#689)
Fixed alignement/size issue with some buttons (#702)
\ No newline at end of file
Better workflow for connecting to another instance (#715)
Changing the instance used is now better integrated in the App, and it is checked that the chosen instance and the suggested instances are valid and running Funkwhale servers.
Fixed crashing upload processing on invalid date format (#718)
Added a "load more" button on artist pages to load more tracks/albums (#719)
Fixed non-transparent background for volume range on Firefox (#722)
\ No newline at end of file
Merged artist/album buttons with title text on artist and album pages (#725)
Do not consider tracks as duplicates during import if they have different positions (#740)
Support embedding full artist discographies (#747)
Labels for privacy levels are now consistently grabbed from a common source instead of being hardcoded everytime they are needed.
Support OAuth2 authorization for better integration with third-party apps (#752)
Add missing command from contributing file (#754)
Ensure all our ActivityPub fetches are authenticated (#758)
Descriptions will now be shown underneath user libraries (#768)
\ No newline at end of file
Document how to use Redis over unix sockets (#770)
Prevent skipping on file import if album_mbid is different (#772)
Don't store unhandled ActivityPub messages in database (#776)
Added a prune_library management command to remove obsolete metadata from the database (#777)
Added a `check_inplace_files` management command to remove purge the database from references to in-place imported files that don't exist on disk anymore (#781)
Better handling of featuring/multi-artist tracks tagged with MusicBrainz (#782)
Display a confirmation dialog when adding duplicate songs to a playlist (#784)
Fixed overflowing input on account detail page (#791)
Fixed cover not showing in queue/player when playing tracks from "albums" tab (#795)
Allow users with dots in their usernames to request a subsonic password (#798)
Removed broken/instable lyrics feature (#799)
Now honor maxBitrate parameter in Subsonic API (#802)
Reduced app size for regular users by moving admin-related code in a dedicated chunk (#805)
Use proper site name/domain in emails (#806)
Advertise the list of supported upload extensions in the Nodeinfo endpoint (#808)
Added admin options to disable login for users, ensure related content is deleted when deleting a user account (#809)
Ensure correct track duration and playable status when browsing radios (#812)
Bumped dependencies to latest versions (#815)
Fixed invalid required fields in Upload django's admin (#819)
Width of filter menus for radios has been set to stop text from overlapping the borders
\ No newline at end of file
Fixed invalid OEmbed URL when using a local FUNKWHALE_SPA_HTML_ROOT (#824)
Added env variable to set AWS region and signature version to serve media without proxy (#826)
Fixed an encoding issue with instance name on about page (#828)
Better handling of follow/accept messages to avoid and recover from desync between instances (#830)
The buttons displaying an icon now always show a little divider between the icon and the text. (!620)
Use network/depends_on instead of links in docker-compose.yml (!716)
\ No newline at end of file
Keep persistent connections to the database instead of recreating a new one for each request
Enhanced the design of the embed wizard. (!619)
Add required envvar for dev environment (!668)
Fixed dev command for fake data creation (!664)
Ensure the footer always stays at the bottom of the page
[Experimental] Added a new "Similar" radio based on users history (suggested by @gordon)
Expose an instance-level actor (service@domain) in nodeinfo endpoint (#689)
import argparse
import requests
WEBLATE_COMPONENT_ID = "funkwhale/front"
def get_commits(ref_name, since):
url = GITLAB_URL + "/api/v4/projects/{}/repository/commits".format(
while url:
response = requests.get(
url, params={"since": since, "ref_name": ref_name, "per_page": 100}
yield from response.json()
if "next" in response.links:
url = response.links["next"]["url"]
url = None
def get_commit_stats(commits):
stats = {"total": 0, "commiters": {}}
for commit in commits:
if commit["message"].startswith("Merge branch "):
stats["total"] += 1
stats["commiters"][commit["author_name"]] += 1
except KeyError:
stats["commiters"][commit["author_name"]] = 1
return stats
def get_tag_date(ref):
url = GITLAB_URL + "/api/v4/projects/{}/repository/tags/{}".format(
response = requests.get(url)
data = response.json()
return data["commit"]["committed_date"]
def get_translations(since):
url = WEBLATE_URL + "/api/components/{}/changes/".format(WEBLATE_COMPONENT_ID)
while url:
response = requests.get(url)
if "next" in response.json():
url = response.json()["next"]
url = None
for t in response.json()["results"]:
if t["timestamp"] < since:
url = None
yield t
def get_translations_stats(translations):
stats = {"total": 0, "translators": {}}
for translation in translations:
if not translation["author"]:
print("translation", translation["action_name"])
stats["total"] += 1
stats["translators"][translation["author"]] += 1
except KeyError:
stats["translators"][translation["author"]] = 1
return stats
def main():
parser = argparse.ArgumentParser()
args = parser.parse_args()
since = get_tag_date(args.last_tag)
commits = get_commits(args.ref_name, since)
commits_stats = get_commit_stats(commits)
commiter_names = commits_stats["commiters"].keys()
for commiter in sorted(commits_stats["commiters"].keys(), key=lambda v: v.upper()):
translations = get_translations(since)
translations_stats = get_translations_stats(translations)
translators_ids = sorted(translations_stats["translators"].keys())
# There is no way to query user/author info via weblate API and we need the names…
"Execute the following SQL query on the weblate server to get the translators names:"
print("$ weblate dbshell")
"SELECT full_name FROM weblate_auth_user WHERE id in ({});".format(
", ".join([str(i) for i in translators_ids])
if __name__ == "__main__":
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment