Skip to content
0.16 (unreleased)
-----------------

Upgrade instructions are available at
https://docs.funkwhale.audio/upgrading.html

Features:

- Complete redesign of the library home and playlist pages (#284)
- Expose ActivityPub actors for users (#317)
- Implemented a basic but functionnal Github-like search on federated tracks
  list (#344)
- Internationalized interface as well as translations for Arabic, French,
  Esperanto, Italian, Occitan, Polish, Portuguese and Swedish (#161, #167)
- Users can now upload an avatar in their settings page (#257)

Enhancements:

- Added feedback when creating/updating radio (#302)
- Apply restrictions to username characters during signup
- Autoselect best language based on browser configuration (#386)
- Can now order tracks on federated track list (#326)
- Can now relaunch pending import jobs from the web interface (#323)
- Ensure we do not display pagination on single pages (#334)
- Ensure we have sane defaults for MEDIA_ROOT, STATIC_ROOT and
  MUSIC_DIRECTORY_PATH in the deployment .env file (#350)
- Make some space for the volume slider to allow precise control (#318)
- Removed django-cacheops dependency
- Store track artist and album artist separately (#237) Better handling of
  tracks with a different artist than the album artist
- The navigation bar of Library is now fixed (#375)
- Use thumbnails for avatars and covers to reduce bandwidth

Bugfixes:

- Ensure 750 permissions on CI artifacts (#332)
- Ensure images are not cropped in queue (#337)
- Ensure we do not import artists with empty names (#351)
- Fix notifications not closing when clicking on the cross (#366)
- Fix the most annoying offset in the whole fediverse (#369)
- Fixed persistent message in playlist modal (#304)
- Fixed unfiltered results in favorites API (#384)
- Raise a warning instead of crashing when getting a broken path in file import
  (#138)
- Remove parallelization of uploads during import to avoid crashing small
  servers (#382)
- Subsonic API login is now case insensitive (#339)
- Validate Date header in HTTP Signatures (#328)

Documentation:

- Added troubleshotting and technical overview documentation (#256)
- Arch Linux installation steps
- Document that users can use Ultrasonic on Android (#316)
- Fixed a couple of typos
- Some cosmetic improvements to the doc

i18n:

- Arabic translation (!302)
- Polish translation (!304)

Library home and playlist page overhaul
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The library home page have been completely redesigned to include:

- other users activity (listenings, playlists and favorites)
- recently imported albums

We think this new version showcases more music in a more useful way, let us know
what you think about it!

The playlist page have been updated as well.

Internationalized interface
^^^^^^^^^^^^^^^^^^^^^^^^^^^

After months of work, we're proud to announce our interface is now ready
for internationalization.

Translators have already started the work of translating Funkwhale in 8 different languages,
and we're ready to add more as needed.

You can easily get involved at https://translate.funkwhale.audio/engage/funkwhale/

Better handling of tracks with a different artist than the album artist
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Some tracks involve a different artist than the album artist (e.g. a featuring)
and Funkwhale has been known to do weird things when importing such tracks, resulting
in albums that contained a single track, for instance.

The situation should be improved with this release, as Funkwhale is now able to
store separately the track and album artist, and display it properly in the interface.

Users now have an ActivityPub Actor [Manual action required]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In the process of implementing federation for user activity such as listening
history, we are now making user profiles (a.k.a. ActivityPub actors) available through federation.

This does not means the federation is working, but this is a needed step to implement it.

Those profiles will be created automatically for new users, but you have to run a command
to create them for existing users.

On docker setups::

    docker-compose run --rm api python manage.py script create_actors --no-input

On non-docker setups::

    python manage.py script create_actors --no-input

This should only take a few seconds to run. It is safe to interrupt the process or rerun it multiple times.

Image thumbnails [Manual action required]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To reduce bandwidth usage on slow or limited connexions and improve performance
in general, we now use smaller images in the front-end. For instance, if you have
an album cover with a 1000x1000 pixel size, we will create smaller
versions of this image (50x50, 200x200, 400x400) and reference those resized version
when we don't actually need the original image.

Thumbnail will be created automatically for new objects, however, you have
to launch a manual command to deal with existing ones.

On docker setups::

    docker-compose run --rm api python manage.py script create_image_variations --no-input

On non-docker setups::

    python manage.py script create_image_variations --no-input

This should be quite fast but may take up to a few minutes depending on the number
of albums you have in database. It is safe to interrupt the process or rerun it multiple times.

Improved search on federated tracks list
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Having a powerful but easy-to-use search is important but difficult to achieve, especially
if you do not want to have a real complex search interface.

Github does a pretty good job with that, using a structured but simple query system
(See https://help.github.com/articles/searching-issues-and-pull-requests/#search-only-issues-or-pull-requests).

This release implements a limited but working subset of this query system. You can use it only on the federated
tracks list (/manage/federation/tracks) at the moment, but depending on feedback it will be rolled-out on other pages as well.

This is the type of query you can run:

- ``hello world``: search for "hello" and "world" in all the available fields
- ``hello in:artist`` search for results where artist name is "hello"
- ``spring in:artist,album`` search for results where artist name or album title contain "spring"
- ``artist:hello`` search for results where artist name equals "hello"
- ``artist:"System of a Down" domain:instance.funkwhale`` search for results where artist name equals "System of a Down" and inside "instance.funkwhale" library

Ensure MEDIA_ROOT, STATIC_ROOT and MUSIC_DIRECTORY_* are set explicitely [Manual action required]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In our default .env file, MEDIA_ROOT and STATIC_ROOT were commented by default, causing
some deployment issues on non-docker setups when people forgot to uncomment them.

From now on, those variables are uncommented, and will also be used on docker setups
to mount the volumes automatically in the docker-compose.yml file. This has been a source
of headache as well in some deployments, where you had to update both the .env file and
the compose file.

This also applies to in-place paths (MUSIC_DIRECTORY_PATH and MUSIC_DIRECTORY_SERVE_PATH),
whose values are now used directly to set up the proper Docker volumes.

This will only affect new deployments though. If you want to benefit from this on an
existing instance, do a backup of your ``.env`` and ``docker-compose.yml`` files and apply the following changes:

- Ensure ``MEDIA_ROOT`` is uncommented in your .env file and match the absolute path where media files are stored
  on your host (``/srv/funkwhale/data/media`` by default)
- Ensure ``STATIC_ROOT`` is uncommented in your .env file and match the absolute path where static files are stored
  on your host (``/srv/funkwhale/data/static`` by default)
- If you use in-place import:
    - Ensure MUSIC_DIRECTORY_PATH is uncommented and set to ``/music``
    - Ensure MUSIC_DIRECTORY_SERVE_PATH is uncommented and set to the absolute path on your host were your music files
      are stored (``/srv/funkwhale/data/music`` by default)
- Edit your docker-compose.yml file to reflect the changes:
    - Search for volumes (there should be two occurences) that contains ``/app/funkwhale_api/media`` on the right side, and
      replace the whole line with ``- "${MEDIA_ROOT}:${MEDIA_ROOT}"``
    - Search for a volume that contains ``/app/staticfiles`` on the right side, and
      replace the whole line with ``- "${STATIC_ROOT}:${STATIC_ROOT}"``
    - If you use in-place import, search for volumes (there should be two occurences) that contains ``/music:ro`` on the right side, and
      replace the whole line with ``- "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro"``

In the end, the ``volumes`` directives of your containers should look like that::

    ...
    celeryworker
      volumes:
        - "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro"
        - "${MEDIA_ROOT}:${MEDIA_ROOT}"
    ...
    api:
      volumes:
        - "${MUSIC_DIRECTORY_SERVE_PATH}:${MUSIC_DIRECTORY_PATH}:ro"
        - "${MEDIA_ROOT}:${MEDIA_ROOT}"
        - "${STATIC_ROOT}:${STATIC_ROOT}"
        - ./front/dist:/frontend
    ...

Removed Cacheops dependency
---------------------------

We removed one of our dependency named django-cacheops. It was unly used in a few places,
and not playing nice with other dependencies.

You can safely remove this dependency in your environment with ``pip uninstall django-cacheops`` if you're
not using docker.

You can also safely remove any ``CACHEOPS_ENABLED`` setting from your environment file.