void MediaDeviceTrack::setAlbumArtist( const QString &newAlbumArtist ) { if( !m_collection ) return; if( m_album.isNull() || newAlbumArtist.isEmpty() ) return; MediaDeviceArtistPtr artistPtr; ArtistMap artistMap = m_collection.data()->memoryCollection()->artistMap(); if( artistMap.contains( newAlbumArtist ) ) artistPtr = MediaDeviceArtistPtr::staticCast( artistMap.value( newAlbumArtist ) ); else { artistPtr = MediaDeviceArtistPtr( new MediaDeviceArtist( newAlbumArtist ) ); artistMap.insert( newAlbumArtist, ArtistPtr::staticCast( artistPtr ) ); } m_album->setAlbumArtist( artistPtr ); m_collection.data()->memoryCollection()->acquireWriteLock(); m_collection.data()->memoryCollection()->setArtistMap( artistMap ); m_collection.data()->memoryCollection()->releaseLock(); }
void TestSingleCollectionTreeItemModel::testRemoveArtist() { Collections::CollectionTestImpl *coll = new Collections::CollectionTestImpl( "test" ); addMockTrack( coll, "track1", "artist1", "album1" ); addMockTrack( coll, "track2", "artist2", "album2" ); QList<CategoryId::CatMenuId> levels; levels<< CategoryId::Artist << CategoryId::Album; SingleCollectionTreeItemModel *model = new SingleCollectionTreeItemModel( coll, levels ); loadChildren( model, QModelIndex() ); QCOMPARE( model->rowCount( QModelIndex() ), 2 ); { QSet<QString> artists; QModelIndex idx1 = model->index( 0, 0, QModelIndex() ); artists << model->data( idx1, Qt::DisplayRole ).toString(); QModelIndex idx2 = model->index( 1, 0, QModelIndex() ); artists << model->data( idx2, Qt::DisplayRole ).toString(); QSet<QString> expected; expected << "artist1" << "artist2"; QCOMPARE( artists, expected ); } ArtistMap map = coll->mc->artistMap(); map.remove( "artist2" ); //album and track are still part of the collection coll->mc->setArtistMap( map ); model->slotFilter(); loadChildren( model, QModelIndex() ); QCOMPARE( model->rowCount( QModelIndex() ), 1 ); { QModelIndex artist1Index = model->index( 0, 0, QModelIndex() ); QCOMPARE( model->data( artist1Index, Qt::DisplayRole ).toString(), QString( "artist1" ) ); } delete model; delete coll; }
void MediaDeviceTrack::setArtist( const QString &newArtist ) { if( !m_collection ) return; MediaDeviceArtistPtr artistPtr; MediaDeviceTrackPtr track( this ); ArtistMap artistMap = m_collection.data()->memoryCollection()->artistMap(); // do cleanup of soon to be previous artist artistPtr = m_artist; // remove track from previous artist's tracklist if ( !artistPtr.isNull() ) { artistPtr->remTrack( track ); // if artist's tracklist is empty, remove artist from artistmap if( artistPtr->tracks().isEmpty() ) artistMap.remove( artistPtr->name() ); } // change to a new artist // check for the existence of the artist to be set to, // if artist exists, reuse, else create if ( artistMap.contains( newArtist ) ) { artistPtr = MediaDeviceArtistPtr::staticCast( artistMap.value( newArtist ) ); } else { artistPtr = MediaDeviceArtistPtr( new MediaDeviceArtist( newArtist ) ); artistMap.insert( newArtist, ArtistPtr::staticCast( artistPtr ) ); } // add track to artist's tracklist artistPtr->addTrack( track ); // set track's artist to the new artist setArtist( artistPtr ); m_collection.data()->memoryCollection()->acquireWriteLock(); m_collection.data()->memoryCollection()->setArtistMap( artistMap ); m_collection.data()->memoryCollection()->releaseLock(); }
bool Reader::parseSongList( const QByteArray &data ) { QDataStream raw( data ); Map songResults = parse( raw, 0, true ); TrackMap trackMap; ArtistMap artistMap; AlbumMap albumMap; GenreMap genreMap; ComposerMap composerMap; YearMap yearMap; if( songResults["adbs"].toList().size() < 1 || songResults["adbs"].toList()[0].toMap()["mlcl"].toList().count() < 1 ) { emit httpError( "Invalid response" ); //it's not a real http error, but the effect is the same deleteLater(); return false; } QList<QVariant> songList; songList = songResults["adbs"].toList()[0].toMap()["mlcl"].toList()[0].toMap()["mlit"].toList(); debug() << "songList.count() = " << songList.count(); foreach( const QVariant &var, songList ) { //debug() << "begin iteration..."; QString itemId = QString::number( var.toMap()["miid"].toList()[0].toInt() ); QString format = var.toMap()["asfm"].toList().size() ? var.toMap()["asfm"].toList()[0].toString() : QString(); DaapTrackPtr track( new DaapTrack( m_memColl, m_host, m_port, m_databaseId, itemId, format ) ); track->setTitle( var.toMap()["minm"].toList().size() ? var.toMap()["minm"].toList()[0].toString() : QString() ); track->setLength( var.toMap()["astm"].toList().size() ? var.toMap()["astm"].toList()[0].toInt()/1000 : 0 ); track->setTrackNumber( var.toMap()["astn"].toList().size() ? var.toMap()["astn"].toList()[0].toInt() : 0); QString album = var.toMap()["asal"].toList().size() ? var.toMap()["asal"].toList()[0].toString() : QString(); DaapAlbumPtr albumPtr; if ( albumMap.contains( album ) ) albumPtr = DaapAlbumPtr::staticCast( albumMap.value( album ) ); else { albumPtr = DaapAlbumPtr( new DaapAlbum( album ) ); albumMap.insert( album, AlbumPtr::staticCast( albumPtr ) ); } albumPtr->addTrack( track ); track->setAlbum( albumPtr ); QString artist = var.toMap()["asar"].toList().size() ? var.toMap()["asar"].toList()[0].toString() : QString(); DaapArtistPtr artistPtr; if ( artistMap.contains( artist ) ) artistPtr = DaapArtistPtr::staticCast( artistMap.value( artist ) ); else { artistPtr = DaapArtistPtr( new DaapArtist( artist ) ); artistMap.insert( artist, ArtistPtr::staticCast( artistPtr ) ); } artistPtr->addTrack( track ); track->setArtist( artistPtr ); QString year = var.toMap()["asyr"].toList().size() ? var.toMap()["asyr"].toList()[0].toString() : QString(); DaapYearPtr yearPtr; if ( yearMap.contains( year ) ) yearPtr = DaapYearPtr::staticCast( yearMap.value( year ) ); else { yearPtr = DaapYearPtr( new DaapYear( year ) ); yearMap.insert( year, YearPtr::staticCast( yearPtr ) ); } yearPtr->addTrack( track ); track->setYear( yearPtr ); QString genre = var.toMap()["asgn"].toList().size() ? var.toMap()["asgn"].toList()[0].toString() : QString(); DaapGenrePtr genrePtr; if ( genreMap.contains( genre ) ) genrePtr = DaapGenrePtr::staticCast( genreMap.value( genre ) ); else { genrePtr = DaapGenrePtr( new DaapGenre( genre ) ); genreMap.insert( genre, GenrePtr::staticCast( genrePtr ) ); } genrePtr->addTrack( track ); track->setGenre( genrePtr ); trackMap.insert( track->uidUrl(), TrackPtr::staticCast( track ) ); }