33 #include <core/dbus/property.h> 34 #include <core/dbus/types/object_path.h> 35 #include <core/dbus/types/variant.h> 36 #include <core/dbus/types/stl/map.h> 37 #include <core/dbus/types/stl/vector.h> 48 const std::shared_ptr<media::Player>&
parent,
49 const dbus::Object::Ptr&
object)
57 object->get_signal<mpris::TrackList::Signals::TrackAdded>(),
58 object->get_signal<mpris::TrackList::Signals::TracksAdded>(),
59 object->get_signal<mpris::TrackList::Signals::TrackMoved>(),
60 object->get_signal<mpris::TrackList::Signals::TrackRemoved>(),
61 object->get_signal<mpris::TrackList::Signals::TrackListReset>(),
62 object->get_signal<mpris::TrackList::Signals::TrackListReplaced>(),
63 object->get_signal<mpris::TrackList::Signals::TrackChanged>()
69 std::shared_ptr<media::Player>
parent;
72 std::shared_ptr<core::dbus::Property<mpris::TrackList::Properties::CanEditTracks>>
can_edit_tracks;
73 std::shared_ptr<core::dbus::Property<mpris::TrackList::Properties::Tracks>>
tracks;
78 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackAdded, mpris::TrackList::Signals::TrackAdded::ArgumentType>
DBusTrackAddedSignal;
79 typedef core::dbus::Signal<mpris::TrackList::Signals::TracksAdded, mpris::TrackList::Signals::TracksAdded::ArgumentType>
DBusTracksAddedSignal;
80 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackMoved, mpris::TrackList::Signals::TrackMoved::ArgumentType>
DBusTrackMovedSignal;
81 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackRemoved, mpris::TrackList::Signals::TrackRemoved::ArgumentType>
DBusTrackRemovedSignal;
82 typedef core::dbus::Signal<
83 mpris::TrackList::Signals::TrackListReset,
84 mpris::TrackList::Signals::TrackListReset::ArgumentType>
86 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackListReplaced, mpris::TrackList::Signals::TrackListReplaced::ArgumentType>
DBusTrackListReplacedSignal;
87 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackChanged, mpris::TrackList::Signals::TrackChanged::ArgumentType>
DBusTrackChangedSignal;
89 Signals(
const std::shared_ptr<DBusTrackAddedSignal>& track_added,
90 const std::shared_ptr<DBusTracksAddedSignal>& tracks_added,
91 const std::shared_ptr<DBusTrackMovedSignal>& track_moved,
92 const std::shared_ptr<DBusTrackRemovedSignal>& track_removed,
93 const std::shared_ptr<DBusTrackListResetSignal>& track_list_reset,
94 const std::shared_ptr<DBusTrackListReplacedSignal>& track_list_replaced,
95 const std::shared_ptr<DBusTrackChangedSignal>& track_changed)
116 MH_DEBUG(
"OnTrackAdded signal arrived via the bus.");
122 MH_DEBUG(
"OnTracksAdded signal arrived via the bus.");
128 MH_DEBUG(
"OnTrackMoved signal arrived via the bus.");
134 MH_DEBUG(
"OnTrackRemoved signal arrived via the bus.");
138 dbus.on_track_list_reset->connect([
this](
void)
140 MH_DEBUG(
"OnTrackListReset signal arrived via the bus.");
146 MH_DEBUG(
"OnTrackListReplaced signal arrived via the bus.");
152 MH_DEBUG(
"OnTrackChanged signal arrived via the bus.");
181 const std::shared_ptr<media::Player>&
parent,
182 const core::dbus::Object::Ptr&
object)
183 : d(new
Private(this, parent, object))
193 return *d->can_edit_tracks;
203 auto op = d->object->invoke_method_synchronously<
204 mpris::TrackList::GetTracksMetadata,
205 std::map<std::string, std::string>>(id);
208 throw std::runtime_error(
"Problem querying meta data for track: " + op.error());
210 media::Track::MetaData md;
211 for(
auto pair : op.value())
213 md.
set(pair.first, pair.second);
220 auto op = d->object->invoke_method_synchronously<
221 mpris::TrackList::GetTracksUri,
225 throw std::runtime_error(
"Problem querying track for uri: " + op.error());
235 auto op = d->object->invoke_method_synchronously<mpris::TrackList::AddTrack,
void>(
242 if (op.error().name() ==
244 throw media::TrackList::Errors::InsufficientPermissionsToAddTrack{};
246 throw media::Player::Errors::UriNotFound{op.error().print()};
248 throw std::runtime_error{op.error().print()};
254 auto op = d->object->invoke_method_synchronously<mpris::TrackList::AddTracks,
void>(
260 if (op.error().name() ==
262 throw media::TrackList::Errors::InsufficientPermissionsToAddTrack{};
264 throw media::Player::Errors::UriNotFound{op.error().print()};
266 throw std::runtime_error{op.error().print()};
272 auto op = d->object->invoke_method_synchronously<mpris::TrackList::MoveTrack,
void>(id, to);
276 if (op.error().name() ==
278 throw media::TrackList::Errors::FailedToMoveTrack{};
279 else if (op.error().name() ==
281 throw media::TrackList::Errors::FailedToFindMoveTrackSource{op.error().print()};
282 else if (op.error().name() ==
284 throw media::TrackList::Errors::FailedToFindMoveTrackDest{op.error().print()};
286 throw std::runtime_error{op.error().print()};
296 auto op = d->object->invoke_method_synchronously<mpris::TrackList::RemoveTrack,
void>(
301 if (op.error().name() ==
303 throw media::TrackList::Errors::TrackNotFound{};
305 throw std::runtime_error{
"Problem removing track: " + op.error().print()};
311 auto op = d->object->invoke_method_synchronously<mpris::TrackList::GoTo,
void>(track);
314 throw std::runtime_error(
"Problem adding track: " + op.error());
331 auto op = d->object->invoke_method_synchronously<mpris::TrackList::Reset,
void>();
334 throw std::runtime_error(
"Problem resetting tracklist: " + op.error());
339 return d->signals.on_track_list_replaced;
344 return d->signals.on_track_added;
349 return d->signals.on_tracks_added;
354 return d->signals.on_track_moved;
359 return d->signals.on_track_removed;
364 return d->signals.on_track_list_reset;
369 return d->signals.on_track_changed;
374 return d->signals.on_go_to_track;
379 return d->signals.on_end_of_tracklist;
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name
static constexpr const char * name