From ce92747d8996d1362cf764d7b542cd5bd37d345e Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 12 May 2018 12:06:14 +0200 Subject: [PATCH] Fix #157: Can now import and play flac files If you ever need an empty flac file with metadata again: 1. Get a flac file (like https://archive.org/download/NineInchNailsTheSlip24bit96khz/01999999.flac) 2. Tag it with Musicbrainz Picard 3. Truncate it, keeping only tags with `ffmpeg -i in.flac -ss 0 -to 0.001 out.flac` Thanks @HgO for the trick! --- api/funkwhale_api/music/metadata.py | 40 +++++++++++++++++++++++++++- api/funkwhale_api/music/utils.py | 1 + api/tests/music/sample.flac | Bin 0 -> 9793 bytes api/tests/music/test_metadata.py | 17 ++++++++++++ changes/changelog.d/157.feature | 1 + front/src/audio/formats.js | 3 ++- 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 api/tests/music/sample.flac create mode 100644 changes/changelog.d/157.feature diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index a20069783..494256711 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -28,6 +28,13 @@ def get_id3_tag(f, k): raise TagNotFound(k) +def get_flac_tag(f, k): + try: + return f.get(k)[0] + except (KeyError, IndexError): + raise TagNotFound(k) + + def get_mp3_recording_id(f, k): try: return [ @@ -121,7 +128,38 @@ CONF = { 'getter': get_mp3_recording_id, }, } - } + }, + 'FLAC': { + 'getter': get_flac_tag, + 'fields': { + 'track_number': { + 'field': 'tracknumber', + 'to_application': convert_track_number + }, + 'title': { + 'field': 'title' + }, + 'artist': { + 'field': 'artist' + }, + 'album': { + 'field': 'album' + }, + 'date': { + 'field': 'date', + 'to_application': lambda v: arrow.get(str(v)).date() + }, + 'musicbrainz_albumid': { + 'field': 'musicbrainz_albumid' + }, + 'musicbrainz_artistid': { + 'field': 'musicbrainz_artistid' + }, + 'musicbrainz_recordingid': { + 'field': 'musicbrainz_trackid' + }, + } + }, } diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py index 49a639303..329a99bed 100644 --- a/api/funkwhale_api/music/utils.py +++ b/api/funkwhale_api/music/utils.py @@ -66,6 +66,7 @@ def compute_status(jobs): AUDIO_EXTENSIONS_AND_MIMETYPE = [ ('ogg', 'audio/ogg'), ('mp3', 'audio/mpeg'), + ('flac', 'audio/flac'), ] EXTENSION_TO_MIMETYPE = {ext: mt for ext, mt in AUDIO_EXTENSIONS_AND_MIMETYPE} diff --git a/api/tests/music/sample.flac b/api/tests/music/sample.flac new file mode 100644 index 0000000000000000000000000000000000000000..6eff1c06e43f6f536c2d810d0d059cc6af319f5e GIT binary patch literal 9793 zcmYfENpxmlU{F$EP+(wSILW|pQoMkc-2! zz~GZumS$?MXKJQrXke(#z`y_!3<+{{_Vx?)b#e`|H56rFU~u;L4e$?k4YCa>O3f=# z2uiKW%P$fFO9Vs)dAfUq*curaSSaLW=J7KyFt|8|xPk?A4NP?nOxZy~p25z}wuYPx z3=EO3jzM5qkX0a)J$)QQJpKJ_4fGip7y^R)T|%8*gKQmh67v*%^GkD5Qj4q|OG+}6 zON$kP@{5bDksSdtBg8Yr$JN%-(o)CL(h}rcpU5CjXV2ge6z2*uFfatU`nWm1vl73pzsGf%hu4q9?c40G%!mxGB*RoiDR&*pRJRDfuXaTe}HeG zJOcv*l4FDYgF6#No1bBe_o7#RG6Jl#G09DUGYl$(KpA=o*{Ga$s) zC$S{Y1{7+Z&aQsJuC^H^B?VUc`pHG9i6xn3smb}dx%qj;dih1^`Z<}&sd>ez#rjE= zx_QaE#fkdHdItKX#rhU#UIaVL)5X@%D9O}3#l%cE(a_RJ*Tm8?RX5SnFiqDyCDF{x z+|nS?FxgNH5v{=?jv=AJw)tsknaP=nIntD zfx*?!-P6w%Zz}Z7OwLG5%~1#`&B;kE0woQwv%v``I485f65UgzqzYk>W>*(aM_ZT7 z^vsgP90lLhl*~k=G#nBc;A)$glT?}u%7?z55onGDDTT!zJjXeLGMH=J`R4f{+4WiiLrJiGhLX`NM5q=b|+xZ(ROy|Dy!2>q;6og-y&dV0f_La6s$SYrb