Removed transcoding support (#271)
This commit is contained in:
parent
390dcfd06f
commit
36a0a4df4f
|
@ -1,23 +0,0 @@
|
||||||
from django import forms
|
|
||||||
|
|
||||||
from . import models
|
|
||||||
|
|
||||||
|
|
||||||
class TranscodeForm(forms.Form):
|
|
||||||
FORMAT_CHOICES = [
|
|
||||||
('ogg', 'ogg'),
|
|
||||||
('mp3', 'mp3'),
|
|
||||||
]
|
|
||||||
|
|
||||||
to = forms.ChoiceField(choices=FORMAT_CHOICES)
|
|
||||||
BITRATE_CHOICES = [
|
|
||||||
(64, '64'),
|
|
||||||
(128, '128'),
|
|
||||||
(256, '256'),
|
|
||||||
]
|
|
||||||
bitrate = forms.ChoiceField(
|
|
||||||
choices=BITRATE_CHOICES, required=False)
|
|
||||||
|
|
||||||
track_file = forms.ModelChoiceField(
|
|
||||||
queryset=models.TrackFile.objects.exclude(audio_file__isnull=True)
|
|
||||||
)
|
|
|
@ -35,7 +35,6 @@ from funkwhale_api.musicbrainz import api
|
||||||
from funkwhale_api.requests.models import ImportRequest
|
from funkwhale_api.requests.models import ImportRequest
|
||||||
|
|
||||||
from . import filters
|
from . import filters
|
||||||
from . import forms
|
|
||||||
from . import importers
|
from . import importers
|
||||||
from . import models
|
from . import models
|
||||||
from . import permissions as music_permissions
|
from . import permissions as music_permissions
|
||||||
|
@ -324,42 +323,6 @@ class TrackFileViewSet(viewsets.ReadOnlyModelViewSet):
|
||||||
except models.TrackFile.DoesNotExist:
|
except models.TrackFile.DoesNotExist:
|
||||||
return Response(status=404)
|
return Response(status=404)
|
||||||
|
|
||||||
@list_route(methods=['get'])
|
|
||||||
def viewable(self, request, *args, **kwargs):
|
|
||||||
return Response({}, status=200)
|
|
||||||
|
|
||||||
@list_route(methods=['get'])
|
|
||||||
def transcode(self, request, *args, **kwargs):
|
|
||||||
form = forms.TranscodeForm(request.GET)
|
|
||||||
if not form.is_valid():
|
|
||||||
return Response(form.errors, status=400)
|
|
||||||
|
|
||||||
f = form.cleaned_data['track_file']
|
|
||||||
if not f.audio_file:
|
|
||||||
return Response(status=400)
|
|
||||||
output_kwargs = {
|
|
||||||
'format': form.cleaned_data['to']
|
|
||||||
}
|
|
||||||
args = (ffmpeg
|
|
||||||
.input(f.audio_file.path)
|
|
||||||
.output('pipe:', **output_kwargs)
|
|
||||||
.get_args()
|
|
||||||
)
|
|
||||||
# we use a generator here so the view return immediatly and send
|
|
||||||
# file chunk to the browser, instead of blocking a few seconds
|
|
||||||
def _transcode():
|
|
||||||
p = subprocess.Popen(
|
|
||||||
['ffmpeg'] + args,
|
|
||||||
stdout=subprocess.PIPE)
|
|
||||||
for line in p.stdout:
|
|
||||||
yield line
|
|
||||||
|
|
||||||
response = StreamingHttpResponse(
|
|
||||||
_transcode(), status=200,
|
|
||||||
content_type=form.cleaned_data['to'])
|
|
||||||
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
class TagViewSet(viewsets.ReadOnlyModelViewSet):
|
class TagViewSet(viewsets.ReadOnlyModelViewSet):
|
||||||
queryset = Tag.objects.all().order_by('name')
|
queryset = Tag.objects.all().order_by('name')
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
Removed transcoding support (#271)
|
||||||
|
|
||||||
|
|
||||||
|
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
|
|
@ -1,8 +1,5 @@
|
||||||
# Ensure you update at least the server_name variables to match your own
|
# Ensure you update at least the server_name variables to match your own
|
||||||
|
|
||||||
# transcode cache
|
|
||||||
proxy_cache_path /tmp/funkwhale-transcode levels=1:2 keys_zone=transcode:10m max_size=1g inactive=7d;
|
|
||||||
|
|
||||||
# domain
|
# domain
|
||||||
upstream funkwhale-api {
|
upstream funkwhale-api {
|
||||||
# depending on your setup, you may want to udpate this
|
# depending on your setup, you may want to udpate this
|
||||||
|
@ -98,41 +95,6 @@ server {
|
||||||
alias /srv/funkwhale/data/music;
|
alias /srv/funkwhale/data/music;
|
||||||
}
|
}
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
location /staticfiles/ {
|
location /staticfiles/ {
|
||||||
# django static files
|
# django static files
|
||||||
alias /srv/funkwhale/data/static/;
|
alias /srv/funkwhale/data/static/;
|
||||||
|
|
|
@ -26,7 +26,6 @@ http {
|
||||||
keepalive_timeout 65;
|
keepalive_timeout 65;
|
||||||
|
|
||||||
#gzip on;
|
#gzip on;
|
||||||
proxy_cache_path /tmp/funkwhale-transcode levels=1:2 keys_zone=transcode:10m max_size=1g inactive=24h use_temp_path=off;
|
|
||||||
|
|
||||||
map $http_upgrade $connection_upgrade {
|
map $http_upgrade $connection_upgrade {
|
||||||
default upgrade;
|
default upgrade;
|
||||||
|
@ -46,38 +45,6 @@ http {
|
||||||
internal;
|
internal;
|
||||||
alias /music;
|
alias /music;
|
||||||
}
|
}
|
||||||
location = /transcode-auth {
|
|
||||||
# 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;
|
|
||||||
}
|
|
||||||
include /etc/nginx/funkwhale_proxy.conf;
|
|
||||||
proxy_pass http://api:12081/api/v1/trackfiles/viewable/?$query;
|
|
||||||
proxy_pass_request_body off;
|
|
||||||
proxy_set_header Content-Length "";
|
|
||||||
}
|
|
||||||
|
|
||||||
location /api/v1/trackfiles/transcode/ {
|
|
||||||
# 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;
|
|
||||||
}
|
|
||||||
include /etc/nginx/funkwhale_proxy.conf;
|
|
||||||
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://api:12081;
|
|
||||||
}
|
|
||||||
location / {
|
location / {
|
||||||
include /etc/nginx/funkwhale_proxy.conf;
|
include /etc/nginx/funkwhale_proxy.conf;
|
||||||
proxy_pass http://api:12081/;
|
proxy_pass http://api:12081/;
|
||||||
|
|
|
@ -16,10 +16,8 @@ The project relies on the following components and services to work:
|
||||||
Hardware requirements
|
Hardware requirements
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
Funkwhale is not especially CPU hungry, unless you're relying heavily
|
Funkwhale is not especially CPU hungry. On a dockerized instance with 2 CPUs
|
||||||
on the transcoding feature (which is basic and unoptimized at the moment).
|
and a few active users, the memory footprint is around ~500Mb::
|
||||||
|
|
||||||
On a dockerized instance with 2 CPUs and a few active users, the memory footprint is around ~500Mb::
|
|
||||||
|
|
||||||
CONTAINER MEM USAGE
|
CONTAINER MEM USAGE
|
||||||
funkwhale_api_1 202.1 MiB
|
funkwhale_api_1 202.1 MiB
|
||||||
|
@ -125,10 +123,8 @@ Apache2
|
||||||
are not working yet:
|
are not working yet:
|
||||||
|
|
||||||
- Websocket (used for real-time updates on Instance timeline)
|
- Websocket (used for real-time updates on Instance timeline)
|
||||||
- Transcoding of audio files
|
|
||||||
|
|
||||||
Those features are not necessary to use your Funkwhale instance, and
|
Those features are not necessary to use your Funkwhale instance.
|
||||||
transcoding in particular is still in alpha-state anyway.
|
|
||||||
|
|
||||||
Ensure you have a recent version of apache2 installed on your server.
|
Ensure you have a recent version of apache2 installed on your server.
|
||||||
You'll also need the following dependencies::
|
You'll also need the following dependencies::
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
<script>
|
<script>
|
||||||
import {mapState} from 'vuex'
|
import {mapState} from 'vuex'
|
||||||
import url from '@/utils/url'
|
import url from '@/utils/url'
|
||||||
import formats from '@/audio/formats'
|
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
// import logger from '@/logging'
|
// import logger from '@/logging'
|
||||||
|
|
||||||
|
@ -52,13 +51,6 @@ export default {
|
||||||
let sources = [
|
let sources = [
|
||||||
{type: file.mimetype, url: file.path}
|
{type: file.mimetype, url: file.path}
|
||||||
]
|
]
|
||||||
formats.formats.forEach(f => {
|
|
||||||
if (f !== file.mimetype) {
|
|
||||||
let format = formats.formatsMap[f]
|
|
||||||
let url = `/api/v1/trackfiles/transcode/?track_file=${file.id}&to=${format}`
|
|
||||||
sources.push({type: f, url: url})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (this.$store.state.auth.authenticated) {
|
if (this.$store.state.auth.authenticated) {
|
||||||
// we need to send the token directly in url
|
// we need to send the token directly in url
|
||||||
// so authentication can be checked by the backend
|
// so authentication can be checked by the backend
|
||||||
|
|
Loading…
Reference in New Issue