Resolve "In-place imports cannot be transcoded"

merge-requests/622/head
Vierkantor 2019-01-29 09:32:35 +01:00 zatwierdzone przez Eliot Berriot
rodzic db8427f30c
commit 0efdb6d980
4 zmienionych plików z 43 dodań i 3 usunięć

Wyświetl plik

@ -7,6 +7,7 @@ import uuid
import markdown import markdown
import pendulum import pendulum
import pydub
from django.conf import settings from django.conf import settings
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
@ -780,6 +781,15 @@ class Upload(models.Model):
"size": self.get_file_size(), "size": self.get_file_size(),
} }
def get_audio_segment(self):
input = self.get_audio_file()
if not input:
return
input_format = utils.MIMETYPE_TO_EXTENSION[self.mimetype]
audio = pydub.AudioSegment.from_file(input, format=input_format)
return audio
def save(self, **kwargs): def save(self, **kwargs):
if not self.mimetype: if not self.mimetype:
if self.audio_file: if self.audio_file:
@ -824,10 +834,9 @@ class Upload(models.Model):
0 0
] + ".{}".format(format) ] + ".{}".format(format)
version.audio_file.save(new_name, f) version.audio_file.save(new_name, f)
utils.transcode_file( utils.transcode_audio(
input=self.audio_file, audio=self.get_audio_segment(),
output=version.audio_file, output=version.audio_file,
input_format=utils.MIMETYPE_TO_EXTENSION[self.mimetype],
output_format=utils.MIMETYPE_TO_EXTENSION[mimetype], output_format=utils.MIMETYPE_TO_EXTENSION[mimetype],
) )
version.size = version.audio_file.size version.size = version.audio_file.size

Wyświetl plik

@ -75,5 +75,9 @@ def get_actor_from_request(request):
def transcode_file(input, output, input_format, output_format, **kwargs): def transcode_file(input, output, input_format, output_format, **kwargs):
with input.open("rb"): with input.open("rb"):
audio = pydub.AudioSegment.from_file(input, format=input_format) audio = pydub.AudioSegment.from_file(input, format=input_format)
return transcode_audio(audio, output, output_format, **kwargs)
def transcode_audio(audio, output, output_format, **kwargs):
with output.open("wb"): with output.open("wb"):
return audio.export(output, format=output_format, **kwargs) return audio.export(output, format=output_format, **kwargs)

Wyświetl plik

@ -374,6 +374,32 @@ def test_listen_transcode(factories, now, logged_in_api_client, mocker):
) )
@pytest.mark.parametrize("serve_path", [("/host/music",), ("/app/music",)])
def test_listen_transcode_in_place(
serve_path, factories, now, logged_in_api_client, mocker, settings
):
settings.MUSIC_DIRECTORY_PATH = "/app/music"
settings.MUSIC_DIRECTORY_SERVE_PATH = serve_path
upload = factories["music.Upload"](
import_status="finished",
library__actor__user=logged_in_api_client.user,
audio_file=None,
source="file://" + os.path.join(DATA_DIR, "test.ogg"),
)
assert upload.get_audio_segment()
url = reverse("api:v1:listen-detail", kwargs={"uuid": upload.track.uuid})
handle_serve = mocker.spy(views, "handle_serve")
response = logged_in_api_client.get(url, {"to": "mp3"})
assert response.status_code == 200
handle_serve.assert_called_once_with(
upload, user=logged_in_api_client.user, format="mp3"
)
def test_user_can_create_library(factories, logged_in_api_client): def test_user_can_create_library(factories, logged_in_api_client):
actor = logged_in_api_client.user.create_actor() actor = logged_in_api_client.user.create_actor()
url = reverse("api:v1:libraries-list") url = reverse("api:v1:libraries-list")

Wyświetl plik

@ -0,0 +1 @@
Fix transcoding of in-place imported tracks (#688)