这个问题听起来很简单,但我找不到方法来检查轨道 uri 是否正确。
例如,通过给定的有效轨道 uri spotify:track:5Z7ygHQo02SUrFmcgpwsKW 播放轨道的正常过程是:
1) 通过 sp_link_create_from_string(const char *$track_uri) 获取 sp_link*
2) 通过 sp_link_as_track(sp_link*) 获取 sp_track*
3) sp_track_add_ref(sp_track*)
4) 如果 sp_track_error() 返回 SP_ERROR_OK 或 SP_ERROR_IS_LOADING,但 metadata_updated 和 SP_ERROR_OK,则 sp_session_player_load 和 sp_session_player_play 加载并播放轨道。
5) 当轨道结束时 sp_track_release() 和 sp_session_player_unload()。
现在,如果用户在 Spotify 轨道 URI 上输入错误并尝试播放 spotify:track:5Z7ygHQo02SUrFmcgpwsKQ (最后一个字符 Q 是一个拼写错误,应为 >W)。过程中所有可能的错误检查都不会返回任何错误:
步骤 1) sp_link 不为 NULL
步骤 2) sp_track* 不为 NULL
步骤 3) 返回 SP_ERROR_OK
第 4 步)sp_track_error() 返回 SP_ERROR_IS_LOADING,metadata_updated 永远不会被调用,当然程序会挂起。
轨道加载前的检查无法发现轨道 uri 的无效性。 API sp_track_availability 听起来像是一种方法,但如果未加载轨道,它将始终返回 NOT AVAILABLE,但如果轨道 uri 不正确,则永远不会加载轨道。
我是否错过了什么或误解了 API?
最佳答案
您可以通过检查链接类型来检查 uri 是否有效:
enum sp_linktype {
SP_LINKTYPE_INVALID = 0,
SP_LINKTYPE_TRACK = 1,
SP_LINKTYPE_ALBUM = 2,
SP_LINKTYPE_ARTIST = 3,
SP_LINKTYPE_SEARCH = 4,
SP_LINKTYPE_PLAYLIST = 5,
SP_LINKTYPE_PROFILE = 6,
SP_LINKTYPE_STARRED = 7,
SP_LINKTYPE_LOCALTRACK = 8,
SP_LINKTYPE_IMAGE = 9
}
这使我们可以像这样执行链接检查:
- 检查 sp_link_type(link) == SP_LINKTYPE_TRACK
- 从 sp_link_as_track(link) 创建 sp_track* 轨道,或者 sp_track_get_playable(sp_link*, sp_session*)
- 等待加载,然后检查可用性
关于spotify - libspotify : how to find out if a track uri is correct and playable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12011497/