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

Add album and tracks view to script collections

This commit is contained in:
Dominik Schmidt
2015-01-11 21:25:36 +01:00
parent 8ac87615c9
commit 1cbae9b957
9 changed files with 154 additions and 34 deletions

View File

@@ -624,6 +624,14 @@ Tomahawk.PluginManager = {
resolve: [], resolve: [],
invokeSync: function (requestId, objectId, methodName, params) { invokeSync: function (requestId, objectId, methodName, params) {
if (!Tomahawk.resolver.instance.apiVersion || Tomahawk.resolver.instance.apiVersion < 0.9) {
if (methodName === 'artistAlbums') {
methodName = 'albums';
} else if ( methodName === 'albumTracks' ) {
methodName = 'tracks';
}
}
var pluginManager = this; var pluginManager = this;
if (!this.objects[objectId]) { if (!this.objects[objectId]) {
Tomahawk.log("Object not found! objectId: " + objectId + " methodName: " + methodName); Tomahawk.log("Object not found! objectId: " + objectId + " methodName: " + methodName);
@@ -694,6 +702,15 @@ Tomahawk.ConfigTestResultType = {
}; };
Tomahawk.Collection = {
BrowseCapability: {
Artists: 1,
Albums: 2,
Tracks: 4
}
};
// Legacy compability for 0.8 and before // Legacy compability for 0.8 and before
Tomahawk.reportCapabilities = function (capabilities) { Tomahawk.reportCapabilities = function (capabilities) {
if (capabilities & TomahawkResolverCapability.Browsable) { if (capabilities & TomahawkResolverCapability.Browsable) {

View File

@@ -67,6 +67,13 @@ Collection::weakRef() const
} }
QSet< Collection::BrowseCapability >
Collection::browseCapabilities() const
{
return m_browseCapabilities;
}
const QString const QString
Collection::name() const Collection::name() const
{ {

View File

@@ -27,10 +27,6 @@
#ifndef TOMAHAWK_COLLECTION_H #ifndef TOMAHAWK_COLLECTION_H
#define TOMAHAWK_COLLECTION_H #define TOMAHAWK_COLLECTION_H
#include <QHash>
#include <QList>
#include <QSharedPointer>
#include "Typedefs.h" #include "Typedefs.h"
#include "Playlist.h" #include "Playlist.h"
#include "playlist/dynamic/DynamicPlaylist.h" #include "playlist/dynamic/DynamicPlaylist.h"
@@ -41,6 +37,12 @@
#include "DllMacro.h" #include "DllMacro.h"
#include <QHash>
#include <QList>
#include <QSharedPointer>
#include <QSet>
namespace Tomahawk namespace Tomahawk
{ {
@@ -55,6 +57,16 @@ public:
void setWeakRef( const collection_wptr& weakRef ); void setWeakRef( const collection_wptr& weakRef );
const collection_wptr weakRef() const; const collection_wptr weakRef() const;
enum BrowseCapability
{
CapabilityBrowseNull = 0x0,
CapabilityBrowseArtists = 0x1,
CapabilityBrowseAlbums = 0x2,
CapabilityBrowseTracks = 0x4
};
QSet< BrowseCapability > browseCapabilities() const;
enum BackendType enum BackendType
{ {
NullCollectionType = 0, NullCollectionType = 0,
@@ -127,6 +139,7 @@ public slots:
protected: protected:
QString m_name; QString m_name;
unsigned int m_lastmodified; // unix time of last change to collection unsigned int m_lastmodified; // unix time of last change to collection
QSet< BrowseCapability > m_browseCapabilities;
private slots: private slots:
void onSynced(); void onSynced();

View File

@@ -229,6 +229,27 @@ ScriptCollection::parseMetaData( const QVariantMap& metadata )
fetchIcon( metadata.value( "iconurl" ).toString() ); fetchIcon( metadata.value( "iconurl" ).toString() );
} }
if ( metadata.contains( "capabilities" ) )
{
QVariantList list = metadata[ "capabilities" ].toList();
foreach( const QVariant& type, list )
{
bool ok;
int intType = type.toInt( &ok );
if ( ok )
{
tLog() << intType;
m_browseCapabilities << static_cast< BrowseCapability >( intType );
}
}
}
else
{
m_browseCapabilities << CapabilityBrowseArtists;
}
} }

View File

@@ -26,6 +26,7 @@
#include "PlaylistEntry.h" #include "PlaylistEntry.h"
#include "ScriptCollection.h" #include "ScriptCollection.h"
#include "ScriptJob.h" #include "ScriptJob.h"
#include "ScriptCommand_AllArtists.h"
using namespace Tomahawk; using namespace Tomahawk;
@@ -70,16 +71,18 @@ ScriptCommand_AllAlbums::exec()
return; return;
} }
if ( !m_artist ) ScriptJob* job;
if ( m_artist )
{ {
reportFailure(); QVariantMap arguments;
return; arguments[ "artist" ] = m_artist->name();
job = collection->scriptObject()->invoke( "artistAlbums", arguments );
}
else
{
job = collection->scriptObject()->invoke( "albums" );
} }
QVariantMap arguments;
arguments[ "artist" ] = m_artist->name();
ScriptJob* job = collection->scriptObject()->invoke( "albums", arguments );
connect( job, SIGNAL( done( QVariantMap ) ), SLOT( onAlbumsJobDone( QVariantMap ) ), Qt::QueuedConnection ); connect( job, SIGNAL( done( QVariantMap ) ), SLOT( onAlbumsJobDone( QVariantMap ) ), Qt::QueuedConnection );
job->start(); job->start();
} }
@@ -108,8 +111,17 @@ ScriptCommand_AllAlbums::onAlbumsJobDone(const QVariantMap& result)
return; return;
} }
QList< Tomahawk::album_ptr > a = parseAlbumVariantList( m_artist, result[ "albums" ].toList() ); QList< Tomahawk::artist_ptr > resultArtists;
if ( result["artists"].toList().length() > 0 )
{
resultArtists = ScriptCommand_AllArtists::parseArtistVariantList( result[ "artists" ].toList() );
}
else
{
resultArtists << m_artist;
}
QList< Tomahawk::album_ptr > a = parseAlbumVariantList( resultArtists, result[ "albums" ].toList() );
if ( m_filter.isEmpty() ) if ( m_filter.isEmpty() )
emit albums( a ); emit albums( a );
else else
@@ -130,19 +142,34 @@ ScriptCommand_AllAlbums::onAlbumsJobDone(const QVariantMap& result)
QList< Tomahawk::album_ptr > QList< Tomahawk::album_ptr >
ScriptCommand_AllAlbums::parseAlbumVariantList( const Tomahawk::artist_ptr& artist, const QVariantList& reslist ) ScriptCommand_AllAlbums::parseAlbumVariantList( const QList< Tomahawk::artist_ptr >& artists, const QVariantList& reslist )
{ {
QList< Tomahawk::album_ptr > results; QList< Tomahawk::album_ptr > results;
foreach( const QVariant& rv, reslist ) if (artists.length() != 1 && reslist.length() != artists.length())
{ {
const QString val = rv.toString(); tLog() << "artists" << artists.length();
tLog() << "albums" << reslist.length();
Q_ASSERT(false);
tLog() << "Got invalid collection albums response where artists and albums don't match";
return results;
}
bool useArtistList = ( artists.length() > 1 );
for( int i=0; i<reslist.length(); i++ )
{
const QString val = reslist[ i ].toString();
if ( val.trimmed().isEmpty() ) if ( val.trimmed().isEmpty() )
continue; continue;
Tomahawk::album_ptr ap = Tomahawk::Album::get( artist, val, false ); if ( useArtistList )
{
results << ap; results << Tomahawk::Album::get( artists[ i ], val, false );
}
else
{
results << Tomahawk::Album::get( artists[ 0 ], val, false );
}
} }
return results; return results;

View File

@@ -52,7 +52,7 @@ private slots:
void onAlbumsJobDone( const QVariantMap& result ); void onAlbumsJobDone( const QVariantMap& result );
private: private:
static QList< Tomahawk::album_ptr > parseAlbumVariantList( const Tomahawk::artist_ptr& artist, static QList< Tomahawk::album_ptr > parseAlbumVariantList( const QList< Tomahawk::artist_ptr >& artists,
const QVariantList& reslist ); const QVariantList& reslist );
Tomahawk::collection_ptr m_collection; Tomahawk::collection_ptr m_collection;
Tomahawk::artist_ptr m_artist; Tomahawk::artist_ptr m_artist;

View File

@@ -29,7 +29,9 @@ namespace Tomahawk
class ScriptCommand_AllArtists : public ScriptCommand, public Tomahawk::ArtistsRequest class ScriptCommand_AllArtists : public ScriptCommand, public Tomahawk::ArtistsRequest
{ {
Q_OBJECT Q_OBJECT
friend class ScriptCommand_AllAlbums;
public: public:
explicit ScriptCommand_AllArtists( const Tomahawk::collection_ptr& collection, explicit ScriptCommand_AllArtists( const Tomahawk::collection_ptr& collection,
QObject* parent = nullptr ); QObject* parent = nullptr );

View File

@@ -64,17 +64,21 @@ ScriptCommand_AllTracks::exec()
return; return;
} }
if ( m_album.isNull() ) ScriptJob* job;
if( m_album )
{ {
reportFailure(); QVariantMap arguments;
return; arguments[ "artist" ] = m_album->artist()->name();
arguments[ "album" ] = m_album->name();
job = collection->scriptObject()->invoke( "albumTracks", arguments );
}
else
{
job = collection->scriptObject()->invoke( "tracks" );
} }
QVariantMap arguments;
arguments[ "artist" ] = m_album->artist()->name();
arguments[ "album" ] = m_album->name();
ScriptJob* job = collection->scriptObject()->invoke( "tracks", arguments );
connect( job, SIGNAL( done( QVariantMap ) ), SLOT( onTracksJobDone( QVariantMap ) ), Qt::QueuedConnection ); connect( job, SIGNAL( done( QVariantMap ) ), SLOT( onTracksJobDone( QVariantMap ) ), Qt::QueuedConnection );
job->start(); job->start();
} }

View File

@@ -88,9 +88,15 @@ CollectionViewPage::CollectionViewPage( const Tomahawk::collection_ptr& collecti
m_header->ui->anchor1Label->setText( tr( "Artists" ) ); m_header->ui->anchor1Label->setText( tr( "Artists" ) );
m_header->ui->anchor2Label->setText( tr( "Albums" ) ); m_header->ui->anchor2Label->setText( tr( "Albums" ) );
m_header->ui->anchor3Label->setText( tr( "Songs" ) ); m_header->ui->anchor3Label->setText( tr( "Songs" ) );
m_header->ui->anchor1Label->show();
m_header->ui->anchor2Label->show(); if( collection->browseCapabilities().contains( Collection::CapabilityBrowseArtists ) )
m_header->ui->anchor3Label->show(); m_header->ui->anchor1Label->show();
if( collection->browseCapabilities().contains( Collection::CapabilityBrowseAlbums ) )
m_header->ui->anchor2Label->show();
if( collection->browseCapabilities().contains( Collection::CapabilityBrowseTracks ) )
m_header->ui->anchor3Label->show();
const float lowOpacity = 0.8; const float lowOpacity = 0.8;
m_header->ui->anchor1Label->setOpacity( 1 ); m_header->ui->anchor1Label->setOpacity( 1 );
@@ -335,7 +341,33 @@ CollectionViewPage::restoreViewMode()
m_mode = static_cast< CollectionViewPageMode >( modeNumber ); m_mode = static_cast< CollectionViewPageMode >( modeNumber );
TomahawkSettings::instance()->endGroup(); TomahawkSettings::instance()->endGroup();
setCurrentMode( (CollectionViewPageMode)modeNumber ); // try to set a supported mode otherwise fall back to artists view
CollectionViewPageMode mode = (CollectionViewPageMode) modeNumber;
if ( mode == CollectionViewPage::Columns && !m_collection->browseCapabilities().contains( Collection::CapabilityBrowseArtists ) )
{
tLog() << Q_FUNC_INFO << 0;
if ( m_collection->browseCapabilities().contains( Collection::CapabilityBrowseAlbums ) )
setCurrentMode( CollectionViewPage::Albums );
else if ( m_collection->browseCapabilities().contains( Collection::CapabilityBrowseTracks ) )
setCurrentMode( CollectionViewPage::Columns );
}
else if ( mode == CollectionViewPage::Albums && !m_collection->browseCapabilities().contains( Collection::CapabilityBrowseAlbums ) )
{
tLog() << Q_FUNC_INFO << 1;
if ( m_collection->browseCapabilities().contains( Collection::CapabilityBrowseTracks ) )
setCurrentMode( CollectionViewPage::Flat );
else
setCurrentMode( CollectionViewPage::Columns );
} else if ( mode == CollectionViewPage::Flat && !m_collection->browseCapabilities().contains( Collection::CapabilityBrowseTracks ) )
{
tLog() << Q_FUNC_INFO << 2;
if ( m_collection->browseCapabilities().contains( Collection::CapabilityBrowseArtists ) )
setCurrentMode( CollectionViewPage::Columns );
else if ( m_collection->browseCapabilities().contains( Collection::CapabilityBrowseAlbums ) )
setCurrentMode( CollectionViewPage::Albums );
} else {
setCurrentMode( mode );
}
} }
@@ -386,9 +418,6 @@ CollectionViewPage::onCollectionChanged()
} }
else else
setEmptyTip( tr( "This collection is empty." ) ); setEmptyTip( tr( "This collection is empty." ) );
if ( m_collection.objectCast<ScriptCollection>() )
m_trackView->setEmptyTip( tr( "Cloud collections aren't supported in the flat view yet. We will have them covered soon. Switch to another view to navigate them." ) );
} }