1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-10 16:14:40 +02:00

Add basic trending tracks in NetworkActivities

This commit is contained in:
Uwe L. Korn
2013-07-10 19:37:56 +02:00
parent f87bf7921d
commit 8b8455c97c
8 changed files with 542 additions and 84 deletions

View File

@@ -22,16 +22,24 @@
#include "audio/AudioEngine.h"
#include "database/Database.h"
#include "database/DatabaseCommand_NetworkCharts.h"
#include "playlist/PlaylistChartItemDelegate.h"
#include "database/DatabaseCommand_TrendingTracks.h"
#include "playlist/AlbumItemDelegate.h"
// #include "playlist/PlaylistChartItemDelegate.h"
#include "playlist/ViewHeader.h"
#include "utils/AnimatedSpinner.h"
#include "utils/ImageRegistry.h"
#include "utils/Logger.h"
#include "utils/TomahawkStyle.h"
#include "utils/TomahawkUtilsGui.h"
#include "widgets/OverlayWidget.h"
#include <QDateTime>
#include <QStandardItemModel>
#include <QScrollArea>
#include <QtConcurrentRun>
#define NETWORKCHARTS_NUM_TRACKS 100
#define NETWORKCHARTS_NUM_TRACKS 20
#define TRENDING_TRACKS_NUM 3
using namespace Tomahawk;
using namespace Tomahawk::Widgets;
@@ -40,28 +48,17 @@ NetworkActivityWidget::NetworkActivityWidget( QWidget* parent )
: QWidget( parent )
, d_ptr( new NetworkActivityWidgetPrivate ( this ) )
{
d_func()->ui->setupUi( this );
Q_D( NetworkActivityWidget );
QWidget* widget = new QWidget();
TomahawkUtils::unmarginLayout( layout() );
TomahawkUtils::unmarginLayout( d_func()->ui->stackLeft->layout() );
TomahawkUtils::unmarginLayout( d_func()->ui->verticalLayout_2->layout() );
TomahawkUtils::unmarginLayout( d_func()->ui->horizontalLayout->layout() );
TomahawkUtils::unmarginLayout( d_func()->ui->breadCrumbLeft->layout() );
d->ui->setupUi( widget );
d_func()->crumbModelLeft = new QStandardItemModel( this );
d_func()->sortedProxy = new QSortFilterProxyModel( this );
d->crumbModelLeft = new QStandardItemModel( this );
d->sortedProxy = new QSortFilterProxyModel( this );
d_func()->ui->breadCrumbLeft->setRootIcon( TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ) );
// d_func()->ui->breadCrumbLeft->setRootIcon( TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ) );
connect( d_func()->ui->breadCrumbLeft, SIGNAL( activateIndex( QModelIndex ) ), SLOT( leftCrumbIndexChanged( QModelIndex ) ) );
d_func()->ui->tracksViewLeft->setHeaderHidden( true );
d_func()->ui->tracksViewLeft->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( d_func()->ui->tracksViewLeft, d_func()->ui->tracksViewLeft->proxyModel() );
d_func()->ui->tracksViewLeft->setPlaylistItemDelegate( del );
d_func()->ui->tracksViewLeft->setUniformRowHeights( false );
d_func()->playlistInterface = d_func()->ui->tracksViewLeft->playlistInterface();
// Build up breadcrumb
QStandardItem* rootItem = d_func()->crumbModelLeft->invisibleRootItem();
QStandardItem* chartItem = new QStandardItem( tr( "Charts" ) );
@@ -81,6 +78,111 @@ NetworkActivityWidget::NetworkActivityWidget( QWidget* parent )
d_func()->sortedProxy->setSourceModel( d_func()->crumbModelLeft );
d_func()->ui->breadCrumbLeft->setModel( d_func()->sortedProxy );
d_func()->ui->breadCrumbLeft->setVisible( true );
{
// d->ui->tracksViewLeft->setHeaderHidden( true );
// d->ui->tracksViewLeft->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
// PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( d->ui->tracksViewLeft, d->ui->tracksViewLeft->proxyModel() );
AlbumItemDelegate* del = new AlbumItemDelegate( d->ui->tracksViewLeft, d->ui->tracksViewLeft->proxyModel(), true );
d->ui->tracksViewLeft->setPlaylistItemDelegate( del );
// d->ui->tracksViewLeft->setUniformRowHeights( false );
// d->ui->tracksViewLeft->overlay()->setEnabled( false );
d->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Short );
d->ui->tracksViewLeft->setAutoResize( true );
d->ui->tracksViewLeft->setAlternatingRowColors( false );
d->ui->tracksViewLeft->setSortingEnabled( false );
d->ui->tracksViewLeft->setEmptyTip( tr( "Sorry, we could not find any top hits for this artist!" ) );
d->playlistInterface = d->ui->tracksViewLeft->playlistInterface();
QPalette p = d->ui->tracksViewLeft->palette();
p.setColor( QPalette::Text, TomahawkStyle::PAGE_TRACKLIST_TRACK_SOLVED );
p.setColor( QPalette::BrightText, TomahawkStyle::PAGE_TRACKLIST_TRACK_UNRESOLVED );
p.setColor( QPalette::Foreground, TomahawkStyle::PAGE_TRACKLIST_NUMBER );
p.setColor( QPalette::Highlight, TomahawkStyle::PAGE_TRACKLIST_HIGHLIGHT );
p.setColor( QPalette::HighlightedText, TomahawkStyle::PAGE_TRACKLIST_HIGHLIGHT_TEXT );
d->ui->tracksViewLeft->setPalette( p );
d->ui->tracksViewLeft->setFrameShape( QFrame::NoFrame );
d->ui->tracksViewLeft->setAttribute( Qt::WA_MacShowFocusRect, 0 );
d->ui->tracksViewLeft->setStyleSheet( "QTreeView { background-color: transparent; }" );
TomahawkStyle::stylePageFrame( d->ui->chartsFrame );
}
// Trending Tracks
{
d->trendingTracksModel = new PlaylistModel( d->ui->trendingTracksView );
// TODO:
// m_tracksModel = new RecentlyPlayedModel( ui->tracksView, HISTORY_TRACK_ITEMS );
d->ui->trendingTracksView->proxyModel()->setStyle( PlayableProxyModel::Short );
d->ui->trendingTracksView->overlay()->setEnabled( false );
d->ui->trendingTracksView->setPlaylistModel( d->trendingTracksModel );
d->ui->trendingTracksView->setAutoResize( true );
d->ui->trendingTracksView->setAlternatingRowColors( false );
QPalette p = d->ui->trendingTracksView->palette();
p.setColor( QPalette::Text, TomahawkStyle::PAGE_TRACKLIST_TRACK_SOLVED );
p.setColor( QPalette::BrightText, TomahawkStyle::PAGE_TRACKLIST_TRACK_UNRESOLVED );
p.setColor( QPalette::Foreground, TomahawkStyle::PAGE_TRACKLIST_NUMBER );
p.setColor( QPalette::Highlight, TomahawkStyle::PAGE_TRACKLIST_HIGHLIGHT );
p.setColor( QPalette::HighlightedText, TomahawkStyle::PAGE_TRACKLIST_HIGHLIGHT_TEXT );
d->ui->trendingTracksView->setPalette( p );
d->ui->trendingTracksView->setFrameShape( QFrame::NoFrame );
d->ui->trendingTracksView->setAttribute( Qt::WA_MacShowFocusRect, 0 );
d->ui->trendingTracksView->setStyleSheet( "QTreeView { background-color: transparent; }" );
TomahawkStyle::stylePageFrame( d->ui->trendingTracksFrame );
}
{
QFont f = d->ui->trendingTracksLabel->font();
f.setFamily( "Pathway Gothic One" );
QPalette p = d->ui->trendingTracksLabel->palette();
p.setColor( QPalette::Foreground, TomahawkStyle::PAGE_CAPTION );
d->ui->trendingTracksLabel->setFont( f );
d->ui->trendingTracksLabel->setPalette( p );
}
// Hot Playlists
{
TomahawkStyle::stylePageFrame( d->ui->hotPlaylistsFrame );
QFont f = d->ui->hotPlaylistsLabel->font();
f.setFamily( "Pathway Gothic One" );
QPalette p = d->ui->hotPlaylistsLabel->palette();
p.setColor( QPalette::Foreground, TomahawkStyle::PAGE_CAPTION );
d->ui->hotPlaylistsLabel->setFont( f );
d->ui->hotPlaylistsLabel->setPalette( p );
}
{
QScrollArea* area = new QScrollArea();
area->setWidgetResizable( true );
area->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
area->setWidget( widget );
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget( area );
setLayout( layout );
TomahawkUtils::unmarginLayout( layout );
}
{
// Load trending tracks
qRegisterMetaType< QList< QPair< double,Tomahawk::track_ptr > > >("QList< QPair< double,Tomahawk::track_ptr > >");
DatabaseCommand_TrendingTracks* dbcmd = new DatabaseCommand_TrendingTracks();
dbcmd->setLimit( TRENDING_TRACKS_NUM );
connect( dbcmd, SIGNAL( done( QList< QPair< double,Tomahawk::track_ptr > >) ),
SLOT( trendingTracks( QList< QPair< double,Tomahawk::track_ptr > > ) ) );
Database::instance()->enqueue( dbcmd_ptr( dbcmd ) );
}
}
@@ -97,6 +199,13 @@ NetworkActivityWidget::playlistInterface() const
}
QPixmap
NetworkActivityWidget::pixmap() const
{
return ImageRegistry::instance()->pixmap( RESPATH "images/network-activity.svg", QSize( 0, 0 ) );
}
bool
NetworkActivityWidget::isBeingPlayed() const
{
@@ -177,6 +286,25 @@ NetworkActivityWidget::overallCharts( const QList<track_ptr>& tracks )
}
void
NetworkActivityWidget::trendingTracks( const QList<QPair<double, track_ptr> >& _tracks )
{
Q_D( NetworkActivityWidget );
d->trendingTracksModel->startLoading();
QList<track_ptr> tracks;
QList< QPair< double, track_ptr > >::const_iterator iter = _tracks.constBegin();
const QList< QPair< double, track_ptr > >::const_iterator end = _tracks.constEnd();
for(; iter != end; ++iter)
{
tracks << iter->second;
}
d->trendingTracksModel->appendTracks( tracks );
d->trendingTracksModel->finishLoading();
}
void
NetworkActivityWidget::leftCrumbIndexChanged( const QModelIndex& index )
{
@@ -309,9 +437,11 @@ NetworkActivityWidget::showOverallCharts()
d_func()->activeView = OverallChart;
if ( !d_func()->overallChartsModel.isNull() )
{
d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large );
// d_func()->ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large );
d_func()->ui->tracksViewLeft->setPlaylistModel( d_func()->overallChartsModel );
d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 );
d_func()->ui->tracksViewLeft->setAutoResize( true );
// d_func()->ui->tracksViewLeft->proxyModel()->sort( -1 );
// d_func()->ui->tracksViewLeft->setAutoResize( true );
}
else
{

View File

@@ -51,9 +51,10 @@ public:
virtual Tomahawk::playlistinterface_ptr playlistInterface() const;
virtual QString title() const { return tr( "Network Activity" ); }
virtual QString description() const { return QString(); }
virtual QString description() const { return QString("Listening activity among your friends"); }
virtual QPixmap pixmap() const;
virtual bool showInfoBar() const { return false; }
virtual bool showInfoBar() const { return true; }
virtual bool isBeingPlayed() const;
virtual bool jumpToCurrentTrack();
@@ -65,6 +66,8 @@ private slots:
void yearlyCharts( const QList<Tomahawk::track_ptr>& );
void overallCharts( const QList<Tomahawk::track_ptr>& );
void trendingTracks( const QList< QPair< double,Tomahawk::track_ptr > >& tracks );
void leftCrumbIndexChanged( const QModelIndex& );
private:

View File

@@ -7,37 +7,153 @@
<x>0</x>
<y>0</y>
<width>875</width>
<height>513</height>
<height>520</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="Tomahawk::Breadcrumb" name="breadCrumbLeft" native="true"/>
<widget class="QFrame" name="frame">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="hotPlaylistsFrame">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="trendingTracksLabel">
<property name="font">
<font>
<pointsize>20</pointsize>
</font>
</property>
<property name="text">
<string>Trending Tracks</string>
</property>
</widget>
</item>
<item>
<widget class="PlaylistView" name="trendingTracksView">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="trendingTracksFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLabel" name="hotPlaylistsLabel">
<property name="font">
<font>
<pointsize>20</pointsize>
</font>
</property>
<property name="text">
<string>Hot Playlists</string>
</property>
</widget>
</item>
<item>
<widget class="Tomahawk::Widgets::PlaylistWidget" name="playlistView">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>100</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="stackLeft">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="page">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="PlaylistView" name="tracksViewLeft">
<property name="minimumSize">
<size>
<width>320</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QFrame" name="chartsFrame">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="Tomahawk::Breadcrumb" name="breadCrumbLeft" native="true"/>
</item>
<item>
<widget class="PlaylistView" name="tracksViewLeft">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>Tomahawk::Widgets::PlaylistWidget</class>
<extends>QListWidget</extends>
<header>PlaylistWidget.h</header>
</customwidget>
<customwidget>
<class>PlaylistView</class>
<extends>QTreeView</extends>

View File

@@ -44,6 +44,9 @@ private:
QPointer<PlaylistModel> monthlyChartsModel;
QPointer<PlaylistModel> yearlyChartsModel;
QPointer<PlaylistModel> overallChartsModel;
QPointer<PlaylistModel> trendingTracksModel;
Tomahawk::Widgets::NetworkActivityWidget::ViewType activeView;
};

