From 87316652571c04968a3cefa7d1e601afd977f179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Lindstr=C3=B6m?= Date: Wed, 16 Nov 2011 12:26:02 +0100 Subject: [PATCH] Adding cache for charts --- .../infoplugins/generic/chartsplugin.cpp | 161 ++++++++++-------- .../infoplugins/generic/chartsplugin.h | 20 ++- src/libtomahawk/widgets/whatshotwidget.cpp | 40 +++-- src/tomahawkapp.cpp | 2 +- 4 files changed, 123 insertions(+), 100 deletions(-) diff --git a/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.cpp b/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.cpp index 866fe00ef..640b8e492 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.cpp +++ b/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.cpp @@ -19,12 +19,10 @@ #include "chartsplugin.h" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include #include "album.h" #include "chartsplugin_data_p.h" @@ -50,27 +48,12 @@ ChartsPlugin::ChartsPlugin() m_chartResources << "billboard" << "itunes" << "rdio" << "wearehunted" << "ex.fm"; m_supportedGetTypes << InfoChart << InfoChartCapabilities; - /// Then get each chart from resource - /// We want to prepopulate the breadcrumb to fetch them before they are asked for - if ( !m_chartResources.isEmpty() && m_allChartsMap.isEmpty() ) - { - tDebug() << "ChartsPlugin: InfoChart fetching possible resources"; - foreach ( QVariant resource, m_chartResources ) - { - QUrl url = QUrl( QString( CHART_URL "source/%1" ).arg(resource.toString() ) ); - QNetworkReply* reply = TomahawkUtils::nam()->get( QNetworkRequest( url ) ); - tDebug() << "fetching:" << url; - connect( reply, SIGNAL( finished() ), SLOT( chartTypes() ) ); - - m_chartsFetchJobs++; - } - } } ChartsPlugin::~ChartsPlugin() { - qDebug() << Q_FUNC_INFO; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO; } @@ -85,27 +68,27 @@ ChartsPlugin::dataError( Tomahawk::InfoSystem::InfoRequestData requestData ) void ChartsPlugin::getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ) { - qDebug() << Q_FUNC_INFO << requestData.caller; - qDebug() << Q_FUNC_INFO << requestData.customData; + //qDebug() << Q_FUNC_INFO << requestData.caller; + //qDebug() << Q_FUNC_INFO << requestData.customData; InfoStringHash hash = requestData.input.value< Tomahawk::InfoSystem::InfoStringHash >(); bool foundSource = false; switch ( requestData.type ) { - case InfoChart: /// We need something to check if the request is actually ment to go to this plugin if ( !hash.contains( "chart_source" ) ) { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Hash did not contain required param!"; dataError( requestData ); break; } else { - foreach( QVariant resource, m_chartResources ) + foreach( QString resource, m_chartResources ) { - if( resource.toString() == hash["chart_source"] ) + if( resource == hash["chart_source"] ) { foundSource = true; } @@ -130,15 +113,6 @@ ChartsPlugin::getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ) } -void -ChartsPlugin::pushInfo( const QString caller, const Tomahawk::InfoSystem::InfoType type, const QVariant input ) -{ - Q_UNUSED( caller ) - Q_UNUSED( type) - Q_UNUSED( input ) -} - - void ChartsPlugin::fetchChart( Tomahawk::InfoSystem::InfoRequestData requestData ) { @@ -155,6 +129,7 @@ ChartsPlugin::fetchChart( Tomahawk::InfoSystem::InfoRequestData requestData ) /// Each request needs to contain both a id and source if ( !hash.contains( "chart_id" ) && !hash.contains( "chart_source" ) ) { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Hash did not contain required params!"; dataError( requestData ); return; @@ -163,7 +138,7 @@ ChartsPlugin::fetchChart( Tomahawk::InfoSystem::InfoRequestData requestData ) criteria["chart_id"] = hash["chart_id"]; criteria["chart_source"] = hash["chart_source"]; - emit getCachedInfo( criteria, 0, requestData ); + emit getCachedInfo( criteria, 86400000, requestData ); } void @@ -171,13 +146,14 @@ ChartsPlugin::fetchChartCapabilities( Tomahawk::InfoSystem::InfoRequestData requ { if ( !requestData.input.canConvert< Tomahawk::InfoSystem::InfoStringHash >() ) { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Could not convert requestData to InfoStringHash!"; dataError( requestData ); return; } Tomahawk::InfoSystem::InfoStringHash criteria; - - emit getCachedInfo( criteria, 0, requestData ); + criteria[ "InfoChartCapabilities" ] = "all"; + emit getCachedInfo( criteria, 86400000, requestData ); } void @@ -187,9 +163,11 @@ ChartsPlugin::notInCacheSlot( QHash criteria, Tomahawk::InfoSy { case InfoChart: { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "InfoChart not in cache! Fetching..."; + /// Fetch the chart, we need source and id QUrl url = QUrl( QString( CHART_URL "source/%1/chart/%2" ).arg( criteria["chart_source"] ).arg( criteria["chart_id"] ) ); - qDebug() << Q_FUNC_INFO << "Getting chart url" << url; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Getting chart url" << url; QNetworkReply* reply = TomahawkUtils::nam()->get( QNetworkRequest( url ) ); reply->setProperty( "requestData", QVariant::fromValue< Tomahawk::InfoSystem::InfoRequestData >( requestData ) ); @@ -201,9 +179,30 @@ ChartsPlugin::notInCacheSlot( QHash criteria, Tomahawk::InfoSy case InfoChartCapabilities: { + + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "InfoChartCapabilities not in cache! Fetching..."; + + /// Then get each chart from resource + + if ( !m_chartResources.isEmpty() && m_allChartsMap.isEmpty() ) + { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "InfoChart fetching possible resources"; + foreach ( QString resource, m_chartResources ) + { + QUrl url = QUrl( QString( CHART_URL "source/%1" ).arg( resource ) ); + QNetworkReply* reply = TomahawkUtils::nam()->get( QNetworkRequest( url ) ); + reply->setProperty( "chart_resource", resource); + + tDebug() << "fetching:" << url; + connect( reply, SIGNAL( finished() ), SLOT( chartTypes() ) ); + + m_chartsFetchJobs++; + } + } + if ( m_chartsFetchJobs > 0 ) { - qDebug() << Q_FUNC_INFO << "InfoChartCapabilities still fetching!"; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "InfoChartCapabilities still fetching!"; m_cachedRequests.append( requestData ); return; } @@ -226,9 +225,10 @@ void ChartsPlugin::chartTypes() { /// Get possible chart type for specificChartsPlugin: InfoChart types returned chart source - tDebug() << "Got chart type result"; + tDebug( LOGVERBOSE ) << "Got chart type result"; QNetworkReply* reply = qobject_cast( sender() ); + if ( reply->error() == QNetworkReply::NoError ) { QJson::Parser p; @@ -262,7 +262,8 @@ ChartsPlugin::chartTypes() QHash< QString, QVariantMap > extraType; foreach( const QVariant& chartObj, chartObjs.values() ) { - if( !chartObj.toMap().isEmpty() ){ + if( !chartObj.toMap().isEmpty() ) + { const QVariantMap chart = chartObj.toMap(); const QString id = chart.value( "id" ).toString(); const QString geo = chart.value( "geo" ).toString(); @@ -271,7 +272,8 @@ ChartsPlugin::chartTypes() const bool isDefault = ( chart.contains( "default" ) && chart[ "default" ].toInt() == 1 ); QString extra; - if( !geo.isEmpty() ){ + if( !geo.isEmpty() ) + { if ( !m_cachedCountries.contains( geo ) ) { @@ -289,10 +291,10 @@ ChartsPlugin::chartTypes() m_cachedCountries[ geo ] = extra; } else - { extra = m_cachedCountries[ geo ]; - } - }else extra = chart.value( "extra" ).toString(); + } + else + extra = chart.value( "extra" ).toString(); if ( name.isEmpty() ) // not a specific chart, an all chart name = tr( "Top Overall" ); @@ -304,10 +306,10 @@ ChartsPlugin::chartTypes() if ( isDefault ) c[ "default" ] = "true"; - QList extraTypeData = extraType[ extra ][ type ].value< QList< InfoStringHash > >(); + QList< Tomahawk::InfoSystem::InfoStringHash > extraTypeData = extraType[ extra ][ type ].value< QList< Tomahawk::InfoSystem::InfoStringHash > >(); extraTypeData.append( c ); + extraType[ extra ][ type ] = QVariant::fromValue< QList< Tomahawk::InfoSystem::InfoStringHash > >( extraTypeData ); - extraType[ extra ].insert( type, QVariant::fromValue< QList< InfoStringHash > >( extraTypeData ) ); if ( isDefault ) { defaultChain.clear(); @@ -319,7 +321,7 @@ ChartsPlugin::chartTypes() foreach( const QString& c, extraType.keys() ) { charts[ c ] = extraType[ c ]; -// qDebug() << "extraType has types:" << c; +// tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "extraType has types:" << c; } if( source == "itunes" ){ chartName = "iTunes"; @@ -330,7 +332,8 @@ ChartsPlugin::chartTypes() } } - }else + } + else { // We'll just build: // [Source] - Album - Chart Type @@ -380,11 +383,11 @@ ChartsPlugin::chartTypes() } } if( !artistCharts.isEmpty() ) - charts.insert( tr( "Artists" ), QVariant::fromValue< QList< InfoStringHash > >( artistCharts ) ); + charts.insert( tr( "Artists" ), QVariant::fromValue< QList< Tomahawk::InfoSystem::InfoStringHash > >( artistCharts ) ); if( !albumCharts.isEmpty() ) - charts.insert( tr( "Albums" ), QVariant::fromValue< QList< InfoStringHash > >( albumCharts ) ); + charts.insert( tr( "Albums" ), QVariant::fromValue< QList< Tomahawk::InfoSystem::InfoStringHash > >( albumCharts ) ); if( !trackCharts.isEmpty() ) - charts.insert( tr( "Tracks" ), QVariant::fromValue< QList< InfoStringHash > >( trackCharts ) ); + charts.insert( tr( "Tracks" ), QVariant::fromValue< QList< Tomahawk::InfoSystem::InfoStringHash > >( trackCharts ) ); /// @note For displaying purposes, upper the first letter /// @note Remeber to lower it when fetching this! @@ -394,7 +397,7 @@ ChartsPlugin::chartTypes() } /// Add the possible charts and its types to breadcrumb -// qDebug() << "ADDING CHART TYPE TO CHARTS:" << chartName; +// tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "ADDING CHART TYPE TO CHARTS:" << chartName; QVariantMap defaultMap = m_allChartsMap.value( "defaults" ).value< QVariantMap >(); defaultMap[ source ] = defaultChain; m_allChartsMap[ "defaults" ] = defaultMap; @@ -413,6 +416,10 @@ ChartsPlugin::chartTypes() foreach ( InfoRequestData request, m_cachedRequests ) { emit info( request, m_allChartsMap ); + // update cache + Tomahawk::InfoSystem::InfoStringHash criteria; + criteria[ "InfoChartCapabilities" ] = "all"; + emit updateCache( criteria, 86400000, request.type, m_allChartsMap ); } m_cachedRequests.clear(); } @@ -441,8 +448,8 @@ ChartsPlugin::chartReturned() /// SO we have a result, parse it! QVariantList chartResponse = res.value( "list" ).toList(); - QList< InfoStringHash > top_tracks; - QList< InfoStringHash > top_albums; + QList< Tomahawk::InfoSystem::InfoStringHash > top_tracks; + QList< Tomahawk::InfoSystem::InfoStringHash > top_albums; QStringList top_artists; /// Deside what type, we need to handle it differently @@ -478,16 +485,16 @@ ChartsPlugin::chartReturned() if ( album.isEmpty() && artist.isEmpty() ) // don't have enough... { - tLog() << "Didn't get an artist and album name from chart, not enough to build a query on. Aborting" << title << album << artist; + tDebug( LOGVERBOSE ) << "Didn't get an artist and album name from chart, not enough to build a query on. Aborting" << title << album << artist; } else { - qDebug() << Q_FUNC_INFO << album << artist; - InfoStringHash pair; + + Tomahawk::InfoSystem::InfoStringHash pair; pair["artist"] = artist; pair["album"] = album; - top_albums << pair; + top_albums.append( pair ); } } @@ -497,28 +504,28 @@ ChartsPlugin::chartReturned() if ( title.isEmpty() && artist.isEmpty() ) // don't have enough... { - tLog() << "Didn't get an artist and track name from charts, not enough to build a query on. Aborting" << title << artist << album; + tDebug( LOGVERBOSE ) << "Didn't get an artist and track name from charts, not enough to build a query on. Aborting" << title << artist << album; } else { - InfoStringHash pair; + Tomahawk::InfoSystem::InfoStringHash pair; pair["artist"] = artist; pair["track"] = title; - top_tracks << pair; + top_tracks.append( pair ); } }else if( chartType() == Artist ) { if ( artist.isEmpty() ) // don't have enough... { - tLog() << "Didn't get an artist from charts, not enough to build a query on. Aborting" << artist; + tDebug( LOGVERBOSE ) << "Didn't get an artist from charts, not enough to build a query on. Aborting" << artist; } else { - top_artists << artist; + top_artists.append( artist ); } } @@ -528,31 +535,35 @@ ChartsPlugin::chartReturned() if( chartType() == Artist ) { tDebug() << "ChartsPlugin:" << "\tgot " << top_artists.size() << " artists"; - returnedData["artists"] = QVariant::fromValue( top_artists ); - returnedData["type"] = "artists"; + returnedData[ "artists" ] = QVariant::fromValue< QStringList >( top_artists ); + returnedData[ "type" ] = "artists"; } if( chartType() == Track ) { tDebug() << "ChartsPlugin:" << "\tgot " << top_tracks.size() << " tracks"; - returnedData["tracks"] = QVariant::fromValue( top_tracks ); - returnedData["type"] = "tracks"; + returnedData[ "tracks" ] = QVariant::fromValue< QList< Tomahawk::InfoSystem::InfoStringHash > >( top_tracks ); + returnedData[ "type" ] = "tracks"; } if( chartType() == Album ) { tDebug() << "ChartsPlugin:" << "\tgot " << top_albums.size() << " albums"; - returnedData["albums"] = QVariant::fromValue( top_albums ); - returnedData["type"] = "albums"; + returnedData[ "albums" ] = QVariant::fromValue< QList< Tomahawk::InfoSystem::InfoStringHash > >( top_albums ); + returnedData[ "type" ] = "albums"; } Tomahawk::InfoSystem::InfoRequestData requestData = reply->property( "requestData" ).value< Tomahawk::InfoSystem::InfoRequestData >(); - emit info( requestData, returnedData ); - // TODO update cache + // update cache + Tomahawk::InfoSystem::InfoStringHash criteria; + Tomahawk::InfoSystem::InfoStringHash origData = requestData.input.value< Tomahawk::InfoSystem::InfoStringHash >(); + criteria[ "chart_id" ] = origData[ "chart_id" ]; + criteria[ "chart_source" ] = origData[ "chart_source" ]; + emit updateCache( criteria, 86400000, requestData.type, returnedData ); } else - qDebug() << "Network error in fetching chart:" << reply->url().toString(); + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Network error in fetching chart:" << reply->url().toString(); } diff --git a/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.h b/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.h index 285420a14..0d527d4c9 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.h +++ b/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.h @@ -21,8 +21,8 @@ #include "infosystem/infosystem.h" #include "infosystem/infosystemworker.h" -#include -#include +#include +#include class QNetworkReply; @@ -47,8 +47,9 @@ public: Artist = 0x04 }; - void setChartType( ChartType type ) { m_chartType = type; } - ChartType chartType() const { return m_chartType; } + + void setChartType( ChartType type ) { m_chartType = type; } + ChartType chartType() const { return m_chartType; } public slots: void chartReturned(); @@ -58,15 +59,20 @@ protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, QVariant data ); + virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, QVariant data ) + { + Q_UNUSED( caller ) + Q_UNUSED( type ) + Q_UNUSED( data ) + } private: void fetchChart( Tomahawk::InfoSystem::InfoRequestData requestData ); void fetchChartCapabilities( Tomahawk::InfoSystem::InfoRequestData requestData ); void dataError( Tomahawk::InfoSystem::InfoRequestData requestData ); - QVariantList m_chartResources; - QList m_charts; + QStringList m_chartResources; + QList< InfoStringHash > m_charts; ChartType m_chartType; QVariantMap m_allChartsMap; diff --git a/src/libtomahawk/widgets/whatshotwidget.cpp b/src/libtomahawk/widgets/whatshotwidget.cpp index a0ac24639..7cb374e66 100644 --- a/src/libtomahawk/widgets/whatshotwidget.cpp +++ b/src/libtomahawk/widgets/whatshotwidget.cpp @@ -20,9 +20,9 @@ #include "whatshotwidget.h" #include "ui_whatshotwidget.h" -#include -#include -#include +#include +#include +#include #include "viewmanager.h" #include "sourcelist.h" @@ -156,9 +156,15 @@ WhatsHotWidget::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestDat return; } - tDebug( LOGVERBOSE ) << "WhatsHot: got something..."; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot: got something..."; + if ( !output.canConvert< QVariantMap >() ) + { + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot: Could not parse output"; + return; + } + QVariantMap returnedData = output.toMap(); - qDebug() << "WhatsHot::" << returnedData; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot::" << returnedData; switch ( requestData.type ) { case InfoSystem::InfoChartCapabilities: @@ -174,9 +180,9 @@ WhatsHotWidget::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestDat foreach ( const QString label, returnedData.keys() ) { - tDebug( LOGVERBOSE ) << "WhatsHot:: parsing " << label; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot:: parsing " << label; QStandardItem *childItem = parseNode( rootItem, label, returnedData[label] ); - tDebug( LOGVERBOSE ) << "WhatsHot:: appending" << childItem->text(); + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot:: appending" << childItem->text(); rootItem->appendRow(childItem); } @@ -187,7 +193,7 @@ WhatsHotWidget::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestDat QStandardItem* source = rootItem->child( i, 0 ); if ( defaultSource.toLower() == source->text().toLower() ) { - qDebug() << "Setting DEFAULT SOURCE:" << source->text(); + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Setting DEFAULT SOURCE:" << source->text(); source->setData( true, Breadcrumb::DefaultRole ); } @@ -203,7 +209,7 @@ WhatsHotWidget::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestDat { if ( cur->child( k, 0 )->text() == index ) { - tDebug() << "Found DEFAULT ITEM:" << index; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Found DEFAULT ITEM:" << index; cur = cur->child( k, 0 ); // this is the default, drill down into the default to pick the next default cur->setData( true, Breadcrumb::DefaultRole ); break; @@ -229,11 +235,11 @@ WhatsHotWidget::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestDat const QString chartId = requestData.input.value< Tomahawk::InfoSystem::InfoStringHash >().value( "chart_id" ); m_queuedFetches.remove( chartId ); - tDebug( LOGVERBOSE ) << "WhatsHot: got chart! " << type << " on " << side; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot: got chart! " << type << " on " << side; if( type == "artists" ) { const QStringList artists = returnedData["artists"].toStringList(); - tDebug( LOGVERBOSE ) << "WhatsHot: got artists! " << artists.size(); + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot: got artists! " << artists.size(); TreeModel* artistsModel = new TreeModel( ui->artistsViewLeft ); artistsModel->setColumnStyle( TreeModel::TrackOnly ); @@ -251,19 +257,19 @@ WhatsHotWidget::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestDat else if( type == "albums" ) { QList al; - const QList albums = returnedData[ "albums" ].value >(); - tDebug( LOGVERBOSE ) << "WhatsHot: got albums! " << albums.size(); + const QList< Tomahawk::InfoSystem::InfoStringHash > albums = returnedData[ "albums" ].value< QList< Tomahawk::InfoSystem::InfoStringHash > >(); + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot: got albums! " << albums.size(); AlbumModel* albumModel = new AlbumModel( ui->additionsView ); foreach ( const Tomahawk::InfoSystem::InfoStringHash& album, albums ) { - qDebug() << "Getting album" << album[ "album" ] << "By" << album[ "artist" ]; + tDebug( LOGVERBOSE) << Q_FUNC_INFO << "Getting album" << album[ "album" ] << "By" << album[ "artist" ]; artist_ptr artistPtr = Artist::get( album[ "artist" ], false ); album_ptr albumPtr = Album::get( artistPtr, album[ "album" ], false ); al << albumPtr; } - qDebug() << "Adding albums to model"; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "Adding albums to model"; albumModel->addAlbums( al ); m_albumModels[ chartId ] = albumModel; @@ -273,7 +279,7 @@ WhatsHotWidget::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestDat } else if( type == "tracks" ) { - const QList tracks = returnedData[ "tracks" ].value >(); + const QList< Tomahawk::InfoSystem::InfoStringHash > tracks = returnedData[ "tracks" ].value< QList< Tomahawk::InfoSystem::InfoStringHash > >(); tDebug( LOGVERBOSE ) << "WhatsHot: got tracks! " << tracks.size(); PlaylistModel* trackModel = new PlaylistModel( ui->tracksViewLeft ); @@ -294,7 +300,7 @@ WhatsHotWidget::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestDat } else { - tDebug( LOGVERBOSE ) << "WhatsHot: got unknown chart type" << type; + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "WhatsHot: got unknown chart type" << type; } break; } diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index 91d2023db..cd0e6a4d1 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -406,6 +406,7 @@ TomahawkApp::registerMetaTypes() qRegisterMetaType< Tomahawk::InfoSystem::InfoSystemCache* >( "Tomahawk::InfoSystem::InfoSystemCache*" ); qRegisterMetaType< QList< Tomahawk::InfoSystem::InfoStringHash > >("QList< Tomahawk::InfoSystem::InfoStringHash > "); + qRegisterMetaTypeStreamOperators< QList< Tomahawk::InfoSystem::InfoStringHash > >("QList< Tomahawk::InfoSystem::InfoStringHash > "); qRegisterMetaType< QPersistentModelIndex >( "QPersistentModelIndex" ); } @@ -582,4 +583,3 @@ TomahawkApp::instanceStarted( KDSingleApplicationGuard::Instance instance ) QString arg1 = instance.arguments[ 1 ]; loadUrl( arg1 ); } -