mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-13 09:34:53 +02:00
Really use all data instead of only cached
This commit is contained in:
@@ -26,6 +26,8 @@
|
||||
#include "database/DatabaseImpl.h"
|
||||
#include "NetworkActivityWidget.h"
|
||||
|
||||
#include "utils/Logger.h"
|
||||
|
||||
#include <QDateTime>
|
||||
|
||||
namespace Tomahawk
|
||||
@@ -49,6 +51,7 @@ NetworkActivityWorker::~NetworkActivityWorker()
|
||||
void
|
||||
NetworkActivityWorker::run()
|
||||
{
|
||||
tLog() << Q_FUNC_INFO << QDateTime::currentDateTime().toTime_t();
|
||||
{
|
||||
// Load trending tracks
|
||||
qRegisterMetaType< QList< QPair< double,Tomahawk::track_ptr > > >("QList< QPair< double,Tomahawk::track_ptr > >");
|
||||
@@ -66,31 +69,29 @@ NetworkActivityWorker::run()
|
||||
Qt::QueuedConnection);
|
||||
Database::instance()->enqueue( dbcmd_ptr( dbcmd ) );
|
||||
}
|
||||
tLog() << Q_FUNC_INFO << QDateTime::currentDateTime().toTime_t();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
NetworkActivityWorker::allPlaylistsReceived( const QList<playlist_ptr>& playlists )
|
||||
NetworkActivityWorker::allPlaylistsReceived( const QHash< Tomahawk::playlist_ptr, QStringList >& playlists )
|
||||
{
|
||||
Q_D( NetworkActivityWorker );
|
||||
d->sourcesToLoad--;
|
||||
d->playlists.append( playlists );
|
||||
d->playlists.unite( playlists );
|
||||
|
||||
if ( d->sourcesToLoad == 0 )
|
||||
{
|
||||
tLog() << Q_FUNC_INFO << QDateTime::currentDateTime().toTime_t();
|
||||
// Load all playlist entries
|
||||
foreach( playlist_ptr playlist, d->playlists )
|
||||
|
||||
foreach( playlist_ptr playlist, d->playlists.keys() )
|
||||
{
|
||||
if ( !playlist->loaded() )
|
||||
{
|
||||
d->playlistsRevisionToLoad++;
|
||||
connect( playlist.data(), SIGNAL( revisionLoaded( Tomahawk::PlaylistRevision ) ),
|
||||
SLOT( revisionLoaded( Tomahawk::PlaylistRevision ) ),
|
||||
Qt::QueuedConnection );
|
||||
playlist->loadRevision();
|
||||
}
|
||||
d->playtimesToLoad++;
|
||||
DatabaseCommand_CalculatePlaytime* dbcmd = new DatabaseCommand_CalculatePlaytime( playlist, d->playlists.value( playlist ), QDateTime::currentDateTime().addDays( -7 ), QDateTime::currentDateTime() );
|
||||
connect( dbcmd, SIGNAL( done( Tomahawk::playlist_ptr, uint ) ), SLOT( playtime( Tomahawk::playlist_ptr, uint ) ) );
|
||||
Database::instance()->enqueue( dbcmd_ptr( dbcmd ) );
|
||||
}
|
||||
checkRevisionLoadedDone();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,14 +99,16 @@ NetworkActivityWorker::allPlaylistsReceived( const QList<playlist_ptr>& playlist
|
||||
void
|
||||
NetworkActivityWorker::allSourcesReceived( const QList<source_ptr>& sources )
|
||||
{
|
||||
tLog() << Q_FUNC_INFO << QDateTime::currentDateTime().toTime_t();
|
||||
Q_D( NetworkActivityWorker );
|
||||
d->sourcesToLoad = sources.count();
|
||||
|
||||
foreach ( const source_ptr& source, sources)
|
||||
{
|
||||
DatabaseCommand_LoadAllPlaylists* dbcmd = new DatabaseCommand_LoadAllPlaylists( source );
|
||||
connect( dbcmd, SIGNAL( done( QList<Tomahawk::playlist_ptr> ) ),
|
||||
SLOT( allPlaylistsReceived ( QList<Tomahawk::playlist_ptr> ) ),
|
||||
dbcmd->setReturnPlEntryIds( true );
|
||||
connect( dbcmd, SIGNAL( done( QHash< Tomahawk::playlist_ptr, QStringList > ) ),
|
||||
SLOT( allPlaylistsReceived ( QHash< Tomahawk::playlist_ptr, QStringList > ) ),
|
||||
Qt::QueuedConnection );
|
||||
Database::instance()->enqueue( dbcmd_ptr( dbcmd ) );
|
||||
}
|
||||
@@ -113,21 +116,28 @@ NetworkActivityWorker::allSourcesReceived( const QList<source_ptr>& sources )
|
||||
|
||||
|
||||
void
|
||||
NetworkActivityWorker::playtime( uint playtime )
|
||||
NetworkActivityWorker::playtime( const Tomahawk::playlist_ptr& playlist, uint playtime )
|
||||
{
|
||||
Q_D( NetworkActivityWorker );
|
||||
d->playlistCount.insert( playtime, d->playlistStack.pop() );
|
||||
calculateNextPlaylist();
|
||||
}
|
||||
d->playtimesToLoad--;
|
||||
d->playlistCount.insert( playtime, playlist );
|
||||
|
||||
|
||||
void
|
||||
NetworkActivityWorker::revisionLoaded(PlaylistRevision revision)
|
||||
{
|
||||
Q_UNUSED( revision );
|
||||
Q_D( NetworkActivityWorker );
|
||||
d->playlistsRevisionToLoad--;
|
||||
checkRevisionLoadedDone();
|
||||
if ( d->playtimesToLoad == 0 )
|
||||
{
|
||||
tLog() << Q_FUNC_INFO << QDateTime::currentDateTime().toTime_t();
|
||||
d->playlistCount.remove( 0 );
|
||||
QList<playlist_ptr> playlists;
|
||||
QMapIterator<uint, playlist_ptr> iter( d->playlistCount );
|
||||
iter.toBack();
|
||||
while (iter.hasPrevious() && (uint)playlists.size() < Widgets::NetworkActivityWidget::numberOfHotPlaylists )
|
||||
{
|
||||
iter.previous();
|
||||
playlists << iter.value();
|
||||
}
|
||||
emit hotPlaylists( playlists );
|
||||
d->hotPlaylistsDone = true;
|
||||
checkDone();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -149,47 +159,6 @@ NetworkActivityWorker::trendingTracksReceived( const QList<QPair<double, Tomahaw
|
||||
checkDone();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
NetworkActivityWorker::calculateNextPlaylist()
|
||||
{
|
||||
Q_D( NetworkActivityWorker );
|
||||
if ( !d->playlistStack.isEmpty() )
|
||||
{
|
||||
DatabaseCommand_CalculatePlaytime* dbcmd = new DatabaseCommand_CalculatePlaytime( d->playlistStack.top(), QDateTime::currentDateTime().addDays( -7 ), QDateTime::currentDateTime() );
|
||||
connect( dbcmd, SIGNAL( done( uint ) ), SLOT( playtime( uint ) ), Qt::QueuedConnection );
|
||||
Database::instance()->enqueue( dbcmd_ptr( dbcmd ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
d->playlistCount.remove( 0 );
|
||||
QList<playlist_ptr> playlists;
|
||||
QMapIterator<uint, playlist_ptr> iter (d->playlistCount);
|
||||
iter.toBack();
|
||||
while (iter.hasPrevious() && (uint)playlists.size() < Widgets::NetworkActivityWidget::numberOfHotPlaylists )
|
||||
{
|
||||
iter.previous();
|
||||
playlists << iter.value();
|
||||
}
|
||||
emit hotPlaylists( playlists );
|
||||
d->hotPlaylistsDone = true;
|
||||
checkDone();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NetworkActivityWorker::checkRevisionLoadedDone()
|
||||
{
|
||||
Q_D( NetworkActivityWorker );
|
||||
if ( d->playlistsRevisionToLoad == 0 )
|
||||
{
|
||||
foreach (playlist_ptr playlist, d->playlists) {
|
||||
d->playlistStack.push( playlist );
|
||||
}
|
||||
calculateNextPlaylist();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NetworkActivityWorker::checkDone()
|
||||
{
|
||||
|
@@ -52,17 +52,14 @@ protected:
|
||||
QScopedPointer<NetworkActivityWorkerPrivate> d_ptr;
|
||||
|
||||
private slots:
|
||||
void allPlaylistsReceived( const QList<Tomahawk::playlist_ptr>& playlists );
|
||||
void allPlaylistsReceived( const QHash< Tomahawk::playlist_ptr, QStringList >& playlists );
|
||||
void allSourcesReceived( const QList< Tomahawk::source_ptr >& sources );
|
||||
void playtime( uint playtime );
|
||||
void revisionLoaded( Tomahawk::PlaylistRevision revision );
|
||||
void playtime( const Tomahawk::playlist_ptr& playlist , uint playtime );
|
||||
void trendingTracksReceived( const QList< QPair< double,Tomahawk::track_ptr > >& tracks );
|
||||
|
||||
private:
|
||||
Q_DECLARE_PRIVATE( NetworkActivityWorker )
|
||||
|
||||
void calculateNextPlaylist();
|
||||
void checkRevisionLoadedDone();
|
||||
void checkDone();
|
||||
};
|
||||
|
||||
|
@@ -37,7 +37,7 @@ public:
|
||||
: q_ptr( q )
|
||||
, trendingTracksDone( false )
|
||||
, hotPlaylistsDone( false )
|
||||
, playlistsRevisionToLoad( 0 )
|
||||
, playtimesToLoad( 0 )
|
||||
, trackStatsToLoad( 0 )
|
||||
{
|
||||
}
|
||||
@@ -48,8 +48,8 @@ private:
|
||||
bool trendingTracksDone;
|
||||
|
||||
bool hotPlaylistsDone;
|
||||
QList<Tomahawk::playlist_ptr> playlists;
|
||||
uint playlistsRevisionToLoad;
|
||||
QHash< Tomahawk::playlist_ptr, QStringList > playlists;
|
||||
uint playtimesToLoad;
|
||||
uint sourcesToLoad;
|
||||
uint trackStatsToLoad;
|
||||
QStack<playlist_ptr> playlistStack;
|
||||
|
@@ -32,6 +32,15 @@ DatabaseCommand_CalculatePlaytime::DatabaseCommand_CalculatePlaytime( const play
|
||||
{
|
||||
d->trackIds.append( QString::number( entry->query()->track()->trackId() ) );
|
||||
}
|
||||
d->playlist = playlist;
|
||||
}
|
||||
|
||||
DatabaseCommand_CalculatePlaytime::DatabaseCommand_CalculatePlaytime( const playlist_ptr& playlist, const QStringList& plEntryIds, QDateTime from, QDateTime to, QObject* parent )
|
||||
: DatabaseCommand( parent, new DatabaseCommand_CalculatePlaytimePrivate( this , from, to ) )
|
||||
{
|
||||
Q_D( DatabaseCommand_CalculatePlaytime );
|
||||
d->plEntryIds = plEntryIds;
|
||||
d->playlist = playlist;
|
||||
}
|
||||
|
||||
DatabaseCommand_CalculatePlaytime::DatabaseCommand_CalculatePlaytime( const track_ptr& track, QDateTime from, QDateTime to, QObject* parent )
|
||||
@@ -81,11 +90,34 @@ DatabaseCommand_CalculatePlaytime::exec( DatabaseImpl *dbi )
|
||||
{
|
||||
Q_D( DatabaseCommand_CalculatePlaytime );
|
||||
|
||||
QString sql = QString(
|
||||
" SELECT SUM(secs_played) "
|
||||
" FROM playback_log "
|
||||
" WHERE track in ( %1 ) AND playtime >= %2 AND playtime <= %3 "
|
||||
).arg( d->trackIds.join(", ") ).arg( d->from.toTime_t() ).arg( d->to.toTime_t() );
|
||||
QString sql;
|
||||
|
||||
if ( d->plEntryIds.isEmpty() )
|
||||
{
|
||||
sql = QString(
|
||||
" SELECT SUM(pl.secs_played) "
|
||||
" FROM playback_log pl "
|
||||
" WHERE track in ( %1 ) AND playtime >= %2 AND playtime <= %3 "
|
||||
).arg( d->trackIds.join(", ") ).arg( d->from.toTime_t() ).arg( d->to.toTime_t() );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Escape all GUIDs
|
||||
QMutableStringListIterator iter( d->plEntryIds );
|
||||
while ( iter.hasNext() )
|
||||
{
|
||||
iter.setValue( QString( "'%1'" ).arg( iter.next() ) );
|
||||
}
|
||||
sql = QString(
|
||||
" SELECT SUM(pl.secs_played) "
|
||||
" FROM playlist_item pi "
|
||||
" JOIN track t ON pi.trackname = t.name "
|
||||
" JOIN artist a ON a.name = pi.artistname AND t.artist = a.id "
|
||||
" JOIN playback_log pl ON pl.track = t.id "
|
||||
" WHERE guid IN (%1); "
|
||||
)
|
||||
.arg( d->plEntryIds.join(", ") );
|
||||
}
|
||||
|
||||
TomahawkSqlQuery query = dbi->newquery();
|
||||
query.prepare( sql );
|
||||
@@ -97,6 +129,11 @@ DatabaseCommand_CalculatePlaytime::exec( DatabaseImpl *dbi )
|
||||
playtime = query.value( 0 ).toUInt();
|
||||
}
|
||||
emit done( playtime );
|
||||
|
||||
if ( !d->playlist.isNull() )
|
||||
{
|
||||
emit done( d->playlist, playtime );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -31,6 +31,7 @@ class DLLEXPORT DatabaseCommand_CalculatePlaytime : public Tomahawk::DatabaseCom
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DatabaseCommand_CalculatePlaytime( const playlist_ptr& playlist, QDateTime from, QDateTime to, QObject* parent = 0 );
|
||||
explicit DatabaseCommand_CalculatePlaytime( const playlist_ptr& playlist, const QStringList& plEntryIds, QDateTime from, QDateTime to, QObject* parent = 0 );
|
||||
explicit DatabaseCommand_CalculatePlaytime( const track_ptr& track, QDateTime from, QDateTime to, QObject* parent = 0 );
|
||||
explicit DatabaseCommand_CalculatePlaytime( const QList<track_ptr>& tracks, QDateTime from, QDateTime to, QObject* parent = 0 );
|
||||
explicit DatabaseCommand_CalculatePlaytime( const query_ptr& query, QDateTime from, QDateTime to, QObject* parent = 0 );
|
||||
@@ -45,6 +46,7 @@ public:
|
||||
|
||||
signals:
|
||||
void done( uint playtime );
|
||||
void done( const Tomahawk::playlist_ptr& playlist, uint playtime );
|
||||
|
||||
private:
|
||||
Q_DECLARE_PRIVATE( DatabaseCommand_CalculatePlaytime )
|
||||
|
@@ -43,7 +43,9 @@ class DatabaseCommand_CalculatePlaytimePrivate : public DatabaseCommandPrivate
|
||||
private:
|
||||
QDateTime from;
|
||||
QDateTime to;
|
||||
QStringList plEntryIds;
|
||||
QStringList trackIds;
|
||||
Tomahawk::playlist_ptr playlist;
|
||||
};
|
||||
|
||||
}
|
||||
|
@@ -24,6 +24,8 @@
|
||||
#include "PlaylistEntry.h"
|
||||
#include "Source.h"
|
||||
|
||||
#include <qjson/parser.h>
|
||||
|
||||
#include <QSqlQuery>
|
||||
|
||||
using namespace Tomahawk;
|
||||
@@ -32,6 +34,7 @@ using namespace Tomahawk;
|
||||
DatabaseCommand_LoadAllPlaylists::DatabaseCommand_LoadAllPlaylists( const source_ptr& s, QObject* parent )
|
||||
: DatabaseCommand( parent, new DatabaseCommand_LoadAllPlaylistsPrivate( this, s ) )
|
||||
{
|
||||
qRegisterMetaType< QHash< Tomahawk::playlist_ptr, QStringList > >("QHash< Tomahawk::playlist_ptr, QStringList >");
|
||||
}
|
||||
|
||||
|
||||
@@ -55,19 +58,32 @@ DatabaseCommand_LoadAllPlaylists::exec( DatabaseImpl* dbi )
|
||||
if ( !source().isNull() )
|
||||
sourceToken = QString( "AND source %1 " ).arg( source()->isLocal() ? "IS NULL" : QString( "= %1" ).arg( source()->id() ) );
|
||||
|
||||
query.exec( QString( " SELECT p.guid, p.title, p.info, p.creator, p.lastmodified, p.shared, p.currentrevision, p.createdOn "
|
||||
QString trackIdJoin;
|
||||
QString trackIdFields;
|
||||
if ( d->returnPlEntryIds )
|
||||
{
|
||||
trackIdFields = ", pr.entries";
|
||||
trackIdJoin = "JOIN playlist_revision pr ON pr.playlist = p.guid AND pr.guid = p.currentrevision";
|
||||
}
|
||||
|
||||
query.exec( QString( " SELECT p.guid, p.title, p.info, p.creator, p.lastmodified, p.shared, p.currentrevision, p.createdOn %6 "
|
||||
" FROM playlist p "
|
||||
" %5 "
|
||||
" WHERE dynplaylist = 'false' "
|
||||
" %1 "
|
||||
" %2 %3 %4 "
|
||||
)
|
||||
.arg( sourceToken )
|
||||
.arg( orderToken )
|
||||
.arg( d->sortDescending ? "DESC" : QString() )
|
||||
.arg( d->limitAmount > 0 ? QString( "LIMIT 0, %1" ).arg( d->limitAmount ) : QString() )
|
||||
)
|
||||
.arg( sourceToken )
|
||||
.arg( orderToken )
|
||||
.arg( d->sortDescending ? "DESC" : QString() )
|
||||
.arg( d->limitAmount > 0 ? QString( "LIMIT 0, %1" ).arg( d->limitAmount ) : QString() )
|
||||
.arg( trackIdJoin )
|
||||
.arg( trackIdFields )
|
||||
);
|
||||
|
||||
QList<playlist_ptr> plists;
|
||||
QHash<playlist_ptr, QStringList> phash;
|
||||
QJson::Parser parser;
|
||||
while ( query.next() )
|
||||
{
|
||||
playlist_ptr p( new Playlist( source(), //src
|
||||
@@ -82,9 +98,20 @@ DatabaseCommand_LoadAllPlaylists::exec( DatabaseImpl* dbi )
|
||||
), &QObject::deleteLater );
|
||||
p->setWeakSelf( p.toWeakRef() );
|
||||
plists.append( p );
|
||||
|
||||
if ( d->returnPlEntryIds )
|
||||
{
|
||||
QStringList trackIds = parser.parse( query.value( 8 ).toByteArray() ).toStringList();
|
||||
phash.insert( p, trackIds );
|
||||
}
|
||||
}
|
||||
|
||||
emit done( plists );
|
||||
|
||||
if ( d->returnPlEntryIds )
|
||||
{
|
||||
emit done( phash );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -111,3 +138,11 @@ DatabaseCommand_LoadAllPlaylists::setSortDescending( bool descending )
|
||||
d->sortDescending = descending;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DatabaseCommand_LoadAllPlaylists::setReturnPlEntryIds( bool returnPlEntryIds )
|
||||
{
|
||||
Q_D( DatabaseCommand_LoadAllPlaylists );
|
||||
d->returnPlEntryIds = returnPlEntryIds;
|
||||
}
|
||||
|
||||
|
@@ -54,9 +54,24 @@ public:
|
||||
void setSortOrder( SortOrder order );
|
||||
void setSortDescending( bool descending );
|
||||
|
||||
/**
|
||||
* By default, only playlists with no revision will be loaded as fully
|
||||
* loading a revision is a lot of work which cannot be integrated into
|
||||
* one query.
|
||||
*
|
||||
* Often one only needs to know the trackIds of a playlist, not the
|
||||
* whole revision information.
|
||||
*/
|
||||
void setReturnPlEntryIds( bool returnPlEntryIds );
|
||||
|
||||
signals:
|
||||
void done( const QList<Tomahawk::playlist_ptr>& playlists );
|
||||
|
||||
/**
|
||||
* This signal is only emitted if returnTrackIds == true.
|
||||
*/
|
||||
void done( const QHash< Tomahawk::playlist_ptr, QStringList >& playlists );
|
||||
|
||||
private:
|
||||
Q_DECLARE_PRIVATE( DatabaseCommand_LoadAllPlaylists )
|
||||
};
|
||||
|
@@ -35,6 +35,7 @@ public:
|
||||
DatabaseCommand_LoadAllPlaylistsPrivate( DatabaseCommand_LoadAllPlaylists* q, const source_ptr& s )
|
||||
: DatabaseCommandPrivate( q, s )
|
||||
, limitAmount( 0 )
|
||||
, returnPlEntryIds( false )
|
||||
, sortOrder( DatabaseCommand_LoadAllPlaylists::None )
|
||||
, sortDescending( false )
|
||||
{
|
||||
@@ -44,6 +45,7 @@ public:
|
||||
|
||||
private:
|
||||
unsigned int limitAmount;
|
||||
bool returnPlEntryIds;
|
||||
DatabaseCommand_LoadAllPlaylists::SortOrder sortOrder;
|
||||
bool sortDescending;
|
||||
};
|
||||
|
Reference in New Issue
Block a user