私は C# で .NET Spotify クライアントを作成しています。LibspotifyDotNet を使用して libspotify ライブラリをラップし、Libspotify バージョン 12.1.51 を使用しています。
初めてセッション プレイリスト コンテナをロードするときに、奇妙な動作が発生します (つまり、既存の設定の場所がない場合)。アプリは libspotify の関数をチェックして、プレイリスト コンテナがロードされていることを確認します。これは true を返します。これにより、すべてのプレイリストを取得しても安全であると判断されます。プレイリスト コンテナー内のプレイリストの数を要求すると、0 になるため、何も読み込まれません。この後しばらくすると、プレイリストが読み込まれたことを示すコールバックが返されます。これは、アプリが後続の実行でプレイリストを正常に取得することを意味しますが、最初の実行では取得しません。このコールバックに追加の 'isPlaylistReallyLoaded' フラグを設定したほうがよいでしょうか? それとも、ここに何か問題がありますか?デバッガーの出力を示してから、関連するメソッドをいくつか示します。
デバッグ出力
libspotify> 09:27:28.211 I [user_cache:135] UserCache::initiateGetUsers() will query for 1 users
libspotify> 09:27:28.231 I [ap:1752] Connecting to AP ap.gslb.spotify.com:4070
The thread 'Win32 Thread' (0x172c) has exited with code 0 (0x0).
libspotify> 09:27:28.264 E [c:/Users/spotify-buildagent/BuildAgent/work/1e0ce8a77adfb2dc/client/core/network/proxy_resolver_win32.cpp:215] WinHttpGetProxyForUrl failed
libspotify> 09:27:28.337 I [offline-mgr:2084] Storage has been cleaned
The thread 'Win32 Thread' (0x16f8) has exited with code 0 (0x0).
Itterating over loaded playlists
libspotify> 09:27:44.155 E [ap:1694] AP Socket Error: Undefined Error 0x4E20 (20000)
libspotify> 09:27:45.381 E [ap:3915] Connection error: 117
libspotify> 09:27:54.065 I [ap:1752] Connecting to AP ap.gslb.spotify.com:4070
0 playlists found
libspotify> 09:27:56.290 I [ap:1226] Connected to AP: 78.31.12.21:4070
libspotify> 09:28:03.035 I [user_cache:135] UserCache::initiateGetUsers() will query for 1 users
libspotify> 09:28:03.177 I [user_cache:135] UserCache::initiateGetUsers() will query for 100 users
libspotify> 09:28:03.271 W [core/playlist/playlist.h:45] Adding observer while updating
libspotify> 09:28:03.297 W [core/playlist/playlist.h:45] Adding observer while updating
libspotify> 09:28:03.325 W [core/playlist/playlist.h:45] Adding observer while updating
libspotify> 09:28:03.353 W [core/playlist/playlist.h:45] Adding observer while updating
playlist_added at position 0
playlist_added at position 1
playlist_added at position 2
playlist_added at position 3
playlist_added at position 4
playlist_added at position 5
playlist_added at position 6
playlist_added at position 7
playlist_added at position 8
container_loaded
libspotify> 09:28:03.644 W [core/playlist/playlist.h:45] Adding observer while updating
「プレイリストを反復処理中」と書かれている行は、プレイリストの読み込み状態を確認したところ、真であることがわかり、GetAllPlaylists() メソッドに入ります。そのループが実行された後に 0 プレイリストが見つかったことを示す行が出力され、sp_playlistcontainer_num_playlists をチェックしたときに返されたプレイリストの数が示されます。「container_loaded」と記述されている行は、プレイリスト コンテナの container_loaded コールバックへの応答です。
プレイ中のメソッド
// this is the method that is called upon login to get the user's playlists
public static List<PlaylistContainer.PlaylistInfo> GetAllSessionPlaylists()
{
waitFor(delegate
{
return PlaylistContainer.GetSessionContainer().IsLoaded
&& PlaylistContainer.GetSessionContainer().PlaylistsAreLoaded;
}, REQUEST_TIMEOUT);
return PlaylistContainer.GetSessionContainer().GetAllPlaylists();
}
PlaylistContainer モデル クラス内
public static PlaylistContainer GetSessionContainer()
{
if (_sessionContainer == null) {
if (Session.GetSessionPtr() == IntPtr.Zero)
throw new InvalidOperationException("No valid session.");
_sessionContainer = new PlaylistContainer(libspotify.sp_session_playlistcontainer(Session.GetSessionPtr()));
}
return _sessionContainer;
}
public bool IsLoaded {
get {
return libspotify.sp_playlistcontainer_is_loaded(_containerPtr);
}
}
public bool PlaylistsAreLoaded {
get {
if (!this.IsLoaded)
return false;
int count = libspotify.sp_playlistcontainer_num_playlists(_containerPtr);
for (int i = 0; i < count; i++) {
if(libspotify.sp_playlistcontainer_playlist_type(_containerPtr, i) == libspotify.sp_playlist_type.SP_PLAYLIST_TYPE_PLAYLIST) {
using (Playlist p = Playlist.Get(libspotify.sp_playlistcontainer_playlist(_containerPtr, i))) {
if (!p.IsLoaded)
return false;
}
}
}
return true;
}
}
public List<PlaylistInfo> GetAllPlaylists() {
if (!GetSessionContainer().IsLoaded)
throw new InvalidOperationException("Container is not loaded.");
List<PlaylistInfo> playlists = new List<PlaylistInfo>();
Logger.WriteDebug("Itterating over loaded playlists");
int count = libspotify.sp_playlistcontainer_num_playlists(_containerPtr);
for (int i = 0; i < count; i++) {
if (libspotify.sp_playlistcontainer_playlist_type(_containerPtr, i) == libspotify.sp_playlist_type.SP_PLAYLIST_TYPE_PLAYLIST) {
IntPtr playlistPtr = libspotify.sp_playlistcontainer_playlist(_containerPtr, i);
playlists.Add(new PlaylistInfo() {
Pointer = playlistPtr,
PlaylistType = libspotify.sp_playlist_type.SP_PLAYLIST_TYPE_PLAYLIST,
ContainerPtr = _containerPtr,
Name = Functions.PtrToString(libspotify.sp_playlist_name(playlistPtr))
});
}
}
Logger.WriteDebug("{0} playlists found", count);
return playlists;
}
Jamcast プラグインから多くの API インタラクション コードを借用し (実際に存在する唯一の例)、見つけた問題を修正しました。しかし、Spotify の API の初心者としてこの問題に取り組んだことから、これは良い開始方法のように思えました。少しずつ少しずつ書き直しています。追加の質問として、Jamcast の内容を完全に書き直して、公開する前に最初からやり直す価値はありますか?
すでにたくさんあることは承知していますが、さらに情報が必要な場合はお知らせください。このlibspotify noobを提供していただけると助かります。