MusicLibraryItemArtist * MusicLibraryItemRoot::createArtist(const Song &s, bool forceComposer)
{
    QString aa=songArtist(s, forceComposer);
    MusicLibraryItemArtist *item=new MusicLibraryItemArtist(aa, Song::Standard==s.type ? s.albumArtist() : QString(), s.artistSortString(), this);
    m_indexes.insert(aa, m_childItems.count());
    m_childItems.append(item);
    return item;
}
MusicLibraryItemArtist * MusicLibraryItemRoot::artist(const Song &s, bool create)
{
    QString aa=songArtist(s);
    MusicLibraryItemArtist *artistItem=getArtist(aa);
    return artistItem ? artistItem : (create ? createArtist(s) : 0);
}
void DmapClient::parseSongs(QByteArray &array)
{
    char *data = array.data();
    char *end = data + (array.size() - 1);

    for(;std::memcmp(data, "mlit", 4); data++);

    for(int place = 0; data < end; place++)
    {
        data = adjustStatementBorder(data, "mlit", 4);
        data += 8;

        data = adjustStatementBorder(data, "miid", 4);
        data += 8;
        quint32 id = DmapStatement::byteToInt<quint32>(data);

        data = adjustStatementBorder(data, "minm", 4);
        data += 4;
        int nameSize = DmapStatement::byteToInt<quint32>(data);
        data += 4;
        QByteArray name(data, nameSize);

        data += nameSize;
        data = adjustStatementBorder(data, "asai", 4);
        data += 8;
        quint64 albumId = DmapStatement::byteToInt<quint64>(data);

        data += 8;
        data = adjustStatementBorder(data, "asar", 4);
        data += 4;
        int songArtistSize = DmapStatement::byteToInt<quint32>(data);
        data += 4;
        QByteArray songArtist(data, songArtistSize);

        data += songArtistSize;
        data = adjustStatementBorder(data, "asaa", 4);
        data += 4;
        int songAlbumArtistSize = DmapStatement::byteToInt<quint32>(data);
        data += 4;
        QByteArray songAlbumArtist(data, songAlbumArtistSize);

        data += songAlbumArtistSize;
        data = adjustStatementBorder(data, "as", 2);

        quint16 discNumber = 1;
        if(!std::memcmp(data, "asdn", 4))
        {
            data += 8;
            discNumber = DmapStatement::byteToInt<quint16>(data);
            data += 2;
            data = adjustStatementBorder(data, "astm", 4);
        }

        data += 8;
        quint32 songTime = DmapStatement::byteToInt<quint32>(data);

        data += 4;
        quint16 trackNumber;
        if(!std::memcmp(data, "astn", 4))
        {
            data += 8;
            trackNumber = DmapStatement::byteToInt<quint16>(data);
            data += 2;
        }
        else
        {
            trackNumber = library->getAlbum(albumId).lock()->getSongListLenght() + 1;
        }

        if(songArtist.size() != songAlbumArtist.size() || std::memcmp(songArtist, songAlbumArtist, songArtist.size()))
            library->addSong(QSharedPointer<Song>(new Song(id, name, songTime, trackNumber, discNumber, albumId, 1, songArtist)), place);
        else
            library->addSong(QSharedPointer<Song>(new Song(id, name, songTime, trackNumber, discNumber, albumId)), place);
        library->getAlbum(albumId).lock()->addSong(discNumber, trackNumber, id);

    }

    auto artistPtr = library->getArtistList();
    auto artistOrdered = library->getOrderedArtistList();
    auto albumPtr = library->getAlbumList();
    auto songPtr = library->getSongList();

    for(auto artist : *artistOrdered)
    {
        qDebug() << artistPtr->value(artist)->getId() << " : " << artistPtr->value(artist)->getName();

        for(auto album : *(artistPtr->value(artist)->getAlbumList()))
        {
            qDebug() << "\t" <<albumPtr->value(album)->getId() << " : " << albumPtr->value(album)->getName() <<" - " << albumPtr->value(album)->getSongListLenght();

            for(auto cd : *(albumPtr->value(album)->getSongList()))
            {
                qDebug() <<"\t\tCD";
                for(auto song : cd)
                {
                    qDebug() << "\t\t" <<songPtr->value(song)->getId() << " : " << songPtr->value(song)->getName() <<" - " << songPtr->value(song)->getDiscNumber() <<" - " << songPtr->value(song)->getTrackNumber();
                }
            }
        }
    }
}