kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
Removed transcoding support (#271)
rodzic
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 . import filters
|
||||
from . import forms
|
||||
from . import importers
|
||||
from . import models
|
||||
from . import permissions as music_permissions
|
||||
|
@ -324,42 +323,6 @@ class TrackFileViewSet(viewsets.ReadOnlyModelViewSet):
|
|||
except models.TrackFile.DoesNotExist:
|
||||
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):
|
||||
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
|
||||
|
||||
# transcode cache
|
||||
proxy_cache_path /tmp/funkwhale-transcode levels=1:2 keys_zone=transcode:10m max_size=1g inactive=7d;
|
||||
|
||||
# domain
|
||||
upstream funkwhale-api {
|
||||
# depending on your setup, you may want to udpate this
|
||||
|
@ -98,41 +95,6 @@ server {
|
|||
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/ {
|
||||
# django static files
|
||||
alias /srv/funkwhale/data/static/;
|
||||
|
|
|
@ -26,7 +26,6 @@ http {
|
|||
keepalive_timeout 65;
|
||||
|
||||
#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 {
|
||||
default upgrade;
|
||||
|
@ -46,38 +45,6 @@ http {
|
|||
internal;
|
||||
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 / {
|
||||
include /etc/nginx/funkwhale_proxy.conf;
|
||||
proxy_pass http://api:12081/;
|
||||
|
|
|
@ -16,10 +16,8 @@ The project relies on the following components and services to work:
|
|||
Hardware requirements
|
||||
---------------------
|
||||
|
||||
Funkwhale is not especially CPU hungry, unless you're relying heavily
|
||||
on the transcoding feature (which is basic and unoptimized at the moment).
|
||||
|
||||
On a dockerized instance with 2 CPUs and a few active users, the memory footprint is around ~500Mb::
|
||||
Funkwhale is not especially CPU hungry. On a dockerized instance with 2 CPUs
|
||||
and a few active users, the memory footprint is around ~500Mb::
|
||||
|
||||
CONTAINER MEM USAGE
|
||||
funkwhale_api_1 202.1 MiB
|
||||
|
@ -125,10 +123,8 @@ Apache2
|
|||
are not working yet:
|
||||
|
||||
- Websocket (used for real-time updates on Instance timeline)
|
||||
- Transcoding of audio files
|
||||
|
||||
Those features are not necessary to use your Funkwhale instance, and
|
||||
transcoding in particular is still in alpha-state anyway.
|
||||
Those features are not necessary to use your Funkwhale instance.
|
||||
|
||||
Ensure you have a recent version of apache2 installed on your server.
|
||||
You'll also need the following dependencies::
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
<script>
|
||||
import {mapState} from 'vuex'
|
||||
import url from '@/utils/url'
|
||||
import formats from '@/audio/formats'
|
||||
import _ from 'lodash'
|
||||
// import logger from '@/logging'
|
||||
|
||||
|
@ -52,13 +51,6 @@ export default {
|
|||
let sources = [
|
||||
{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) {
|
||||
// we need to send the token directly in url
|
||||
// so authentication can be checked by the backend
|
||||
|
|
Ładowanie…
Reference in New Issue