import requests
import time
from zounds.soundfile import AudioMetaData
[docs]class FreeSoundSearch(object):
"""
Produces an iterable of :class:`zounds.soundfile.AudioMetaData` instances
for every result from a https://freesound.org search
Args:
api_key (str): Your freesound.org API key (get one here:
(http://freesound.org/apiv2/apply/))
query (str): The text query to perform
Raises
ValueError: when `api_key` and/or `query` are not supplied
Examples:
>>> from zounds import FreeSoundSearch
>>> fss = FreeSoundSearch('YOUR_API_KEY', 'guitar')
>>> iter(fss).next()
{'description': u'Etude of Electric Guitar in Dm. Used chorus and reverberation effects. Size 6/4. Tempo 100. Gloomy and sentimental.', 'tags': [u'Etude', u'Experemental', u'Guitar', u'guitar', u'Electric', u'Chorus'], 'uri': <Request [GET]>, 'channels': 2, 'licensing': u'http://creativecommons.org/licenses/by/3.0/', 'samplerate': 44100.0}
See Also:
:class:`InternetArchive`
:class:`PhatDrumLoops`
:class:`zounds.soundfile.AudioMetaData`
"""
def __init__(self, api_key, query, n_results=10, delay=0.2):
super(FreeSoundSearch, self).__init__()
if not api_key:
raise ValueError('You must supply a freesound.org API key')
if not query:
raise ValueError('You must supply a text query')
self.delay = delay
self.n_results = n_results
self.query = query
self.api_key = api_key
def _get_metadata_by_id(self, _id):
sound_data = requests.get(
'http://www.freesound.org/apiv2/sounds/{_id}'.format(**locals()),
params={'token': self.api_key}
)
sound_data.raise_for_status()
return sound_data.json()
def _freesound_to_audio_metadata(self, data):
request = requests.Request(
method='GET',
url=data['previews']['preview-hq-ogg'],
params={'token': self.api_key})
web_url = 'https://freesound.org/people/{username}/sounds/{id}/'\
.format(**data)
return AudioMetaData(
uri=request,
samplerate=data['samplerate'],
channels=data['channels'],
licensing=data['license'],
description=data['description'],
tags=data['tags'],
web_url=web_url)
def get_by_id(self, freesound_id):
data = self._get_metadata_by_id(freesound_id)
print(data)
return self._freesound_to_audio_metadata(data)
def _iter_results(self, link=None):
if link:
results = requests.get(link, params={'token': self.api_key})
else:
results = requests.get(
'http://www.freesound.org/apiv2/search/text',
params={
'query': self.query,
'token': self.api_key
})
time.sleep(self.delay)
results.raise_for_status()
results = results.json()
for r in results['results']:
yield self._get_metadata_by_id(r['id'])
# prevent 429 "Too Many Requests" responses
time.sleep(self.delay)
for r in self._iter_results(results['next']):
yield r
def __iter__(self):
for i, data in enumerate(self._iter_results()):
if i > self.n_results:
break
yield self._freesound_to_audio_metadata(data)