mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-04-08 10:02:29 +02:00
Keep track of spotify IDs of tracks in a synced playlist and update to id api
This commit is contained in:
parent
02ff39f595
commit
f414e92b74
@ -168,7 +168,7 @@ SpotifyAccount::resolverMessage( const QString &msgType, const QVariantMap &msg
|
||||
SpotifyPlaylistUpdater* updater = m_updaters[ plid ];
|
||||
Q_ASSERT( updater->sync() );
|
||||
|
||||
const int startPos = msg.value( "startPosition" ).toInt();
|
||||
const QString startPos = msg.value( "startPosition" ).toString();
|
||||
const QVariantList tracksList = msg.value( "tracks" ).toList();
|
||||
const QString newRev = msg.value( "revid" ).toString();
|
||||
const QString oldRev = msg.value( "oldRev" ).toString();
|
||||
@ -210,7 +210,6 @@ SpotifyAccount::resolverMessage( const QString &msgType, const QVariantMap &msg
|
||||
const QString newRev = msg.value( "revid" ).toString();
|
||||
const QString oldRev = msg.value( "oldRev" ).toString();
|
||||
|
||||
|
||||
updater->spotifyTracksMoved( tracksList, newRev, oldRev );
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ SpotifyUpdaterFactory::create( const Tomahawk::playlist_ptr& pl )
|
||||
}
|
||||
|
||||
// Register the updater with the account
|
||||
const QString spotifyId = QString( "playlistupdaters/%1" ).arg( pl->guid() );
|
||||
const QString spotifyId = TomahawkSettings::instance()->value( QString( "playlistupdaters/%1/spotifyId" ).arg( pl->guid() ) ).toString();
|
||||
Q_ASSERT( !spotifyId.isEmpty() );
|
||||
SpotifyPlaylistUpdater* updater = new SpotifyPlaylistUpdater( m_account, pl );
|
||||
m_account->registerUpdaterForPlaylist( spotifyId, updater );
|
||||
@ -140,28 +140,40 @@ SpotifyPlaylistUpdater::sync() const
|
||||
|
||||
|
||||
void
|
||||
SpotifyPlaylistUpdater::spotifyTracksAdded( const QVariantList& tracks, int startPos, const QString& newRev, const QString& oldRev )
|
||||
SpotifyPlaylistUpdater::spotifyTracksAdded( const QVariantList& tracks, const QString& startPosId, const QString& newRev, const QString& oldRev )
|
||||
{
|
||||
const QList< query_ptr > queries = variantToQueries( tracks );
|
||||
|
||||
qDebug() << Q_FUNC_INFO << "inserting tracks in middle of tomahawk playlist, from spotify command!" << tracks << startPos << newRev << oldRev;
|
||||
qDebug() << Q_FUNC_INFO << "inserting tracks in middle of tomahawk playlist, from spotify command!" << tracks << startPosId << newRev << oldRev;
|
||||
// Uh oh, dont' want to get out of sync!!
|
||||
// Q_ASSERT( m_latestRev == oldRev );
|
||||
// m_latestRev = newRev;
|
||||
|
||||
if ( startPos > playlist()->entries().size() )
|
||||
startPos = playlist()->entries().size();
|
||||
// Find the position of the track to insert from
|
||||
int pos = -1;
|
||||
QList< plentry_ptr > entries = playlist()->entries();
|
||||
for ( int i = 0; i < entries.size(); i++ )
|
||||
{
|
||||
if ( entries[ i ]->annotation() == startPosId )
|
||||
{
|
||||
pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( pos == -1 )
|
||||
pos = entries.size();
|
||||
|
||||
qDebug() << Q_FUNC_INFO << "inserting tracks at position:" << pos;
|
||||
m_plRevisionBeforeUpdate = playlist()->currentrevision();
|
||||
|
||||
playlist()->insertEntries( queries, startPos, playlist()->currentrevision() );
|
||||
playlist()->insertEntries( queries, pos, playlist()->currentrevision() );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SpotifyPlaylistUpdater::spotifyTracksRemoved( const QVariantList& trackPositions, const QString& newRev, const QString& oldRev )
|
||||
SpotifyPlaylistUpdater::spotifyTracksRemoved( const QVariantList& trackIds, const QString& newRev, const QString& oldRev )
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << "remove tracks in middle of tomahawk playlist, from spotify command!" << trackPositions << newRev << oldRev;
|
||||
qDebug() << Q_FUNC_INFO << "remove tracks in middle of tomahawk playlist, from spotify command!" << trackIds << newRev << oldRev;
|
||||
// Uh oh, dont' want to get out of sync!!
|
||||
// Q_ASSERT( m_latestRev == oldRev );
|
||||
// m_latestRev = newRev;
|
||||
@ -170,17 +182,23 @@ SpotifyPlaylistUpdater::spotifyTracksRemoved( const QVariantList& trackPositions
|
||||
|
||||
// Collect list of tracks to remove (can't remove in-place as that might modify the indices)
|
||||
QList<plentry_ptr> toRemove;
|
||||
foreach( const QVariant posV, trackPositions )
|
||||
foreach( const QVariant trackIdV, trackIds )
|
||||
{
|
||||
bool ok;
|
||||
const int pos = posV.toInt( &ok );
|
||||
if ( !ok || pos < 0 || pos >= entries.size() )
|
||||
const QString id = trackIdV.toString();
|
||||
if ( id.isEmpty() )
|
||||
{
|
||||
qWarning() << Q_FUNC_INFO << "Tried to get track position to remove, but either couldn't convert to int, or out of bounds:" << ok << pos << entries.size() << entries << trackPositions;
|
||||
qWarning() << Q_FUNC_INFO << "Tried to get track id to remove, but either couldn't convert to qstring:" << trackIdV;
|
||||
continue;
|
||||
}
|
||||
|
||||
toRemove << entries.at(pos);
|
||||
foreach ( const plentry_ptr& entry, entries )
|
||||
{
|
||||
if ( entry->annotation() == id )
|
||||
{
|
||||
toRemove << entry;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -191,12 +209,13 @@ SpotifyPlaylistUpdater::spotifyTracksRemoved( const QVariantList& trackPositions
|
||||
|
||||
m_plRevisionBeforeUpdate = playlist()->currentrevision();
|
||||
|
||||
qDebug() << "We were asked to delete:" << trackPositions.size() << "tracks from the playlist, and we deleted:" << ( playlist()->entries().size() - entries.size() );
|
||||
if ( trackPositions.size() != ( playlist()->entries().size() - entries.size() ) )
|
||||
const int sizeDiff = playlist()->entries().size() - entries.size();
|
||||
qDebug() << "We were asked to delete:" << trackIds.size() << "tracks from the playlist, and we deleted:" << sizeDiff;
|
||||
if ( trackIds.size() != ( playlist()->entries().size() - entries.size() ) )
|
||||
qWarning() << "========================= Failed to delete all the tracks we were asked for!! Didn't find some indicesss... ===================";
|
||||
|
||||
|
||||
playlist()->createNewRevision( uuid(), playlist()->currentrevision(), entries );
|
||||
if ( sizeDiff > 0 )
|
||||
playlist()->createNewRevision( uuid(), playlist()->currentrevision(), entries );
|
||||
}
|
||||
|
||||
|
||||
@ -221,7 +240,20 @@ SpotifyPlaylistUpdater::tomahawkTracksInserted( const QList< plentry_ptr >& trac
|
||||
QVariantMap msg;
|
||||
msg[ "_msgtype" ] = "addTracksToPlaylist";
|
||||
msg[ "oldrev" ] = m_latestRev;
|
||||
msg[ "startPosition" ] = pos;
|
||||
|
||||
// Find the trackid of the nearest spotify track
|
||||
QList< plentry_ptr > plTracks = playlist()->entries();
|
||||
Q_ASSERT( pos-1 < plTracks.size() );
|
||||
|
||||
for ( int i = pos-1; i >= 0; i-- )
|
||||
{
|
||||
if ( !plTracks[ i ]->annotation().isEmpty() && plTracks[ i ]->annotation().contains( "spotify:track") )
|
||||
{
|
||||
msg[ "startPosition" ] = plTracks[ i ]->annotation();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
msg[ "playlistid" ] = m_spotifyId;
|
||||
|
||||
QVariantList tracksJson;
|
||||
@ -300,8 +332,8 @@ SpotifyPlaylistUpdater::queryToVariant( const query_ptr& query )
|
||||
m[ "artist" ] = query->artist();
|
||||
m[ "album" ] = query->album();
|
||||
|
||||
if ( !query->property( "spotifytrackid" ).isNull() )
|
||||
m[ "id" ] = query->property( "spotifytrackid" );
|
||||
if ( !query->property( "annotation" ).isNull() )
|
||||
m[ "id" ] = query->property( "annotation" );
|
||||
|
||||
return m;
|
||||
}
|
||||
@ -316,7 +348,7 @@ SpotifyPlaylistUpdater::variantToQueries( const QVariantList& list )
|
||||
QVariantMap trackMap = blob.toMap();
|
||||
const query_ptr q = Query::get( trackMap.value( "artist" ).toString(), trackMap.value( "track" ).toString(), trackMap.value( "album" ).toString(), uuid(), false );
|
||||
if ( trackMap.contains( "id" ) )
|
||||
q->setProperty( "spotifytrackid", trackMap.value( "id" ) );
|
||||
q->setProperty( "annotation", trackMap.value( "id" ) );
|
||||
|
||||
queries << q;
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ public:
|
||||
void setSync( bool sync );
|
||||
|
||||
/// Spotify callbacks when we are directly instructed from the resolver
|
||||
void spotifyTracksAdded( const QVariantList& tracks, int startPos, const QString& newRev, const QString& oldRev );
|
||||
void spotifyTracksAdded( const QVariantList& tracks, const QString& startPosId, const QString& newRev, const QString& oldRev );
|
||||
void spotifyTracksRemoved( const QVariantList& tracks, const QString& newRev, const QString& oldRev );
|
||||
void spotifyTracksMoved( const QVariantList& tracks, const QString& newRev, const QString& oldRev );
|
||||
|
||||
@ -68,6 +68,7 @@ private slots:
|
||||
|
||||
private:
|
||||
void init();
|
||||
|
||||
static QVariantList queriesToVariant( const QList< Tomahawk::query_ptr >& queries );
|
||||
static QVariant queryToVariant( const Tomahawk::query_ptr& query );
|
||||
static QList< Tomahawk::query_ptr > variantToQueries( const QVariantList& list );
|
||||
|
@ -77,6 +77,7 @@ DatabaseCommand_LoadPlaylistEntries::generateEntries( DatabaseImpl* dbi )
|
||||
|
||||
Tomahawk::query_ptr q = Tomahawk::Query::get( query.value( 2 ).toString(), query.value( 1 ).toString(), query.value( 3 ).toString() );
|
||||
q->setResultHint( query.value( 8 ).toString() );
|
||||
q->setProperty( "annotation", e->annotation() );
|
||||
e->setQuery( q );
|
||||
|
||||
m_entrymap.insert( e->guid(), e );
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
Copyright (C) 2011 Leo Franchi <lfranchi@kde.org>
|
||||
Copyright (C) 2011, Jeff Mitchell <jeff@tomahawk-player.org>
|
||||
|
||||
|
||||
This program 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 2 of the License, or
|
||||
@ -974,7 +974,10 @@ GlobalActionManager::doBookmark( const playlist_ptr& pl, const query_ptr& q )
|
||||
e->setDuration( 0 );
|
||||
|
||||
e->setLastmodified( 0 );
|
||||
e->setAnnotation( "" ); // FIXME
|
||||
QString annotation = "";
|
||||
if ( !q->property( "annotation" ).toString().isEmpty() )
|
||||
annotation = q->property( "annotation" ).toString();
|
||||
e->setAnnotation( annotation );
|
||||
e->setQuery( q );
|
||||
|
||||
pl->createNewRevision( uuid(), pl->currentrevision(), QList< plentry_ptr >( pl->entries() ) << e );
|
||||
|
@ -181,7 +181,10 @@ Playlist::create( const source_ptr& author,
|
||||
p->setGuid( uuid() );
|
||||
p->setDuration( query->duration() );
|
||||
p->setLastmodified( 0 );
|
||||
p->setAnnotation( "" );
|
||||
QString annotation = "";
|
||||
if ( !query->property( "annotation" ).toString().isEmpty() )
|
||||
annotation = query->property( "annotation" ).toString();
|
||||
p->setAnnotation( annotation );
|
||||
p->setQuery( query );
|
||||
|
||||
entries << p;
|
||||
@ -607,7 +610,10 @@ Playlist::entriesFromQueries( const QList<Tomahawk::query_ptr>& queries, bool cl
|
||||
e->setDuration( 0 );
|
||||
|
||||
e->setLastmodified( 0 );
|
||||
e->setAnnotation( "" ); // FIXME
|
||||
QString annotation = "";
|
||||
if ( !query->property( "annotation" ).toString().isEmpty() )
|
||||
annotation = query->property( "annotation" ).toString();
|
||||
e->setAnnotation( annotation ); // FIXME
|
||||
e->setQuery( query );
|
||||
|
||||
el << e;
|
||||
|
@ -60,7 +60,7 @@ class DLLEXPORT XspfUpdaterFactory : public PlaylistUpdaterFactory
|
||||
public:
|
||||
XspfUpdaterFactory() {}
|
||||
|
||||
virtual QString type() const { return "type"; }
|
||||
virtual QString type() const { return "xspf"; }
|
||||
virtual PlaylistUpdaterInterface* create( const playlist_ptr& pl ) { return new XspfUpdater( pl ); }
|
||||
};
|
||||
|
||||
|
@ -193,7 +193,11 @@ PlaylistModel::insert( const QList< Tomahawk::query_ptr >& queries, int row )
|
||||
entry->setDuration( 0 );
|
||||
|
||||
entry->setLastmodified( 0 );
|
||||
entry->setAnnotation( "" ); // FIXME
|
||||
QString annotation = "";
|
||||
if ( !query->property( "annotation" ).toString().isEmpty() )
|
||||
annotation = query->property( "annotation" ).toString();
|
||||
entry->setAnnotation( annotation );
|
||||
|
||||
entry->setQuery( query );
|
||||
entry->setGuid( uuid() );
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user