mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-05 05:37:29 +02:00
refactor the generator a bit to share code
update the data in the echonest control when changing type
This commit is contained in:
@@ -60,6 +60,8 @@ Tomahawk::EchonestControl::setSelectedType ( const QString& type )
|
|||||||
|
|
||||||
Tomahawk::DynamicControl::setSelectedType ( type );
|
Tomahawk::DynamicControl::setSelectedType ( type );
|
||||||
updateWidgets();
|
updateWidgets();
|
||||||
|
updateData();
|
||||||
|
qDebug() << "Setting new type, set data to:" << m_data.first << m_data.second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -76,6 +76,11 @@ void
|
|||||||
EchonestGenerator::generate ( int number )
|
EchonestGenerator::generate ( int number )
|
||||||
{
|
{
|
||||||
// convert to an echonest query, and fire it off
|
// convert to an echonest query, and fire it off
|
||||||
|
qDebug() << Q_FUNC_INFO;
|
||||||
|
qDebug() << "Generating playlist with " << m_controls.size();
|
||||||
|
foreach( const dyncontrol_ptr& ctrl, m_controls )
|
||||||
|
qDebug() << ctrl->selectedType() << ctrl->match() << ctrl->input();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Echonest::DynamicPlaylist::PlaylistParams params = getParams();
|
Echonest::DynamicPlaylist::PlaylistParams params = getParams();
|
||||||
|
|
||||||
@@ -153,7 +158,7 @@ EchonestGenerator::getParams() const throw( std::runtime_error )
|
|||||||
foreach( const dyncontrol_ptr& control, m_controls ) {
|
foreach( const dyncontrol_ptr& control, m_controls ) {
|
||||||
params.append( control.dynamicCast<EchonestControl>()->toENParam() );
|
params.append( control.dynamicCast<EchonestControl>()->toENParam() );
|
||||||
}
|
}
|
||||||
params.append( Echonest::DynamicPlaylist::PlaylistParamData( Echonest::DynamicPlaylist::Type, determineRadioType() ) );
|
appendRadioType( params );
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,50 +198,46 @@ EchonestGenerator::dynamicFetched()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
EchonestGenerator::onlyThisArtistType( Echonest::DynamicPlaylist::ArtistTypeEnum type ) const throw( std::runtime_error )
|
||||||
|
{
|
||||||
|
bool only = true;
|
||||||
|
bool some = false;
|
||||||
|
|
||||||
|
foreach( const dyncontrol_ptr& control, m_controls ) {
|
||||||
|
if( control->selectedType() == "Artist" && static_cast<Echonest::DynamicPlaylist::ArtistTypeEnum>( control->match().toInt() ) != type ) {
|
||||||
|
only = false;
|
||||||
|
} else if( control->selectedType() == "Artist" && static_cast<Echonest::DynamicPlaylist::ArtistTypeEnum>( control->match().toInt() ) == type ) {
|
||||||
|
some = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( some && only ) {
|
||||||
|
return true;
|
||||||
|
} else if( some && !only ) {
|
||||||
|
throw std::runtime_error( "All artist match types must be the same" );
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Echonest::DynamicPlaylist::ArtistTypeEnum
|
void
|
||||||
EchonestGenerator::determineRadioType() const throw( std::runtime_error )
|
EchonestGenerator::appendRadioType( Echonest::DynamicPlaylist::PlaylistParams& params ) const throw( std::runtime_error )
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* so we try to match the best type of echonest playlist, based on the controls
|
* so we try to match the best type of echonest playlist, based on the controls
|
||||||
* the types are artist, artist-radio, artist-description, catalog, catalog-radio, song-radio. we don't care about the catalog ones.
|
* the types are artist, artist-radio, artist-description, catalog, catalog-radio, song-radio. we don't care about the catalog ones.
|
||||||
*
|
*
|
||||||
* Fallback is artist-radio
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/// 1. artist: If all the artist controls are Limit-To. If some were but not all, error out.
|
/// 1. artist: If all the artist controls are Limit-To. If some were but not all, error out.
|
||||||
bool artistOnly = true;
|
|
||||||
bool someArtist = false;
|
|
||||||
foreach( const dyncontrol_ptr& control, m_controls ) {
|
|
||||||
if( control->selectedType() == "Artist" && static_cast<Echonest::DynamicPlaylist::ArtistTypeEnum>( control->match().toInt() ) != Echonest::DynamicPlaylist::ArtistType ) {
|
|
||||||
artistOnly = false;
|
|
||||||
} else if( control->selectedType() == "Artist" && static_cast<Echonest::DynamicPlaylist::ArtistTypeEnum>( control->match().toInt() ) == Echonest::DynamicPlaylist::ArtistType ) {
|
|
||||||
someArtist = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( someArtist && artistOnly ) {
|
|
||||||
return Echonest::DynamicPlaylist::ArtistType;
|
|
||||||
} else if( someArtist && !artistOnly ) {
|
|
||||||
throw std::runtime_error( "All artist match types must be the same" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 2. artist-description: If all the artist entries are Description. If some were but not all, error out.
|
/// 2. artist-description: If all the artist entries are Description. If some were but not all, error out.
|
||||||
bool artistDescOnly = true;
|
/// 3. Artist-Radio: If all the artist entries are Similar To. If some were but not all, error out.
|
||||||
bool someArtistDescFound = false;
|
if( onlyThisArtistType( Echonest::DynamicPlaylist::ArtistType ) )
|
||||||
|
params.append( Echonest::DynamicPlaylist::PlaylistParamData( Echonest::DynamicPlaylist::Type, Echonest::DynamicPlaylist::ArtistType ) );
|
||||||
foreach( const dyncontrol_ptr& control, m_controls ) {
|
else if( onlyThisArtistType( Echonest::DynamicPlaylist::ArtistDescriptionType ) )
|
||||||
if( control->selectedType() == "Artist" && static_cast<Echonest::DynamicPlaylist::ArtistTypeEnum>( control->match().toInt() ) == Echonest::DynamicPlaylist::ArtistDescriptionType ) {
|
params.append( Echonest::DynamicPlaylist::PlaylistParamData( Echonest::DynamicPlaylist::Type, Echonest::DynamicPlaylist::ArtistDescriptionType ) );
|
||||||
someArtistDescFound = true;
|
else if( onlyThisArtistType( Echonest::DynamicPlaylist::ArtistRadioType ) )
|
||||||
} else if( control->selectedType() == "Artist" && static_cast<Echonest::DynamicPlaylist::ArtistTypeEnum>( control->match().toInt() ) != Echonest::DynamicPlaylist::ArtistDescriptionType ) {
|
params.append( Echonest::DynamicPlaylist::PlaylistParamData( Echonest::DynamicPlaylist::Type, Echonest::DynamicPlaylist::ArtistRadioType ) );
|
||||||
artistDescOnly = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( someArtistDescFound && artistDescOnly ) {
|
|
||||||
return Echonest::DynamicPlaylist::ArtistDescriptionType;
|
|
||||||
} else if( someArtistDescFound && !artistDescOnly ) // fail, must be all artist desc
|
|
||||||
throw std::runtime_error( "All artist match types must be the same" );
|
|
||||||
|
|
||||||
return Echonest::DynamicPlaylist::ArtistRadioType;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
query_ptr
|
query_ptr
|
||||||
|
@@ -58,7 +58,8 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
Echonest::DynamicPlaylist::PlaylistParams getParams() const throw( std::runtime_error );
|
Echonest::DynamicPlaylist::PlaylistParams getParams() const throw( std::runtime_error );
|
||||||
query_ptr queryFromSong( const Echonest::Song& song );
|
query_ptr queryFromSong( const Echonest::Song& song );
|
||||||
Echonest::DynamicPlaylist::ArtistTypeEnum determineRadioType() const throw( std::runtime_error );
|
void appendRadioType( Echonest::DynamicPlaylist::PlaylistParams& params ) const throw( std::runtime_error );
|
||||||
|
bool onlyThisArtistType( Echonest::DynamicPlaylist::ArtistTypeEnum type ) const throw( std::runtime_error );
|
||||||
|
|
||||||
Echonest::DynamicPlaylist* m_dynPlaylist;
|
Echonest::DynamicPlaylist* m_dynPlaylist;
|
||||||
QPixmap m_logo;
|
QPixmap m_logo;
|
||||||
|
@@ -63,7 +63,7 @@ DynamicControlList::init()
|
|||||||
setLayout( m_layout );
|
setLayout( m_layout );
|
||||||
m_layout->setColumnStretch( 2, 1 );
|
m_layout->setColumnStretch( 2, 1 );
|
||||||
m_layout->setMargin( 0 );
|
m_layout->setMargin( 0 );
|
||||||
m_layout->setSpacing( 0 );
|
m_layout->setVerticalSpacing( 0 );
|
||||||
m_layout->setContentsMargins( 0, 0, 0, 0 );
|
m_layout->setContentsMargins( 0, 0, 0, 0 );
|
||||||
m_layout->setSizeConstraint( QLayout::SetMinimumSize );
|
m_layout->setSizeConstraint( QLayout::SetMinimumSize );
|
||||||
|
|
||||||
|
@@ -114,6 +114,10 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist )
|
|||||||
if( !m_playlist.isNull() && ( m_playlist.data() == playlist.data() ) // same playlist pointer
|
if( !m_playlist.isNull() && ( m_playlist.data() == playlist.data() ) // same playlist pointer
|
||||||
&& m_playlist->generator()->controls().size() == playlist->generator()->controls().size() ) {
|
&& m_playlist->generator()->controls().size() == playlist->generator()->controls().size() ) {
|
||||||
// we can skip our work. just let the dynamiccontrollist show the difference
|
// we can skip our work. just let the dynamiccontrollist show the difference
|
||||||
|
qDebug() << "SKIPPING SETTING:" << playlist->generator()->controls().size();
|
||||||
|
foreach( const dyncontrol_ptr& control, playlist->generator()->controls() ) {
|
||||||
|
qDebug() << "CONTROL:" << control->selectedType() << control->match() << control->input();
|
||||||
|
}
|
||||||
m_controls->setControls( m_playlist->generator(), m_playlist->generator()->controls(), m_playlist->author()->isLocal() );
|
m_controls->setControls( m_playlist->generator(), m_playlist->generator()->controls(), m_playlist->author()->isLocal() );
|
||||||
|
|
||||||
m_playlist = playlist;
|
m_playlist = playlist;
|
||||||
|
Reference in New Issue
Block a user