View File

@@ -237,60 +237,60 @@ list(APPEND libSources
database/DatabaseImpl.cpp
database/DatabaseResolver.cpp
database/DatabaseCommand.cpp
database/DatabaseCommandLoggable.cpp
database/DatabaseCommand_Resolve.cpp
database/DatabaseCommand_AllArtists.cpp
database/DatabaseCommand_AllAlbums.cpp
database/DatabaseCommand_AllTracks.cpp
database/DatabaseCommand_AddClientAuth.cpp
database/DatabaseCommand_AddFiles.cpp
database/DatabaseCommand_AddSource.cpp
database/DatabaseCommand_AllAlbums.cpp
database/DatabaseCommand_AllArtists.cpp
database/DatabaseCommand_AllTracks.cpp
database/DatabaseCommand_ArtistStats.cpp
database/DatabaseCommand_ClientAuthValid.cpp
database/DatabaseCommand_CollectionAttributes.cpp
database/DatabaseCommand_CollectionStats.cpp
database/DatabaseCommand_CreateDynamicPlaylist.cpp
database/DatabaseCommand_CreatePlaylist.cpp
database/DatabaseCommand_DeleteDynamicPlaylist.cpp
database/DatabaseCommand_DeleteFiles.cpp
database/DatabaseCommand_DeleteInboxEntry.cpp
database/DatabaseCommand_DeletePlaylist.cpp
database/DatabaseCommand_DirMtimes.cpp
database/DatabaseCommand_FileMTimes.cpp
database/DatabaseCommand_LoadFiles.cpp
database/DatabaseCommand_LogPlayback.cpp
database/DatabaseCommand_AddSource.cpp
database/DatabaseCommand_SourceOffline.cpp
database/DatabaseCommand_CollectionStats.cpp
database/DatabaseCommand_TrackStats.cpp
database/DatabaseCommand_ArtistStats.cpp
database/DatabaseCommand_LoadPlaylistEntries.cpp
database/DatabaseCommand_LoadInboxEntries.cpp
database/DatabaseCommand_ModifyPlaylist.cpp
database/DatabaseCommand_PlaybackHistory.cpp
database/DatabaseCommand_SetPlaylistRevision.cpp
database/DatabaseCommand_GenericSelect.cpp
database/DatabaseCommand_LoadAllAutoPlaylists.cpp
database/DatabaseCommand_LoadAllPlaylists.cpp
database/DatabaseCommand_LoadAllSortedPlaylists.cpp
database/DatabaseCommand_LoadAllSources.cpp
database/DatabaseCommand_CreatePlaylist.cpp
database/DatabaseCommand_DeletePlaylist.cpp
database/DatabaseCommand_RenamePlaylist.cpp
database/DatabaseCommand_LoadOps.cpp
database/DatabaseCommand_UpdateSearchIndex.cpp
database/DatabaseCommand_SetDynamicPlaylistRevision.cpp
database/DatabaseCommand_CreateDynamicPlaylist.cpp
database/DatabaseCommand_LoadAllStations.cpp
database/DatabaseCommand_LoadDynamicPlaylist.cpp
database/DatabaseCommand_LoadDynamicPlaylistEntries.cpp
database/DatabaseCommand_LoadAllAutoPlaylists.cpp
database/DatabaseCommand_LoadAllStations.cpp
database/DatabaseCommand_DeleteDynamicPlaylist.cpp
database/DatabaseCommand_AddClientAuth.cpp
database/DatabaseCommand_ClientAuthValid.cpp
database/DatabaseCommand_SocialAction.cpp
database/DatabaseCommand_LoadFiles.cpp
database/DatabaseCommand_LoadInboxEntries.cpp
database/DatabaseCommand_LoadOps.cpp
database/DatabaseCommand_LoadPlaylistEntries.cpp
database/DatabaseCommand_LoadSocialActions.cpp
database/DatabaseCommand_LoadTrackAttributes.cpp
database/DatabaseCommand_GenericSelect.cpp
database/DatabaseCommand_SetCollectionAttributes.cpp
database/DatabaseCommand_CollectionAttributes.cpp
database/DatabaseCommand_TrackAttributes.cpp
database/DatabaseCommand_SetTrackAttributes.cpp
database/DatabaseCommand_PlaybackCharts.cpp
database/DatabaseCommand_ShareTrack.cpp
database/DatabaseCommand_DeleteInboxEntry.cpp
database/DatabaseCommand_LogPlayback.cpp
database/DatabaseCommand_ModifyInboxEntry.cpp
database/DatabaseCommand_ModifyPlaylist.cpp
database/DatabaseCommand_NetworkCharts.cpp
database/Database.cpp
database/TomahawkSqlQuery.cpp
database/DatabaseCommand_PlaybackCharts.cpp
database/DatabaseCommand_PlaybackHistory.cpp
database/DatabaseCommand_RenamePlaylist.cpp
database/DatabaseCommand_Resolve.cpp
database/DatabaseCommand_SetCollectionAttributes.cpp
database/DatabaseCommand_SetDynamicPlaylistRevision.cpp
database/DatabaseCommand_SetPlaylistRevision.cpp
database/DatabaseCommand_SetTrackAttributes.cpp
database/DatabaseCommand_ShareTrack.cpp
database/DatabaseCommand_SocialAction.cpp
database/DatabaseCommand_SourceOffline.cpp
database/DatabaseCommand_TrackAttributes.cpp
database/DatabaseCommand_TrackStats.cpp
database/DatabaseCommand_TrendingTracks.cpp
database/DatabaseCommand_UpdateSearchIndex.cpp
database/DatabaseCommandLoggable.cpp
database/IdThreadWorker.cpp
database/TomahawkSqlQuery.cpp
infosystem/InfoSystem.cpp
infosystem/InfoSystemCache.cpp

View File

@@ -0,0 +1,102 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#include "DatabaseCommand_TrendingTracks_p.h"
#include "database/DatabaseImpl.h"
#include "database/TomahawkSqlQuery.h"
#include "Track.h"
namespace Tomahawk {
DatabaseCommand_TrendingTracks::DatabaseCommand_TrendingTracks( QObject* parent )
: DatabaseCommand( parent, new DatabaseCommand_TrendingTracksPrivate( this ) )
{
}
DatabaseCommand_TrendingTracks::~DatabaseCommand_TrendingTracks()
{
}
void
DatabaseCommand_TrendingTracks::exec( DatabaseImpl* dbi )
{
Q_D( DatabaseCommand_TrendingTracks );
TomahawkSqlQuery query = dbi->newquery();
QString limit;
if ( d->amount > 0 )
{
limit = QString( "LIMIT 0, %1" ).arg( d->amount );
}
QDateTime now = QDateTime::currentDateTime();
QDateTime _1WeekAgo = now.addDays( -7 );
QDateTime _2WeeksAgo = now.addDays( -14 );
QDateTime _3WeeksAgo = now.addDays( -21 );
// TODO:
// -> Look at absolute playcount, an increase from 1 to 4 plays per week is currently considered very high
QString timespanSql = QString(
" SELECT COUNT(*) as counter, track "
" FROM playback_log "
" WHERE playback_log.source IS NOT NULL " // exclude self
" AND playback_log.playtime >= %1 AND playback_log.playtime <= %2 "
" GROUP BY playback_log.track "
);
QString lastWeekSql = timespanSql.arg( _1WeekAgo.toTime_t() ).arg( now.toTime_t() );
QString _1BeforeLastWeekSql = timespanSql.arg( _2WeeksAgo.toTime_t() ).arg( _1WeekAgo.toTime_t() );
QString _2BeforeLastWeekSql = timespanSql.arg( _3WeeksAgo.toTime_t() ).arg( _2WeeksAgo.toTime_t() );
QString sql = QString(
" SELECT track.name, artist.name, ( lastweek.counter - weekbefore.counter ) as slope1, max( weekbefore.counter - week2before.counter, 1 ) as slope2, ( ( lastweek.counter - weekbefore.counter ) / max( weekbefore.counter - week2before.counter, 1 ) ) as trending "
" FROM ( %1 ) lastweek, ( %2 ) weekbefore, ( %3 ) week2before, track, artist "
" WHERE lastweek.track = weekbefore.track AND weekbefore.track = week2before.track "
" AND track.id = lastweek.track AND artist.id = track.artist "
" AND ( lastweek.counter - weekbefore.counter ) > 0"
" ORDER BY slope1 DESC %4 "
).arg( lastWeekSql ).arg( _1BeforeLastWeekSql ).arg( _2BeforeLastWeekSql ).arg( limit );
query.prepare( sql );
query.exec();
QList< QPair< double, Tomahawk::track_ptr > > tracks;
while ( query.next() )
{
Tomahawk::track_ptr track = Tomahawk::Track::get( query.value( 1 ).toString(), query.value( 0 ).toString() );
if ( !track )
continue;
tracks << QPair< double, track_ptr >( query.value( 4 ).toDouble(), track );
}
emit done( tracks );
}
void
DatabaseCommand_TrendingTracks::setLimit( unsigned int amount )
{
Q_D( DatabaseCommand_TrendingTracks );
d->amount = amount;
}
} // namespace Tomahawk

View File

@@ -0,0 +1,57 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TOMAHAWK_DATABASECOMMAND_TRENDINGTRACKS_H
#define TOMAHAWK_DATABASECOMMAND_TRENDINGTRACKS_H
#include "database/DatabaseCommand.h"
namespace Tomahawk {
class DatabaseCommand_TrendingTracksPrivate;
/**
* Find tracks that trend among your friends.
*
* At the moment the most trending tracks are those with the highest quotient of
* plays in the last week and the week before.
*/
class DLLEXPORT DatabaseCommand_TrendingTracks : public Tomahawk::DatabaseCommand
{
Q_OBJECT
public:
explicit DatabaseCommand_TrendingTracks( QObject *parent = 0 );
virtual ~DatabaseCommand_TrendingTracks();
virtual void exec( DatabaseImpl* );
virtual bool doesMutates() const { return false; }
virtual QString commandname() const { return "trendingtracks"; }
void setLimit( unsigned int amount );
signals:
void done( const QList<QPair< double, Tomahawk::track_ptr > >& tracks );
private:
Q_DECLARE_PRIVATE( DatabaseCommand_TrendingTracks )
};
} // namespace Tomahawk
#endif // TOMAHAWK_DATABASECOMMAND_TRENDINGTRACKS_H

View File

@@ -0,0 +1,47 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DATABASECOMMAND_TRENDINGTRACKS_P_H
#define DATABASECOMMAND_TRENDINGTRACKS_P_H
#include "database/DatabaseCommand_TrendingTracks.h"
#include "database/DatabaseCommand_p.h"
#include "Source.h"
namespace Tomahawk
{
class DatabaseCommand_TrendingTracksPrivate: DatabaseCommandPrivate
{
public:
DatabaseCommand_TrendingTracksPrivate( DatabaseCommand_TrendingTracks* q )
: DatabaseCommandPrivate( q )
, amount( 0 )
{
}
Q_DECLARE_PUBLIC( DatabaseCommand_TrendingTracks )
private:
uint amount;
};
} // Tomahawk
#endif // DATABASECOMMAND_TRENDINGTRACKS_P_H