from essentia.standard import Danceability from essentia.standard import MonoLoader from essentia.standard import RhythmDescriptors import requests def analyze_audio(audio_url): file_path = download_audio(audio_url) loader = get_audio_loader(file_path) audio_input = loader() result = { 'bpm': get_bpm(audio_input), 'danceability': get_danceability(audio_input)} return result def download_audio(audio_url): # @todo: use Tempfile or whatever it is local_path = '/tmp/' + audio_url.split('/')[-1] response = requests.get(audio_url, stream=True) with open(local_path, 'wb') as local_file: for chunk in response.iter_content(chunk_size=1024): if chunk: local_file.write(chunk) return local_path def get_audio_loader(file_path): """ Creates an audio loader *function* that loads audio data from the given file. """ return MonoLoader(filename=file_path) def get_rhythm_descriptors(audio_input): rhythm = RhythmDescriptors() return rhythm(audio_input) def get_bpm(audio_input): descriptors = get_rhythm_descriptors(audio_input) return descriptors[1] def get_danceability(audio_input): dance_func = Danceability() raw_danceability = dance_func(audio_input) return raw_danceability / 3.0