void TreeProxyModel::onRowsInserted( const QModelIndex& parent, int /* start */, int /* end */ ) { if ( m_filter.isEmpty() ) return; if ( sender() != m_model ) return; PlayableItem* pi = m_model->itemFromIndex( m_model->index( parent.row(), 0, parent.parent() ) ); if ( pi->artist().isNull() ) return; Tomahawk::AlbumsRequest* cmd = 0; if ( !m_model->collection().isNull() ) cmd = m_model->collection()->requestAlbums( pi->artist() ); else cmd = new Tomahawk::DatabaseCommand_AllAlbums( Tomahawk::collection_ptr(), pi->artist() ); cmd->setFilter( m_filter ); connect( dynamic_cast< QObject* >( cmd ), SIGNAL( albums( QList<Tomahawk::album_ptr> ) ), SLOT( onFilterAlbums( QList<Tomahawk::album_ptr> ) ) ); cmd->enqueue(); }
void TreeProxyModel::onFilterArtists( const QList<Tomahawk::artist_ptr>& artists ) { bool finished = true; m_artistsFilter = artists; m_artistsFilterCmd = 0; foreach ( const Tomahawk::artist_ptr& artist, artists ) { const QModelIndex idx = m_model->indexFromArtist( artist ); if ( m_model->rowCount( idx ) ) { finished = false; Tomahawk::AlbumsRequest* cmd = m_model->collection()->requestAlbums( artist ); cmd->setFilter( m_filter ); connect( dynamic_cast< QObject* >( cmd ), SIGNAL( albums( QList<Tomahawk::album_ptr> ) ), SLOT( onFilterAlbums( QList<Tomahawk::album_ptr> ) ) ); cmd->enqueue(); } } if ( finished ) filterFinished(); }
void ScriptCommand_AllAlbums::onResolverDone( const QList< Tomahawk::album_ptr >& a ) { if ( m_filter.isEmpty() ) emit albums( a ); else { QList< Tomahawk::album_ptr > filtered; foreach( const Tomahawk::album_ptr& album, a ) { if( album->name().toLower().contains( m_filter.toLower() ) || album->artist()->name().toLower().contains( m_filter.toLower() ) ) filtered.append( album ); } emit albums( filtered ); } emit done(); }
void ScriptCommand_AllAlbums::reportFailure() { if ( m_artist ) tDebug() << Q_FUNC_INFO << "for collection" << m_collection->name() << "and artist" << m_artist->name(); emit albums( QList< Tomahawk::album_ptr >() ); emit done(); }
void DatabaseCommand_AllAlbums::execForArtist( DatabaseImpl* dbi ) { TomahawkSqlQuery query = dbi->newquery(); QList<Tomahawk::album_ptr> al; QString orderToken, sourceToken; switch ( m_sortOrder ) { case 0: break; case ModificationTime: orderToken = "file.mtime"; } if ( !m_collection.isNull() ) sourceToken = QString( "AND file.source %1 " ).arg( m_collection->source()->isLocal() ? "IS NULL" : QString( "= %1" ).arg( m_collection->source()->id() ) ); QString sql = QString( "SELECT DISTINCT album.id, album.name " "FROM file, file_join " "LEFT OUTER JOIN album " "ON file_join.album = album.id " "WHERE file.id = file_join.file " "AND file_join.artist = %1 " "%2 " "%3 %4 %5" ).arg( m_artist->id() ) .arg( sourceToken ) .arg( m_sortOrder > 0 ? QString( "ORDER BY %1" ).arg( orderToken ) : QString() ) .arg( m_sortDescending ? "DESC" : QString() ) .arg( m_amount > 0 ? QString( "LIMIT 0, %1" ).arg( m_amount ) : QString() ); query.prepare( sql ); query.exec(); while( query.next() ) { unsigned int albumId = query.value( 0 ).toUInt(); QString albumName = query.value( 1 ).toString(); if ( query.value( 0 ).isNull() ) { albumName = tr( "Unknown" ); } Tomahawk::album_ptr album = Tomahawk::Album::get( albumId, albumName, m_artist ); al << album; } if ( al.count() ) emit albums( al, data() ); emit done(); }
void ScriptCommand_AllAlbums::enqueue() { Tomahawk::ScriptCollection* collection = qobject_cast< Tomahawk::ScriptCollection* >( m_collection.data() ); if ( collection == 0 ) { emit albums( QList< Tomahawk::album_ptr >() ); return; } collection->resolver()->enqueue( QSharedPointer< ScriptCommand >( this ) ); }
void DatabaseResolver::resolve( const Tomahawk::query_ptr& query ) { Tomahawk::DatabaseCommand_Resolve* cmd = new Tomahawk::DatabaseCommand_Resolve( query ); connect( cmd, SIGNAL( results( Tomahawk::QID, QList< Tomahawk::result_ptr > ) ), SLOT( gotResults( Tomahawk::QID, QList< Tomahawk::result_ptr > ) ), Qt::QueuedConnection ); connect( cmd, SIGNAL( albums( Tomahawk::QID, QList< Tomahawk::album_ptr > ) ), SLOT( gotAlbums( Tomahawk::QID, QList< Tomahawk::album_ptr > ) ), Qt::QueuedConnection ); connect( cmd, SIGNAL( artists( Tomahawk::QID, QList< Tomahawk::artist_ptr > ) ), SLOT( gotArtists( Tomahawk::QID, QList< Tomahawk::artist_ptr > ) ), Qt::QueuedConnection ); Tomahawk::Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) ); }
void DatabaseCommand_AllAlbums::exec( DatabaseImpl* dbi ) { Q_ASSERT( !m_collection->source().isNull() ); TomahawkSqlQuery query = dbi->newquery(); QList<Tomahawk::album_ptr> al; QString m_orderToken; switch ( m_sortOrder ) { case 0: break; case ModificationTime: m_orderToken = "file.mtime"; } QString sql = QString( "SELECT DISTINCT album.id, album.name, album.artist, artist.name " "FROM album, file, file_join " "LEFT OUTER JOIN artist " "ON album.artist = artist.id " "WHERE file.id = file_join.file " "AND file_join.album = album.id " "AND file.source %1 " "%2 %3 %4" ).arg( m_collection->source()->isLocal() ? "IS NULL" : QString( "= %1" ).arg( m_collection->source()->id() ) ) .arg( m_sortOrder > 0 ? QString( "ORDER BY %1" ).arg( m_orderToken ) : QString() ) .arg( m_sortDescending ? "DESC" : QString() ) .arg( m_amount > 0 ? QString( "LIMIT 0, %1" ).arg( m_amount ) : QString() ); query.prepare( sql ); query.exec(); while( query.next() ) { Tomahawk::artist_ptr artist = Tomahawk::Artist::get( query.value( 2 ).toUInt(), query.value( 3 ).toString() ); Tomahawk::album_ptr album = Tomahawk::Album::get( query.value( 0 ).toUInt(), query.value( 1 ).toString(), artist ); al << album; } if ( al.count() ) emit albums( al, m_collection ); emit done( m_collection ); }
void TreeProxyModel::onRowsInserted( const QModelIndex& parent, int /* start */, int /* end */ ) { if ( m_filter.isEmpty() ) return; if ( sender() != m_model ) return; TreeModelItem* pi = m_model->itemFromIndex( m_model->index( parent.row(), 0, parent.parent() ) ); if ( pi->artist().isNull() ) return; DatabaseCommand_AllAlbums* cmd = new DatabaseCommand_AllAlbums( m_model->collection() ); cmd->setArtist( pi->artist() ); cmd->setFilter( m_filter ); connect( cmd, SIGNAL( albums( QList<Tomahawk::album_ptr>, QVariant ) ), SLOT( onFilterAlbums( QList<Tomahawk::album_ptr> ) ) ); Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) ); }
void TreeProxyModel::onFilterArtists( const QList<Tomahawk::artist_ptr>& artists ) { bool finished = true; m_artistsFilter = artists; m_artistsFilterCmd = 0; foreach ( const Tomahawk::artist_ptr& artist, artists ) { QModelIndex idx = m_model->indexFromArtist( artist ); if ( m_model->rowCount( idx ) ) { finished = false; DatabaseCommand_AllAlbums* cmd = new DatabaseCommand_AllAlbums( m_model->collection() ); cmd->setArtist( artist ); cmd->setFilter( m_filter ); connect( cmd, SIGNAL( albums( QList<Tomahawk::album_ptr>, QVariant ) ), SLOT( onFilterAlbums( QList<Tomahawk::album_ptr> ) ) ); Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) ); } }
int MediaLibrary::listGenre( int listQuery, const medialibrary::QueryParameters* paramsPtr, const char* pattern, uint32_t nbItems, uint32_t offset, va_list args ) { auto genre = m_ml->genre( va_arg( args, int64_t ) ); if ( genre == nullptr ) return VLC_EGENERIC; switch( listQuery ) { case VLC_ML_LIST_GENRE_ARTISTS: case VLC_ML_COUNT_GENRE_ARTISTS: { medialibrary::Query<medialibrary::IArtist> query; if ( pattern != nullptr ) query = genre->searchArtists( pattern, paramsPtr ); else query = genre->artists( paramsPtr ); if ( query == nullptr ) return VLC_EGENERIC; switch ( listQuery ) { case VLC_ML_LIST_GENRE_ARTISTS: *va_arg( args, vlc_ml_artist_list_t**) = ml_convert_list<vlc_ml_artist_list_t, vlc_ml_artist_t>( query->items( nbItems, offset ) ); return VLC_SUCCESS; case VLC_ML_COUNT_GENRE_ARTISTS: *va_arg( args, size_t* ) = query->count(); return VLC_SUCCESS; default: vlc_assert_unreachable(); } } case VLC_ML_LIST_GENRE_TRACKS: case VLC_ML_COUNT_GENRE_TRACKS: { medialibrary::Query<medialibrary::IMedia> query; if ( pattern != nullptr ) query = genre->searchTracks( pattern, paramsPtr ); else query = genre->tracks( paramsPtr ); if ( query == nullptr ) return VLC_EGENERIC; switch ( listQuery ) { case VLC_ML_LIST_GENRE_TRACKS: *va_arg( args, vlc_ml_media_list_t**) = ml_convert_list<vlc_ml_media_list_t, vlc_ml_media_t>( query->items( nbItems, offset ) ); return VLC_SUCCESS; case VLC_ML_COUNT_GENRE_TRACKS: *va_arg( args, size_t*) = query->count(); return VLC_SUCCESS; default: vlc_assert_unreachable(); } } case VLC_ML_LIST_GENRE_ALBUMS: case VLC_ML_COUNT_GENRE_ALBUMS: { medialibrary::Query<medialibrary::IAlbum> query; if ( pattern != nullptr ) query = genre->searchAlbums( pattern, paramsPtr ); else query = genre->albums( paramsPtr ); if ( query == nullptr ) return VLC_EGENERIC; switch ( listQuery ) { case VLC_ML_LIST_GENRE_ALBUMS: *va_arg( args, vlc_ml_album_list_t**) = ml_convert_list<vlc_ml_album_list_t, vlc_ml_album_t>( query->items( nbItems, offset ) ); return VLC_SUCCESS; case VLC_ML_COUNT_GENRE_ALBUMS: *va_arg( args, size_t* ) = query->count(); return VLC_SUCCESS; default: vlc_assert_unreachable(); } } default: vlc_assert_unreachable(); } }
QVector<QList<QString> > iTunes::getAlbums() { QDomDocument doc("Lib"); QFile file(filePath); if(!file.open(QIODevice::ReadOnly)) throw QString("Erreur lors de l'ouverture du fichier."); if(!doc.setContent(&file)) throw QString("Erreur lors de l'initialisation du XML."); file.close(); // Root element QDomElement docElem = doc.documentElement(); // <plist> -> <dict> QDomNode n = docElem.firstChild().firstChildElement("dict"); // Get the children nodes of the first dict QDomNodeList list = n.childNodes(); int count = list.count(); // Init the albums storage QVector<QList<QString> > albums(0); int albumIterator(0); // For each child for(int nodeIterator = 0; nodeIterator <= count; nodeIterator++) { QDomElement node = list.at(nodeIterator).toElement(); // If it is a <dict> if(node.tagName().startsWith("dict")) { node = node.firstChildElement(); // We go through its children while(!node.isNull()) { // Get the key tag if(node.tagName() == "key") { // For each tag we want to store for(int keyIterator = 0; keyIterator < keys.count(); keyIterator++) { // We check if the current tag is one of them if(node.text() == keys.at(keyIterator) && node.tagName() == "key") { // The value is stored in the next element node = node.nextSiblingElement(); if(!node.isNull()) { albums.resize(albumIterator+1); QString value = node.text(); if(albums[albumIterator].indexOf(value) == -1) albums[albumIterator].insert(keys.indexOf(keys.at(keyIterator)), value); } } } } node = node.nextSiblingElement(); } albumIterator = albumIterator+1; } QCoreApplication::processEvents(); } if(albums.isEmpty()) throw QString("Aucun album retourné."); return albums; }