Git commit 01d13d4becb370cd80e433303ec170a7d2eba066 by Bart Cerneels. Committed on 22/08/2011 at 13:47. Pushed by shanachie into branch 'master'.
Grey out playlist items when unplayable. Patch by Sandeep Raghuraman BUG: 263640 REVIEW: 102181 GUI: M +66 -45 src/playlist/view/PlaylistViewCommon.cpp M +3 -1 src/playlist/navigators/TrackNavigator.cpp M +6 -0 src/core-impl/collections/daap/DaapMeta.cpp M +1 -0 ChangeLog M +4 -1 src/services/lastfm/meta/LastFmMeta.cpp M +30 -5 src/playlist/navigators/StandardTrackNavigator.cpp M +1 -0 src/services/ampache/AmpacheMeta.h M +5 -1 src/core-impl/meta/stream/Stream.cpp M +7 -1 src/core-impl/meta/file/File.cpp M +6 -1 src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.cpp M +4 -0 src/core-impl/collections/upnpcollection/UpnpMeta.cpp M +9 -0 src/services/ampache/AmpacheMeta.cpp M +1 -0 src/core-impl/collections/daap/CMakeLists.txt M +7 -1 src/core-impl/collections/audiocd/AudioCdMeta.cpp M +21 -1 src/playlist/view/listview/PrettyItemDelegate.cpp M +1 -0 src/services/ampache/CMakeLists.txt http://commits.kde.org/amarok/01d13d4becb370cd80e433303ec170a7d2eba066 diff --git a/ChangeLog b/ChangeLog index f36f4d3..df23ef2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,7 @@ Version 2.4.4-Beta 1 * Display current timestamp in tray tooltip. (BR 278445) CHANGES: + * Mark unplayble tracks in the playlist. Patch by Sandeep Raghuraman. (BR 263640) * Current track applet: show number of artists instead of genres. (BR 261077) BUGFIXES: diff --git a/src/core-impl/collections/audiocd/AudioCdMeta.cpp b/src/core-impl/collections/audiocd/AudioCdMeta.cpp index c4a791e..fbc6220 100644 --- a/src/core-impl/collections/audiocd/AudioCdMeta.cpp +++ b/src/core-impl/collections/audiocd/AudioCdMeta.cpp @@ -72,7 +72,13 @@ AudioCdTrack::prettyUrl() const bool AudioCdTrack::isPlayable() const { - return true; + KUrl trackUrl = playableUrl(); + QFileInfo trackFileInfo = QFileInfo( trackUrl.toLocalFile() ); + //track can be played only if it's readable + if( trackFileInfo.exists() && trackFileInfo.isFile() && trackFileInfo.isReadable() ) + return true; + + return false; } bool diff --git a/src/core-impl/collections/daap/CMakeLists.txt b/src/core-impl/collections/daap/CMakeLists.txt index c60b371..ec6da1e 100644 --- a/src/core-impl/collections/daap/CMakeLists.txt +++ b/src/core-impl/collections/daap/CMakeLists.txt @@ -29,6 +29,7 @@ target_link_libraries(amarok_collection-daapcollection ${KDE4_THREADWEAVER_LIBRARIES} ${KDE4_KDNSSD_LIBS} ${QT_QTNETWORK_LIBRARY} + ${KDE4_SOLID_LIBS} ) if(APPLE) diff --git a/src/core-impl/collections/daap/DaapMeta.cpp b/src/core-impl/collections/daap/DaapMeta.cpp index b8431dd..e4e47b3 100644 --- a/src/core-impl/collections/daap/DaapMeta.cpp +++ b/src/core-impl/collections/daap/DaapMeta.cpp @@ -18,6 +18,8 @@ #include "DaapCollection.h" +#include <Solid/Networking> + using namespace Meta; DaapTrack::DaapTrack( Collections::DaapCollection *collection, const QString &host, quint16 port, const QString &dbId, const QString &itemId, const QString &format) @@ -75,6 +77,10 @@ DaapTrack::prettyUrl() const bool DaapTrack::isPlayable() const { + //daap tracks are accessed over the network, so check if network connectivity is present + if( Solid::Networking::status() != Solid::Networking::Connected ) + return false; + return true; } diff --git a/src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.cpp b/src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.cpp index 5daed6d..727b882 100644 --- a/src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.cpp +++ b/src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.cpp @@ -157,7 +157,12 @@ MediaDeviceTrack::prettyUrl() const bool MediaDeviceTrack::isPlayable() const { - return true; + KUrl trackUrl = playableUrl(); + QFileInfo trackFileInfo = QFileInfo( trackUrl.pathOrUrl() ); + if( trackFileInfo.exists() && trackFileInfo.isFile() && trackFileInfo.isReadable() ) + return true; + + return false; } bool diff --git a/src/core-impl/collections/upnpcollection/UpnpMeta.cpp b/src/core-impl/collections/upnpcollection/UpnpMeta.cpp index 4d44acf..a2f4fc0 100644 --- a/src/core-impl/collections/upnpcollection/UpnpMeta.cpp +++ b/src/core-impl/collections/upnpcollection/UpnpMeta.cpp @@ -22,6 +22,7 @@ #include "covermanager/CoverFetchingActions.h" #include "core/capabilities/ActionsCapability.h" +#include <Solid/Networking> #include <QAction> @@ -73,6 +74,9 @@ UpnpTrack::prettyUrl() const bool UpnpTrack::isPlayable() const { + if( Solid::Networking::status() != Solid::Networking::Connected ) + return false; + return true; } diff --git a/src/core-impl/meta/file/File.cpp b/src/core-impl/meta/file/File.cpp index d8d516e..9832c6f 100644 --- a/src/core-impl/meta/file/File.cpp +++ b/src/core-impl/meta/file/File.cpp @@ -35,6 +35,7 @@ #include "amarokurls/PlayUrlRunner.h" #include <QAction> +#include <QFileInfo> #include <QList> #include <QWeakPointer> #include <QString> @@ -253,7 +254,12 @@ Track::setUidUrl( const QString &newUid ) const bool Track::isPlayable() const { - //simple implementation, check Internet connectivity or ping server? + KUrl trackUrl = playableUrl(); + QFileInfo trackFileInfo = QFileInfo( trackUrl.pathOrUrl() ); + + if( !( trackFileInfo.exists() && trackFileInfo.isFile() && trackFileInfo.isReadable() ) ) + return false; + return true; } diff --git a/src/core-impl/meta/stream/Stream.cpp b/src/core-impl/meta/stream/Stream.cpp index 5a6659c..b0fcfad 100644 --- a/src/core-impl/meta/stream/Stream.cpp +++ b/src/core-impl/meta/stream/Stream.cpp @@ -21,6 +21,8 @@ #include "core/meta/Meta.h" #include "core-impl/meta/default/DefaultMetaTypes.h" +#include <Solid/Networking> + #include <QWeakPointer> #include <QString> @@ -93,7 +95,9 @@ Track::uidUrl() const bool Track::isPlayable() const { - //simple implementation, check Internet connectivity or ping server? + if( Solid::Networking::status() != Solid::Networking::Connected ) + return false; + return true; } diff --git a/src/playlist/navigators/StandardTrackNavigator.cpp b/src/playlist/navigators/StandardTrackNavigator.cpp index 9675876..f9af2ef 100644 --- a/src/playlist/navigators/StandardTrackNavigator.cpp +++ b/src/playlist/navigators/StandardTrackNavigator.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2008 Nikolaj Hald Nielsen <nhn at kde.org> * * Copyright (c) 2009 T?o Mrnjavac <teo at kde.org> * * Copyright (c) 2010 Nanno Langstraat <langstr at gmail.com> * + * Copyright (c) 2011 Sandeep Raghuraman <sandy.8925 at gmail.com> * * * * 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 * @@ -91,13 +92,37 @@ Playlist::StandardTrackNavigator::chooseNextTrack( bool repeatPlaylist ) if( m_onlyQueue ) return 0; - int nextRow = m_model->activeRow() + 1; // 'activeRow()' may be -1. + Meta::TrackPtr track; + bool playableTrackFound = false; + int nextRow; + + //search for a playable track in order from right after the currently active track till the end + for( nextRow = m_model->activeRow() + 1 ; nextRow < m_model->qaim()->rowCount() ; nextRow++ ) // 'activeRow()' may be -1. + { + track = m_model->trackAt(nextRow); + if( track->isPlayable() ) + { + playableTrackFound = true; + break; + } + } - if( nextRow >= m_model->qaim()->rowCount() ) - if( repeatPlaylist ) - nextRow = 0; // This row is still invalid if 'rowCount() == 0'. + //if no playable track was found and the playlist needs to be repeated, search from top of playlist till currently active track + if( !playableTrackFound && repeatPlaylist ) + { + //nextRow=0; This row is still invalid if 'rowCount() == 0'. + for( nextRow = 0 ; nextRow < m_model->activeRow() ; nextRow++) + { + track = m_model->trackAt( nextRow ); + if( track->isPlayable() ) + { + playableTrackFound = true; + break; + } + } + } - if( m_model->rowExists( nextRow ) ) + if( playableTrackFound && m_model->rowExists( nextRow ) ) return m_model->idAt( nextRow ); else return 0; diff --git a/src/playlist/navigators/TrackNavigator.cpp b/src/playlist/navigators/TrackNavigator.cpp index 6fbfc55..827a5bd 100644 --- a/src/playlist/navigators/TrackNavigator.cpp +++ b/src/playlist/navigators/TrackNavigator.cpp @@ -54,9 +54,11 @@ Playlist::TrackNavigator::queueId( const quint64 id ) void Playlist::TrackNavigator::queueIds( const QList<quint64> &ids ) { + Meta::TrackPtr track; foreach( quint64 id, ids ) { - if( !m_queue.contains( id ) ) + track = m_model->trackForId( id ); + if( !m_queue.contains( id ) && track->isPlayable() ) m_queue.enqueue( id ); } } diff --git a/src/playlist/view/PlaylistViewCommon.cpp b/src/playlist/view/PlaylistViewCommon.cpp index db300a3..fc719a7 100644 --- a/src/playlist/view/PlaylistViewCommon.cpp +++ b/src/playlist/view/PlaylistViewCommon.cpp @@ -57,8 +57,8 @@ Playlist::ViewCommon::trackMenu( QWidget *parent, const QModelIndex *index, cons menu->addActions( parentCheckActions( parent, trackActionsFor( parent, index ) ) ); menu->addSeparator(); - QList<QAction*> albumActionsList = parentCheckActions( parent, albumActionsFor( index ) ); - if ( !albumActionsList.isEmpty() ) + QList<QAction *> albumActionsList = parentCheckActions( parent, albumActionsFor( index ) ); + if( !albumActionsList.isEmpty() ) { // there are no cover actions if the song/album is not in the collection KMenu *menuCover = new KMenu( i18n( "Album" ), menu ); @@ -76,10 +76,10 @@ Playlist::ViewCommon::trackMenu( QWidget *parent, const QModelIndex *index, cons } -QList<QAction*> +QList<QAction *> Playlist::ViewCommon::actionsFor( QWidget *parent, const QModelIndex *index ) { - QList<QAction*> actions; + QList<QAction *> actions; QAction *separator = new QAction( parent ); separator->setSeparator( true ); @@ -87,8 +87,8 @@ Playlist::ViewCommon::actionsFor( QWidget *parent, const QModelIndex *index ) actions << parentCheckActions( parent, trackActionsFor( parent, index ) ); actions << separator; - QList<QAction*> albumActionsList = parentCheckActions( parent, albumActionsFor( index ) ); - if ( !albumActionsList.isEmpty() ) + QList<QAction *> albumActionsList = parentCheckActions( parent, albumActionsFor( index ) ); + if( !albumActionsList.isEmpty() ) { actions << albumActionsList; actions << separator; @@ -102,10 +102,10 @@ Playlist::ViewCommon::actionsFor( QWidget *parent, const QModelIndex *index ) } -QList<QAction*> +QList<QAction *> Playlist::ViewCommon::trackActionsFor( QWidget *parent, const QModelIndex *index ) { - QList<QAction*> actions; + QList<QAction *> actions; Meta::TrackPtr track = index->data( Playlist::TrackRole ).value< Meta::TrackPtr >(); @@ -114,40 +114,56 @@ Playlist::ViewCommon::trackActionsFor( QWidget *parent, const QModelIndex *index const bool isQueued = index->data( Playlist::QueuePositionRole ).toInt() != 0; const QString queueText = !isQueued ? i18n( "Queue Track" ) : i18n( "Dequeue Track" ); - if( m_cueTrackAction == 0 ) + //display "Queue track" option only if the track is playable + if( track->isPlayable() ) { - m_cueTrackAction = new QAction( KIcon( "media-track-queue-amarok" ), queueText, parent ); - } - else - { - m_cueTrackAction->disconnect(); - m_cueTrackAction->setText( queueText ); - } - if( isQueued ) - QObject::connect( m_cueTrackAction, SIGNAL( triggered() ), parent, SLOT( dequeueSelection() ) ); - else - QObject::connect( m_cueTrackAction, SIGNAL( triggered() ), parent, SLOT( queueSelection() ) ); + if( m_cueTrackAction == 0 ) + { + m_cueTrackAction = new QAction( KIcon( "media-track-queue-amarok" ), queueText, parent ); + } + else + { + m_cueTrackAction->disconnect(); + m_cueTrackAction->setText( queueText ); + } - actions << m_cueTrackAction; + if( isQueued ) + QObject::connect( m_cueTrackAction, SIGNAL(triggered()), + parent, SLOT(dequeueSelection()) ); + else + QObject::connect( m_cueTrackAction, SIGNAL(triggered()), + parent, SLOT(queueSelection()) ); + + actions << m_cueTrackAction; + + } //actions << separator; const bool isCurrentTrack = index->data( Playlist::ActiveTrackRole ).toBool(); - if( m_stopAfterTrackAction == 0 ) + //display "Stop after this track" option only if track is playable. not sure if this check is really needed + if( track->isPlayable() ) { - m_stopAfterTrackAction = new QAction( KIcon( "media-playback-stop-amarok" ), i18n( "Stop Playing After This Track" ), parent ); - QObject::connect( m_stopAfterTrackAction, SIGNAL( triggered() ), parent, SLOT( stopAfterTrack() ) ); + if( m_stopAfterTrackAction == 0 ) + { + m_stopAfterTrackAction = new QAction( KIcon( "media-playback-stop-amarok" ), + i18n( "Stop Playing After This Track" ), parent ); + QObject::connect( m_stopAfterTrackAction, SIGNAL(triggered()), + parent, SLOT(stopAfterTrack()) ); + } + actions << m_stopAfterTrackAction; } - actions << m_stopAfterTrackAction; //actions << separator; if( m_removeTracTrackAction == 0 ) { - m_removeTracTrackAction = new QAction( KIcon( "media-track-remove-amarok" ), i18n( "Remove From Playlist" ), parent ); - QObject::connect( m_removeTracTrackAction, SIGNAL( triggered() ), parent, SLOT( removeSelection() ) ); + m_removeTracTrackAction = new QAction( KIcon( "media-track-remove-amarok" ), + i18n( "Remove From Playlist" ), parent ); + QObject::connect( m_removeTracTrackAction, SIGNAL(triggered()), + parent, SLOT(removeSelection()) ); } actions << m_removeTracTrackAction; @@ -156,13 +172,14 @@ Playlist::ViewCommon::trackActionsFor( QWidget *parent, const QModelIndex *index { //actions << separator; - QList<QAction*> globalCurrentTrackActions = The::globalCurrentTrackActions()->actions(); + QList<QAction *> globalCurrentTrackActions = The::globalCurrentTrackActions()->actions(); foreach( QAction *action, globalCurrentTrackActions ) actions << action; if( track->hasCapabilityInterface( Capabilities::Capability::Actions ) ) { - QScopedPointer< Capabilities::ActionsCapability > ac( track->create<Capabilities::ActionsCapability>() ); + QScopedPointer<Capabilities::ActionsCapability> + ac( track->create<Capabilities::ActionsCapability>() ); if ( ac ) actions.append( ac->actions() ); } @@ -172,8 +189,10 @@ Playlist::ViewCommon::trackActionsFor( QWidget *parent, const QModelIndex *index { if( m_findInSourceAction == 0 ) { - m_findInSourceAction = new QAction( KIcon( "edit-find" ), i18n( "Show in Media Sources" ), parent ); - QObject::connect( m_findInSourceAction, SIGNAL( triggered() ), parent, SLOT( findInSource() ) ); + m_findInSourceAction = new QAction( KIcon( "edit-find" ), + i18n( "Show in Media Sources" ), parent ); + QObject::connect( m_findInSourceAction, SIGNAL(triggered()), + parent, SLOT(findInSource()) ); } actions << m_findInSourceAction; } @@ -181,17 +200,18 @@ Playlist::ViewCommon::trackActionsFor( QWidget *parent, const QModelIndex *index return actions; } -QList<QAction*> +QList<QAction *> Playlist::ViewCommon::albumActionsFor( const QModelIndex *index ) { - QList<QAction*> actions; + QList<QAction *> actions; Meta::TrackPtr track = index->data( Playlist::TrackRole ).value< Meta::TrackPtr >(); Meta::AlbumPtr album = track->album(); if( album ) { - QScopedPointer< Capabilities::ActionsCapability > ac( album->create<Capabilities::ActionsCapability>() ); + QScopedPointer<Capabilities::ActionsCapability> + ac( album->create<Capabilities::ActionsCapability>() ); if( ac ) actions.append( ac->actions() ); } @@ -200,18 +220,19 @@ Playlist::ViewCommon::albumActionsFor( const QModelIndex *index ) } -QList<QAction*> +QList<QAction *> Playlist::ViewCommon::multiSourceActionsFor( QWidget *parent, const QModelIndex *index ) { - QList<QAction*> actions; + QList<QAction *> actions; Meta::TrackPtr track = index->data( Playlist::TrackRole ).value< Meta::TrackPtr >(); const bool isMultiSource = index->data( Playlist::MultiSourceRole ).toBool(); if( isMultiSource ) { - QAction *selectSourceAction = new QAction( KIcon( "media-playlist-repeat" ), i18n( "Select Source" ), parent ); - QObject::connect( selectSourceAction, SIGNAL( triggered() ), parent, SLOT( selectSource() ) ); + QAction *selectSourceAction = new QAction( KIcon( "media-playlist-repeat" ), + i18n( "Select Source" ), parent ); + QObject::connect( selectSourceAction, SIGNAL(triggered()), parent, SLOT(selectSource()) ); actions << selectSourceAction; } @@ -220,23 +241,24 @@ Playlist::ViewCommon::multiSourceActionsFor( QWidget *parent, const QModelIndex } -QList<QAction*> +QList<QAction *> Playlist::ViewCommon::editActionsFor( QWidget *parent, const QModelIndex *index ) { - QList<QAction*> actions; + QList<QAction *> actions; Meta::TrackPtr track = index->data( Playlist::TrackRole ).value< Meta::TrackPtr >(); - QAction *editAction = new QAction( KIcon( "media-track-edit-amarok" ), i18n( "Edit Track Details" ), parent ); + QAction *editAction = new QAction( KIcon( "media-track-edit-amarok" ), + i18n( "Edit Track Details" ), parent ); editAction->setProperty( "popupdropper_svg_id", "edit" ); - QObject::connect( editAction, SIGNAL( triggered() ), parent, SLOT( editTrackInformation() ) ); + QObject::connect( editAction, SIGNAL(triggered()), parent, SLOT(editTrackInformation()) ); actions << editAction; return actions; } -QList<QAction*> -Playlist::ViewCommon::parentCheckActions( QObject *parent, QList<QAction*> actions ) +QList<QAction *> +Playlist::ViewCommon::parentCheckActions( QObject *parent, QList<QAction *> actions ) { foreach( QAction *action, actions ) { @@ -246,4 +268,3 @@ Playlist::ViewCommon::parentCheckActions( QObject *parent, QList<QAction*> actio return actions; } - diff --git a/src/playlist/view/listview/PrettyItemDelegate.cpp b/src/playlist/view/listview/PrettyItemDelegate.cpp index 08b0724..01e489b 100644 --- a/src/playlist/view/listview/PrettyItemDelegate.cpp +++ b/src/playlist/view/listview/PrettyItemDelegate.cpp @@ -3,6 +3,7 @@ * Copyright (c) 2008-2009 Nikolaj Hald Nielsen <nhn at kde.org> * * Copyright (c) 2008 Soren Harward <stharward at gmail.com> * * Copyright (c) 2010 Nanno Langstraat <langstr at gmail.com> * + * Copyright (c) 2011 Sandeep Raghuraman <sandy.8925 at gmail.com> * * * * 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 * @@ -503,12 +504,31 @@ void Playlist::PrettyItemDelegate::paintItem( const LayoutItemConfig &config, painter->drawPixmap( currentItemX, rowOffsetY + 4, moodbar ); } } + //actual playlist item text is drawn here else { + //TODO: get rid of passing TrackPtr as data, use custom role instead + Meta::TrackPtr track = index.data( TrackRole ).value<Meta::TrackPtr>(); QString text = textIndex.data( Qt::DisplayRole ).toString(); text = element.prefix() + text + element.suffix(); text = QFontMetricsF( font ).elidedText( text, Qt::ElideRight, itemWidth ); - painter->drawText( currentItemX, rowOffsetY, itemWidth, rowHeight, alignment, text ); + + //if the track can't be played, it should be grayed out to show that it is unavailable + if( !track->isPlayable() ) + { + painter->save(); + QPen grayPen = painter->pen(); + grayPen.setColor( QColor( 127, 127, 127 ) ); + painter->setPen( grayPen ); + painter->drawText( currentItemX, rowOffsetY, itemWidth, rowHeight, alignment, + text ); + painter->restore(); + } + else + { + painter->drawText( currentItemX, rowOffsetY, itemWidth, rowHeight, alignment, + text ); + } } currentItemX += itemWidth; } diff --git a/src/services/ampache/AmpacheMeta.cpp b/src/services/ampache/AmpacheMeta.cpp index 2b85a7b..ec447ff 100644 --- a/src/services/ampache/AmpacheMeta.cpp +++ b/src/services/ampache/AmpacheMeta.cpp @@ -17,6 +17,7 @@ #include "AmpacheMeta.h" #include "core/support/Debug.h" +#include <Solid/Networking> using namespace Meta; @@ -49,3 +50,11 @@ QList< QAction * > Meta::AmpacheTrack::currentTrackActions() return actions; } +bool +AmpacheTrack::isPlayable() const +{ + if( Solid::Networking::status() != Solid::Networking::Connected ) + return true; + + return false; +} diff --git a/src/services/ampache/AmpacheMeta.h b/src/services/ampache/AmpacheMeta.h index fa104ec..c74b227 100644 --- a/src/services/ampache/AmpacheMeta.h +++ b/src/services/ampache/AmpacheMeta.h @@ -46,6 +46,7 @@ public: virtual QString sourceDescription() { return "The Ampache music server project: http://Ampache.org"; } virtual QPixmap emblem() { return QPixmap( KStandardDirs::locate( "data", "amarok/images/emblem-ampache.png" ) ); } virtual QString scalableEmblem() { return KStandardDirs::locate( "data", "amarok/images/emblem-ampache-scalable.svgz" ); } + virtual bool isPlayable() const; virtual QList< QAction *> currentTrackActions(); diff --git a/src/services/ampache/CMakeLists.txt b/src/services/ampache/CMakeLists.txt index e3d09af..25fdbec 100644 --- a/src/services/ampache/CMakeLists.txt +++ b/src/services/ampache/CMakeLists.txt @@ -60,6 +60,7 @@ install(TARGETS ampache_account_login DESTINATION ${INSTALL_TARGETS_DEFAULT_ARGS ${KDE4_KIO_LIBS} ${KDE4_THREADWEAVER_LIBRARIES} ${QT_QTXML_LIBRARY} + ${KDE4_SOLID_LIBS} ) if( LIBLASTFM_FOUND ) target_link_libraries(amarok_service_ampache diff --git a/src/services/lastfm/meta/LastFmMeta.cpp b/src/services/lastfm/meta/LastFmMeta.cpp index 055dfef..d8f5284 100644 --- a/src/services/lastfm/meta/LastFmMeta.cpp +++ b/src/services/lastfm/meta/LastFmMeta.cpp @@ -36,6 +36,7 @@ #include <KLocale> #include <KSharedPtr> #include <KStandardDirs> +#include <Solid/Networking> #include <QWeakPointer> #include <QUrl> @@ -178,7 +179,9 @@ Track::uidUrl() const bool Track::isPlayable() const { - //we could check connectivity here... + if( Solid::Networking::status() != Solid::Networking::Connected ) + return false; + return !d->trackPath.isEmpty(); }
