Как уже упоминалось в комментариях, вокруг используется много кода, использующего неудачный не открытый исходный код libspotify.Приведены примеры API, в которых тщательно пропущен способ перебора всех плейлистов.
Вы упомянули, что вам нужно что-то, что может подключаться для спойтинга (онлайн-API, безусловно, то, что Spotify хотел бы, чтобы все использовали), но япочти уверен, что то же самое можно сделать в автономном режиме.Как вы сами сказали, файлы могут быть скопированы.
Расположен в:
~ / .config / spotify / Users / name /
или
{USER_APP_DATA} / Spotify / Users / {USER_ID}
Вы, вероятно, уже можете сказать, что я не фанат закрытых библиотек, ограничивающих доступ к тому, что я могу или не могу делать.Поэтому я придумала простую программу, которая может печатать имена всех сохраненных плейлистов.Это достаточно полезно, потому что я обычно добавляю по одному альбому в каждый плейлист.
Я уверен, что его можно будет доработать, добавив отдельные треки.
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
int main(int argc, char *argv[]) {
std::vector<char> vbuf;
unsigned int len;
std::vector<char>::iterator bpos,dpos,epos;
std::ifstream in("playlist.bnk", std::ios::in|std::ios::binary);
if (in) {
in.seekg(0,std::ios::end);
len = in.tellg();
vbuf.resize(len);
in.seekg(0,std::ios::beg);
in.read(&vbuf[0],len);
for(std::vector<char>::iterator it = vbuf.begin(); it != vbuf.end(); ++it) {
if (*it == (char)0x02 && *(it+1) == (char)0x09) {
bpos = it+3;
}
if (*it == (char)0xE2 && *(it+1) == (char)0x80 && *(it+2) == (char)0x93 && bpos != vbuf.end()) {
dpos = it;
}
if (*it == (char)0x18 && *(it+1) == (char)0x01 && *(it+2) == (char)0x19 && dpos != vbuf.end()) {
epos = it;
}
if (bpos != vbuf.end() && dpos != vbuf.end() && epos != vbuf.end()) {
for(std::vector<char>::iterator it2 = bpos; it2 < dpos; ++it2) {
std::cout << *it2;
}
for(std::vector<char>::iterator it2 = dpos; it2 < epos; ++it2) {
std::cout << *it2;
}
std::cout << std::endl;
bpos = vbuf.end();
dpos = vbuf.end();
epos = vbuf.end();
}
}
}
}