libspotify を使用して、(データベースに保存されている) Spotify ユーザー名のリストを反復処理し、これらのプレイリスト コンテナーを作成し、コンテナー内のすべてのプレイリストとすべてのプレイリスト内のすべてのトラックを取得しています。
私は次のようにこれをやっています:
static sp_playlistcontainer_callbacks pc_callbacks = {
NULL,
NULL,
NULL,
&container_loaded
};
static sp_playlist_callbacks pl_callbacks = {
NULL,
NULL,
NULL,
NULL,
&playlist_callback,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};
static void container_loaded(sp_playlistcontainer *pc, void *userdata)
{
char * username = ((char *) userdata);
sp_playlistcontainer_remove_callbacks(pc, &pc_callbacks, username);
int num_playlists = sp_playlistcontainer_num_playlists(pc);
std::cout << "User: " << username << " has : " << num_playlists << std::endl;
//for each playlist, analyse each song
//sp_playlist currentPlaylist;
for(int i=0;i<num_playlists;i++)
{
sp_playlist * currentPlaylist = sp_playlistcontainer_playlist(pc,i);
sp_playlist_add_callbacks(currentPlaylist, &pl_callbacks, username);
}
sp_playlistcontainer_release(pc);
}
static void playlist_callback(sp_playlist *pl, void *userdata)
{
char * username = ((char *) userdata);
if(!sp_playlist_is_loaded(pl))
{
return;
}
sp_playlist_remove_callbacks(pl, &pl_callbacks, username);
int numTracks = sp_playlist_num_tracks(pl);
for (int i=0;i<numTracks;i++)
{
//do track processing
}
std::cout << "Found: " << sp_playlist_name(pl) << std::endl;
}
//main function
//for(int i=0;...
sp_playlistcontainer * plc = sp_session_publishedcontainer_for_user_create(g_session, usernames[i]);
sp_playlistcontainer_add_callbacks(
plc,
&pc_callbacks,
usernames[i]
);
//end for
//end main
//more functions etc...
プレイリスト コンテナ コールバックは問題なく動作しますが、プレイリスト コールバックは一部のプレイリストでしか機能しないことがあります。毎回、すべてのプレイリストの 95% を正しく取得できます。コールバックを発生させずに、コールバックを 30 分以上残しました。
何か不足していますか、それとも回避する必要があるバグがありますか?
御時間ありがとうございます。
よろしく、 ロブ