查看 soundcloud-python github repo 中 Resource 对象的源代码,他们的文档似乎已经过时了。
Resource 定义了 __getattr__ 方法,但没有定义 __getitem__ 方法。这意味着您将不得不使用点符号来访问您感兴趣的值,而不是切片符号。改变:
print embed_info['html']
到
print embed_info.html
输出:
<iframe width="100%" height="400" scrolling="no" frameborder="no"
src="https://w.soundcloud.com/player/?visual=true&url=https%3A%2F
%2Fapi.soundcloud.com%2Ftracks%2F293&show_artwork=true&
client_id=96e00f360883e6ef77c531acfc8ee4c3"></iframe>
我相信这就是您正在寻找的。p>
编辑:
要嵌入 Set 而不是 Track,您只需调用 client.get 并将 url 参数设置为相关播放列表的 URL。要获取 ID 为 405726 的播放列表的 oembed 数据:
def sc(request):
client = soundcloud.Client(client_id='my_id')
# get a playlist's oembed data
playlist_url = "http://api.soundcloud.com/playlists/405726"
embed_info = client.get('/oembed', url=playlist_url)
# print the html for the player widget
print embed_info.html
return render(request, 'rango/sc.html', {'embed' : embed_info})
编辑 2:
关于为任意一组曲目获取嵌入的主题:
您可以使用/tracks 端点上的ids 查询参数在单个请求中查询多个不相关的轨道。它接受以逗号分隔的曲目 ID 列表。用法:
$ curl "http://api.soundcloud.com/tracks?client_id=YOUR_CLIENT_ID&ids=13158665,6621631"
返回一个包含轨道 13158665 和 6621631 的列表。
不幸的是,a) 无法直接使用带有client.get('/tracks', ids='13158665,6621631') 或client.get('/tracks?ids=13158665,6621631') 的客户端重新创建此请求,或者仅通过将我们成功curled 作为url 参数传递给client.get('/oembed', url=our_clever_url) 的URL。
至少,我们发现了幸运的是,我们总是可以在提供的客户端之外下拉来测试我们是否可以做我们需要的事情。使用 requests 库,我们可以查询 API 本身,无包装:
import requests
client_id='my-id'
track_ids = ["13158665", "6621631"]
tracks_url ='http://api.soundcloud.com/tracks'
payload = {'client_id': client_id, 'ids': ','.join(track_ids)}
response = requests.get(tracks_url, params=payload)
print response.status_code
print response.json()
所以我们至少可以在一个请求中通过 id 手动检索任意一组曲目。
现在的问题是:/oembed 端点会接受带有ids 查询参数的 URL 并做出相应的响应吗?还需要测试,一会儿再更新。
编辑 3:
当我只想要一个曲目/播放列表(通过资源 URL 作为 url 查询参数传递)时,我能够让 /oembed 端点手动返回 XML,而之前我能够检索多个通过/tracks 端点使用ids 查询参数的单个轨道。不幸的是,/oembed 端点不支持检索任意一组轨道 ID。您必须尝试其他方法。