Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 1.4.1-upgrade-release
  • 1121-download
  • 1218-smartplaylist_backend
  • 1373-login-form-move-reset-your-password-link
  • 1381-progress-bars
  • 1481
  • 1518-update-django-allauth
  • 1645
  • 1675-widget-improperly-configured-missing-resource-id
  • 1675-widget-improperly-configured-missing-resource-id-2
  • 1704-required-props-are-not-always-passed
  • 1716-add-frontend-tests-again
  • 1749-smtp-uri-configuration
  • 1930-first-upload-in-a-batch-always-fails
  • 1976-update-documentation-links-in-readme-files
  • 2054-player-layout
  • 2063-funkwhale-connection-interrupted-every-so-often-requires-network-reset-page-refresh
  • 2091-iii-6-improve-visuals-layout
  • 2151-refused-to-load-spa-manifest-json-2
  • 2154-add-to-playlist-pop-up-hidden-by-now-playing-screen
  • 2155-can-t-see-the-episode-list-of-a-podcast-as-an-anonymous-user-with-anonymous-access-enabled
  • 2156-add-management-command-to-change-file-ref-for-in-place-imported-files-to-s3
  • 2192-clear-queue-bug-when-random-shuffle-is-enabled
  • 2205-channel-page-pagination-link-dont-working
  • 2215-custom-logger-does-not-work-at-all-with-webkit-and-blink-based-browsers
  • 2228-troi-real-world-review
  • 2274-implement-new-upload-api
  • 2303-allow-users-to-own-tagged-items
  • 2395-far-right-filter
  • 2405-front-buttont-trigger-third-party-hook
  • 2408-troi-create-missing-tracks
  • 2416-revert-library-drop
  • 2448-complete-tags
  • 2451-delete-no-user-query
  • 2452-fetch-third-party-metadata
  • 623-test
  • 653-enable-starting-embedded-player-at-a-specific-position-in-track
  • activitypub-overview
  • album-sliders
  • arne/2091-improve-visuals
  • back-option-for-edits
  • chore/2406-compose-modularity-scope
  • develop
  • develop-password-reset
  • env-file-cleanup
  • feat/2091-improve-visuals
  • fix-amd64-docker-build-gfortran
  • fix-gitpod
  • fix-plugins-dev-setup
  • fix-rate-limit-serializer
  • fix-schema-channel-metadata-choices
  • flupsi/2803-improve-visuals
  • flupsi/2804-new-upload-process
  • funkwhale-fix_pwa_manifest
  • funkwhale-petitminion-2136-bug-fix-prune-skipped-upload
  • funkwhale-ui-buttons
  • georg/add-typescript
  • gitpod/test-1866
  • global-button-experiment
  • global-buttons
  • juniorjpdj/pkg-repo
  • manage-py-reference
  • merge-review
  • minimal-python-version
  • petitminion-develop-patch-84496
  • pin-mutagen-to-1.46
  • pipenv
  • plugins
  • plugins-v2
  • plugins-v3
  • pre-release/1.3.0
  • prune_skipped_uploads_docs
  • renovate/front-all-dependencies
  • renovate/front-major-all-dependencies
  • schema-updates
  • small-gitpod-improvements
  • spectacular_schema
  • stable
  • tempArne
  • ui-buttons
  • update-frontend-dependencies
  • upload-process-spec
  • user-concept-docs
  • v2-artists
  • vite-ws-ssl-compatible
  • wip/2091-improve-visuals
  • wvffle/dependency-maintenance
  • wvffle/new-upload-process
  • wvffle/ui-rewrite-sidebar
  • wvffle/ui-sidebar
  • 0.1
  • 0.10
  • 0.11
  • 0.12
  • 0.13
  • 0.14
  • 0.14.1
  • 0.14.2
  • 0.15
  • 0.16
  • 0.16.1
  • 0.16.2
  • 0.16.3
  • 0.17
  • 0.18
  • 0.18.1
  • 0.18.2
  • 0.18.3
  • 0.19.0
  • 0.19.0-rc1
  • 0.19.0-rc2
  • 0.19.1
  • 0.2
  • 0.2.1
  • 0.2.2
  • 0.2.3
  • 0.2.4
  • 0.2.5
  • 0.2.6
  • 0.20.0
  • 0.20.0-rc1
  • 0.20.1
  • 0.21
  • 0.21-rc1
  • 0.21-rc2
  • 0.21.1
  • 0.21.2
  • 0.3
  • 0.3.1
  • 0.3.2
  • 0.3.3
  • 0.3.4
  • 0.3.5
  • 0.4
  • 0.5
  • 0.5.1
  • 0.5.2
  • 0.5.3
  • 0.5.4
  • 0.6
  • 0.6.1
  • 0.7
  • 0.8
  • 0.9
  • 0.9.1
  • 1.0
  • 1.0-rc1
  • 1.0.1
  • 1.1
  • 1.1-rc1
  • 1.1-rc2
  • 1.1.1
  • 1.1.2
  • 1.1.3
  • 1.1.4
  • 1.2.0
  • 1.2.0-rc1
  • 1.2.0-rc2
  • 1.2.0-testing
  • 1.2.0-testing2
  • 1.2.0-testing3
  • 1.2.0-testing4
  • 1.2.1
  • 1.2.10
  • 1.2.2
  • 1.2.3
  • 1.2.4
  • 1.2.5
  • 1.2.6
  • 1.2.6-1
  • 1.2.7
  • 1.2.8
  • 1.2.9
  • 1.3.0
  • 1.3.0-rc1
  • 1.3.0-rc2
  • 1.3.0-rc3
  • 1.3.0-rc4
  • 1.3.0-rc5
  • 1.3.0-rc6
  • 1.3.1
  • 1.3.2
  • 1.3.3
  • 1.3.4
  • 1.4.0
  • 1.4.0-rc1
  • 1.4.0-rc2
  • 1.4.1
  • 2.0.0-alpha.1
  • 2.0.0-alpha.2
190 results

Target

Select target project
  • funkwhale/funkwhale
  • Luclu7/funkwhale
  • mbothorel/funkwhale
  • EorlBruder/funkwhale
  • tcit/funkwhale
  • JocelynDelalande/funkwhale
  • eneiluj/funkwhale
  • reg/funkwhale
  • ButterflyOfFire/funkwhale
  • m4sk1n/funkwhale
  • wxcafe/funkwhale
  • andybalaam/funkwhale
  • jcgruenhage/funkwhale
  • pblayo/funkwhale
  • joshuaboniface/funkwhale
  • n3ddy/funkwhale
  • gegeweb/funkwhale
  • tohojo/funkwhale
  • emillumine/funkwhale
  • Te-k/funkwhale
  • asaintgenis/funkwhale
  • anoadragon453/funkwhale
  • Sakada/funkwhale
  • ilianaw/funkwhale
  • l4p1n/funkwhale
  • pnizet/funkwhale
  • dante383/funkwhale
  • interfect/funkwhale
  • akhardya/funkwhale
  • svfusion/funkwhale
  • noplanman/funkwhale
  • nykopol/funkwhale
  • roipoussiere/funkwhale
  • Von/funkwhale
  • aurieh/funkwhale
  • icaria36/funkwhale
  • floreal/funkwhale
  • paulwalko/funkwhale
  • comradekingu/funkwhale
  • FurryJulie/funkwhale
  • Legolars99/funkwhale
  • Vierkantor/funkwhale
  • zachhats/funkwhale
  • heyjake/funkwhale
  • sn0w/funkwhale
  • jvoisin/funkwhale
  • gordon/funkwhale
  • Alexander/funkwhale
  • bignose/funkwhale
  • qasim.ali/funkwhale
  • fakegit/funkwhale
  • Kxze/funkwhale
  • stenstad/funkwhale
  • creak/funkwhale
  • Kaze/funkwhale
  • Tixie/funkwhale
  • IISergII/funkwhale
  • lfuelling/funkwhale
  • nhaddag/funkwhale
  • yoasif/funkwhale
  • ifischer/funkwhale
  • keslerm/funkwhale
  • flupe/funkwhale
  • petitminion/funkwhale
  • ariasuni/funkwhale
  • ollie/funkwhale
  • ngaumont/funkwhale
  • techknowlogick/funkwhale
  • Shleeble/funkwhale
  • theflyingfrog/funkwhale
  • jonatron/funkwhale
  • neobrain/funkwhale
  • eorn/funkwhale
  • KokaKiwi/funkwhale
  • u1-liquid/funkwhale
  • marzzzello/funkwhale
  • sirenwatcher/funkwhale
  • newer027/funkwhale
  • codl/funkwhale
  • Zwordi/funkwhale
  • gisforgabriel/funkwhale
  • iuriatan/funkwhale
  • simon/funkwhale
  • bheesham/funkwhale
  • zeoses/funkwhale
  • accraze/funkwhale
  • meliurwen/funkwhale
  • divadsn/funkwhale
  • Etua/funkwhale
  • sdrik/funkwhale
  • Soran/funkwhale
  • kuba-orlik/funkwhale
  • cristianvogel/funkwhale
  • Forceu/funkwhale
  • jeff/funkwhale
  • der_scheibenhacker/funkwhale
  • owlnical/funkwhale
  • jovuit/funkwhale
  • SilverFox15/funkwhale
  • phw/funkwhale
  • mayhem/funkwhale
  • sridhar/funkwhale
  • stromlin/funkwhale
  • rrrnld/funkwhale
  • nitaibezerra/funkwhale
  • jaller94/funkwhale
  • pcouy/funkwhale
  • eduxstad/funkwhale
  • codingHahn/funkwhale
  • captain/funkwhale
  • polyedre/funkwhale
  • leishenailong/funkwhale
  • ccritter/funkwhale
  • lnceballosz/funkwhale
  • fpiesche/funkwhale
  • Fanyx/funkwhale
  • markusblogde/funkwhale
  • Firobe/funkwhale
  • devilcius/funkwhale
  • freaktechnik/funkwhale
  • blopware/funkwhale
  • cone/funkwhale
  • thanksd/funkwhale
  • vachan-maker/funkwhale
  • bbenti/funkwhale
  • tarator/funkwhale
  • prplecake/funkwhale
  • DMarzal/funkwhale
  • lullis/funkwhale
  • hanacgr/funkwhale
  • albjeremias/funkwhale
  • xeruf/funkwhale
  • llelite/funkwhale
  • RoiArthurB/funkwhale
  • cloo/funkwhale
  • nztvar/funkwhale
  • Keunes/funkwhale
  • petitminion/funkwhale-petitminion
  • m-idler/funkwhale
  • SkyLeite/funkwhale
140 results
Select Git revision
  • 278-search-browse
  • 303-json-ld
  • ButterflyOfFire/funkwhale-patch-1
  • develop
  • master
  • 0.1
  • 0.10
  • 0.11
  • 0.12
  • 0.13
  • 0.14
  • 0.14.1
  • 0.14.2
  • 0.15
  • 0.2
  • 0.2.1
  • 0.2.2
  • 0.2.3
  • 0.2.4
  • 0.2.5
  • 0.2.6
  • 0.3
  • 0.3.1
  • 0.3.2
  • 0.3.3
  • 0.3.4
  • 0.3.5
  • 0.4
  • 0.5
  • 0.5.1
  • 0.5.2
  • 0.5.3
  • 0.5.4
  • 0.6
  • 0.6.1
  • 0.7
  • 0.8
  • 0.9
  • 0.9.1
