CHANGELOG 82.8 KB
Newer Older
1
2
3
Changelog
=========

4
5
6
You can subscribe to release announcements by:

- Following `funkwhale@mastodon.eliotberriot.com <https://mastodon.eliotberriot.com/@funkwhale>`_ on Mastodon
Eliot Berriot's avatar
Eliot Berriot committed
7
- Subscribing to the following Atom feed: https://dev.funkwhale.audio/funkwhale/funkwhale/commits/develop?format=atom&search=Merge+tag
8
9
10

This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.html.

11
.. towncrier
12

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
0.18.1 (2019-01-29)
-------------------

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


Fix Gzip compression to avoid BREACH exploit [security] [manual action required]
--------------------------------------------------------------------------------

In the 0.18 release, we've enabled Gzip compression by default for various
content types, including HTML and JSON. Unfortunately, enabling Gzip compression
on such content types could make BREACH-type exploits possible.

We've removed the risky content-types from our nginx template files, to ensure new
instances are safe, however, if you already have an instance, you need
to double check that your host nginx virtualhost do not include the following
values for the ``gzip_types`` settings::

   application/atom+xml
   application/json
   application/ld+json
   application/activity+json
   application/manifest+json
   application/rss+xml
   application/xhtml+xml
   application/xml

For convenience, you can also replace the whole setting with the following snippet::

   gzip_types
      application/javascript
      application/vnd.geo+json
      application/vnd.ms-fontobject
      application/x-font-ttf
      application/x-web-app-manifest+json
      font/opentype
      image/bmp
      image/svg+xml
      image/x-icon
      text/cache-manifest
      text/css
      text/plain
      text/vcard
      text/vnd.rim.location.xloc
      text/vtt
      text/x-component
      text/x-cross-domain-policy;

Many thanks to @jibec for the report!

Fix Apache configuration file for 0.18 [manual action required]
----------------------------------------------------------

The way front is served has changed since 0.18. The Apache configuration can't serve 0.18 properly, leading to blank screens.

If you are on an Apache setup, you will have to replace the `<Location "/api">` block with the following::

   <Location "/">
      # similar to nginx 'client_max_body_size 100M;'
      LimitRequestBody 104857600

      ProxyPass ${funkwhale-api}/
      ProxyPassReverse ${funkwhale-api}/
   </Location>

And add some more `ProxyPass` directives so that the `Alias` part of your configuration file looks this way::

   ProxyPass "/front" "!"
   Alias /front /srv/funkwhale/front/dist

   ProxyPass "/media" "!"
   Alias /media /srv/funkwhale/data/media

   ProxyPass "/staticfiles" "!"
   Alias /staticfiles /srv/funkwhale/data/static

In case you are using custom css and theming, you also need to match this block::

   ProxyPass "/settings.json" "!"
   Alias /settings.json /srv/funkwhale/custom/settings.json

   ProxyPass "/custom" "!"
   Alias /custom /srv/funkwhale/custom


Enhancements:

