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