26 #include <dbus/dbus.h> 37 typedef std::map<Track::Id, std::tuple<Track::UriType, Track::MetaData>>
MetaDataCache;
42 std::shared_ptr<media::Engine::MetaDataExtractor>
extractor;
50 if (meta_data_cache.count(
id) == 0)
55 meta_data_cache[id] = std::make_tuple(
57 extractor->meta_data_for_track_with_uri(uri));
58 }
catch (
const std::runtime_error &e) {
59 std::cerr <<
"Failed to retrieve metadata for track '" << uri <<
"' (" << e.what() <<
")" << std::endl;
62 meta_data_cache[id] = std::make_tuple(
68 std::get<0>(meta_data_cache[id]) = uri;
74 media::TrackList::Container::iterator random_it = shuffled_tracks.begin();
75 if (random_it == shuffled_tracks.end())
81 std::advance(random_it, rand() % (shuffled_tracks.size() + 1));
87 const dbus::Bus::Ptr& bus,
88 const dbus::Object::Ptr&
object,
89 const std::shared_ptr<media::Engine::MetaDataExtractor>&
extractor,
90 const media::apparmor::ubuntu::RequestContextResolver::Ptr& request_context_resolver,
91 const media::apparmor::ubuntu::RequestAuthenticator::Ptr& request_authenticator)
105 const auto it = d->meta_data_cache.find(
id);
107 if (it == d->meta_data_cache.end())
110 return std::get<0>(it->second);
115 const auto it = d->meta_data_cache.find(
id);
117 if (it == d->meta_data_cache.end())
118 return Track::MetaData{};
120 return std::get<1>(it->second);
128 std::cout << __PRETTY_FUNCTION__ << std::endl;
130 std::stringstream ss;
131 ss << d->object->path().as_string() <<
"/" << d->track_counter++;
134 std::cout <<
"Adding Track::Id: " <<
id << std::endl;
135 std::cout <<
"\tURI: " << uri << std::endl;
141 auto it = std::find(container.begin(), container.end(), position);
142 container.insert(it,
id);
149 d->updateCachedTrackMetadata(
id, uri);
152 d->shuffled_tracks.insert(d->get_shuffled_insert_it(), id);
162 std::cout <<
"Signaling that we just added track id: " <<
id << std::endl;
168 if (
tracks().get().size() == 1)
175 std::cout << __PRETTY_FUNCTION__ << std::endl;
181 for (
const auto uri : uris)
184 std::stringstream ss;
185 ss << d->object->path().as_string() <<
"/" << d->track_counter++;
187 std::cout <<
"Adding Track::Id: " <<
id << std::endl;
188 std::cout <<
"\tURI: " << uri << std::endl;
194 auto it = std::find(
tracks().
get().begin(),
tracks().
get().end(), insert_position);
197 container.insert(it,
id);
200 insert_position = id;
207 d->updateCachedTrackMetadata(
id, uri);
210 d->shuffled_tracks.insert(d->get_shuffled_insert_it(), id);
213 if (
tracks().get().size() == 1)
220 std::cout <<
"Signaling that we just added " << tmp.size() <<
" tracks to the TrackList" << std::endl;
223 if (!current_id.empty())
230 std::cout << __PRETTY_FUNCTION__ << std::endl;
232 std::cout <<
"-----------------------------------------------------" << std::endl;
233 if (
id.empty() or to.empty())
235 std::cerr <<
"Can't move track since 'id' or 'to' are empty" << std::endl;
241 std::cerr <<
"Can't move track to it's same position" << std::endl;
245 if (
tracks().get().size() == 1)
247 std::cerr <<
"Can't move track since TrackList contains only one track" << std::endl;
253 std::cout <<
"current_track id: " << current_id << std::endl;
255 auto insert_point_it = std::find(
tracks().
get().begin(),
tracks().
get().end(), to);
256 if (insert_point_it !=
tracks().
get().end())
258 const auto result =
tracks().update([
this,
id, to, current_id, &insert_point_it]
262 auto to_move_it = std::find(
tracks().
get().begin(),
tracks().
get().end(),
id);
263 std::cout <<
"Erasing old track position: " << *to_move_it << std::endl;
264 if (to_move_it !=
tracks().
get().end())
266 container.erase(to_move_it);
270 throw media::TrackList::Errors::FailedToFindMoveTrackDest
271 (
"Failed to find destination track " + to);
275 container.insert(insert_point_it,
id);
277 const auto new_current_track_it = std::find(
tracks().
get().begin(),
tracks().
get().end(), current_id);
278 if (new_current_track_it !=
tracks().
get().end())
283 throw media::TrackList::Errors::FailedToMoveTrack();
285 std::cout <<
"*** Updated current_iterator, id: " << *
current_iterator() << std::endl;
289 std::cerr <<
"Can't update current_iterator - failed to find track after move" << std::endl;
290 throw media::TrackList::Errors::FailedToMoveTrack();
298 std::cout <<
"TrackList after move" << std::endl;
299 for(
auto track :
tracks().get())
301 std::cout << track << std::endl;
311 throw media::TrackList::Errors::FailedToFindMoveTrackSource
312 (
"Failed to find source track " +
id);
315 std::cout <<
"-----------------------------------------------------" << std::endl;
324 container.erase(std::find(container.begin(), container.end(), id));
332 d->meta_data_cache.erase(
id);
335 d->shuffled_tracks.erase(find(d->shuffled_tracks.begin(),
336 d->shuffled_tracks.end(), id));
341 if (
tracks().get().empty())
348 std::cout << __PRETTY_FUNCTION__ << std::endl;
359 d->shuffled_tracks =
tracks().get();
360 random_shuffle(d->shuffled_tracks.begin(), d->shuffled_tracks.end());
371 return d->shuffled_tracks;
376 std::cout << __PRETTY_FUNCTION__ << std::endl;
388 d->track_counter = 0;
389 d->shuffled_tracks.clear();