使用 Soundcloud 在 Django 中创建 Set API

create Set in Django with the Soundcloud API

我正在尝试使用 soundcloud 播放器进行试验,但是当我使用 API 教程中的代码时,出现以下错误:'Resource' 对象没有属性 '__getitem__'

我不明白为什么 embed_info['html'] 在 https://developers.soundcloud.com/docs/api/guide#playing 上所说的完全正确时不起作用。我正在尝试制作一个页面,该页面将根据我在网站上列出的轨道对象创建一组。

def sc(request):
    client = soundcloud.Client(client_id='my_id')

    # get a tracks oembed data
    track_url = 'http://soundcloud.com/forss/flickermood'
    embed_info = client.get('/oembed', url=track_url)

    # print the html for the player widget
    print embed_info['html']

    return render(request, 'rango/sc.html', {'embed' : embed_info})

查看 soundcloud-python github repoResource 对象的源代码,他们的文档似乎已过时。

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>

我相信这就是您要找的。

编辑:

要嵌入集合而不是曲目,您只需调用 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"

returns 包含轨道 13158665 和 6621631 的列表。

不幸的是,a) 无法使用带有 client.get('/tracks', ids='13158665,6621631')client.get('/tracks?ids=13158665,6621631') 的客户端直接重新创建此请求,或者仅通过传递 URL 我们成功地 curled 作为url 参数到 client.get('/oembed', url=our_clever_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:

当我只想要一个 track/playlist(通过资源 URL 作为url 查询参数),之前我能够使用 ids 查询参数通过 /tracks 端点检索多个单独的曲目。不幸的是,/oembed 端点不支持检索任意一组轨道 ID。你得试试别的。