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:
@@ -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
|
||||
{
|
||||
|
@@ -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:
|
||||
|
@@ -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>
|
||||
|
@@ -44,6 +44,9 @@ private:
|
||||
QPointer<PlaylistModel> monthlyChartsModel;
|
||||
QPointer<PlaylistModel> yearlyChartsModel;
|
||||
QPointer<PlaylistModel> overallChartsModel;
|
||||
|
||||
QPointer<PlaylistModel> trendingTracksModel;
|
||||
|
||||
Tomahawk::Widgets::NetworkActivityWidget::ViewType activeView;
|
||||
};
|
||||
|
||||
|
@@ -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
|
||||
|
102
src/libtomahawk/database/DatabaseCommand_TrendingTracks.cpp
Normal file
102
src/libtomahawk/database/DatabaseCommand_TrendingTracks.cpp
Normal 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
|
57
src/libtomahawk/database/DatabaseCommand_TrendingTracks.h
Normal file
57
src/libtomahawk/database/DatabaseCommand_TrendingTracks.h
Normal 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
|
47
src/libtomahawk/database/DatabaseCommand_TrendingTracks_p.h
Normal file
47
src/libtomahawk/database/DatabaseCommand_TrendingTracks_p.h
Normal 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
|
Reference in New Issue
Block a user