From ffb8c2cda92c27a2461241924b60f55a61e4dd62 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Wed, 30 May 2012 12:09:44 +0100 Subject: [PATCH] Initial mp3 url support --- src/libtomahawk/GlobalActionManager.cpp | 19 +++++++++++++++++-- src/libtomahawk/Query.cpp | 1 + src/libtomahawk/Query.h | 5 +++++ .../database/DatabaseCommand_Resolve.cpp | 2 +- .../DatabaseCommand_SetPlaylistRevision.cpp | 16 ++++++++++++++-- src/libtomahawk/database/DatabaseImpl.cpp | 11 ++++------- src/libtomahawk/utils/JspfLoader.cpp | 3 +++ src/libtomahawk/utils/WidgetDragFilter.cpp | 2 +- src/libtomahawk/utils/XspfLoader.cpp | 3 +++ 9 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/libtomahawk/GlobalActionManager.cpp b/src/libtomahawk/GlobalActionManager.cpp index 80a52ce7a..244f00b63 100644 --- a/src/libtomahawk/GlobalActionManager.cpp +++ b/src/libtomahawk/GlobalActionManager.cpp @@ -645,8 +645,12 @@ GlobalActionManager::doQueueAdd( const QStringList& parts, const QList< QPair< Q return false; if ( !urlStr.isEmpty() ) + { q->setResultHint( urlStr ); - Pipeline::instance()->resolve( q ); + q->setSaveHTTPResultHint( true ); + } + + Pipeline::instance()->resolve( q, true ); handleOpenTrack( q ); return true; @@ -668,9 +672,14 @@ GlobalActionManager::doQueueAdd( const QStringList& parts, const QList< QPair< Q { // give it a web result hint QFileInfo info( track.path() ); query_ptr q = Query::get( QString(), info.baseName(), QString(), uuid(), false ); + if ( q.isNull() ) continue; + q->setResultHint( track.toString() ); + q->setSaveHTTPResultHint( true ); + + q->setResultHint( track.toString() ); Pipeline::instance()->resolve( q ); @@ -1075,7 +1084,10 @@ GlobalActionManager::handlePlayCommand( const QUrl& url ) return false; if ( !urlStr.isEmpty() ) + { q->setResultHint( urlStr ); + q->setSaveHTTPResultHint( true ); + } playNow( q ); return true; @@ -1166,8 +1178,11 @@ bool GlobalActionManager::handleBookmarkCommand(const QUrl& url) return false; if ( !urlStr.isEmpty() ) + { q->setResultHint( urlStr ); - Pipeline::instance()->resolve( q ); + q->setSaveHTTPResultHint( true ); + } + Pipeline::instance()->resolve( q, true ); // now we add it to the special "bookmarks" playlist, creating it if it doesn't exist. if nothing is playing, start playing the track QSharedPointer< LocalCollection > col = SourceList::instance()->getLocal()->collection().dynamicCast< LocalCollection >(); diff --git a/src/libtomahawk/Query.cpp b/src/libtomahawk/Query.cpp index 444bace2e..1ae0593b7 100644 --- a/src/libtomahawk/Query.cpp +++ b/src/libtomahawk/Query.cpp @@ -164,6 +164,7 @@ Query::init() m_duration = -1; m_albumpos = 0; m_discnumber = 0; + m_saveResultHint = false; updateSortNames(); } diff --git a/src/libtomahawk/Query.h b/src/libtomahawk/Query.h index be8f3d613..8216445ac 100644 --- a/src/libtomahawk/Query.h +++ b/src/libtomahawk/Query.h @@ -164,6 +164,9 @@ public: void setAllSocialActions( const QList< Tomahawk::SocialAction >& socialActions ); QString socialActionDescription( const QString& action, DescriptionMode mode ) const; + void setSaveHTTPResultHint( bool saveResultHint ) { m_saveResultHint = saveResultHint; } + bool saveHTTPResultHint() const { return m_saveResultHint; } + QList similarTracks() const; QStringList lyrics() const; @@ -254,6 +257,8 @@ private: QPair< Tomahawk::source_ptr, unsigned int > m_playedBy; QList< QWeakPointer< Tomahawk::Resolver > > m_resolvers; + bool m_saveResultHint; + mutable QMutex m_mutex; QWeakPointer< Tomahawk::Query > m_ownRef; diff --git a/src/libtomahawk/database/DatabaseCommand_Resolve.cpp b/src/libtomahawk/database/DatabaseCommand_Resolve.cpp index bcb708429..ec5a05fdb 100644 --- a/src/libtomahawk/database/DatabaseCommand_Resolve.cpp +++ b/src/libtomahawk/database/DatabaseCommand_Resolve.cpp @@ -55,7 +55,7 @@ DatabaseCommand_Resolve::exec( DatabaseImpl* lib ) qDebug() << "Using result-hint to speed up resolving:" << m_query->resultHint(); Tomahawk::result_ptr result = lib->resultFromHint( m_query ); - if ( !result.isNull() && !result->collection().isNull() && result->collection()->source()->isOnline() ) + if ( !result.isNull() && ( result->collection().isNull() || result->collection()->source()->isOnline() ) ) { QList res; res << result; diff --git a/src/libtomahawk/database/DatabaseCommand_SetPlaylistRevision.cpp b/src/libtomahawk/database/DatabaseCommand_SetPlaylistRevision.cpp index a64097809..9bdba3a28 100644 --- a/src/libtomahawk/database/DatabaseCommand_SetPlaylistRevision.cpp +++ b/src/libtomahawk/database/DatabaseCommand_SetPlaylistRevision.cpp @@ -199,11 +199,23 @@ DatabaseCommand_SetPlaylistRevision::exec( DatabaseImpl* lib ) m_addedmap.insert( e->guid(), e ); // needed in postcommithook - QString resultHint; + QString resultHint, foundResult; + // Whitelist resulthint protocols + bool fromQuery = false; if ( !e->query()->results().isEmpty() ) - resultHint = e->query()->results().first()->url(); + foundResult = e->query()->results().first()->url(); else if ( !e->query()->resultHint().isEmpty() ) + { resultHint = e->query()->resultHint(); + foundResult = true; + } + + if ( resultHint.startsWith( "file://" ) || + resultHint.startsWith( "servent://" ) || // Save resulthints for local files and peers automatically + ( fromQuery && e->query()->saveHTTPResultHint() ) ) + { + resultHint = foundResult; + } adde.bindValue( 0, e->guid() ); adde.bindValue( 1, m_playlistguid ); diff --git a/src/libtomahawk/database/DatabaseImpl.cpp b/src/libtomahawk/database/DatabaseImpl.cpp index 7b9b8fc3a..332cd3374 100644 --- a/src/libtomahawk/database/DatabaseImpl.cpp +++ b/src/libtomahawk/database/DatabaseImpl.cpp @@ -621,17 +621,14 @@ DatabaseImpl::resultFromHint( const Tomahawk::query_ptr& origquery ) else { // Q_ASSERT( false ); -/* res = Tomahawk::result_ptr( new Tomahawk::Result() ); - s = SourceList::instance()->webSource(); - res->setUrl( url ); - res->setCollection( s->collection() ); + res = Tomahawk::Result::get( url ); res->setRID( uuid() ); res->setScore( 1.0 ); - res->setArtist( Tomahawk::artist_ptr( new Tomahawk::Artist( 0, origquery->artist() ) ) ); - res->setAlbum( Tomahawk::album_ptr( new Tomahawk::Album( 0, origquery->album(), res->artist() ) ) ); + res->setArtist( Tomahawk::Artist::get( artistId( origquery->artist(), true ), origquery->artist() ) ); + res->setAlbum( Tomahawk::Album::get( albumId( res->artist()->id(), origquery->album(), true ), origquery->album(), res->artist() ) ); res->setTrack( origquery->track() ); res->setDuration( origquery->duration() ); - res->setFriendlySource( url );*/ + res->setFriendlySource( url ); return res; } diff --git a/src/libtomahawk/utils/JspfLoader.cpp b/src/libtomahawk/utils/JspfLoader.cpp index 393c563b6..e890e97f1 100644 --- a/src/libtomahawk/utils/JspfLoader.cpp +++ b/src/libtomahawk/utils/JspfLoader.cpp @@ -179,7 +179,10 @@ JSPFLoader::gotBody() q->setDuration( duration.toInt() / 1000 ); if( !url.isEmpty() ) + { q->setResultHint( url ); + q->setSaveHTTPResultHint( true ); + } m_entries << q; } diff --git a/src/libtomahawk/utils/WidgetDragFilter.cpp b/src/libtomahawk/utils/WidgetDragFilter.cpp index 3d427d097..76ca5b105 100644 --- a/src/libtomahawk/utils/WidgetDragFilter.cpp +++ b/src/libtomahawk/utils/WidgetDragFilter.cpp @@ -1,6 +1,6 @@ /* === This file is part of Tomahawk Player - === * - * Copyright 2010-2011, Christian Muehlhaeuser + * Copyright 2010-2011, Leo Franchi * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/libtomahawk/utils/XspfLoader.cpp b/src/libtomahawk/utils/XspfLoader.cpp index a3d137738..84e91a2c1 100644 --- a/src/libtomahawk/utils/XspfLoader.cpp +++ b/src/libtomahawk/utils/XspfLoader.cpp @@ -250,7 +250,10 @@ XSPFLoader::gotBody() q->setDuration( duration.toInt() / 1000 ); if ( !url.isEmpty() ) + { q->setResultHint( url ); + q->setSaveHTTPResultHint( true ); + } m_entries << q; }