libspotify: иногда созданные плейлисты не получают имен

Я использую последнюю версию API libspotify (12.1.51). И я пишу с использованием C# и libspotify.NET (простая библиотека оболочки взаимодействия для libspotify). Я создал программу, которая создает плейлисты с помощью API libspotify. Я использую последний встроенный клиент Spotify для Windows для проверки моих созданных списков воспроизведения.

Я создал программу, которая ожидает имя списка воспроизведения и список URI дорожек или один URI альбома и создает соответствующий список воспроизведения. Если указан URI альбома, все дорожки из альбома будут добавлены в новый список воспроизведения, в противном случае предоставленный список URI дорожек будет использоваться для создания нового списка воспроизведения. Программа ждет до обратного вызова

playlist_update_in_progress

вызывается, и параметр done равен true, прежде чем принимать новые списки воспроизведения для создания.

Это работает хорошо, за исключением того, что иногда списки воспроизведения создаются без имен, но имеют все дорожки. Я могу просто попросить программу создать точно такой же плейлист, у которого нет имени, и он может сработать во второй раз. Это происходит случайным образом, но я заметил, что если я создаю около 200 списков воспроизведения, то, возможно, 5-10 списков воспроизведения не получат имен. Я вижу, как плейлисты добавляются в ваш клиент Spotify во время работы программы, создания плейлистов и случайного просмотра плейлистов без названий. Списки воспроизведения появляются почти одновременно с вызовом и выполнением обратного вызова, что равно true (не всегда, конечно, возможна задержка). Я попытался вручную переименовать списки воспроизведения в клиенте Spotify для Windows без проблем (длина имени списка воспроизведения была 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 и выполняется true. Затем он снова читает входные данные...

Любая помощь будет высоко оценен.

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 обратный вызов срабатывает перед выходом. В противном случае некоторые изменения могут не синхронизироваться со службой.

Другие вопросы по тегам