【问题标题】:libspotify: sometimes created playlists get no nameslibspotify:有时创建的播放列表没有名字
【发布时间】:2013-02-07 12:52:28
【问题描述】:

我正在使用最新版本的 libspotify API (12.1.51)。我正在使用 C# 和 libspotify.NET(libspotify 的简单互操作包装库)进行编码。我已经构建了一个使用 libspotify API 创建播放列表的程序。我正在使用适用于 Windows 的最新原生 Spotify 客户端来检查我创建的播放列表。

我已经构建了一个程序,它等待播放列表名称和曲目 URI 列表或一个专辑 URI 并创建相应的播放列表。如果提供了专辑 URI,则专辑中的所有曲目都将添加到新的播放列表中,否则提供的曲目 URI 列表将用于创建新的播放列表。程序一直等到回调

playlist_update_in_progress

在接受要创建的新播放列表之前调用并且 done 参数等于 true。

它运行良好,只是有时创建的播放列表没有名称但包含所有曲目。我可以告诉程序创建完全相同但没有名称的播放列表,它可能会在第二次工作。它是随机发生的,但我注意到如果我创建大约 200 个播放列表,那么可能有 5-10 个播放列表没有名字。当程序正在运行并创建播放列表并随机看到没有名称的播放列表时,我可以看到播放列表正在添加到您的 Spotify 客户端中。播放列表几乎在调用回调的同时出现,并且 done 等于 true(当然,并非总是如此,可能会有延迟)。我尝试在 Windows 的 Spotify 客户端中手动重命名播放列表,没有任何问题(播放列表名称长度为 0 或空字符串,如果您愿意)。原生 Spotify 客户端甚至不允许空的播放列表名称。

我用:

sp_playlistcontainer_add_new_playlist

添加一个新的播放列表,我尝试使用 IntPtr 和一个 C# 字符串传递给它。两种都试了:

[DllImport("libspotify")]
public static extern IntPtr sp_playlistcontainer_add_new_playlist(IntPtr playlistContainerPtr, string name);

[DllImport("libspotify")]
public static extern IntPtr sp_playlistcontainer_add_new_playlist(IntPtr playlistContainerPtr, IntPtr namePtr);

我也试过了

sp_playlist_rename

多次重命名播放列表(作为某种修复)但没有成功。我不知道创建播放列表时服务器会发生什么。这是一个错误还是发生了什么?

我确实尝试了很多技巧来完成这项工作,但无济于事。

有关该计划的更多信息:

首先它连接到 Spotify,然后等待一些控制台输入。 它检查以下字符串的输入:

使用名称和曲目列表创建播放列表:

createplaylistfromtracks "Tracks playlist" spotify:track:36MuLw248uzLPtrJ6073ZR spotify:track:5WPkvx0MARhlWhXp1sJg4k spotify:track:1VrdbSFVU9wJkuDM2sWYVe spotify:track:66RG0BBwpQqHxZs06UUyeo spotify:track:0zp3uPuhnARR1XYsgg5JLV

并使用专辑 URI 中的名称和曲目列表创建播放列表:

createplaylistfromalbum "Album playlist" spotify:album:5rVwDKRKa1FjDlLofDZyRb

然后程序解析输入并创建播放列表并设置标志 Busy = true 以便控制台在 Busy = false 之前不会读取任何输入,这发生在调用 playlist_update_in_progress 回调并且 done 为 true 时。然后它再次读取输入...

任何帮助将不胜感激。

【问题讨论】:

  • 您能否在我们的桌面客户端查看播放列表是否以正确的名称显示在那里?
  • 这正是我要检查的地方,我发现他们没有任何播放列表名称。 “在我的 Spotify 客户端中”是指您的 Spotify 客户端。
  • 你好,iKendac。感谢您花时间回答我的问题。我附上了 Spotify 客户端的打印屏幕,清楚地显示了问题:dropbox.com/s/2bp7psw0874zvel/playlist_no_name.png 在创建播放列表后,我还读取了我的 Spotify 帐户中所有播放列表的列表,如下所示:IEnumerable list = PlaylistContainer. GetSessionContainer().GetAllPlaylists().Where(p => Playlist.Get(p.Pointer) != null && string.IsNullOrWhiteSpace(p.Name) || p.Name == "播放列表测试!");我只得到 1 个名称 = "" 的播放列表!
  • 哦,我不确定,但这似乎是您遇到的某种错误。我进行了调试,并且我创建的所有播放列表对象都有名称。如果你愿意,同样的。我已经调试了很多。我们真的需要解决这个问题,因为这个实用程序对我们公司来说非常重要。

标签: api spotify playlist libspotify


【解决方案1】:

我们有许多在内部和外部运行 libspotify 的应用程序,我们没有遇到类似的库问题,这表明这不是 libspotify 中的错误。

一些可能导致这种情况发生的指针:

  • 确保正确管理线程。当您收到notify_main_thread() 调用(到达某个后台线程)时,您必须从主线程异步调用sp_sesion_process_events(),因此您需要确保将其编组到主线程正确。如果这个过程不能正常工作,事情就会开始变得奇怪。

  • 由于您正在执行许多操作,请确保 libspotify 有时间将您的所有更改与服务同步。 playlist_update_in_progress 旨在在播放列表发生多个突变时通知您,并且在从其他地方传入更改时通常很有用。相反,playlist_state_changed 是您收听此类更改所需要的(通常,在重命名后,我相信播放列表在应用更改时进入“加载”状态,然后退出(即,sp_playlist_is_loading 返回false 再次)一旦完成。

  • 此外,当您退出应用程序时,请确保执行sp_session_logout() 调用并等到logged_out 回调被触发后再退出。否则,某些更改可能不会与服务同步。

【讨论】:

  • 感谢您的回答。我会检查这些点。但是 sp_playlist_is_loading 真的存在吗?我用谷歌搜索了 0 个结果。但是 sp_playlist_is_loaded 确实存在。你说的是这个功能吗?添加新播放列表后,state_changed 回调被调用 5 次。如果我不使用 playlist_update_in_progress 回调,我如何知道播放列表何时添加并完成加载?可能是播放列表仍处于加载阶段,并且不知何故并未完全完成,因此永远不会设置名称。仅当我快速添加多个播放列表时才会出现此行为谢谢
  • 是的,我的意思是 sp_playlist_is_loaded。当你得到 state_changed 时,检查 is_loaded 和其他属性,这样你就可以看到状态是什么。 update_in_progress 与名称无关,只是跟踪变化。
  • is_loaded 每次调用 true 时都会返回 state_change - 它被调用 5 次。至少在调用add_new_playlist 函数之后。无论如何,如果我通过 API 获得播放列表名称,那就是正确的。所以调试非常困难。只是客户端将其显示为空。这就是为什么我认为这是一个错误。但我不是指责,只是想知道。谢谢。
  • 既然名称总是正确的(当通过 libspotify API 读取它时),那么它肯定是其他错误 - 这使得客户端显示一个空字符串作为名称。如果我能弄清楚该怎么做,那就太棒了。使用state_change 对我没有用。仍然无法弄清楚如何知道播放列表已完成加载,因为它总是返回 true。
  • 确保您正在正确运行notify_main_thread() 处理。如果这是不正确的,网络线程可能会停止,这意味着本地更改不会在服务器上结束。播放列表服务也可能出现问题,这种情况可能不时发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多