27 #include <dbus/dbus.h> 40 typedef std::map<Track::Id, std::tuple<Track::UriType, Track::MetaData>>
MetaDataCache;
45 std::shared_ptr<media::Engine::MetaDataExtractor>
extractor;
53 if (meta_data_cache.count(
id) == 0)
58 meta_data_cache[id] = std::make_tuple(
60 extractor->meta_data_for_track_with_uri(uri));
61 }
catch (
const std::runtime_error &e) {
62 std::cerr <<
"Failed to retrieve metadata for track '" << uri <<
"' (" << e.what() <<
")" << std::endl;
65 meta_data_cache[id] = std::make_tuple(
71 std::get<0>(meta_data_cache[id]) = uri;
77 media::TrackList::Container::iterator random_it = shuffled_tracks.begin();
78 if (random_it == shuffled_tracks.end())
84 std::advance(random_it, rand() % (shuffled_tracks.size() + 1));
90 const dbus::Bus::Ptr& bus,
91 const dbus::Object::Ptr&
object,
92 const std::shared_ptr<media::Engine::MetaDataExtractor>&
extractor,
93 const media::apparmor::ubuntu::RequestContextResolver::Ptr& request_context_resolver,
94 const media::apparmor::ubuntu::RequestAuthenticator::Ptr& request_authenticator)
108 const auto it = d->meta_data_cache.find(
id);
110 if (it == d->meta_data_cache.end())
113 return std::get<0>(it->second);
118 const auto it = d->meta_data_cache.find(
id);
120 if (it == d->meta_data_cache.end())
121 return Track::MetaData{};
123 return std::get<1>(it->second);
133 std::stringstream ss;
134 ss << d->object->path().as_string() <<
"/" << d->track_counter++;
137 MH_DEBUG(
"Adding Track::Id: %s",
id);
144 auto it = std::find(container.begin(), container.end(), position);
145 container.insert(it,
id);
152 d->updateCachedTrackMetadata(
id, uri);
155 d->shuffled_tracks.insert(d->get_shuffled_insert_it(), id);
165 MH_DEBUG(
"Signaling that we just added track id: %s",
id);
171 if (
tracks().get().size() == 1)
184 for (
const auto uri : uris)
187 std::stringstream ss;
188 ss << d->object->path().as_string() <<
"/" << d->track_counter++;
190 MH_DEBUG(
"Adding Track::Id: %s",
id);
197 auto it = std::find(
tracks().
get().begin(),
tracks().
get().end(), insert_position);
200 container.insert(it,
id);
203 insert_position = id;
210 d->updateCachedTrackMetadata(
id, uri);
213 d->shuffled_tracks.insert(d->get_shuffled_insert_it(), id);
216 if (
tracks().get().size() == 1)
223 MH_DEBUG(
"Signaling that we just added %d tracks to the TrackList", tmp.size());
226 if (!current_id.empty())
235 MH_DEBUG(
"-----------------------------------------------------");
236 if (
id.empty() or to.empty())
238 MH_ERROR(
"Can't move track since 'id' or 'to' are empty");
244 MH_ERROR(
"Can't move track to it's same position");
248 if (
tracks().
get().size() == 1)
250 MH_ERROR(
"Can't move track since TrackList contains only one track");
256 MH_DEBUG(
"current_track id: %s", current_id);
258 auto insert_point_it = std::find(
tracks().
get().begin(),
tracks().
get().end(), to);
259 if (insert_point_it !=
tracks().
get().end())
261 const auto result =
tracks().update([
this,
id, to, current_id, &insert_point_it]
265 auto to_move_it = std::find(
tracks().
get().begin(),
tracks().
get().end(),
id);
266 if (to_move_it !=
tracks().
get().end())
268 container.erase(to_move_it);
272 throw media::TrackList::Errors::FailedToFindMoveTrackDest
273 (
"Failed to find destination track " + to);
277 container.insert(insert_point_it,
id);
279 const auto new_current_track_it = std::find(
tracks().
get().begin(),
tracks().
get().end(), current_id);
280 if (new_current_track_it !=
tracks().
get().end())
285 throw media::TrackList::Errors::FailedToMoveTrack();
291 MH_ERROR(
"Can't update current_iterator - failed to find track after move");
292 throw media::TrackList::Errors::FailedToMoveTrack();
301 for(
const auto track :
tracks().
get())
313 throw media::TrackList::Errors::FailedToFindMoveTrackSource
314 (
"Failed to find source track " +
id);
317 MH_DEBUG(
"-----------------------------------------------------");
326 container.erase(std::find(container.begin(), container.end(), id));
334 d->meta_data_cache.erase(
id);
337 d->shuffled_tracks.erase(find(d->shuffled_tracks.begin(),
338 d->shuffled_tracks.end(), id));
343 if (
tracks().get().empty())
361 d->shuffled_tracks =
tracks().get();
362 random_shuffle(d->shuffled_tracks.begin(), d->shuffled_tracks.end());
373 return d->shuffled_tracks;
390 d->track_counter = 0;
391 d->shuffled_tracks.clear();