39 results
Show changes
Changelog
=========
You can subscribe to release announcements by:
- Following `funkwhale@mastodon.eliotberriot.com <https://mastodon.eliotberriot.com/@funkwhale>`_ on Mastodon
- Subscribing to the following Atom feed: https://code.eliotberriot.com/funkwhale/funkwhale/commits/develop?format=atom&search=tag
This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.html.
.. towncrier
0.15 (2018-06-24)
-----------------
Upgrade instructions are available at
https://docs.funkwhale.audio/upgrading.html
Features:
- Added admin interface to manage import requests (#190)
- Added replace flag during import to replace already present tracks with a new
version of their track file (#222)
- Funkwhale's front-end can now point to any instance (#327) Removed front-end
and back-end coupling
- Management interface for users (#212)
- New invite system (#248) New invite system
Enhancements:
- Added "TV" to the list of highlighted words during YouTube import (#154)
- Command line import now accepts unlimited args (#242)
Bugfixes:
- Expose track files date in manage API (#307)
- Fixed current track restart/hiccup when shuffling queue, deleting track from
queue or reordering (#310)
- Include user's current private playlists on playlist list (#302)
- Remove link to generic radios, since they don't have detail pages (#324)
Documentation:
- Document that Funkwhale may be installed with YunoHost (#325)
- Documented a saner layout with symlinks for in-place imports (#254)
- Upgrade documentation now use the correct user on non-docker setups (#265)
Invite system
^^^^^^^^^^^^^
On closed instances, it has always been a little bit painful to create accounts
by hand for new users. This release solve that by adding invitations.
You can generate invitation codes via the "users" admin interface (you'll find a
link in the sidebar). Those codes are valid for 14 days, and can be used once
to create a new account on the instance, even if registrations are closed.
By default, we generate a random code for invitations, but you can also use custom codes
if you need to print them or make them fancier ;)
Invitations generation and management requires the "settings" permission.
Removed front-end and back-end coupling
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Eventhough Funkwhale's front-end has always been a Single Page Application,
talking to an API, it was only able to talk to an API on the same domain.
There was no real technical justification behind this (only lazyness), and it was
also blocking interesting use cases:
- Use multiple customized versions of the front-end with the same instance
- Use a customized version of the front-end with multiple instances
- Use a locally hosted front-end with a remote API, which is especially useful in development
From now on, Funkwhale's front-end can connect to any Funkwhale server. You can
change the server you are connecting to in the footer.
Fixing this also unlocked a really interesting feature in our development/review workflow:
by leveraging Gitlab CI and review apps, we are now able to deploy automatically live versions of
a merge request, making it possible for anyone to review front-end changes easily, without
the need to install a local environment.
0.14.2 (2018-06-16)
-------------------
.. warning::
This release contains a fix for a permission issue. You should upgrade
as soon as possible. Read the changelog below for more details.
Upgrade instructions are available at
https://docs.funkwhale.audio/upgrading.html
Enhancements:
- Added feedback on shuffle button (#262)
- Added multiple warnings in the documentation that you should never run
makemigrations yourself (#291)
- Album cover served in http (#264)
- Apache2 reverse proxy now supports websockets (tested with Apache 2.4.25)
(!252)
- Display file size in human format during file upload (#289)
- Switch from BSD-3 licence to AGPL-3 licence (#280)
Bugfixes:
- Ensure radios can only be edited and deleted by their owners (#311)
- Fixed admin menu not showing after login (#245)
- Fixed broken pagination in Subsonic API (#295)
- Fixed duplicated websocket connexion on timeline (#287)
Documentation:
- Improved documentation about in-place imports setup (#298)
Other:
- Added Black and flake8 checks in CI to ensure consistent code styling and
formatting (#297)
- Added bug and feature issue templates (#299)
Permission issues on radios
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Because of an error in the way we checked user permissions on radios,
public radios could be deleted by any logged-in user, even if they were not
the owner of the radio.
We recommend instances owners to upgrade as fast as possible to avoid any abuse
and data loss.
Funkwhale is now licenced under AGPL-3
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Following the recent switch made by PixelFed
(https://github.com/dansup/pixelfed/issues/143), we decided along with
the community to relicence Funkwhale under the AGPL-3 licence. We did this
switch for various reasons:
- This is better aligned with other fediverse software
- It prohibits anyone to distribute closed-source and proprietary forks of Funkwhale
As end users and instance owners, this does not change anything. You can
continue to use Funkwhale exactly as you did before :)
Apache support for websocket
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Up until now, our Apache2 configuration was not working with websockets. This is now
solved by adding this at the beginning of your Apache2 configuration file::
Define funkwhale-api-ws ws://localhost:5000
And this, before the "/api" block::
# Activating WebSockets
ProxyPass "/api/v1/instance/activity" ${funkwhale-api-ws}/api/v1/instance/activity
Websockets may not be supported in older versions of Apache2. Be sure to upgrade to the latest version available.
Serving album covers in https (Apache2 proxy)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Two issues are addressed here. The first one was about Django replying with
mixed content (http) when queried for covers. Setting up the `X-Forwarded-Proto`
allows Django to know that the client is using https, and that the reply must
be https as well.
Second issue was a problem of permission causing Apache a denied access to
album cover folder. It is solved by adding another block for this path in
the Apache configuration file for funkwhale.
Here is how to modify your `funkwhale.conf` apache2 configuration::
<VirtualHost *:443>
...
#Add this new line
RequestHeader set X-Forwarded-Proto "https"
...
# Add this new block below the other <Directory/> blocks
# replace /srv/funkwhale/data/media with the path to your media directory
# if you're not using the standard layout.
<Directory /srv/funkwhale/data/media/albums>
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
...
</VirtualHost>
About the makemigrations warning
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You may sometimes get the following warning while applying migrations::
"Your models have changes that are not yet reflected in a migration, and so won't be applied."
This is a warning, not an error, and it can be safely ignored.
Never run the ``makemigrations`` command yourself.
0.14.1 (2018-06-06)
-------------------
Upgrade instructions are available at https://docs.funkwhale.audio/upgrading.html
Enhancements:
- Display server version in the footer (#270)
- fix_track_files will now update files with bad mimetype (and not only the one
with no mimetype) (#273)
- Huge performance boost (~x5 to x7) during CLI import that queries MusicBrainz
(#288)
- Removed alpha-state transcoding support (#271)
Bugfixes:
- Broken logging statement during import error (#274)
- Broken search bar on library home (#278)
- Do not crash when importing track with an artist that do not match the
release artist (#237)
- Do not crash when tag contains multiple uuids with a / separator (#267)
- Ensure we do not store bad mimetypes (such as application/x-empty) (#266)
- Fix broken "play all" button that played only 25 tracks (#281)
- Fixed broken track download modal (overflow and wrong URL) (#239)
- Removed hardcoded size limit in file upload widget (#275)
Documentation:
- Added warning about _protected/music location in nginx configuration (#247)
Removed alpha-state transcoding (#271)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
A few months ago, a basic transcoding feature was implemented. Due to the way
this feature was designed, it was slow, CPU intensive on the server side,
and very tightly coupled to the reverse-proxy configuration, preventing
it to work Apache2, for instance. It was also not compatible with Subsonic clients.
Based on that, we're currently removing support for transcoding
**in its current state**. The work on a better designed transcoding feature
can be tracked in https://code.eliotberriot.com/funkwhale/funkwhale/issues/272.
You don't have to do anything on your side, but you may want to remove
the now obsolete configuration from your reverse proxy file (nginx only)::
# Remove those blocks:
# transcode cache
proxy_cache_path /tmp/funkwhale-transcode levels=1:2 keys_zone=transcode:10m max_size=1g inactive=7d;
# Transcoding logic and caching
location = /transcode-auth {
include /etc/nginx/funkwhale_proxy.conf;
# needed so we can authenticate transcode requests, but still
# cache the result
internal;
set $query '';
# ensure we actually pass the jwt to the underlytin auth url
if ($request_uri ~* "[^\?]+\?(.*)$") {
set $query $1;
}
proxy_pass http://funkwhale-api/api/v1/trackfiles/viewable/?$query;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
location /api/v1/trackfiles/transcode/ {
include /etc/nginx/funkwhale_proxy.conf;
# this block deals with authenticating and caching transcoding
# requests. Caching is heavily recommended as transcoding
# is a CPU intensive process.
auth_request /transcode-auth;
if ($args ~ (.*)jwt=[^&]*(.*)) {
set $cleaned_args $1$2;
}
proxy_cache_key "$scheme$request_method$host$uri$is_args$cleaned_args";
proxy_cache transcode;
proxy_cache_valid 200 7d;
proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://funkwhale-api;
}
# end of transcoding logic
0.14 (2018-06-02)
-----------------
Upgrade instructions are available at
https://docs.funkwhale.audio/upgrading.html
Features:
- Admins can now configure default permissions that will be granted to all
registered users (#236)
- Files management interface for users with "library" permission (#223)
- New action table component for quick and efficient batch actions (#228) This
is implemented on the federated tracks pages, but will be included in other
pages as well depending on the feedback.
Enhancements:
- Added a new "upload" permission that allows user to launch import and view
their own imports (#230)
- Added Support for OggTheora in import.
- Autoremove media files on model instance deletion (#241)
- Can now import a whole remote library at once thanks to new Action Table
component (#164)
- Can now use album covers from flac/mp3 metadata and separate file in track
directory (#219)
- Implemented getCovertArt in Subsonic API to serve album covers (#258)
- Implemented scrobble endpoint of subsonic API, listenings are now tracked
correctly from third party apps that use this endpoint (#260)
- Retructured music API to increase performance and remove useless endpoints
(#224)
Bugfixes:
- Consistent constraints/checks for URL size (#207)
- Display proper total number of tracks on radio detail (#225)
- Do not crash on flac import if musicbrainz tags are missing (#214)
- Empty save button in radio builder (#226)
- Ensure anonymous users can use the app if the instance is configured
accordingly (#229)
- Ensure inactive users cannot get auth tokens (#218) This was already the case
bug we missed some checks
- File-upload import now supports Flac files (#213)
- File-upload importer should now work properly, assuming files are tagged
(#106)
- Fixed a few broken translations strings (#227)
- Fixed broken ordering in front-end lists (#179)
- Fixed ignored page_size paremeter on artist and favorites list (#240)
- Read ID3Tag Tracknumber from TRCK (#220)
- We now fetch album covers regardless of the import methods (#231)
Documentation:
- Added missing subsonic configuration block in deployment vhost files (#249)
- Moved upgrade doc under install doc in TOC (#251)
Other:
- Removed acoustid support, as the integration was buggy and error-prone (#106)
Files management interface
^^^^^^^^^^^^^^^^^^^^^^^^^^
This is the first bit of an ongoing work that will span several releases, to
bring more powerful library management features to Funkwhale. This iteration
includes a basic file management interface where users with the "library"
permission can list and search available files, order them using
various criterias (size, bitrate, duration...) and delete them.
New "upload" permission
^^^^^^^^^^^^^^^^^^^^^^^
This new permission is helpful if you want to give upload/import rights
to some users, but don't want them to be able to manage the library as a whole:
although there are no controls yet for managing library in the fron-end,
subsequent release will introduce management interfaces for artists, files,
etc.
Because of that, users with the "library" permission will have much more power,
and will also be able to remove content from the platform. On the other hand,
users with the "upload" permission will only have the ability to add new
content.
Also, this release also includes a new feature called "default permissions":
those are permissions that are granted to every users on the platform.
On public/open instances, this will play well with the "upload" permission
since everyone will be able to contribute to the instance library without
an admin giving the permission to every single user.
Smarter album cover importer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
In earlier versions, covers where only imported when launching a YouTube import.
Starting from this release, covers will be imported regardless of the import mode
(file upload, youtube-dl, CLI, in-place...). Funkwhale will look for covers
in the following order:
1. In the imported file itself (FLAC/MP3 only)
2. In a cover.jpg or cover.png in the file directory
3. By fetching cover art from Musibrainz, assuming the file is tagged correctly
This will only work for newly imported tracks and albums though. In the future,
we may offer an option to refetch album covers from the interface, but in the
meantime, you can use the following snippet:
.. code-block:: python
# Store this in /tmp/update_albums.py
from funkwhale_api.music.models import Album, TrackFile
from funkwhale_api.music.tasks import update_album_cover
albums_without_covers = Album.objects.filter(cover='')
total = albums_without_covers.count()
print('Found {} albums without cover'.format(total))
for i, album in enumerate(albums_without_covers.iterator()):
print('[{}/{}] Fetching cover for {}...'.format(i+1, total, album.title))
f = TrackFile.objects.filter(track__album=album).filter(source__startswith='file://').first()
update_album_cover(album, track_file=f)
Then launch it::
# docker setups
cat /tmp/update_albums.py | docker-compose run --rm api python manage.py shell -i python
# non-docker setups
source /srv/funkwhale/load_env
source /srv/funkwhale/virtualenv/bin/activate
cat /tmp/update_albums.py | python manage.py shell -i python
# cleanup
rm /tmp/update_albums.py
.. note::
Depending on your number of albums, the previous snippet may take some time
to execute. You can interrupt it at any time using ctrl-c and relaunch it later,
as it's idempotent.
Music API changes
^^^^^^^^^^^^^^^^^
This release includes an API break. Even though the API is advertised
as unstable, and not documented, here is a brief explanation of the change in
case you are using the API in a client or in a script. Summary of the changes:
- ``/api/v1/artists`` does not includes a list of tracks anymore. It was to heavy
to return all of this data all the time. You can get all tracks for an
artist using ``/api/v1/tracks?artist=artist_id``
- Additionally, ``/api/v1/tracks`` now support an ``album`` filter to filter
tracks matching an album
- ``/api/v1/artists/search``, ``/api/v1/albums/search`` and ``/api/v1/tracks/search``
endpoints are removed. Use ``/api/v1/{artists|albums|tracks}/?q=yourquery``
instead. It's also more powerful, since you can combine search with other
filters and ordering options.
- ``/api/v1/requests/import-requests/search`` endpoint is removed as well.
Use ``/api/v1/requests/import-requests/?q=yourquery``
instead. It's also more powerful, since you can combine search with other
filters and ordering options.
Of course, the front-end was updated to work with the new API, so this should
not impact end-users in any way, apart from slight performance gains.
.. note::
The API is still not stable and may evolve again in the future. API freeze
will come at a later point.
Flac files imports via upload
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You have nothing to do to benefit from this, however, since Flac files
tend to be a lot bigger than other files, you may want to increase the
``client_max_body_size`` value in your Nginx configuration if you plan
to upload flac files.
Missing subsonic configuration bloc in vhost files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Because of a missing bloc in the sample Nginx and Apache configurations,
instances that were deployed after the 0.13 release are likely to be unable
to answer to Subsonic clients (the missing bits were properly documented
in the changelog).
Ensure you have the following snippets in your Nginx or Apache configuration
if you plan to use the Subsonic API.
Nginx::
location /rest/ {
include /etc/nginx/funkwhale_proxy.conf;
proxy_pass http://funkwhale-api/api/subsonic/rest/;
}
Apache2::
<Location "/rest">
ProxyPass ${funkwhale-api}/api/subsonic/rest
ProxyPassReverse ${funkwhale-api}/api/subsonic/rest
</Location>
0.13 (2018-05-19)
-----------------
Upgrade instructions are available at
https://docs.funkwhale.audio/upgrading.html
Features:
- Can now import and play flac files (#157)
- Simpler permission system (#152)
- Store file length, size and bitrate (#195)
- We now have a brand new instance settings interface in the front-end (#206)
Enhancements:
- Disabled browsable HTML API in production (#205)
- Instances can now indicate on the nodeinfo endpoint if they want to remain
private (#200)
Bugfixes:
- .well-known/nodeinfo endpoint can now answer to request with Accept:
application/json (#197)
- Fixed escaping issue of track name in playlist modal (#201)
- Fixed missing dot when downloading file (#204)
- In-place imported tracks with non-ascii characters don't break reverse-proxy
serving (#196)
- Removed Python 3.6 dependency (secrets module) (#198)
- Uplayable tracks are now properly disabled in the interface (#199)
Instance settings interface
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Prior to this release, the only way to update instance settings (such as
instance description, signup policy, federation configuration, etc.) was using
the admin interface provided by Django (the back-end framework which power the API).
This interface worked, but was not really-user friendly and intuitive.
Starting from this release, we now offer a dedicated interface directly
in the front-end. You can view and edit all your instance settings from here,
assuming you have the required permissions.
This interface is available at ``/manage/settings` and via link in the sidebar.
Storage of bitrate, size and length in database
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Starting with this release, when importing files, Funkwhale will store
additional information about audio files:
- Bitrate
- Size (in bytes)
- Duration
This change is not retroactive, meaning already imported files will lack those
informations. The interface and API should work as before in such case, however,
we offer a command to deal with legacy files and populate the missing values.
On docker setups:
.. code-block:: shell
docker-compose run --rm api python manage.py fix_track_files
On non-docker setups:
.. code-block:: shell
# from your activated virtualenv
python manage.py fix_track_files
.. note::
The execution time for this command is proportional to the number of
audio files stored on your instance. This is because we need to read the
files from disk to fetch the data. You can run it in the background
while Funkwhale is up.
It's also safe to interrupt this command and rerun it at a later point, or run
it multiple times.
Use the --dry-run flag to check how many files would be impacted.
Simpler permission system
^^^^^^^^^^^^^^^^^^^^^^^^^
Starting from this release, the permission system is much simpler. Up until now,
we were using Django's built-in permission system, which was working, but also
quite complex to deal with.
The new implementation relies on simpler logic, which will make integration
on the front-end in upcoming releases faster and easier.
If you have manually given permissions to users on your instance,
you can migrate those to the new system.
On docker setups:
.. code-block:: shell
docker-compose run --rm api python manage.py script django_permissions_to_user_permissions --no-input
On non-docker setups:
.. code-block:: shell
# in your virtualenv
python api/manage.py script django_permissions_to_user_permissions --no-input
There is still no dedicated interface to manage user permissions, but you
can use the admin interface at ``/api/admin/users/user/`` for that purpose in
the meantime.
0.12 (2018-05-09)
-----------------
Upgrade instructions are available at
https://docs.funkwhale.audio/upgrading.html
Features:
- Subsonic API implementation to offer compatibility with existing clients such
as DSub (#75)
- Use nodeinfo standard for publishing instance information (#192)
Enhancements:
- Play button now play tracks immediately instead of appending them to the
queue (#99, #156)
Bugfixes:
- Fix broken federated import (#193)
Documentation:
- Up-to-date documentation for upgrading front-end files on docker setup (#132)
Subsonic API
^^^^^^^^^^^^
This release implements some core parts of the Subsonic API, which is widely
deployed in various projects and supported by numerous clients.
By offering this API in Funkwhale, we make it possible to access the instance
library and listen to the music without from existing Subsonic clients, and
without developping our own alternative clients for each and every platform.
Most advanced Subsonic clients support offline caching of music files,
playlist management and search, which makes them well-suited for nomadic use.
Please head over :doc:`users/apps` for more informations about supported clients
and user instructions.
At the instance-level, the Subsonic API is enabled by default, but require
and additional endpoint to be added in you reverse-proxy configuration.
On nginx, add the following block::
location /rest/ {
include /etc/nginx/funkwhale_proxy.conf;
proxy_pass http://funkwhale-api/api/subsonic/rest/;
}
On Apache, add the following block::
<Location "/rest">
ProxyPass ${funkwhale-api}/api/subsonic/rest
ProxyPassReverse ${funkwhale-api}/api/subsonic/rest
</Location>
The Subsonic can be disabled at the instance level from the django admin.
.. note::
Because of Subsonic's API design which assumes cleartext storing of
user passwords, we chose to have a dedicated, separate password
for that purpose. Users can generate this password from their
settings page in the web client.
Nodeinfo standard for instance information and stats
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. warning::
The ``/api/v1/instance/stats/`` endpoint which was used to display
instance data in the about page is removed in favor of the new
``/api/v1/instance/nodeinfo/2.0/`` endpoint.
In earlier version, we where using a custom endpoint and format for
our instance information and statistics. While this was working,
this was not compatible with anything else on the fediverse.
We now offer a nodeinfo 2.0 endpoint which provides, in a single place,
all the instance information such as library and user activity statistics,
public instance settings (description, registration and federation status, etc.).
We offer two settings to manage nodeinfo in your Funkwhale instance:
1. One setting to completely disable nodeinfo, but this is not recommended
as the exposed data may be needed to make some parts of the front-end
work (especially the about page).
2. One setting to disable only usage and library statistics in the nodeinfo
endpoint. This is useful if you want the nodeinfo endpoint to work,
but don't feel comfortable sharing aggregated statistics about your library
and user activity.
To make your instance fully compatible with the nodeinfo protocol, you need to
to edit your nginx configuration file::
# before
...
location /.well-known/webfinger {
include /etc/nginx/funkwhale_proxy.conf;
proxy_pass http://funkwhale-api/.well-known/webfinger;
}
...
# after
...
location /.well-known/ {
include /etc/nginx/funkwhale_proxy.conf;
proxy_pass http://funkwhale-api/.well-known/;
}
...
You can do the same if you use apache::
# before
...
<Location "/.well-known/webfinger">
ProxyPass ${funkwhale-api}/.well-known/webfinger
ProxyPassReverse ${funkwhale-api}/.well-known/webfinger
</Location>
...
# after
...
<Location "/.well-known/">
ProxyPass ${funkwhale-api}/.well-known/
ProxyPassReverse ${funkwhale-api}/.well-known/
</Location>
...
This will ensure all well-known endpoints are proxied to funkwhale, and
not just webfinger one.
Links:
- About nodeinfo: https://github.com/jhass/nodeinfo
0.11 (2018-05-06)
-----------------
Upgrade instructions are available at https://docs.funkwhale.audio/upgrading.html
Special thanks for this release go to @renon:matrix.org (@Hazmo on Gitlab)
for bringing Apache2 support to Funkwhale and contributing on other issues.
Thank you!
Features:
- Funkwhale now works behind an Apache2 reverse proxy (!165)
check out the brand new documentation at https://docs.funkwhale.audio/installation/index.html#apache2
if you want to try it!
- Users can now request password reset by email, assuming a SMTP server was
correctly configured (#187)
Enhancements:
- Added a fix_track_files command to run checks and fixes against library
(#183)
- Avoid fetching Actor object on every request authentication
- Can now relaunch errored jobs and batches (#176)
- List pending requests by default, added a status filter for requests (#109)
- More structured menus in sidebar, added labels with notifications
- Sample virtual-host file for Apache2 reverse-proxy (!165)
- Store high-level settings (such as federation or auth-related ones) in
database (#186)
Bugfixes:
- Ensure in place imported files get a proper mimetype (#183)
- Federation cache suppression is now simpler and also deletes orphaned files
(#189)
- Fixed small UI glitches/bugs in federation tabs (#184)
- X-sendfile not working with in place import (#182)
Documentation:
- Added a documentation area for third-party projects (#180)
- Added documentation for optimizing Funkwhale and reduce its memory footprint.
- Document that the database should use an utf-8 encoding (#185)
- Foundations for API documentation with Swagger (#178)
Database storage for high-level settings
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Due to the work done in #186, the following environment variables have been
deprecated:
- FEDERATION_ENABLED
- FEDERATION_COLLECTION_PAGE_SIZE
- FEDERATION_MUSIC_NEEDS_APPROVAL
- FEDERATION_ACTOR_FETCH_DELAY
- PLAYLISTS_MAX_TRACKS
- API_AUTHENTICATION_REQUIRED
Configuration for this settings has been moved to database, as it will provide
a better user-experience, by allowing you to edit these values on-the-fly,
without restarting Funkwhale processes.
You can leave those environment variables in your .env file for now, as the
values will be used to populate the database entries. We'll make a proper
announcement when the variables won't be used anymore.
Please browse https://docs.funkwhale.audio/configuration.html#instance-settings
for more information about instance configuration using the web interface.
System emails
^^^^^^^^^^^^^
Starting from this release, Funkwhale will send two types
of emails:
- Email confirmation emails, to ensure a user's email is valid
- Password reset emails, enabling user to reset their password without an admin's intervention
Email sending is disabled by default, as it requires additional configuration.
In this mode, emails are simply outputed on stdout.
If you want to actually send those emails to your users, you should edit your
.env file and tweak the EMAIL_CONFIG variable. See :ref:`setting-EMAIL_CONFIG`
for more details.
.. note::
As a result of these changes, the DJANGO_EMAIL_BACKEND variable,
which was not documented, has no effect anymore. You can safely remove it from
your .env file if it is set.
Proxy headers for non-docker deployments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
For non-docker deployments, add ``--proxy-headers`` at the end of the ``daphne``
command in :file:`/etc/systemd/system/funkwhale-server.service`.
This will ensure the application receive the correct IP address from the client
and not the proxy's one.
0.10 (2018-04-23)
-----------------
Features:
- Can now import files in-place from the CLI importer (#155)
Enhancements:
- Avoid downloading audio files multiple times from remote libraries (#163)
- Better file import performance and error handling (#144)
- Import job and batch API and front-end have been improved with better
performance, pagination and additional filters (#171)
- Increased max_length on TrackFile.source, this will help when importing files
with a really long path (#142)
- Player is back in Queue tab (#150)
Bugfixes:
- Fail graciously when AP representation includes a null_value for mediaType
- Fix sidebar tabs not showing under small resolution under Chrome (#173)
- Fixed broken login due to badly configured Axios (#172)
- Fixed broken playlist modal after login (#155)
- Fixed queue reorder or track deletion restarting currently playing track
(#151)
- Radio will now append new track if you delete the last track in queue (#145)
- Reset all sensitive front-end data on logout (#124)
- Typos/not showing text due to i18n work (#175)
Documentation:
- Better documentation for hardware requirements and memory usage (#165)
In-place import
^^^^^^^^^^^^^^^
This release includes in-place imports for the CLI import. This means you can
load gigabytes of music into funkwhale without worrying about about Funkwhale
copying those music files in its internal storage and eating your disk space.
`This new feature is documented here <https://docs.funkwhale.audio/importing-music.html#in-place-import>`_
and require additional configuration to ensure funkwhale and your webserver can
serve those files properly.
**Non-docker users:**
Assuming your music is stored in ``/srv/funkwhale/data/music``, add the following
block to your nginx configuration::
location /_protected/music {
internal;
alias /srv/funkwhale/data/music;
}
And the following to your .env file::
MUSIC_DIRECTORY_PATH=/srv/funkwhale/data/music
**Docker users:**
Assuming your music is stored in ``/srv/funkwhale/data/music``, add the following
block to your nginx configuration::
location /_protected/music {
internal;
alias /srv/funkwhale/data/music;
}
Assuming you have the following volume directive in your ``docker-compose.yml``
(it's the default): ``/srv/funkwhale/data/music:/music:ro``, then add
the following to your .env file::
# this is the path in the container
MUSIC_DIRECTORY_PATH=/music
# this is the path on the host
MUSIC_DIRECTORY_SERVE_PATH=/srv/funkwhale/data/music
0.9.1 (2018-04-17)
------------------
Bugfixes:
- Allow null values for musicbrainz_id in Audio ActivityPub representation
- Fixed broken permission check on library scanning and too aggressive page
validation
0.9 (2018-04-17)
----------------
Features:
- Add internationalization support (#5)
- Can now follow and import music from remote libraries (#136, #137)
Enhancements:
- Added a i18n-extract yarn script to extract strings to PO files (#162)
- User admin now includes signup and last login dates (#148)
- We now use a proper user agent including instance version and url during
outgoing requests
Federation is here!
^^^^^^^^^^^^^^^^^^^
This is for real this time, and includes:
- Following other Funkwhale libraries
- Importing tracks from remote libraries (tracks are hotlinked, and only cached for a short amount of time)
- Searching accross federated catalogs
Note that by default, federation is opt-in, on a per-instance basis:
instances will request access to your catalog, and you can accept or refuse
those requests. You can also revoke the access at any time.
Documentation was updated with relevant instructions to use and benefit
from this new feature: https://docs.funkwhale.audio/federation.html
Preparing internationalization
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Funkwhale's front-end as always been english-only, and this is a barrier
to new users. The work make Funkwhale's interface translatable was started
in this release by Baptiste. Although nothing is translated yet,
this release includes behind the stage changes that will make it possible in
the near future.
Many thank to Baptiste for the hard work and for figuring out a proper solution
to this difficult problem.
Upgrade path
^^^^^^^^^^^^
In addition to the usual instructions from
https://docs.funkwhale.audio/upgrading.html, non-docker users will have
to setup an additional systemd unit file for recurrent tasks.
This was forgotten in the deployment documentation, but recurrent tasks,
managed by the celery beat process, will be needed more and more in subsequent
releases. Right now, we'll be using to clear the cache for federated music files
and keep disk usage to a minimum.
In the future, they will also be needed to refetch music metadata or federated
information periodically.
Celery beat can be enabled easily::
curl -L -o "/etc/systemd/system/funkwhale-beat.service" "https://code.eliotberriot.com/funkwhale/funkwhale/raw/develop/deploy/funkwhale-beat.service"
# Also edit /etc/systemd/system/funkwhale.target
# and ensure the Wants= line contains the following:
# Wants=funkwhale-server.service funkwhale-worker.service funkwhale-beat.service
nano /etc/systemd/system/funkwhale.target
# reload configuration
systemctl daemon-reload
Docker users already have celerybeat enabled.
0.8 (2018-04-02)
----------------
Features:
- Add a detail page for radios (#64)
- Implemented page title binding (#1)
- Previous Track button restart playback after 3 seconds (#146)
Enhancements:
- Added credits to Francis Gading for the logotype (#101)
- API endpoint for fetching instance activity and updated timeline to use this
new endpoint (#141)
- Better error messages in case of missing environment variables (#140)
- Implemented a @test@yourfunkwhaledomain bot to ensure federation works
properly. Send it "/ping" and it will answer back :)
- Queue shuffle now apply only to tracks after the current one (#97)
- Removed player from queue tab and consistently show current track in queue
(#131)
- We now restrict some usernames from being used during signup (#139)
Bugfixes:
- Better error handling during file import (#120)
- Better handling of utf-8 filenames during file import (#138)
- Converted favicon from .ico to .png (#130)
- Upgraded to Python 3.6 to fix weird but harmless weakref error on django task
(#121)
Documentation:
- Documented the upgrade process (#127)
Preparing for federation
^^^^^^^^^^^^^^^^^^^^^^^^
Federation of music libraries is one of the most asked feature.
While there is still a lot of work to do, this version includes
the foundation that will enable funkwhale servers to communicate
between each others, and with other federated software, such as
Mastodon.
Funkwhale will use ActivityPub as it's federation protocol.
In order to prepare for federation (see #136 and #137), new API endpoints
have been added under /federation and /.well-known/webfinger.
For these endpoints to work, you will need to update your nginx configuration,
and add the following snippets::
location /federation/ {
include /etc/nginx/funkwhale_proxy.conf;
proxy_pass http://funkwhale-api/federation/;
}
location /.well-known/webfinger {
include /etc/nginx/funkwhale_proxy.conf;
proxy_pass http://funkwhale-api/.well-known/webfinger;
}
This will ensure federation endpoints will be reachable in the future.
You can of course skip this part if you know you will not federate your instance.
A new ``FEDERATION_ENABLED`` env var have also been added to control whether
federation is enabled or not on the application side. This settings defaults
to True, which should have no consequences at the moment, since actual
federation is not implemented and the only available endpoints are for
testing purposes.
Add ``FEDERATION_ENABLED=false`` to your .env file to disable federation
on the application side.
To test and troubleshoot federation, we've added a bot account. This bot is available at @test@yourinstancedomain,
and sending it "/ping", for example, via Mastodon, should trigger
a response.
0.7 (2018-03-21)
----------------
Features:
- Can now filter artists and albums with no listenable tracks (#114)
- Improve the style of the sidebar to make it easier to understand which tab is
selected (#118)
- On artist page, albums are not sorted by release date, if any (#116)
- Playlists are here \o/ :tada: (#3, #93, #94)
- Use django-cacheops to cache common ORM requests (#117)
Bugfixes:
- Fixed broken import request admin (#115)
- Fixed forced redirection to login event with
API_AUTHENTICATION_REQUIRED=False (#119)
- Fixed position not being reseted properly when playing the same track
multiple times in a row
- Fixed synchronized start/stop radio buttons for all custom radios (#103)
- Fixed typo and missing icon on homepage (#96)
Documentation:
- Up-to-date and complete development and contribution instructions in
README.rst (#123)
0.6.1 (2018-03-06)
------------------
Features:
- Can now skip acoustid on file import with the --no-acoustid flag (#111)
Bugfixes:
- Added missing batch id in output during import (#112)
- Added some feedback on the play button (#100)
- Smarter pagination which takes a fixed size (#84)
Other:
- Completely removed django-cachalot from the codebase (#110). You can safely
remove the CACHALOT_ENABLED setting from your .env file
0.6 (2018-03-04)
----------------
Features:
- Basic activity stream for listening and favorites (#23)
- Switched to django-channels and daphne for serving HTTP and websocket (#34)
Upgrades notes
**************
This version contains breaking changes in the way funkwhale is deployed,
please read the notes carefully.
Instance timeline
^^^^^^^^^^^^^^^^^
A new "Activity" page is now available from the sidebar, where you can
browse your instance activity. At the moment, this includes other users
favorites and listening, but more activity types will be implemented in the
future.
Internally, we implemented those events by following the Activity Stream
specification, which will help us to be compatible with other networks
in the long-term.
A new settings page has been added to control the visibility of your activity.
By default, your activity will be browsable by anyone on your instance,
but you can switch to a full private mode where nothing is shared.
The setting form is available in your profile.
Switch from gunicorn to daphne
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This release include an important change in the way we serve the HTTP API.
To prepare for new realtime features and enable websocket support in Funkwhale,
we are now using django-channels and daphne to serve HTTP and websocket traffic.
This replaces gunicorn and the switch should be easy assuming you
follow the upgrade process described bellow.
If you are using docker, please remove the command instruction inside the
api service, as the up-to-date command is now included directly in the image
as the default entry point:
.. code-block:: yaml
api:
restart: unless-stopped
image: funkwhale/funkwhale:${FUNKWHALE_VERSION:-latest}
command: ./compose/django/gunicorn.sh # You can remove this line
On non docker setups, you'll have to update the [Service] block of your
funkwhale-server systemd unit file to launch the application server using daphne instead of gunicorn.
The new configuration should be similar to this:
.. code-block:: ini
[Service]
User=funkwhale
# adapt this depending on the path of your funkwhale installation
WorkingDirectory=/srv/funkwhale/api
EnvironmentFile=/srv/funkwhale/config/.env
ExecStart=/usr/local/bin/daphne -b ${FUNKWHALE_API_IP} -p ${FUNKWHALE_API_PORT} config.asgi:application
Ensure you update funkwhale's dependencies as usual to install the required
packages.
On both docker and non-docker setup, you'll also have to update your nginx
configuration for websocket support. Ensure you have the following blocks
included in your virtualhost file:
.. code-block:: txt
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
...
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
Remember to reload your nginx server after the edit.
0.5.4 (2018-02-28)
------------------
Features:
- Now stop running radio when clearing queue (#98)
Bugfixes:
- Fixed queue skipping tracks (#91)
- Now loop properly on queue when we only have one track (#95)
0.5.3 (2018-02-27)
------------------
Features:
- Added admin interface for radios, track files, favorites and import requests (#80)
- Added basic instance stats on /about (#82)
- Search now unaccent letters for queries like "The Dø" or "Björk" yielding more results (#81)
Bugfixes:
- Always use username in sidebar (#89)
- Click event outside of player icons (#83)
- Fixed broken import because of missing transaction
- Now always load next radio track on last queue track ended (#87)
- Now exclude tracks without file from radio candidates (#88)
- skip to next track properly on 40X errors (#86)
Other:
- Switched to towncrier for changelog management and compilation
0.5.2 (2018-02-26)
------------------
- Fixed broken file import due to wrong url (#73)
- More accurate mimetype detection
- Fixed really small size on small screens
- Added masonry layout for artists, requests and radios (#68)
- We now have a favicon!
- Fixed truncated play icon (#65)
0.5.1 (2018-02-24)
------------------
- Front: Fixed broken ajax call on radio builder (#69)
- Front: Shuffle now restart next track from beginning (#70)
- Front: volume slider should now have the same style everywhere (#72)
0.5 (2018-02-24)
----------------
- Front: Now reset player colors when track has no cover (#46)
- Front: play button now disabled for unplayable tracks
- API: You can now enable or disable registration on the fly, via a preference (#58)
- Front: can now signup via the web interface (#35)
- Front: Fixed broken redirection on login
- Front: Fixed broken error handling on settings and login form
About page:
There is a brand new about page on instances (/about), and instance
owner can now provide a name, a short and a long description for their instance via the admin (/api/admin/dynamic_preferences/globalpreferencemodel/).
Transcoding:
Basic transcoding is now available to/from the following formats : ogg and mp3.
*This is still an alpha feature at the moment, please report any bug.*
This relies internally on FFMPEG and can put some load on your server.
It's definitely recommended you setup some caching for the transcoded files
at your webserver level. Check the the exemple nginx file at deploy/nginx.conf
for an implementation.
On the frontend, usage of transcoding should be transparent in the player.
Music Requests:
This release includes a new feature, music requests, which allows users
to request music they'd like to see imported.
Admins can browse those requests and mark them as completed when
an import is made.
0.4 (2018-02-18)
----------------
- Front: ambiant colors in player based on current track cover (#59)
- Front: simplified front dev setup thanks to webpack proxy (#59)
- Front: added some unittests for the store (#55)
- Front: fixed broken login redirection when 401
- Front: Removed autoplay on page reload
- API: Added a /instance/settings endpoint
- Front: load /instance/settings on page load
- Added settings to report JS and Python error to a Sentry instance
This is disabled by default, but feel free to enable it if you want
to help us by sending your error reports :) (#8)
0.3.5 (2018-01-07)
------------------
- Smarter BACKEND_URL in frontend
0.3.4 (2018-01-07)
------------------
- Fixed wrong URL construction in ajax call
0.3.3 (2018-01-07)
------------------
- Users can now create their own dynamic radios (#51)
0.3.2
------------------
- Fixed an issue in the main dockerfile
0.3.1
------------------
- Revamped all import logic, everything is more tested and consistend
- Can now use Acoustid in file imports to automatically grab metadata from musicbrainz
- Brand new file import wizard
0.2.7
------------------
- Shortcuts: can now use the ``f`` shortcut to toggle the currently playing track
as a favorite (#53)
- Shortcuts: avoid collisions between shortcuts by using the exact modifier (#53)
- Player: Added looping controls and shortcuts (#52)
- Player: Added shuffling controls and shortcuts (#52)
- Favorites: can now modify the ordering of track list (#50)
- Library: can now search/reorder results on artist browsing view (#50)
- Upgraded celery to 4.1, added endpoint logic for fingerprinting audio files
- Fixed #56: invalidate tokens on password change, also added change password form
- Fixed #57: now refresh jwt token on page refresh
- removed ugly dividers in batch import list
- Fixed a few padding issues
- Now persist/restore queue/radio/player state automatically
- Removed old broken imports
- Now force tests paths
- Fixed #54: Now use pytest everywhere \o/
- Now use vuex to manage state for favorites
- Now use vuex to manage state for authentication
- Now use vuex to manage state for player/queue/radios
0.2.6 (2017-12-15)
------------------
- Fixed broken Dockerfile
0.2.5 (2017-12-15)
------------------
Features:
- Import: can now specify search template when querying import sources (#45)
- Login form: now redirect to previous page after login (#2)
- 404: a decent 404 template, at least (#48)
Bugfixes:
- Player: better handling of errors when fetching the audio file (#46)
- Csrf: default CSRF_TRUSTED_ORIGINS to ALLOWED_HOSTS to avoid Csrf issues on admin (#49)
Tech:
- Django 2 compatibility, lot of packages upgrades (#47)
0.2.4 (2017-12-14)
------------------
Features:
- Models: now store relese group mbid on Album model (#7)
- Models: now bind import job to track files (#44)
Bugfixes:
- Library: fixen broken "play all albums" button on artist cards in Artist browsing view (#43)
# Changelog
You can subscribe to release announcements by:
- Following [@funkwhale@fosstodon.org](https://fosstodon.org/@funkwhale) on Mastodon
- Subscribing to the following Atom feed: https://dev.funkwhale.audio/funkwhale/funkwhale/commits/develop?format=atom&search=Merge+tag
This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.html.
<!-- towncrier -->
## 2.0.0-alpha.2 (2025-06-10)
Upgrade instructions are available at https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Make playlist detail page reactive to plugin upload updates (#2464)
- Only refresh_nodeinfo_known_nodes for Funkwhale instances (#2442)
Bugfixes:
- Fixed database migrations for trackfavorite, playlist and playlisttrack
## 2.0.0-alpha.1 (2025-05-23)
Carefully read [this blog post](https://blog.funkwhale.audio/2025-funkwhale-2-news.html) before upgrading. This alpha release might break your db.
Upgrade instructions are available at https://docs.funkwhale.audio/administrator/upgrade/index.html
Features:
- Add a command to create playlists from folder structure (#2223)
- Add Musicbrainz genres to funkwhale tag table and allow Musicbrainz tag sync (#2143)
- Add support for deprecated COVERART fields in ogg files.
- Add support for Python 3.12
- Allow specifying more parameters on fs-import API endpoint
- Build desktop app with Tauri
- Drop libraries in favor of playlist (#2366)
- Entering an input in the global search in the sidebar opens up a modal that show all possible results at once with collapseable sections for each category, including federated searches for other users, channels and rss feeds. (#2910)
- Extend Subsonic API with OpenSubsonic support (#2270)
- Generate mock test server from openapi schema
- Implement Subsonic getArtistInfo2 response
- Improve mobile design (#2090)
- Improve visuals & layout (#2091)
- Playlist federation (#1458)
- Quality filter for content frontend (#1469)
- Quality filters backend (#2275)
- Support multiples artists for tracks and albums (#1568)
- Use playlists to privately share audio files (#2417)
- User follow with listening and track favorite activities (#1810)
Enhancements:
- Add cli command to prune non mbid content from db (#2083)
- Add favorite and listening sync ith Listenbrainz (#2079)
- Add tests for track cache
- Allow special characters in tags (#2009)
- disable some linter rule to avoid noise on the api lint process (#2346)
- Drop python 3.8 and 3.9 (#2282)
- Migrate frontend to api V2 (#2324)
- Optimize radios queryset to support large tables (#2450)
- Publish releases from CI job
- Subsonic getAlbumInfo, getAlbumInfo2 and getTopSongs endpoints (#2392)
- Support setting CELERY_TASK_TIME_LIMIT from environment
- Update dj-rest-auth to 5.0.2 and django-allauth to 0.55.2
- Update django to version 4.2
Refactoring:
- Add compatibility for lru-cache v10
Bugfixes:
- ActivityStreams compliance: duration (#1566)
- Docker mac compatibility, dynamic DNS + Debian image (#2337)
- Federation API returns a 404 response when an actor is not found
- fix fakedata generation regression from multiartist (#2343)
- Fix schema generation to allow propre types in front (#2404)
- Fix third party upload triggers and plugin example (#2405)
- Fixed the exceptions caught in two places in the getCoverArt subsonic API (#2122)
- regression:multiple albums with same name and artsit creating during import (#2365)
- Resolve forbidden tags due to filter database error (#2325)
- Resolve Radio playing fails when unauthenticated (#2319)
Documentation:
- Add API v2 overview.
- Add genre tags spec.
- Add import group details to content upload spec (#2268)
- add listenings-favorites-sync-with-lb spec
- Added explanation of AWS_CUSTOM_DOMAIN and AWS_S3_URL_PROTOCOL.
- Added new upload process spec
- Added user deletion spec
- Fixed the sample Apache configuration
- Playlist federation spec
- update federation doc with the new artist credit object (#2335)
Other:
- Use Alpine 3.19 as base for docker images
Deprecation:
- The "funkwhaleVersion" field in Subsonic responses is deprecated. Clients
should use the OpenSubsonic field "serverVersion" instead.
## 1.4.0 (2023-12-12)
Upgrade instructions are available at https://docs.funkwhale.audio/administrator/upgrade/index.html
Features:
- Add a management command to generate dummy notifications for testing
- Add atom1.0 to node info services (#2085)
- Add basic cypress testing
- Add NodeInfo 2.1 (#2085)
- Add support for Funkwhale UI library.
- Add support for Python 3.12
- Allow moderators to set moderation languages (#2085)
- Allow to set the instances server location (#2085)
- Cache radio queryset into redis. New radio track endpoint for api v2 is /api/v2/radios/sessions/{radiosessionid}/tracks (#2135)
- Create a testing environment in production for ListenBrainz recommendation engine (troi-recommendation-playground) (#1861)
- Generate all nginx configurations from one template
- New management command to update Uploads which have been imported using --in-place and are now
stored in s3 (#2156)
- Only allow MusicBrainz tagged file on a pod (#2083)
- Prohibit the creation of new users using django's `createsuperuser` command in favor of our own CLI
entry point. Run `funkwhale-manage fw users create --superuser` instead. (#1288)
Enhancements:
- Add custom logging functionality (#2155)
- Adding typesense container and api client (2104)
- Cache pip package in api docker builds (#2193)
- Connect loglevel and debug mode (#1538)
- Get api version from python package
- Log service worker registration error and add a warning about Firefox SW incompatibility in development mode
- Maintain api version using poetry
- Maloja: Submit album artists and duration and allow to disable server side metadata fixing
- Replace pytz with zoneinfo in the API
- Speed up linting and type-checking by using cache
- Split front large bundles into smaller chunks
- Support boolean config fields in plugins
Bugfixes:
- `postgres > db_dump.sql` cannot be used if the postgres container is stopped. Update command.
- Avoid troi radio to give duplicates (#2231)
- Do not cache all requests to avoid missing updates #2258
- Fix broken nginx templates for docker setup (#2252)
- Fix help messages for running scripts using funkwhale-manage
- Fix missing og meta tags (#2208)
- Fix multiarch docker builds #2211
- Fix regression that prevent static files from being served in non-docker-deployments (#2256)
- Fixed an issue where the copy button didn't copy the Embed code in the embed modal.
- Fixed an issue with the nginx templates that caused issues when connecting to websockets.
- Fixed development docker setup (2102)
- Fixed development docker setup (2196)
- Fixed embedded player crash when API returns relative listen URL. (#2163)
- Fixed issue with regular expression in embed.
- Make Artist ordering by name case insensitive
- Make sure build requirements for ujson are met
- Make sure embed codes generated before 1.3.0 are still working
- Make sure funkwhale_api package and metadata are available for docs
- Make sure meta tags link to embedded player correctly
- Merge nginx configs for docker production and development setups (#1939)
- Updated links to the Funkwhale website in the UI. (#2235)
- Use correct data field for rate limiting identity field (#2248)
Documentation:
- Add missing `has_mbid` requirement to quality filter spec.
- Add spec for user following.
- Added CoC link to nodeinfo endpoint spec.
- Added multi-artist support spec.
- Added new collections spec.
- Added NodeInfo 2.1 specification
- Archived the pre-1.0 changelog
- Updated nodeinfo spec to include usage statistics.
- Updated the Nodeinfo 2 spec to address feedback from implementation.
Other:
- Add build metadata script
- Don't run CI on branch containing stable or develop
- Fix CI deploy docs job after stable branch merge
- Format api container file
- Lint api code using pylint
- Make renovate not pinning the python version to the latest one
- Rename CHANGELOG to CHANGELOG.md
- Replace docs scripts with make
- Rework the CI pipeline
- Use buildx bake in docker job
Removal:
- Drop support for python3.7
- This release doesn't support Debian 10 anymore. If you are still on Debian 10, we recommend
updating to a later version. Alternatively, install a supported Python version (>= Python 3.8). Python 3.11 is recommended.
Contributors to our Issues:
- AMoonRabbit
- Alexandra Parker
- ChengChung
- Ciarán Ainsworth
- Georg Krause
- Ghost User
- Johann Queuniet
- JuniorJPDJ
- Kasper Seweryn
- Kay Borowski
- Marcos Peña
- Mathieu Jourdan
- Nicolas Derive
- Virgile Robles
- jooola
- petitminion
- theit8514
Contributors to our Merge Requests:
- AMoonRabbit
- Alexander Dunkel
- Alexander Torre
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Kay Borowski
- Marcos Peña
- Mathieu Jourdan
- Philipp Wolfer
- Virgile Robles
- interfect
- jooola
- petitminion
Committers:
- Aitor
- Alexander Dunkel
- alextprog
- Aznörth Niryn
- Ciarán Ainsworth
- dignny
- drakonicguy
- Fun.k.whale Trad
- Georg krause
- Georg Krause
- Jérémie Lorente
- jo
- jooola
- josé m
- Julian-Samuel Gebühr
- JuniorJPDJ
- Kasper Seweryn
- Marcos Peña
- Mathieu Jourdan
- Matteo Piovanelli
- Matyáš Caras
- MhP
- omarmaciasmolina
- petitminion
- Philipp Wolfer
- ppom
- Quentin PAGÈS
- rinenweb
- Thomas
- Transcriber allium
## 1.3.4 (2023-11-16)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Remove dangling dependency howler
Documentation:
- Fix a redirect loop on documentation for moderators
Contributors to our Merge Requests:
- Georg Krause
- Thomas
Committers:
- Georg Krause
## 1.3.3 (2023-09-07)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Revert changed logging to fix crashes
Contributors to our Issues:
- Alexandra Parker
- Aurelien Vaillant
- ChengChung
- Ciarán Ainsworth
- Georg Krause
- Johann Queuniet
- Kasper Seweryn
- Mathieu Jourdan
- Nicolas Derive
- Puniko Nyan
- Thomas
- petitminion
- philip ballinger
Contributors to our Merge Requests:
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Marcos Peña
- jooola
- petitminion
## 1.3.2 (2023-09-01)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Enable sourcemaps for production builds
- Use logger composable instead of window.console
Bugfixes:
- Clear shuffled id list on queue clear (#2192)
- Fetch the nodeinfo endpoint from .well-known/nodeinfo when checking instance availability
- Fix instance checking its own availability (#2199)
- Fix multiarch docker builds #2211
- Fix ordering when querystring contains `+` prefix
Resolve multiple updates to ordering fields
- Fix password reset via email
- Make podcast episode pagination reactive (#2205)
- Render HTML in podcast short description (#2206)
- Resolve race condition regarding axios when initializing the frontend
Prevent sending same language setting to backend multiple times
Documentation:
- Fixed incorrect upgrade instructions link in docs.
Contributors to our Issues:
- Ciarán Ainsworth
- Georg Krause
- Kasper Seweryn
- Kay Borowski
- Marcos Peña
- Mathieu Jourdan
- Virgile Robles
- codl
- jooola
- petitminion
- tinglycraniumplacidly
- unkn0wwn52
Contributors to our Merge Requests:
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Marcos Peña
- Virgile Robles
- codl
- jooola
- petitminion
Committers:
- Ciarán Ainsworth
- codl
- Georg Krause
- jo
- Kasper Seweryn
- petitminion
## 1.3.1 (2023-06-27)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Dynamically add report targets to the map to avoid missing keys (#2121)
- Fix location of the nginx config template for docker deployments (#2146)
- Fix pagination on search page (#2134)
- Fix Prune skipped uploads is OOM killed (#2136)
- Fixed Fomantic UI dropdown messing with Vue internals in radio builder (#2142)
- Fixed premature login redirect on podcast detail page (#2155)
- Fixed stale data in indexedDB after logout (#2133)
- Make sure dependency pins are working with pip install (Restores python3.7 support)
- Make sure embed codes generated before 1.3.0 are still working
- Make sure the SPA Manifest is fetched using the right protocol (#2151)
- Moved modals above all content (#2154)
- Raise SystemExit exception in API manage.py script
- Remove track from cache when it gets disposed outside of the cache handler (#2157)
- Standardize instanceUrl value in instance store (#2113)
- Fix for banner images not being served on pods.
- Fixed PWA Window theme color.
Documentation:
- Fix instructions for using custom nginx configurations in our documentation
Other:
- Don't run CI on branch containing stable or develop
Contributors to our Issues:
- AMoonRabbit
- Asier Iturralde Sarasola
- Bertille D.
- Casuallynoted
- Ciarán Ainsworth
- Daniel Jeller
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Mathieu Jourdan
- NaiveTub
- Ricardo
- Virgile Robles
- nouts
- petitminion
Contributors to our Merge Requests:
- AMoonRabbit
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- jooola
- petitminion
Committers:
- AMoonRabbit
- Georg Krause
- jo
- JuniorJPDJ
- Kasper Seweryn
- Moon Rabbit
- Petitminion
## 1.3.0 (2023-06-01)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Update instructions:
- If you are running the docker deployment, make sure to update our compose file.
In this small example we show you how to save the old config and update it
correctly:
```
export FUNKWHALE_VERSION="1.3.0"
cd /srv/funkwhale
docker-compose down
mv docker-compose.yml docker-compose.bak
curl -L -o /srv/funkwhale/docker-compose.yml "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/${FUNKWHALE_VERSION}/deploy/docker-compose.yml"
```
:::{note}
If you need to customize your nginx template, e.g. to work around [problems with Docker's resolver](https://docs.funkwhale.audio/admin/external-storages.html#no-resolver-found), you can mount your
custom nginx configuration into the container. Uncomment the commented volumes in the `nginx` section of your `docker-compose.yml`.
Additionally you need to update the paths in `nginx/funkwhale.template`.
Replace all occurrences of `/funkwhale` by `/usr/share/nginx/html`.
This loads the templates from your `nginx` folder and overrides the template files in the Docker container.
:::
```
docker-compose up -d
```
- The Docker instructions now use the updated Docker compose plugin. If you previously used the `docker-compose` standalone installation, do the following while upgrading:
1. Download the [Docker compose plugin](https://docs.docker.com/compose/install/linux/#install-using-the-repository)
2. Stop your containers using the **docker-compose** syntax.
```sh
docker compose down
```
3. Bring the containers back up using the **docker compose** syntax.
```sh
docker compose up -d
```
After this you can continue to use the **docker compose** syntax for all Docker management tasks.
- Upgrade Postgres to version 15. [Make sure to migrate!](https://docs.funkwhale.audio/administrator/upgrade/docker.html#upgrade-the-postgres-container)
- With this update Funkwhale starts using poetry to maintain its dependencies. We therefore recommend
removing the old virtualenv by running `rm -rf /srv/funkwhale/virtualenv`.
Features:
- Add a management command to create a new library for a user
- Add Gitpod configuration and guide
- Add Sentry SDK to collect #1479
- Prepare API for the upcoming version 2
- Rewrite player to be based on Web Audio API
Enhancements:
- Add a celery task to scan remote library (#1712)
- Add coverage report for Frontend Tests
- Add hint which serializer is used for OembedView (#1901)
- Add music visualizer (#1135)
- Add playable tracks to gitpod instance
- Add playlists radio to search page (#1968)
- Add proper serialization for TextPreviewView (#1903)
- Add python debug and test support for gitpod
- Add Serializer for SpaManifest endpoint
- Add support for python 3.11
- Added proper serializers for the rate-limit endpoint.
- Added type hints to the API.
- Adding support for play all radio in search result page (#1563)
- All administrator documentation has been rewritten to improve clarity and update outdated information.
- Allow arbitrary length names for artists, albums and tracks
- Allow installing the funkwhale_api package
- Allow using default browser dark mode and update UI dynamically on change
- Apply migrations on API container start (!1879)
- Automatically fetch next page of tracks (#1526)
- Build frontend natively for cross-arch docker images
- Change unmaintained PyMemoize library to django-cache-memoize
to enable Python 3.10 support
- Cleaned up frontend docker container
- Cleanup Gitlab CI and Dockerfiles (!1796)
- Create the funkwhale-manage entrypoint in the api package
- Created migration guide for the deprecated all-in-one docker container.
- Don't buffer python stdout/err in docker
- Don't compile python byte code in docker
- Don't use poetry in production deployments
- Drop direct dependency on pyopenssl (#1975)
- Exclude /api/v1/oauth/authorize from the specs since its not supported yet (#1899)
- Fix openapi specs for user endpoints (#1892, #1894)
- Fix Serializer for inline channel artists (#1833)
- Fix specs for ListenViewSet (#1898)
- Handle PWA correctly and provide better cache strategy for album covers (#1721)
- Improve docker caching
- Improve specification of LibraryFollowViewSet (#1896)
- Install API python package in docker image
- Make CI always run all tests on protected branches.
- Make mutations endpoint appear in openapi specs
- Make Python 3.10 tests in CI mandatory
- Make sure ChannelViewSet always has a serializer (#1895)
- Migrate to new queue system from old localStorage keys
- Migrate to Vue 3
- Migrate to vue-i18n (#1831)
Fix locale changing (#1862)
- Migrated to sphinx-design.
- New task checking if remote instance is reachable to avoid playback latence (#1711)
- OAuth Application client secrets are now hashed before storing them to the DB. Those are only displayed once from now on!
- Parameterize the default S3 ACL when uploading objects. (#1319)
- Pin Alpine package versions in API Dockerfile (fixes part of CI build issues).
- Prefer using the funkwhale-manage entrypoint
- Prevent running two pipelines for MRs
- Random and less listened radio filter out un-owned content on library section (#2007)
- Refactor node info endpoint to use proper serializers
- Refactor SettingsView to use a proper serializer
- Remove unnecessary or wrong `is` keyword usage from backend
- Rename OpenAPI schema's operation ids for nicer API client method names.
- Replace django-channels package with web socket implementation from @vueuse/core (#1715)
- Retry fetching new radio track 5 times if error occurred before resetting radio session (#2022)
- Rewrite embedded player to petite-vue
- Split DATABASE_URL into multiple configuration variables
- The ListenBrainz plugin submits the track duration
- Update Django OAuth Toolkit to version 2, ref #1944
- Update migration after django update (#1815)
- Update upload status when import fails (#1999)
- Updated the installation guides to make installation steps clearer.
- Upgrade docker base image to alpine 3.17
- Use proper serializer for Search endpoint (#1902)
Refactoring:
- Instead of requesting the right spa content from the API using a middleware we now serve the
Frontend directly with nginx and only proxy-forward for API endpoints
- Replace django-rest-auth with dj-rest-auth (#1877)
Bugfixes:
- Allow enabling systemd funkwhale.target
- Allow playback of media from external frontend (#1937).
- Allow summary field of actors to be blank. This leaves actors valid that have a blank (`""`) summary field and allows follows from those.
- Catch ValueError on radio end (#1596)
- Channel overview was displaying foreign tracks (#1773) (1773)
- Docker setup: do not export the API port 5000 publicly
- Fix adding same track multiple times (#1933)
- Fix artist name submission in Maloja plugin
- Fix changing visualizer CORS error (#1934).
- Fix content form autofocus despite `autofocus` prop being set to `false` (#1924)
- Fix CSP header issues
- Fix CSP issue caused by django-channels package (#1752)
- Fix docker API image building with removing autobahn workaround version pin
- Fix docker builds on armv7
- Fix docker nginx entrypoint
- Fix editing playlist tracks (#1362)
- Fix embedded player not working on social posts (1946)
- Fix favorite button in queue
- Fix fetching pages of albums in album detail view (#1927)
- Fix front album tracks count translation
- Fix global keyboard shortcuts firing when input is focused (#1876)
- Fix lots of problems in debian installation guide
- Fix media directory nginx routing error in front docker container introduced in !1897
- Fix OAuth login (#1890)
- Fix play button in albums with multi-page volumes (#1928)
- Fix player closing when queue ends (#1931)
- Fix postgres connection details in docker setup
- Fix purging of dangling files #1929
- Fix remote search (#1857)
- Fix search by text in affected views (#1858)
- Fix timeout on spa manifest requests
- Fix track table showing all tracks and double pagination in some cases (#1923)
- Fix user requests and reports filtering (#1924)
- Fix validity issues in openapi/swagger spec files (#1171)
- Fixed an issue which caused links in Markdown forms to not render correctly. (#2023)
- Fixed login redirect (1736)
- Fixed mobile player element widths (#2054)
- Fixed remote subscription form in Podcast and search views (#1708)
- Fixed upload form VUE errors (#1738) (1738)
- Fixes an issue which made it possible to download all media files without access control (#2101)
- Fixes channel page (#1729) (1729)
- Fixes development environment set-up with docker (1726)
- Fixes embed player (#1783) (1783)
- Fixes service worker (#1634)
- Fixes track listenings not being sent when tab is not focused
- Hide create custom radio to un-authenticated users (#1720)
- Improve signal handling for service and containers
- Move api docker hardcoded env vars in the settings module
- Prefer str over dict for the CACHE_URL api setting
This fix the ability to reuse the CACHE_URL with other settings such as
CELERY_BROKER_URL.
- Remove trailing slash from reverse proxy configuration
- Remove unused Footer component (#1660)
- Remove usage of deprecated Model and Serializer fields (#1663)
- Resolved an issue where queue text with mouse over has dark text on dark background (#2058) (2058)
- Skip refreshing local actors in celery federation.refresh_actor_data task - fixes disappearing avatars (!1873)
Documentation:
- Add ability to translate documentation into multiple languages
- Add generic upgrade instructions to Docker postgres documentation (#2049)
- Add restore instructions to backup docs (#1627).
- Add systemd update instructions to Debian upgrade instructions (#1966)
- Added Nginx regeneration instructions to Debian update guide (#2050)
- Added virtualenv upgrade instructions for Debian (#1562).
- Cleaned up documentation
- Document the new login flow of the CLI-tool (#1800)
- Documented LOGLEVEL command (#1541).
- Documented the `NGINX_MAX_BODY_SIZE` .env variable (#1624).
- Fix broken links in CHANGELOG (#1976)
- Harden security for debian install docs
- Remove unnecessary postgres variable in Docker migration guide (#2124).
- Rewrote documentation contributor guide.
- Rewrote the architecture file (#1908)
- Rewrote the federation developer documentation (#1911)
- Rewrote the plugins documentation (#1910)
- Rewrote translators file
- Updated API developer documentation (#1912, #1909)
- Updated CONTRIBUTING guide with up-to-date documentation. Created layout in documentation hub.
Other:
- Add a CI job to check if changelog snippet is available
- Add CI broken links checker
- Add pre-commit hooks
- flake8
- black
- isort
- pyupgrade
- prettier
- codespell
- Add pre-commit to development tools
- Align the openapi spec to the actual API wherever possible
- Cache lychee checked urls for 1 day in CI
- Fix api tests warnings by renaming fixtures
- Fix permissions for build artifacts
- Fix shell scripts lint errors
- Format api pyproject.toml
- Format or fix files using pre-commit
- Upgrade code to >=python3.7
- Fix flake8 warnings
- Fix spelling errors
- Format files using black
- Format files using isort
- Format files using prettier
- Move api tools config to pyproject.toml
- Move database url composition from custom script to django settings
- Remove docker_all_in_one_release ci job
- Rename api composer/django/ dir to docker/
- Unpin asgiref in API dependencies
- Use vite for building the frontend, #1644
Deprecation:
- Deprecate the api manage.py script in favor of the funkwhale-manage entrypoint
- That's the last minor version series that supports python3.7. Funkwhale 1.4 will remove support for
it. #1693
- The automatically generated `DATABASE_URL` configuration in the docker setup is deprecated, please
configure either the `DATABASE_URL` environment variable or the `DATABASE_HOST`, `DATABASE_USER` and
`DATABASE_PASSWORD` environment variables instead.
Removal:
- This release removes support for Python 3.6. Please make sure you update your python version before
Updating Funkwhale!
Committers:
- Agate
- Aina Hernàndez Campaña
- AMoonRabbit
- Anton
- bruce diao
- Bruno Talanski
- ButterflyOfFire
- Çağla Pickaxe
- Ciarán Ainsworth
- Dignified Silence
- dignny
- Éilias McTalún
- EorlBruder
- Fedi Funkers
- Georg Krause
- ghose
- Henri Dickson
- Jacek Pruciak
- Jasper Bogers
- Jhoan Sebastian Espinosa Borrero
- jo
- jooola
- Julian Rademacher
- JuniorJPDJ
- Kasper Seweryn
- Keunes
- Kisel1337
- Laurin W
- Marcos Peña
- Matyáš Caras
- Michael Long
- nztvar
- oki
- Petitminion
- Philipp Wolfer
- poeppe
- Porrumentzio
- ppom
- Reinhard Prechtl
- Sky
- Sporiff
- Stuart Begley-Miller
- @ta
- Thomas
- Till Robin Zickel
- tobifroe
- wvffle
Contributors to our Issues:
- AMoonRabbit
- Agate
- Artem Anufrij
- ChengChung
- Ciarán Ainsworth
- Creak
- Eric Mesa
- Georg Krause
- Hans Bauer
- HurricaneDancer
- Jakob Schürz
- Jucgshu
- Julian-Samuel Gebühr
- JuniorJPDJ
- Kasper Seweryn
- Keunes
- Laser Lesbian
- Laurin W
- Marco
- Marcos Peña
- Martin Giger
- Mathieu Jourdan
- MattDHarding
- Meliurwen
- Micha Gläß-Stöcker
- MichaelBechHansen
- Nathan Mih
- Nicolas Derive
- Nolan Darilek
- Philipp Wolfer
- Porrumentzio
- Rodion Borisov
- Sam Birch
- Sky Leite
- TheSunCat
- Thomas
- Tobias Frölich
- Tony Wasserka
- Vincent Riquer
- Virgile Robles
- dddddd-mmmmmm
- gerry_the_hat
- getzze
- heyarne
- jake
- jooola
- jovuit
- nouts
- petitminion
- ppom
- pullopen
- resister
- silksow
- troll
Contributors to our Merge Requests:
- AMoonRabbit
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Laurin W
- Marcos Peña
- Mathieu Jourdan
- Nicolas Derive
- Philipp Wolfer
- Rodion Borisov
- Thomas
- Tobias Frölich
- getzze
- jooola
- mqus
- petitminion
- poeppe
## 1.2.10 (2023-03-17)
Bugfixes:
- Fixes a security vulnerability that allows to download all media files without access control #2101
Contributors to our Issues:
- Georg Krause
- JuniorJPDJ
Special thanks to Conradowatz for reporting the vulnerability
Committers:
- JuniorJPDJ
## 1.2.9 (2022-11-25)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Ensure index.html files get loaded with UTF-8 encoding
- Fixed invitation reuse after the invited user has been deleted (#1952)
- Fixed unplayable skipped upload (#1349)
Committers:
- Georg Krause
- Marcos Peña
- Philipp Wolfer
- Travis Briggs
Contributors to our Issues:
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Marcos Peña
- Mathieu Jourdan
- Micha Gläß-Stöcker
- fuomag9
- gammelalf
- myOmikron
- petitminion
Contributors to our Merge Requests:
- Georg Krause
- JuniorJPDJ
- Marcos Peña
- Philipp Wolfer
- fuomag9
## 1.2.8 (2022-09-12)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Features:
- Add Sentry SDK to collect errors at the backend
Bugfixes:
- Fix exponentially growing database when using in-place-imports on a regular base #1676
- Fix navigating to registration request not showing anything (#1836)
- Fix player cover image overlapping queue list
- Fixed metadata handling for Various Artists albums (#1201)
- Fixed search behaviour in radio builder's filters (#733)
- Fixed unpredictable subsonic search3 results (#1782)
Committers:
- Ciarán Ainsworth
- Georg Krause
- Marcos Peña
- Mathias Koehler
- wvffle
Contributors to our Issues:
- AMoonRabbit
- Agate
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Kelvin Hammond
- Marcos Peña
- Meliurwen
- Micha Gläß-Stöcker
- Miv2nir
- Sam Birch
- Tolriq
- Tony Wasserka
- f1reflyyyylmao
- heyarne
- petitminion
- troll
Contributors to our Merge Requests:
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Marcos Peña
- interru
## 1.2.7 (2022-07-14)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Fixed libre.fm plugin not submitting scrobbles (#1817)
Committers:
- Georg Krause
- Marcos Peña
Contributors to our Issues:
- Ciarán Ainsworth
- Marcos Peña
Contributors to our Merge Requests:
- Georg Krause
- Marcos Peña
## 1.2.6 (2022-07-04)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Channel overview was displaying foreign tracks (#1773)
- Fixed login form focusing reset password link instead of next input (#1373)
- Fixed missing album contextual menu (#1791)
- Fixed single listening submission when repeating a song (#1312)
- Fixed subsonic createPlaylist's endpoint doesn't update playlist (#1263)
- Resolve timeouts if nodeinfo and service actor is not known (#1714)
Other:
- Replaced references to #funkwhale-troubleshooting with #funkwhale-support
Committers:
- Georg Krause
- Marcos Peña
- Petitminion
- wvffle
Contributors to our Issues:
- jeweet
- wvffle
- Georg Krause
- Marcos Peña
- AMoonRabbit
- Micha Gläß-Stöcker
- Ciarán Ainsworth
- heyarne
- Agate
- JuniorJPDJ
- MichaelBechHansen
- ooZberg
- Esras .
- PhieF
- Petitminion
Contributors to our Merge Requests:
- wvffle
- Georg Krause
- Marcos Peña
- Petitminion
## 1.2.5 (2022-05-07)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Parameterize the default S3 ACL when uploading objects. (#1319)
Bugfixes:
- Fix stopped player to not show 00:00 when loading a track (#1432)
- Fixes channel page (#1729) (1729)
Committers:
- Georg Krause
- Marcos
- MattDHarding
- Stuart Begley-Miller
Contributors to our Issues:
- Agate
- Beto Dealmeida
- Cam Sweeney
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Marcos Peña
- Mathieu Jourdan
- MattDHarding
- Micha Gläß-Stöcker
- Stuart Begley-Miller
- Tony Wasserka
- jovuit
- petitminion
- pullopen
Contributors to our Merge Requests:
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Marcos Peña
- MattDHarding
- PhieF
- Stuart Begley-Miller
- petitminion
## 1.2.4 (2022-04-23)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Hand cursor now displayed over artist and album cards
Bugfixes:
- Fixes docs' SMTP URI configuration (#1749) (1749)
Documentation:
- The documentation is now available in two versions: Develop and Stable
Contributors to our Issues:
- Beto Dealmeida
- Cam Sweeney
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Marcos Peña
- Mathieu Jourdan
- Micha Gläß-Stöcker
- petitminion
Contributors to our Merge Requests:
- Georg Krause
- JuniorJPDJ
- Marcos Peña
- petitminion
Committers:
- Georg Krause
- Marcos Peña
- MattDHarding
## 1.2.3 (2022-03-18)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Added support for all cover sources in the embedded player (#1697).
- Change unmaintained PyMemoize library to django-cache-memoize
to enable Python 3.10 support
Bugfixes:
- Catch ValueError on radio end (#1596)
- Fix bug that prevents users from creating a new oauth application (#1706)
- Fix failed track adding to playlist being silent (#1020)
- Fix recently added radio not working has expected (#1674)
- Fixed an issue where you couldn't load the details page for tracks with no associated album (#1703)
- Fixed library visibility dropdown (#1384)
- In playlist editor can now click outside the trashcan but inside the button to delete entry (#1348)
Contributors to our Issues:
- Agate
- Baudouin Feildel
- Christoph Pomaska
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Marcos Peña
- Mathieu Jourdan
- MattDHarding
- Micha Gläß-Stöcker
- dnikolov
- jovuit
- petitminion
Contributors to our Merge Requests:
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Kasper Seweryn
- Marcos Peña
- MattDHarding
- petitminion
Committers
- Ciaran Ainsworth
- Georg Krause
- JuniorJPDJ
- MattDHarding
- Petitminion
- Reinhard Prechtl
## 1.2.2 (2022-02-04)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Fix an issue where the tracks tab in a library doesn't show any tracks (#1683)
- Fix an issue with the embedded player not showing any content (#1675)
- Fix broken instance description if it contains a line break #1673
Dependency Updates:
- Update dependency vue-template-compiler to 2.6.14
- Update dependency vue to ^2.6.14
- Update dependency vuex-persistedstate to ^2.7.1
- Update dependency vuedraggable to ^2.24.3
- Update dependency vue-lazyload to ^1.3.3
- Update dependency vue-plyr to ^5.1.3
- Update dependency vue-upload-component to ^2.8.22
- Update dependency vue-gettext to ^2.1.12
- Update dependency showdown to ^1.9.1
- Update dependency js-logger to ^1.6.1
- Update dependency register-service-worker to ^1.7.2
- Update dependency howler to ^2.2.3
- Update dependency fomantic-ui-css to ^2.8.8
- Update dependency diff to ^4.0.2
- Update dependency axios-auth-refresh to ^2.2.8
Contributors to our Issues:
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Marcos Peña
- Mathieu Jourdan
- Micha Gläß-Stöcker
- Ricardo
- petitminion
Contributors to our Merge Requests:
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Marcos Peña
Committers
- Ciarán Ainsworth
- Georg Krause
- JuniorJPDJ
- Keunes
- Marcos Peña
## 1.2.1 (2022-01-06)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Fix Pipeline for stable release builds (#1652)
- Fix remote content page (#1655)
Contributors to our Issues:
- Ciarán Ainsworth
- Georg Krause
- Jakob Schürz
- Mathieu Jourdan
- Micha Gläß-Stöcker
- petitminion
Contributors to our Merge Requests:
- Georg Krause
Committers:
- Dignified Silence
- Georg Krause
- JuniorJPDJ
- nztvar
## 1.2.0 (2021-12-27)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Due to a bug in our CI Pipeline, you need to download the frontend artifact here: https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/81069/artifacts/download
If you are running the All-in-One-Container since a longer time, you probably need to manually migrate your database information. If that's the case, you will get a message like this:
`DETAIL: The data directory was initialized by PostgreSQL version 11, which is not compatible with this version 13.5.`
Make sure the Funkwhale version is set to `1.1.4` in `docker-compose.yml`. Now you can run this command to dump the database into a file:
`docker-compose exec -T funkwhale pg_dump -c -U funkwhale > "db.dump"`
Now you can update the Funkwhale version in `docker-compose.yml` to `1.2.0`. Additionally you should save your `data` directory, eg by running `mv data data.bak && mkdir data`. Stop Funkwhale and start it again with the new version, by using `docker-compose down && docker-compose up -d`. This will initialize a fresh DB and applies all migrations. Now you can restore your database with the following command: `cat db.dump | docker-compose exec -T funkwhale psql -U funkwhale`. That's it, enjoy!
Features:
- Implemented awesome recently added radio (part of #1390)
- Rework the instance about page (#1376)
- Made changes to the track table to make it more visibly pleasing
Enhancements:
- Add linting for Frontend code (#1602)
- Add xmlns:content to feed schemas fixes #1535
- Add a Maloja plugin to submit listenings
- Add artist cover art in subsonic API response (#1528)
- Allow listen activities privacy level to be set public
- Allow running multi-container setup on non-root user inside docker (!1375) (fixes #1334)
- Change volume dynamic range from 60dB to 40dB (fixes #1544)
- Change Start Radio to Play Radio (#1400)
- Display toast when subsonic password is copied (#1496)
- Expose more metadata in Subsonic's getAlbumList endpoint (#623)
- ListenBrainz: Submit media player and submission client information
- Make "play in list" the default when interacting with individual tracks (#1274)
- Prevent an uncontrolled exception when uploading a file without tags, and prints user friendly message (1275)
- Remove deprecated JWT Authentication (#1108) (1108)
- Remove Raven SDK to report errors to Sentry (#1425) (1425)
- Replace psycopg2-binary with psycopg2 (#1513)
Bugfixes:
- Add worker-src to nginx header to prevent issues (#1489)
- Enable stepless adjustment of the volume slider (!1294)
- Fix an error in a Subsonic methods that return lists of numbers/strings like getUser
- Fix showing too long radio descriptions (#1556)
- Fix X-Frame-Options HTTP header for embed and force it to SAMEORIGIN value for other pages (fix #1022)
- Fix before last track starts playing when last track removed (#1485)
- Fix delete account button is not disabled when missing password (#1591)
- Fix omputed properties already defined in components data (#1649)
- Fix the all in one docker image building process, related to #1503
- Fix crash in album moderation interface when missing cover (#1474)
- Fix subsonic scrobble not triggering plugin hook (#1416)
- Improve formatting of RSS episode descriptions (#1405)
- Only suggest typed tag once if it already exists
- Partially fixed playing two tracks at same time (#1213)
- Revert changes that break mobile browser playback (#1509)
- Sanitize remote tracks' saving locations with slashes on their names (#1435)
- Show embed option for channel tracks (#1278)
- Store volume in logarithmic scale and convert when setting it to audio (fixes #1543)
- Use global Howler volume instead of setting it separately for each track (fixes #1542)
Documentation:
- Add email configuration to the documentation (#1481)
- Add server uninstallation documentation (\!1314)
- Document location of cli env file on macOS (\!1354)
- Fix broken backup documentation (#1345)
- Refactore installation documentation and other small documentation adjustments (\!1314)
- Add User documentation for built-in plugins
Other:
- Create stable branch, master is now deprecated and will be removed in 1.3 (#1476)
Committers:
- Alexandra Parker
- Alyssa Ross
- appzer0
- Arthur Brugière
- Asier Iturralde Sarasola
- bittin
- Blopware
- Brian McMillen
- Christoph Pomaska
- Ciaran Ainsworth
- Ciarán Ainsworth
- Classified
- Connor Hay
- Damian Szetela
- David Marzal
- Deleted User
- Dignified Silence
- Dominik Danelski
- egon0
- Erik Präntare
- Georg Abenthung
- Georgios B
- Georgios Brellas
- Georg Krause
- ghose
- greengekota
- heyarne
- ian Vatega
- Janek
- jovuit
- JuniorJPDJ
- Konstantinos G
- manuelviens
- Manuel Viens
- Marcos
- Marcos Peña
- Martin Giger
- Matthew J
- Micha Gläß-Stöcker
- petitminion
- Petitminion
- Philipp Wolfer
- Porrumentzio
- Quentin PAGÈS
- Raphael Lullis
- Riccardo Sacchetto
- Romain Failliot
- Rubén Cabrera
- Ryan Harg
- Sergio Varela
- SpcCw
- Stefano Pigozzi
- Thomas
- Tony Simoes
- Tony Wasserka
- vachan-maker
- Virgile Robles
Contributors to our Issues:
- AMoonRabbit
- Agate
- Antoine POPINEAU
- Arthur Brugière
- Ciarán Ainsworth
- Connor Hay
- Creak
- David Marzal
- Georg Krause
- Gerhard Beck
- Greg Poole
- JuniorJPDJ
- Kuba Orlik
- Lunar Control
- Marcos Peña
- Mateusz Korzeniewski
- Mathieu Jourdan
- Micha Gläß-Stöcker
- Philipp Wolfer
- Porrumentzio
- Thomas
- Tony Wasserka
- Ville Ranki
- arkhi
- heyarne
- interfect
- jovuit
- mal
- petitminion
- vachan-maker
Contributors to our Merge Requests:
- Agate
- Arthur Brugière
- Ciarán Ainsworth
- Connor Hay
- David Marzal
- Distopico
- Fanyx
- Georg Abenthung
- Georg Krause
- Janek
- JuniorJPDJ
- Kasper Seweryn
- Marcos Peña
- Mathieu Jourdan
- Matthew J.
- Micha Gläß-Stöcker
- Philipp Wolfer
- Thomas
- Tony Wasserka
- heyarne
- jovuit
- petitminion
- thanksd
## 1.1.4 (2021-08-02)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
- Pinned version of asgiref to avoid trouble with latest release. For further information, see #1516
## 1.1.3 (2021-08-02)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Test better tagging of Docker Images (#1505)
Bugfixes:
- Fix the scrobbler plugin submitting literal "None" as MusicBrainz ID (#1498)
- Add worker-src to nginx header to prevent issues (#1489)
- Only suggest typed tag once if it already exists
- Implement access control on the moderation views (#1494)
- Prevent open redirect on login (#1492)
## 1.1.2 (2021-05-19)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Added modal to prompt users to log in when subscribing to channels (#1296)
Bugfixes:
- Added missing is_playable serializer for the tracks endpoint.
- Fixed minor graphical bug where loaders would appear white in dark theme (#1442)
- Fixed systemd unit for funkwhale-worker (#1160)
- Several minor fixes for the Frontend
## 1.1.1 (2021-04-13)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Improve UI consistency in artist tracks (#1286)
- Adds year to album's card and album's base UI
Bugfixes:
- Fix playback issues when pausing close the the end of a track (#1324)
- Fix tracks playing in the background without the ability to control them (#1213) (#1387)
- Fixed track playback indicator to reset on queue end (#1380)
- Frontend build tooling is less dependent on `npm` or `yarn` being used (!1285)
- Fixed a small discrepancy to the subsonic api 1374
## 1.1 (2021-03-10)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Add number of tracks and discs of an album to API (#1238)
- Add spacing after "Play all" button in playlist view (!1271)
- Added a ListenBrainz plugin to submit listenings
- Added ability to choose fediverse addresses from channel subscription page/podcast screen (#1294)
- Added new search functions to allow users to more easily search for podcasts in the UI.
- Added padding to volume slider to ease mouse control (#1241)
- Logarithmic scale for volume slider (#1222)
- More user-friendly subsonic tokens (#1269)
- Remove manual entry of Import Reference on front-end import (#1284)
- Support AIFF file format (#1243)
Bugfixes:
- "Add check for empty/null covers (#1281)"
- Added an album filter to fix problem where channel entries would show up in the wrong series (#1282)
- Avoid broken Faker version (#1323)
- Changed audio format detection to happen via sniffing and not file extensions (#1274)
- Changed default behaviour of channel entries to use channel artwork if no entry artwork available (#1289)
- Fix delete library modal closing immediately (#1272)
- Fix public shared remote library radio button being disabled (#1292)
- Fixed an issue that prevented disabling plugins
- Fixed an issue where channel albums don't show up in the album search (#1300)
- Fixed an issue where modals would prevent users being able to interact with channels (#1295)
- Update MediaSession metadata for initially loaded track (#1252)
- Update playback position slider also when track is paused (#1266)
- Fixed follows from Pleroma with custom Emoji as Tag by ignoring not supported tag types #1342
- Update pleroma JSON-LD Schema (#1341)
- Pin twisted version to 20.3.0
Contributors to this release (development, documentation, reviews):
- Adam Novak
- Agate
- alemairebe
- Alicia Blasco Leon
- anonymous
- Amaranthe
- appzer0
- Arne
- Asier Iturralde Sarasola
- Christian Paul
- Ciarán Ainsworth
- Daniel
- David
- Dominik Danelski
- Eorn le goéland
- Eleos
- Erik Duxstad
- Esteban
- Fred Uggla
- Freyja Wildes
- Georg Krause
- ghose
- hellekin
- heyarne
- interfect
- Jess Jing
- Johannes H.
- jovuit
- marzzzello
- Meliurwen
- Mehdi
- Nitai Bezerra da Silva
- Philipp Wolfer
- Pierre Couy
- Porrumentzio
- Reg
- Robert Kaye
- Rubén Cabrera
- Silver Fox
- Snack Capt
- SpcCw
- Strom Lin
- vicdorke
- x
## 1.1-rc2 (2021-03-01)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Bugfixes:
- Fixed follows from Pleroma with custom Emoji as Tag by ignoring not supported tag types #1342
- Update pleroma JSON-LD Schema (#1341)
- Revert fork replacement of http-signature since official package breaks federation
- Pin twisted version to 20.3.0
## 1.1-rc1 (2021-02-24)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Add number of tracks and discs of an album to API (#1238)
- Add spacing after "Play all" button in playlist view (!1271)
- Added a ListenBrainz plugin to submit listenings
- Added ability to choose fediverse addresses from channel subscription page/podcast screen (#1294)
- Added new search functions to allow users to more easily search for podcasts in the UI.
- Added padding to volume slider to ease mouse control (#1241)
- Logarithmic scale for volume slider (#1222)
- More user-friendly subsonic tokens (#1269)
- Remove manual entry of Import Reference on front-end import (#1284)
- Replaced forked http-signature dependency with official package (#876)
- Support AIFF file format (#1243)
Bugfixes:
- "Add check for empty/null covers (#1281)"
- Added an album filter to fix problem where channel entries would show up in the wrong series (#1282)
- Avoid broken Faker version (#1323)
- Changed audio format detection to happen via sniffing and not file extensions (#1274)
- Changed default behaviour of channel entries to use channel artwork if no entry artwork available (#1289)
- Fix delete library modal closing immediately (#1272)
- Fix public shared remote library radio button being disabled (#1292)
- Fixed an issue that prevented disabling plugins
- Fixed an issue where channel albums don't show up in the album search (#1300)
- Fixed an issue where modals would prevent users being able to interact with channels (#1295)
- Update MediaSession metadata for initially loaded track (#1252)
- Update playback position slider also when track is paused (#1266)
Contributors to this release (development, documentation, reviews):
- Reg
- hellekin
- Esteban
- Freyja Wildes
- Amaranthe
- Eleos
- Johannes H.
- Mehdi
- Adam Novak
- Agate
- Christian Paul
- Ciarán Ainsworth
- Erik Duxstad
- Fred Uggla
- Georg Krause
- heyarne
- interfect
- jovuit
- Nitai Bezerra da Silva
- Philipp Wolfer
- Pierre Couy
- Robert Kaye
- Strom Lin
## 1.0.1 (2020-10-31)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
Enhancements:
- Added controls to play volume of an album (#1226)
- Allow genre tags to be updated when rescanning files in-place (#1246)
Bugfixes:
- Fixed broken install because of upgraded dependencies
- Fixed duplication of discs for multi-disc albums in album views (#1228)
- Make the generated RSS feed more conformant with w3c specification (#1250)
Contributors to this release (development, documentation, reviews):
- Agate
- Cédric Schieli
- Ciarán Ainsworth
- Kuba Orlik
## 1.0 (2020-09-09)
Upgrade instructions are available at
https://docs.funkwhale.audio/administrator/upgrade/index.html
### Dropped python 3.5 support [manual action required, non-docker only]
With Funkwhale 1.0, we're dropping support for Python 3.5. Before upgrading,
ensure `python3 --version` returns `3.6` or higher.
If it returns `3.6` or higher, you have nothing to do.
If it returns `3.5`, you will need to upgrade your Python version/Host, then recreate your virtual environment:
```sh
rm -rf /srv/funkwhale/virtualenv
python3 -m venv /srv/funkwhale/virtualenv
```
### Increased quality of JPEG thumbnails [manual action required]
Default quality for JPEG thumbnails was increased from 70 to 95, as 70 was producing visible artifacts in resized images.
Because of this change, existing thumbnails will not load, and you will need to:
1. delete the `__sized__` directory in your `MEDIA_ROOT` directory
2. run `python manage.py fw media generate-thumbnails` to regenerate thumbnails with the enhanced quality
If you don't want to regenerate thumbnails, you can keep the old ones by adding `THUMBNAIL_JPEG_RESIZE_QUALITY=70` to your .env file.
### Small API breaking change in `/api/v1/libraries`
To allow easier crawling of public libraries on a pod,we had to make a slight breaking change
to the behaviour of `GET /api/v1/libraries`.
Before, it returned only libraries owned by the current user.
Now, it returns all the accessible libraries (including ones from other users and pods).
If you are consuming the API via a third-party client and need to retrieve your libraries,
use the `scope` parameter, like this: `GET /api/v1/libraries?scope=me`
### API breaking change in `/api/v1/albums`
To increase performance, querying `/api/v1/albums` doesn't return album tracks anymore. This caused
some performance issues, especially as some albums and series have dozens or even hundreds of tracks.
If you want to retrieve tracks for an album, you can query `/api/v1/tracks/?album=<albumid>`.
### JWT deprecation
API Authentication using JWT is deprecated and will be removed in Funkwhale 1.0. Please use OAuth or application tokens
and refer to our API documentation at https://docs.funkwhale.audio/swagger/ for guidance.
### Full list of changes
Features:
- Allow users to hide compilation artists on the artist search page (#1053)
- Can now launch server import from the UI (#1105)
- Dedicated, advanced search page (#370)
- Persist theme and language settings across sessions (#996)
Enhancements:
- Add support for unauthenticated users hitting the logout page
- Added support for Licence Art Libre (#1088)
- Broadcast/handle rejected follows (#858)
- Confirm email without requiring the user to validate the form manually (#407)
- Display channel and track downloads count (#1178)
- Do not include tracks in album API representation (#1102)
- Dropped python 3.5 support. Python 3.6 is the minimum required version (#1099)
- Improved keyboard accessibility (#1125)
- Improved naming of pages for accessibility (#1127)
- Improved shuffle behaviour (#1190)
- Increased quality of JPEG thumbnails
- Lock focus in modals to improve accessibility (#1128)
- More consistent search UX on /albums, /artists, /radios and /playlists (#1131)
- Play button now replace current queue instead of appending to it (#1083)
- Set proper lang attribute on HTML document (#1130)
- Use semantic headers for accessibility (#1121)
- Users can now update their email address (#292)
- [plugin, scrobbler] Use last.fm API v2 for scrobbling if API key and secret are provided
- Added a new, large thumbnail size for cover images (#1205
- Enforce authentication when viewing remote channels, profiles and libraries (#1210)
Bugfixes:
- Fix broken media support detection (#1180)
- Fix layout issue with playbar on landscape tablets (#1144)
- Fix random radio so that podcast content is not picked up (#1140)
- Fixed an issue with search pages where results would not appear after navigating to another page
- Fixed crash with negative track position in file tags (#1193)
- Handle access errors scanning directories when importing files
- Make channel card updated times more humanly readable, add internationalization (#1089)
- Ensure search page reloads if another search is submitted in the sidebar (#1197)
- Fixed "scope=subscribed" on albums, artists, uploads and libraries API (#1217)
- Fixed broken federation with pods using allow-listing (#1999)
- Fixed broken search when using (, " or & chars (#1196)
- Fixed domains table hidden controls when no domains are found (#1198)
Documentation:
- Simplify Docker mono-container installation and upgrade documentation
Contributors to this release (translation, development, documentation, reviews, design, testing, third-party projects):
- Agate
- Andy Craze
- anonymous
- appzer0
- Arne
- Ciarán Ainsworth
- Daniele Lira Mereb
- dulz
- Francesc Galí
- ghose
- Kalle Anka
- mekind
- Meliurwen
- Puri
- Quentin PAGÈS
- Raphaël Ventura
- Slimane Selyan Amiri
- SpcCw
- Stefano Pigozzi
- Sébastien de Melo
- Ventura Pérez García
- vicdorke
- Xosé M
*.md @funkwhale/documentation
Contribute to Funkwhale development
===================================
First of all, thank you for your interest in the project! We really
appreciate the fact that you're about to take some time to read this
and hack on the project.
This document will guide you through common operations such as:
- Setup your development environment
- Working on your first issue
- Writing unit tests to validate your work
- Submit your work
A quick path to contribute on the front-end
-------------------------------------------
The next sections of this document include a full installation guide to help
you setup a local, development version of Funkwhale. If you only want to fix small things
on the front-end, and don't want to manage a full development environment, there is anoter way.
As the front-end can work with any Funkwhale server, you can work with the front-end only,
and make it talk with an existing instance (like the demo one, or you own instance, if you have one).
If even that is too much for you, you can also make your changes without any development environment,
and open a merge request. We will be able to to review your work easily by spawning automatically a
live version of your changes, thanks to Gitlab Review apps.
Setup front-end only development environment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1. Clone the repository::
git clone ssh://git@code.eliotberriot.com:2222/funkwhale/funkwhale.git
cd funkwhale
cd front
2. Install [nodejs](https://nodejs.org/en/download/package-manager/) and [yarn](https://yarnpkg.com/lang/en/docs/install/#debian-stable)
3. Install the dependencies::
yarn install
4. Launch the development server::
# this will serve the front-end on http://localhost:8000
WEBPACK_DEVSERVER_PORT=8000 yarn dev
5. Make the front-end talk with an existing server (like https://demo.funkwhale.audio),
by clicking on the corresponding link in the footer
6. Start hacking!
Setup your development environment
----------------------------------
If you want to fix a bug or implement a feature, you'll need
to run a local, development copy of funkwhale.
We provide a docker based development environment, which should
be both easy to setup and work similarly regardless of your
development machine setup.
Instructions for bare-metal setup will come in the future (Merge requests
are welcome).
Installing docker and docker-compose
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This is already cover in the relevant documentations:
- https://docs.docker.com/install/
- https://docs.docker.com/compose/install/
Cloning the project
^^^^^^^^^^^^^^^^^^^
Visit https://code.eliotberriot.com/funkwhale/funkwhale and clone the repository using SSH or HTTPS. Exemple using SSH::
git clone ssh://git@code.eliotberriot.com:2222/funkwhale/funkwhale.git
cd funkwhale
A note about branches
^^^^^^^^^^^^^^^^^^^^^
Next release development occurs on the "develop" branch, and releases are made on the "master" branch. Therefore, when submitting Merge Requests, ensure you are merging on the develop branch.
Working with docker
^^^^^^^^^^^^^^^^^^^
In developpement, we use the docker-compose file named ``dev.yml``, and this is why all our docker-compose commands will look like this::
docker-compose -f dev.yml logs
If you do not want to add the ``-f dev.yml`` snippet everytime, you can run this command before starting your work::
export COMPOSE_FILE=dev.yml
Creating your env file
^^^^^^^^^^^^^^^^^^^^^^
We provide a working .env.dev configuration file that is suitable for
development. However, to enable customization on your machine, you should
also create a .env file that will hold your personal environment
variables (those will not be commited to the project).
Create it like this::
touch .env
Create docker network
^^^^^^^^^^^^^^^^^^^^^
Create the federation network::
docker network create federation
Building the containers
^^^^^^^^^^^^^^^^^^^^^^^
On your initial clone, or if there have been some changes in the
app dependencies, you will have to rebuild your containers. This is done
via the following command::
docker-compose -f dev.yml build
Database management
^^^^^^^^^^^^^^^^^^^
To setup funkwhale's database schema, run this::
docker-compose -f dev.yml run --rm api python manage.py migrate
This will create all the tables needed for the API to run proprely.
You will also need to run this whenever changes are made on the database
schema.
It is safe to run this command multiple times, so you can run it whenever
you fetch develop.
Development data
^^^^^^^^^^^^^^^^
You'll need at least an admin user and some artists/tracks/albums to work
locally.
Create an admin user with the following command::
docker-compose -f dev.yml run --rm api python manage.py createsuperuser
Injecting fake data is done by running the fllowing script::
artists=25
command="from funkwhale_api.music import fake_data; fake_data.create_data($artists)"
echo $command | docker-compose -f dev.yml run --rm api python manage.py shell -i python
The previous command will create 25 artists with random albums, tracks
and metadata.
Launch all services
^^^^^^^^^^^^^^^^^^^
Then you can run everything with::
docker-compose -f dev.yml up front api nginx celeryworker
This will launch all services, and output the logs in your current terminal window.
If you prefer to launch them in the background instead, use the ``-d`` flag, and access the logs when you need it via ``docker-compose -f dev.yml logs --tail=50 --follow``.
Once everything is up, you can access the various funkwhale's components:
- The Vue webapp, on http://localhost:8080
- The API, on http://localhost:8080/api/v1/
- The django admin, on http://localhost:8080/api/admin/
Stopping everything
^^^^^^^^^^^^^^^^^^^
Once you're down with your work, you can stop running containers, if any, with::
docker-compose -f dev.yml stop
Removing everything
^^^^^^^^^^^^^^^^^^^
If you want to wipe your development environment completely (e.g. if you want to start over from scratch), just run::
docker-compose -f dev.yml down -v
This will wipe your containers and data, so please be careful before running it.
You can keep your data by removing the ``-v`` flag.
Working with federation locally
-------------------------------
This is not needed unless you need to work on federation-related features.
To achieve that, you'll need:
1. to update your dns resolver to resolve all your .dev hostnames locally
2. a reverse proxy (such as traefik) to catch those .dev requests and
and with https certificate
3. two instances (or more) running locally, following the regular dev setup
Resolve .dev names locally
^^^^^^^^^^^^^^^^^^^^^^^^^^
If you use dnsmasq, this is as simple as doing::
echo "address=/test/172.17.0.1" | sudo tee /etc/dnsmasq.d/test.conf
sudo systemctl restart dnsmasq
If you use NetworkManager with dnsmasq integration, use this instead::
echo "address=/test/172.17.0.1" | sudo tee /etc/NetworkManager/dnsmasq.d/test.conf
sudo systemctl restart NetworkManager
Add wildcard certificate to the trusted certificates
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Simply copy bundled certificates::
sudo cp docker/ssl/test.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
This certificate is a wildcard for ``*.funkwhale.test``
Run a reverse proxy for your instances
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Launch everything
^^^^^^^^^^^^^^^^^
Launch the traefik proxy::
docker-compose -f docker/traefik.yml up -d
Then, in separate terminals, you can setup as many different instances as you
need::
export COMPOSE_PROJECT_NAME=node2
docker-compose -f dev.yml run --rm api python manage.py migrate
docker-compose -f dev.yml run --rm api python manage.py createsuperuser
docker-compose -f dev.yml up nginx api front nginx api celeryworker
Note that by default, if you don't export the COMPOSE_PROJECT_NAME,
we will default to node1 as the name of your instance.
Assuming your project name is ``node1``, your server will be reachable
at ``https://node1.funkwhale.test/``. Not that you'll have to trust
the SSL Certificate as it's self signed.
When working on federation with traefik, ensure you have this in your ``env``::
# This will ensure we don't bind any port on the host, and thus enable
# multiple instances of funkwhale to be spawned concurrently.
WEBPACK_DEVSERVER_PORT_BINDING=
# This disable certificate verification
EXTERNAL_REQUESTS_VERIFY_SSL=false
# this ensure you don't have incorrect urls pointing to http resources
FUNKWHALE_PROTOCOL=https
Typical workflow for a contribution
-----------------------------------
0. Fork the project if you did not already or if you do not have access to the main repository
1. Checkout the development branch and pull most recent changes: ``git checkout develop && git pull``
2. If working on an issue, assign yourself to the issue. Otherwise, consider open an issue before starting to work on something, especially for new features.
3. Create a dedicated branch for your work ``42-awesome-fix``. It is good practice to prefix your branch name with the ID of the issue you are solving.
4. Work on your stuff
5. Commit small, atomic changes to make it easier to review your contribution
6. Add a changelog fragment to summarize your changes: ``echo "Implemented awesome stuff (#42)" > changes/changelog.d/42.feature``
7. Push your branch
8. Create your merge request
9. Take a step back and enjoy, we're really grateful you did all of this and took the time to contribute!
Internationalization
--------------------
We're using https://github.com/Polyconseil/vue-gettext to manage i18n in the project.
When working on the front-end, any end-user string should be translated
using either ``<translate>yourstring</translate>`` or ``$gettext('yourstring')``
function.
Extraction is done by calling ``yarn run i18n-extract``, which
will pull all the strings from source files and put them in a PO file.
Contributing to the API
-----------------------
Project structure
^^^^^^^^^^^^^^^^^
.. code-block:: shell
tree api -L 2 -d
api
├── config # configuration directory (settings, urls, wsgi server)
│ └── settings # Django settings files
├── funkwhale_api # project directory, all funkwhale logic is here
├── requirements # python requirements files
└── tests # test files, matches the structure of the funkwhale_api directory
.. note::
Unless trivial, API contributions must include unittests to ensure
your fix or feature is working as expected and won't break in the future
Running tests
^^^^^^^^^^^^^
To run the pytest test suite, use the following command::
docker-compose -f dev.yml run --rm api pytest
This is regular pytest, so you can use any arguments/options that pytest usually accept::
# get some help
docker-compose -f dev.yml run --rm api pytest -h
# Stop on first failure
docker-compose -f dev.yml run --rm api pytest -x
# Run a specific test file
docker-compose -f dev.yml run --rm api pytest tests/test_acoustid.py
Writing tests
^^^^^^^^^^^^^
Although teaching you how to write unit tests is outside of the scope of this
document, you'll find below a collection of tips, snippets and resources
you can use if you want to learn on that subject.
Useful links:
- `A quick introduction to unit test writing with pytest <https://semaphoreci.com/community/tutorials/testing-python-applications-with-pytest>`_
- `A complete guide to Test-Driven Development (although not using Pytest) <https://www.obeythetestinggoat.com/>`_
- `pytest <https://docs.pytest.org/en/latest/>`_: documentation of our testing engine and runner
- `pytest-mock <https://pypi.org/project/pytest-mock/>`_: project page of our mocking engine
- `factory-boy <http://factoryboy.readthedocs.io/>`_: documentation of factory-boy, which we use to easily generate fake objects and data
Recommendations:
- Test files must target a module and mimic ``funkwhale_api`` directory structure: if you're writing tests for ``funkwhale_api/myapp/views.py``, you should put thoses tests in ``tests/myapp/test_views.py``
- Tests should be small and test one thing. If you need to test multiple things, write multiple tests.
We provide a lot of utils and fixtures to make the process of writing tests as
painless as possible. You'll find some usage examples below.
Use factories to create arbitrary objects:
.. code-block:: python
# funkwhale_api/myapp/users.py
def downgrade_user(user):
"""
A simple function that remove superuser status from users
and return True if user was actually downgraded
"""
downgraded = user.is_superuser
user.is_superuser = False
user.save()
return downgraded
# tests/myapp/test_users.py
from funkwhale_api.myapp import users
def test_downgrade_superuser(factories):
user = factories['users.User'](is_superuser=True)
downgraded = users.downgrade_user(user)
assert downgraded is True
assert user.is_superuser is False
def test_downgrade_normal_user_does_nothing(factories):
user = factories['users.User'](is_superuser=False)
downgraded = something.downgrade_user(user)
assert downgraded is False
assert user.is_superuser is False
.. note::
We offer factories for almost if not all models. Factories are located
in a ``factories.py`` file inside each app.
Mocking: mocking is the process of faking some logic in our code. This is
useful when testing components that depend on each other:
.. code-block:: python
# funkwhale_api/myapp/notifications.py
def notify(email, message):
"""
A function that sends an email to the given recipient
with the given message
"""
# our email sending logic here
# ...
# funkwhale_api/myapp/users.py
from . import notifications
def downgrade_user(user):
"""
A simple function that remove superuser status from users
and return True if user was actually downgraded
"""
downgraded = user.is_superuser
user.is_superuser = False
user.save()
if downgraded:
notifications.notify(user.email, 'You have been downgraded!')
return downgraded
# tests/myapp/test_users.py
def test_downgrade_superuser_sends_email(factories, mocker):
"""
Your downgrade logic is already tested, however, we want to ensure
an email is sent when user is downgraded, but we don't have any email
server available in our testing environment. Thus, we need to mock
the email sending process.
"""
mocked_notify = mocker.patch('funkwhale_api.myapp.notifications.notify')
user = factories['users.User'](is_superuser=True)
users.downgrade_user(user)
# here, we ensure our notify function was called with proper arguments
mocked_notify.assert_called_once_with(user.email, 'You have been downgraded')
def test_downgrade_not_superuser_skips_email(factories, mocker):
mocked_notify = mocker.patch('funkwhale_api.myapp.notifications.notify')
user = factories['users.User'](is_superuser=True)
users.downgrade_user(user)
# here, we ensure no email was sent
mocked_notify.assert_not_called()
Views: you can find some readable views tests in :file:`tests/users/test_views.py`
.. note::
A complete list of available-fixtures is available by running
``docker-compose -f dev.yml run --rm api pytest --fixtures``
Contributing to the front-end
-----------------------------
Running tests
^^^^^^^^^^^^^
To run the front-end test suite, use the following command::
docker-compose -f dev.yml run --rm front yarn run unit
We also support a "watch and test" mode were we continually relaunch
tests when changes are recorded on the file system::
docker-compose -f dev.yml run --rm front yarn run unit-watch
The latter is especially useful when you are debugging failing tests.
.. note::
The front-end test suite coverage is still pretty low
# Contribute to Funkwhale
We welcome contributions from across the community. Whether you are a designer, a translator, a technical writer, or a developer, we look forward to working with you to improve the Funkwhale project!
## Contribute to Funkwhale development
The Funkwhale software is the core of the community project. While we have a core team working on it, we are always excited to see new features, bugfixes, and refactorings from our community.
Funkwhale's backend is written in [Python](https://www.python.org/) using [Django](https://www.djangoproject.com) and [Django REST framework](https://www.django-rest-framework.org/). Our web app is written in [Vue.js](https://vuejs.org/) and [Typescript](https://typescriptlang.org).
Whether you're an experienced developer or you're just learning, check out our [developer guide](https://docs.funkwhale.audio/developer/index.html) to get started.
## Document Funkwhale
Funkwhale is a large project with a lot of moving parts. To help users and developers alike, we need to keep our documentation up-to-date and readable. If you have a knack for explaining technical concepts or you've noticed a gap, check out our [documentation guide](https://docs.funkwhale.audio/documentation/index.html) to see how to get involved.
## Translate Funkwhale
All Funkwhale content is written in American English, but our community speaks languages from all over the world. If you'd like to see Funkwhale in your language, check out the [translation guide](https://docs.funkwhale.audio/translators.html) to see how you can help out.
## Other contributions
We'll update this file and our documentation with more information and workflows as we expand our search for contributors. If you have some suggestions or want to see how else you can get involved, come join us on [our forum](https://forum.funkwhale.audio). We'd love to hear your ideas!
Eliot Berriot
SHELL := bash
CPU_CORES := $(shell N=$$(nproc); echo $$(( $$N > 4 ? 4 : $$N )))
BAKE_FILES = \
docker-bake.json \
docker-bake.api.json \
docker-bake.front.json
docker-bake.%.json:
./scripts/build_metadata.py --format bake --bake-target $* --bake-image docker.io/funkwhale/$* > $@
docker-metadata: $(BAKE_FILES)
docker-build: docker-metadata
docker buildx bake $(foreach FILE,$(BAKE_FILES), --file $(FILE)) --print $(BUILD_ARGS)
docker buildx bake $(foreach FILE,$(BAKE_FILES), --file $(FILE)) $(BUILD_ARGS)
build-metadata:
./scripts/build_metadata.py --format env | tee build_metadata.env
BUILD_DIR = dist
package:
rm -Rf $(BUILD_DIR)
mkdir -p $(BUILD_DIR)
tar --create --gunzip --file='$(BUILD_DIR)/funkwhale-api.tar.gz' \
--owner='root' \
--group='root' \
--exclude-vcs \
api/config \
api/funkwhale_api \
api/install_os_dependencies.sh \
api/manage.py \
api/poetry.lock \
api/pyproject.toml \
api/Readme.md
cd '$(BUILD_DIR)' && \
tar --extract --gunzip --file='funkwhale-api.tar.gz' && \
zip -q 'funkwhale-api.zip' -r api && \
rm -Rf api
tar --create --gunzip --file='$(BUILD_DIR)/funkwhale-front.tar.gz' \
--owner='root' \
--group='root' \
--exclude-vcs \
--transform='s/^front\/dist/front/' \
front/dist
cd '$(BUILD_DIR)' && \
tar --extract --gunzip --file='funkwhale-front.tar.gz' && \
zip -q 'funkwhale-front.zip' -r front && \
rm -Rf front
# cd '$(BUILD_DIR)' && \
# cp ../front/tauri/target/release/bundle/appimage/funkwhale_*.AppImage FunkwhaleDesktop.AppImage
cd '$(BUILD_DIR)' && sha256sum * > SHA256SUMS
# Funkwhale
[![The Funkwhale logo](./front/src/assets/logo/logo-full-500.png)](https://funkwhale.audio)
Funkwhale is a platform for uploading, sharing, and publishing audio content across the federated web. Curate your music library, listen to podcasts, or create your own content and share it with the world.
## Contribute
Want to help make Funkwhale even better? We welcome contributions from across the community. Whether you are a designer, a translator, a technical writer, or a developer, we look forward to seeing your work!
You can find contribution information in our [documentation hub](https://docs.funkwhale.audio).
- [Developer guides](https://docs.funkwhale.audio/developer/index.html)
- [Contributor guides](https://docs.funkwhale.audio/contributing.html)
## Get help
Got a question or need help? Head over to our [forum](https://forum.funkwhale.audio/t/support) and open up a discussion.
## Report a security issue
If you find a security issue or vulnerability, please report it on our [GitLab instance](https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues). When you open your issue, select the **This issue is confidential and should only be visible to team members with at least Reporter access** option. This ensures developers can verify and patch the issue before disclosing it.
## Code of conduct
The Funkwhale collective adheres to a [code of conduct](https://funkwhale.audio/code-of-conduct) in all our community spaces. Please familiarize yourself with this code and follow it when participating in discussions in our spaces.
Funkwhale
=============
.. image:: ./front/src/assets/logo/logo-full-500.png
:alt: Funkwhale logo
:target: https://funkwhale.audio
A self-hosted tribute to Grooveshark.com.
LICENSE: AGPL3
Getting help
------------
We offer various Matrix.org rooms to discuss about Funkwhale:
- `#funkwhale:matrix.org <https://matrix.to/#/#funkwhale:matrix.org>`_ for general questions about funkwhale
- `#funkwhale-dev:matrix.org <https://matrix.to/#/#funkwhale-dev:matrix.org>`_ for development-focused discussion
Please join those rooms if you have any questions!
You can also contact `@funkwhale@mastodon.eliotberriot.com <https://mastodon.eliotberriot.com/@funkwhale>`_ on the fediverse.
Contribute
----------
Contribution guidelines as well as development installation instructions
are outlined in `CONTRIBUTING <CONTRIBUTING>`_.
Translate
^^^^^^^^^
Translators willing to help can refer to `TRANSLATORS <TRANSLATORS>`_ for instructions.
Translating Funkwhale
=====================
Thank you for reading this! If you want to help translate Funkwhale,
you found the proper place :)
Translation is done via our own Weblate instance at https://translate.funkwhale.audio/projects/funkwhale/front/.
You can signup/login using your Gitlab account (from https://code.eliotberriot.com).
Translation workflow
--------------------
Once you're logged-in on the Weblate instance, you can suggest translations. Your suggestions will then be reviewer
by the project maintainer or other translators to ensure consistency.
Guidelines
----------
Respecting those guidelines is mandatory if you want your translation to be included:
- Use gender-neutral language and wording
Requesting a new language
-------------------------
If you'd like to see a new language in Funkwhale, please open an issue here:
https://code.eliotberriot.com/funkwhale/funkwhale/issues
[run]
include = funkwhale_api/*
omit = *migrations*, *tests*
plugins =
django_coverage_plugin
### OSX ###
.DS_Store
.AppleDouble
.LSOverride
### SublimeText ###
# cache files for sublime text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
# workspace files are user-specific
*.sublime-workspace
# project files should be checked into the repository, unless a significant
# proportion of contributors will probably not be using SublimeText
# *.sublime-project
# sftp configuration file
sftp-config.json
# Basics
# Exclude everything and allow only the necessary files
*
!/docker/
!/config/
!/funkwhale_api/
!/manage.py
!/poetry.lock
!/pyproject.toml
# Python
*.py[cod]
__pycache__
# Logs
*.log
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
nosetests.xml
htmlcov
# Translations
*.mo
*.pot
# Pycharm
.idea
# Vim
*~
*.swp
*.swo
# npm
front/node_modules/
# Compass
.sass-cache
# virtual environments
.env
# User-uploaded media
funkwhale_api/media/
# Hitch directory
tests/.hitch
# MailHog binary
mailhog
*.sqlite3
music
media
[MASTER]
load-plugins=pylint_common, pylint_django, pylint_celery
[FORMAT]
max-line-length=120
[MESSAGES CONTROL]
disable=missing-docstring,invalid-name
[DESIGN]
max-parents=13
\ No newline at end of file
FROM python:3.6
ENV PYTHONUNBUFFERED 1
# Requirements have to be pulled and installed here, otherwise caching won't work
RUN echo 'deb http://httpredir.debian.org/debian/ jessie-backports main' > /etc/apt/sources.list.d/ffmpeg.list
COPY ./requirements.apt /requirements.apt
RUN apt-get update; \
grep "^[^#;]" requirements.apt | \
grep -Fv "python3-dev" | \
xargs apt-get install -y --no-install-recommends; \
rm -rf /usr/share/doc/* /usr/share/locale/*
RUN curl -L https://github.com/acoustid/chromaprint/releases/download/v1.4.2/chromaprint-fpcalc-1.4.2-linux-x86_64.tar.gz | tar -xz -C /usr/local/bin --strip 1
COPY ./requirements/base.txt /requirements/base.txt
RUN pip install -r /requirements/base.txt
COPY ./requirements/production.txt /requirements/production.txt
RUN pip install -r /requirements/production.txt
COPY . /app
# Since youtube-dl code is updated fairly often, we split it here
RUN pip install --upgrade youtube-dl
WORKDIR /app
ENTRYPOINT ["./compose/django/entrypoint.sh"]
CMD ["./compose/django/daphne.sh"]
Dockerfile.alpine
\ No newline at end of file
FROM alpine:3.21 AS requirements
RUN set -eux; \
apk add --no-cache \
poetry \
py3-cryptography \
py3-pip \
python3
COPY pyproject.toml poetry.lock /
RUN set -eux; \
poetry export --without-hashes --extras typesense > requirements.txt; \
poetry export --without-hashes --with dev > dev-requirements.txt;
FROM alpine:3.21 AS builder
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ARG PIP_NO_CACHE_DIR=1
ENV CARGO_NET_GIT_FETCH_WITH_CLI=true
RUN set -eux; \
apk add --no-cache \
cargo \
curl \
gcc \
g++ \
git \
jpeg-dev \
libffi-dev \
libldap \
libxml2-dev \
libxslt-dev \
make \
musl-dev \
openldap-dev \
openssl-dev \
postgresql-dev \
zlib-dev \
py3-cryptography \
py3-lxml \
py3-pillow \
py3-psycopg2 \
py3-watchfiles \
python3-dev \
gfortran \
libgfortran \
openblas-dev \
py3-scipy \
py3-scikit-learn;
# Create virtual env
RUN python3 -m venv --system-site-packages /venv
ENV PATH="/venv/bin:$PATH"
COPY --from=requirements /requirements.txt /requirements.txt
COPY --from=requirements /dev-requirements.txt /dev-requirements.txt
RUN --mount=type=cache,target=~/.cache/pip; \
set -eux; \
pip3 install --upgrade pip;
RUN --mount=type=cache,target=~/.cache/pip; \
set -eux; \
pip3 install setuptools wheel;
RUN --mount=type=cache,target=~/.cache/pip; \
set -eux; \
# Currently we are unable to relieably build rust-based packages on armv7. This
# is why we need to use the packages shipped by Alpine Linux.
# Since poetry does not allow in-place dependency pinning, we need
# to install the deps using pip.
grep -Ev 'cryptography|lxml|pillow|psycopg2|watchfiles|scipy|scikit-learn' /requirements.txt \
| pip3 install -r /dev/stdin \
cryptography \
lxml \
pillow \
psycopg2 \
watchfiles \
scipy \
scikit-learn;
ARG install_dev_deps=0
RUN --mount=type=cache,target=~/.cache/pip; \
set -eux; \
if [ "$install_dev_deps" = "1" ] ; then \
grep -Ev 'cryptography|lxml|pillow|psycopg2|watchfiles' /dev-requirements.txt \
| pip3 install -r /dev/stdin \
cryptography \
lxml \
pillow \
psycopg2 \
watchfiles; \
fi
FROM alpine:3.21 AS production
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ARG PIP_NO_CACHE_DIR=1
RUN set -eux; \
apk add --no-cache \
bash \
ffmpeg \
gettext \
jpeg-dev \
libldap \
libmagic \
libpq \
libxml2 \
libxslt \
py3-cryptography \
py3-lxml \
py3-pillow \
py3-psycopg2 \
py3-watchfiles \
py3-scipy \
py3-scikit-learn \
python3 \
tzdata
COPY --from=builder /venv /venv
ENV PATH="/venv/bin:$PATH"
COPY . /app
WORKDIR /app
RUN apk add --no-cache gfortran
RUN --mount=type=cache,target=~/.cache/pip; \
set -eux; \
pip3 install --no-deps --editable .
ENV IS_DOCKER_SETUP=true
CMD ["./docker/server.sh"]
FROM python:3.13-slim AS builder
ARG POETRY_VERSION=1.8
ENV DEBIAN_FRONTEND=noninteractive
ENV VIRTUAL_ENV=/venv
ENV PATH="/venv/bin:$PATH"
ENV POETRY_HOME=/opt/poetry
ENV POETRY_NO_INTERACTION=1
ENV POETRY_VIRTUALENVS_IN_PROJECT=1
ENV POETRY_VIRTUALENVS_CREATE=1
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Tell Poetry where to place its cache and virtual environment
ENV POETRY_CACHE_DIR=/opt/.cache
RUN pip install "poetry==${POETRY_VERSION}"
RUN --mount=type=cache,target=/var/lib/apt/lists \
apt update; \
apt install -y \
build-essential \
python3-dev \
libldap-dev \
libsasl2-dev \
slapd \
ldap-utils \
tox \
lcov \
valgrind
WORKDIR /app
COPY pyproject.toml .
RUN python3 -m venv --system-site-packages ${VIRTUAL_ENV} && . ${VIRTUAL_ENV}/bin/activate
RUN --mount=type=cache,target=/opt/.cache \
poetry install --no-root --extras typesense
FROM python:3.13-slim AS runtime
ARG POETRY_VERSION=1.8
ENV DEBIAN_FRONTEND=noninteractive
ENV VIRTUAL_ENV=/venv
ENV PATH="/venv/bin:$PATH"
RUN --mount=type=cache,target=/var/lib/apt/lists \
apt update; \
apt install -y \
ffmpeg \
gettext \
libjpeg-dev \
libldap-2.5-0 \
libmagic1 \
libpq5 \
libxml2 \
libxslt1.1
RUN pip install "poetry==${POETRY_VERSION}"
COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
WORKDIR /app
COPY . /app
RUN poetry install --extras typesense
CMD ["./docker/server.sh"]
SHELL := bash
CPU_CORES := $(shell N=$$(nproc); echo $$(( $$N > 4 ? 4 : $$N )))
.PHONY: install lint
install:
poetry install --all-extras
lint:
poetry run pylint \
--jobs=$(CPU_CORES) \
--output-format=colorized \
--recursive=true \
--disable=C,R,W,I \
config funkwhale_api tests
# Funkwhale API
This is the Funkwhale API. Check out our [API explorer](https://docs.funkwhale.audio/swagger/) for interactive documentation.
## OAuth Authentication
Funkwhale uses the OAuth [authorization grant flow](https://tools.ietf.org/html/rfc6749#section-4.1) for external apps. This flow is a secure way to authenticate apps that requires a user's explicit consent to perform actions. You can use our demo server at <https://demo.funkwhale.audio> for testing purposes.
To authenticate with the Funkwhale API:
1. Create an application by sending a `POST` request to `api/v1/oauth/apps`. Include your scopes and redirect URI (use `urn:ietf:wg:oauth:2.0:oob`
to get an authorization code you can copy)
2. Send an [authorization request](https://www.rfc-editor.org/rfc/rfc6749#section-4.1.2) to the `/authorize` endpoint to receive an authorization code
3. [Request an access token](https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3) from `/api/v1/oauth/token`
4. Use your access token to authenticate your calls with the following format: `Authorization: Bearer <token>`
5. Refresh your access token by sending a refresh request to `/api/v1/oauth/token`
For more detailed instructions, see [our API authentication documentation](https://docs.funkwhale.audio/developers/authentication.html).
## Application token authentication
If you have an account on your target pod, you can create an application at `/settings/applications/new`. Once you authorize the application you can retrieve an access token. Use your access token to authenticate your calls with the following format: `Authorization: Bearer <token>`
## Rate limiting
Funkwhale supports rate-limiting as of version 0.2.0. Pod admins can choose to rate limit specific endpoints to prevent abuse and improve the stability of the service. If the server drops a request due to rate-limiting, it returns a `429` status code.
Each API call returns HTTP headers to pass the following information:
- What was the scope of the request (`X-RateLimit-Scope`)
- What is the rate-limit associated with the request scope (`X-RateLimit-Limit`)
- How many more requests in the scope can be made within the rate-limit timeframe (`X-RateLimit-Remaining`)
- How much time does the client need to wait to send another request (`Retry-After`)
For more information, check our [rate limit documentation](https://docs.funkwhale.audio/developer/api/rate-limit.html)
## Resources
For more information about API usage, refer to [our API documentation](https://docs.funkwhale.audio/api.html).
#!/bin/bash -eux
python /app/manage.py collectstatic --noinput
/usr/local/bin/daphne -b 0.0.0.0 -p 5000 config.asgi:application --proxy-headers