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(); } } } } }