- Added name attributes on all inputs to improve UX, especially with password managers (#686)
- Disable makemigrations in production and misleading message when running migrate (#685)
- Display progress during file upload
- Hide pagination when there is only one page of results (#681)
- Include shared/public playlists in Subsonic API responses (#684)
- Use proper locale for date-related/duration strings (#670)


Bugfixes:

- Fix transcoding of in-place imported tracks (#688)
- Fixed celery worker defaulting to development settings instead of production
- Fixed crashing Django admin when loading track detail page (#666)
- Fixed list icon alignement on landing page (#668)
- Fixed overescaping issue in notifications and album page (#676)
- Fixed wrong number of affected elements in bulk action modal (#683)
- Fixed wrong URL in documentation for funkwhale_proxy.conf file when deploying using Docker
- Make Apache configuration file work with 0.18 changes (#667)
- Removed potential BREACH exploit because of Gzip compression (#678)
- Upgraded kombu to fix an incompatibility with redis>=3


Documentation:

- Added user upload documentation at https://docs.funkwhale.audio/users/upload.html


Eliot Berriot's avatar
Eliot Berriot committed
128
129
130
131
132
133
134
0.18 "Naomi" (2019-01-22)
-------------------------

This release is dedicated to Naomi, an early contributor and beta tester of Funkwhale.
Her positivity, love and support have been incredibly helpful and helped shape the project
as you can enjoy it today. Thank you so much Naomi <3

135
136
137
Many thanks to the dozens of people that contributed to this release: translators, developers,
bug hunters, admins and backers. You made it possible!

Eliot Berriot's avatar
Eliot Berriot committed
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
Upgrade instructions are available at
https://docs.funkwhale.audio/index.html, ensure you also execute the intructions
marked with ``[manual action required]`` and ``[manual action suggested]``.

See ``Full changelog`` below for an exhaustive list of changes!

Audio transcoding is back!
^^^^^^^^^^^^^^^^^^^^^^^^^^

After removal of our first, buggy transcoding implementation, we're proud to announce
that this feature is back. It is enabled by default, and can be configured/disabled
in your instance settings!

This feature works in the browser, with federated/non-federated tracks and using Subsonic clients.
Transcoded tracks are generated on the fly, and cached for a configurable amount of time,
to reduce the load on the server.


Licensing and copyright information
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Funkwhale is now able to parse copyright and license data from file and store
this information. Apart from displaying it on each track detail page,
no additional behaviour is currently implemented to use this new data, but this
will change in future releases.

License and copyright data is also broadcasted over federation.

License matching is done on the content of the ``License`` tag in the files,
with a fallback on the ``Copyright`` tag.

Funkwhale will successfully extract licensing data for the following licenses:

- Creative Commons 0 (Public Domain)
- Creative Commons 1.0 (All declinations)
- Creative Commons 2.0 (All declinations)
- Creative Commons 2.5 (All declinations and countries)
- Creative Commons 3.0 (All declinations and countries)
- Creative Commons 4.0 (All declinations)

Support for other licenses such as Art Libre or WTFPL will be added in future releases.


Instance-level moderation tools
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This release includes a first set of moderation tools that will give more control
Jo Vuit's avatar
Typo    
Jo Vuit committed
185
to admins about the way their instance federates with other instance and accounts on the network.
Eliot Berriot's avatar
Eliot Berriot committed
186
187
188
189
190
191
192
Using these tools, it's now possible to:

- Browse known accounts and domains, and associated data (storage size, software version, etc.)
- Purge data belonging to given accounts and domains
- Block or partially restrict interactions with any account or domain

All those features are usable using a brand new "moderation" permission, meaning
Jo Vuit's avatar
Typos    
Jo Vuit committed
193
you can appoint one or multiple moderators to help with this task.
Eliot Berriot's avatar
Eliot Berriot committed
194
195
196
197
198
199
200
201

I'd like to thank all Mastodon contributors, because some of the these tools are heavily
inspired from what's being done in Mastodon. Thank you so much!


Iframe widget to embed public tracks and albums [manual action required]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Jo Vuit's avatar
Jo Vuit committed
202
Funkwhale now supports embedding a lightweight audio player on external websites
Eliot Berriot's avatar
Eliot Berriot committed
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
for album and tracks that are available in public libraries. Important pages,
such as artist, album and track pages also include OpenGraph tags that will
enable previews on compatible apps (like sharing a Funkwhale track link on Mastodon
or Twitter).

To achieve that, we had to tweak the way Funkwhale front-end is served. You'll have
to modify your nginx configuration when upgrading to keep your instance working.

**On docker setups**, edit your ``/srv/funkwhale/nginx/funkwhale.template`` and replace
the ``location /api/`` and `location /` blocks by the following snippets::

    location / {
        include /etc/nginx/funkwhale_proxy.conf;
        # this is needed if you have file import via upload enabled
        client_max_body_size ${NGINX_MAX_BODY_SIZE};
        proxy_pass   http://funkwhale-api/;
    }

    location /front/ {
        alias /frontend/;
    }

The change of configuration will be picked when restarting your nginx container.

**On non-docker setups**, edit your ``/etc/nginx/sites-available/funkwhale.conf`` file,
and replace the ``location /api/`` and `location /` blocks by the following snippets::


    location / {
        include /etc/nginx/funkwhale_proxy.conf;
        # this is needed if you have file import via upload enabled
        client_max_body_size ${NGINX_MAX_BODY_SIZE};
        proxy_pass   http://funkwhale-api/;
    }

    location /front/ {
        alias ${FUNKWHALE_FRONTEND_PATH}/;
    }

Replace ``${FUNKWHALE_FRONTEND_PATH}`` by the corresponding variable from your .env file,
which should be ``/srv/funkwhale/front/dist`` by default, then reload your nginx process with
``sudo systemctl reload nginx``.


Alternative docker deployment method
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Jo Vuit's avatar
Jo Vuit committed
250
Thanks to the awesome work done by @thetarkus at https://github.com/thetarkus/docker-funkwhale,
Eliot Berriot's avatar
Eliot Berriot committed
251
252
253
254
255
we're now able to provide an alternative and easier Docker deployment method!

In contrast with our current, multi-container offer, this method integrates
all Funkwhale processes and services (database, redis, etc.) into a single, easier to deploy container.

Jo Vuit's avatar
Typo    
Jo Vuit committed
256
Both methods will coexist in parallel, as each one has pros and cons. You can learn more
Eliot Berriot's avatar
Eliot Berriot committed
257
258
259
260
261
262
263
about this exciting new deployment option by visiting https://docs.funkwhale.audio/installation/docker.html!

Automatically load .env file
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

On non-docker deployments, earlier versions required you to source
the config/.env file before launching any Funkwhale command, with ``export $(cat config/.env | grep -v ^# | xargs)``
Jo Vuit's avatar
Typo    
Jo Vuit committed
264
This led to more complex and error prone deployment / setup.
Eliot Berriot's avatar
Eliot Berriot committed
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291

This is not the case anymore, and Funkwhale will automatically load this file if it's available.


Delete pre 0.17 federated tracks [manual action suggested]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you were using Funkwhale before the 0.17 release and federated with other instances,
it's possible that you still have some unplayable federated files in the database.

To purge the database of those entries, you can run the following command:

On docker setups::

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

On non-docker setups::

    python manage.py script delete_pre_017_federated_uploads --no-input


Enable gzip compression [manual action suggested]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Gzip compression will be enabled on new instances by default
and will reduce the amount of bandwidth consumed by your instance.

Jo Vuit's avatar
Typo    
Jo Vuit committed
292
If you want to benefit from gzip compression on your instance,
Eliot Berriot's avatar
Eliot Berriot committed
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
edit your reverse proxy virtualhost file (located at ``/etc/nginx/sites-available/funkwhale.conf``) and add the following snippet
in the server block, then reload your nginx server::

    server {
        # ... exiting configuration

        # compression settings
        gzip on;
        gzip_comp_level    5;
        gzip_min_length    256;
        gzip_proxied       any;
        gzip_vary          on;

        gzip_types
            application/javascript
            application/vnd.geo+json
            application/vnd.ms-fontobject
            application/x-font-ttf
            application/x-web-app-manifest+json
            font/opentype
            image/bmp
            image/svg+xml
            image/x-icon
            text/cache-manifest
            text/css
            text/plain
            text/vcard
            text/vnd.rim.location.xloc
            text/vtt
            text/x-component
            text/x-cross-domain-policy;
        # end of compression settings
    }

Full changelog
^^^^^^^^^^^^^^

Features:

- Allow embedding of albums and tracks available in public libraries via an <iframe> (#578)
- Audio transcoding is back! (#272)
- First set of instance level moderation tools (#580, !521)
- Store licensing and copyright information from file metadata, if available (#308)


Enhancements:

- Add UI elements for multi-disc albums (#631)
- Added alternative funkwhale/all-in-one docker image (#614)
- Broadcast library updates (name, description, visibility) over federation
- Based Docker image on alpine to have a smaller (and faster to build) image
- Improved front-end performance by stripping unused dependencies, reducing bundle size
  and enabling gzip compression
- Improved accessibility by using main/section/nav tags and aria-labels in most critical places (#612)
- The progress bar in the player now display loading state / buffer loading (#586)
- Added "type: funkwhale" and "funkwhale-version" in Subsonic responses (#573)
- Documented keyboard shortcuts, list is now available by pressing "h" or in the footer (#611)
- Documented which Subsonic endpoints are implemented (#575)
- Hide invitation code field during signup when it's not required (#410)
- Importer will now pick embedded images in files with OTHER type if no COVER_FRONT is present
- Improved keyboard accessibility on player, queue and various controls (#576)
- Improved performance when listing playable tracks, albums and artists
- Increased default upload limit from 30 to 100MB (#654)
- Load env file in config/.env automatically to avoid sourcing it by hand (#626)
- More resilient date parsing during audio import, will not crash anymore on
  invalid dates (#622)
- Now start radios immediatly, skipping any existing tracks in queue (#585)
- Officially support connecting to a password protected redis server, with
  the redis://:password@localhost:6379/0 scheme (#640)
- Performance improvement when fetching favorites, down to a single, small http request
- Removed "Activity" page, since all the data is available on the "Browse" page (#600)
- Removed the need to specify the DJANGO_ALLOWED_HOSTS variable
- Restructured the footer, added useful links and removed unused content
- Show short entries first in search results to improve UX
- Store disc number and order tracks by disc number / position) (#507)
- Strip EXIF metadata from uploaded avatars to avoid leaking private data (#374)
- Support blind key rotation in HTTP Signatures (#658)
- Support setting a server URL in settings.json (#650)
- Updated default docker postgres version from 9.4 to 11 (#656)
- Updated lots of dependencies (especially django 2.0->2.1), and removed unused dependencies (#657)
- Improved test suite speed by reducing / disabling expensive operations (#648)


Bugfixes:

- Fixed parsing of embedded file cover for ogg files tagged with MusicBrainz (#469)
- Upgraded core dependencies to fix websocket/messaging issues and possible memory leaks (#643)
- Fix ".None" extension when downloading Flac file (#473)
- Fixed None extension when downloading an in-place imported file (#621)
- Added a script to prune pre 0.17 federated tracks (#564)
- Advertise public libraries properly in ActivityPub representations (#553)
- Allow opus file upload (#598)
- Do not display "view on MusicBrainz" button if we miss the mbid (#422)
- Do not try to create unaccent extension if it's already present (#663)
- Ensure admin links in sidebar are displayed for users with relavant permissions, and only them (#597)
- Fix broken websocket connexion under Chrome browser (#589)
- Fix play button not starting playback with empty queue (#632)
- Fixed a styling inconsistency on about page when instance description was missing (#659)
- Fixed a UI discrepency in playlist tracks count (#647)
- Fixed greyed tracks in radio builder and detail page (#637)
- Fixed inconsistencies in subsonic error responses (#616)
- Fixed incorrect icon for "next track" in player control (#613)
- Fixed malformed search string when redirecting to LyricsWiki (#608)
- Fixed missing track count on various library cards (#581)
- Fixed skipped track when appending multiple tracks to the queue under certain conditions (#209)
- Fixed wrong album/track count on artist page (#599)
- Hide unplayable/emtpy playlists in "Browse playlist" pages (#424)
- Initial UI render using correct language from browser (#644)
- Invalid URI for reverse proxy websocket with apache (#617)
- Properly encode Wikipedia and lyrics search urls (#470)
- Refresh profile after user settings update to avoid cache issues (#606)
- Use role=button instead of empty links for player controls (#610)


Documentation:

- Deploy documentation from the master branch instead of the develop branch to avoid inconsistencies (#642)
- Document how to find and use library id when importing files in CLI (#562)
- Fix documentation typos (#645)


414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
0.17 (2018-10-07)
-----------------

Per user libraries
^^^^^^^^^^^^^^^^^^

This release contains a big change in music management. This has a lot of impact
on how Funkwhale behaves, and you should have a look at
https://docs.funkwhale.audio/upgrading/0.17.html for information
about what changed and how to migrate.


Features:

- Per user libraries (#463, also fixes #160 and #147)
- Authentication using a LDAP directory (#194)


Enhancements:

- Add configuration option to set Musicbrainz hostname
- Add sign up link in the sidebar (#408)
- Added a library widget to display libraries associated with a track, album
  and artist (#551)
- Ensure from_activity field is not required in django's admin (#546)
- Move setting link from profile page to the sidebar (#406)
- Simplified and less error-prone nginx setup (#358)

Bugfixes:

- Do not restart current song when rordering queue, deleting tracks from queue
  or adding tracks to queue (#464)
- Fix broken icons in playlist editor (#515)
- Fixed a few untranslated strings (#559)
- Fixed splitted album when importing from federation (#346)
- Fixed toggle mute in volume bar does not restore previous volume level (#514)
- Fixed wrong env file URL and display bugs in deployment documentation (#520)
- Fixed wrong title in PlayButton (#435)
- Remove transparency on artist page button (#517)
- Set sane width default for ui cards and center play button (#530)
- Updated wrong icon and copy in play button dropdown (#436)


Documentation:

- Fixed wrong URLs for docker / nginx files in documentation (#537)


Other:

- Added a merge request template and more documentation about the changelog


Using a LDAP directory to authenticate to your Funkwhale instance
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Funkwhale now support LDAP as an authentication source: you can configure
your instance to delegate login to a LDAP directory, which is especially
useful when you have an existing directory and don't want to manage users
manually.

You can use this authentication backend side by side with the classic one.

Have a look at https://docs.funkwhale.audio/installation/ldap.html
for detailed instructions on how to set this up.


Simplified nginx setup [Docker: Manual action required]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We've received a lot of user feedback regarding our installation process,
and it seems the proxy part is the one which is the most confusing and difficult.
Unfortunately, this is also the one where errors and mistakes can completely break
the application.

To make things easier for everyone, we now offer a simplified deployment
process for the reverse proxy part. This will make upgrade of the proxy configuration
significantly easier on docker deployments.

On non-docker instances, you have nothing to do.

If you have a dockerized instance, here is the upgrade path.

First, tweak your .env file::

    # remove the FUNKWHALE_URL variable
    # and add the next variables
    FUNKWHALE_HOSTNAME=yourdomain.funkwhale
    FUNKWHALE_PROTOCOL=https

    # add the following variable, matching the path your app is deployed
    # leaving the default should work fine if you deployed using the same
    # paths as the documentation
    FUNKWHALE_FRONTEND_PATH=/srv/funkwhale/front/dist

Then, add the following block at the end of your docker-compose.yml file::

    # existing services
    api:
        ...
    celeryworker:
        ...

    # new service
    nginx:
      image: nginx
      env_file:
        - .env
      environment:
        # Override those variables in your .env file if needed
524
        - "NGINX_MAX_BODY_SIZE=${NGINX_MAX_BODY_SIZE-100M}"
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
      volumes:
        - "./nginx/funkwhale.template:/etc/nginx/conf.d/funkwhale.template:ro"
        - "./nginx/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro"
        - "${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:ro"
        - "${MEDIA_ROOT}:${MEDIA_ROOT}:ro"
        - "${STATIC_ROOT}:${STATIC_ROOT}:ro"
        - "${FUNKWHALE_FRONTEND_PATH}:/frontend:ro"
      ports:
        # override those variables in your .env file if needed
        - "${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT}:80"
      command: >
          sh -c "envsubst \"`env | awk -F = '{printf \" $$%s\", $$1}'`\"
          < /etc/nginx/conf.d/funkwhale.template
          > /etc/nginx/conf.d/default.conf
          && cat /etc/nginx/conf.d/default.conf
          && nginx -g 'daemon off;'"
      links:
        - api

By doing that, you'll enable a dockerized nginx that will automatically be
configured to serve your Funkwhale instance.

Download the required configuration files for the nginx container:

.. parsed-literal::

    cd /srv/funkwhale
    mkdir nginx
Eliot Berriot's avatar
Eliot Berriot committed
553
554
    curl -L -o nginx/funkwhale.template "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/|version|/deploy/docker.nginx.template"
    curl -L -o nginx/funkwhale_proxy.conf "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/|version|/deploy/funkwhale_proxy.conf"
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607

Update the funkwhale.conf configuration of your server's reverse-proxy::

    # the file should match something like that, upgrade all variables
    # between ${} to match the ones in your .env file,
    # and your SSL configuration if you're not using let's encrypt
    # The important thing is that you only have a single location block
    # that proxies everything to your dockerized nginx.

    sudo nano /etc/nginx/sites-enabled/funkwhale.conf
    upstream fw {
        # depending on your setup, you may want to update this
        server ${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT};
    }
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen 80;
        listen [::]:80;
        server_name ${FUNKWHALE_HOSTNAME};
        location / { return 301 https://$host$request_uri; }
    }
    server {
        listen      443 ssl;
        listen [::]:443 ssl;
        server_name ${FUNKWHALE_HOSTNAME};

        # TLS
        ssl_protocols TLSv1.2;
        ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_certificate     /etc/letsencrypt/live/${FUNKWHALE_HOSTNAME}/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/${FUNKWHALE_HOSTNAME}/privkey.pem;

        # HSTS
        add_header Strict-Transport-Security "max-age=31536000";

        location / {
            include /etc/nginx/funkwhale_proxy.conf;
            proxy_pass   http://fw/;
        }
    }

Check that your configuration is valid then reload:

    sudo nginx -t
    sudo systemctl reload nginx


608
609
610
611
612
613
614
615
616
617
618
0.16.3 (2018-08-21)
-------------------

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

Bugfixes:

- Fixed front-end not contacting the proper path on the API (!385)


619
620
621
0.16.2 (2018-08-21)
-------------------

622
623
624
625
626
.. warning::

  **This release is broken, do not use it. Upgrade to 0.16.3 or higher instead.**


627
628
629
630
631
632
633
634
635
636
637
Upgrade instructions are available at
https://docs.funkwhale.audio/upgrading.html

Bugfixes:

- Ensure we always have a default api url set on first load to avoid displaying
  the instance picker (#490)
- Fixed CLI importer syntax error because of async reserved keyword usage
  (#494)


638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
0.16.1 (2018-08-19)
-------------------

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

Features:

- Make funkwhale themable by loading external stylesheets (#456)

Enhancements:

- Add link to admin on "Staff member" button (#202)
- Can now add a description to radios and better radio cards (#331)
- Display track duration in track tables (#461)
- More permissive default permissions for front-end files (#388)
- Simpler configuration and toolchain for the front-end using vue-cli (!375)
- Use Howler to manage audio instead of our own dirty/untested code (#392)


Bugfixes:

- Fix alignment issue on top bar in Admin tabs (#395)
- Fix Apache2 permission issue preventing `/media` folder from being served
  correctly (#389)
- Fix loading on browse page lists causing them to go down, and dimming over
  the top bar (#468)
- Fixed (again): administration section not showing up in sidebar after login
  (#245)
- Fixed audio mimetype not showing up on track detail and list (#459)
- Fixed broken audio playback on Chrome and invisible volume control (#390)
- Fixed broken federation import on big imports due to missing transaction
  logic (#397)
- Fixed crash on artist pages when no cover is available (#457)
- Fixed favorited status of tracks not appearing in interface (#398)
- Fixed invitation code not prefilled in form when accessing invitation link
  (#476)
- Fixed typos in scheduled tasks configuration (#487)
- Removed release date error in case of empty date (#478)
- Removed white on white artist button on hover, on Album page (#393)
- Smarter date parsing during import by replacing arrow with pendulum (#376)
- Display public playlists properly for anonymous users (#488)


i18n:

- Added portuguese, spanish and german translations


Custom themes for Funkwhale
^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you ever wanted to give a custom look and feel to your instance, this is now possible.

Check https://docs.funkwhale.audio/configuration.html#theming if you want to know more!


Fix Apache2 configuration file for media block [Manual action required]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The permission scope on the current Apache2 configuration file is too narrow, preventing thumbnails from being served.

On Apache2 setups, you have to replace the following line::

    <Directory /srv/funkwhale/data/media/albums>

with::

    <Directory /srv/funkwhale/data/media>

You can now restart your server::

    sudo systemctl restart apache2


713
0.16 (2018-07-22)
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
-----------------

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
935
^^^^^^^^^^^^^^^^^^^^^^^^^^^
936
937
938
939
940
941
942
943
944
945

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.


946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
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.