19 #ifndef GSTREAMER_META_DATA_EXTRACTOR_H_
20 #define GSTREAMER_META_DATA_EXTRACTOR_H_
22 #include "../engine.h"
37 : pipe(gst_pipeline_new(
"meta_data_extractor_pipeline")),
38 decoder(gst_element_factory_make (
"uridecodebin", NULL)),
39 bus(GST_ELEMENT_BUS(pipe))
41 gst_bin_add(GST_BIN(pipe), decoder);
43 auto sink = gst_element_factory_make (
"fakesink", NULL);
44 gst_bin_add (GST_BIN (pipe), sink);
46 g_signal_connect (decoder,
"pad-added", G_CALLBACK (on_new_pad), sink);
51 gst_element_set_state(pipe, GST_STATE_NULL);
57 if (!gst_uri_is_valid(uri.c_str()))
58 throw std::runtime_error(
"Invalid uri");
61 std::promise<core::ubuntu::media::Track::MetaData> promise;
62 std::future<core::ubuntu::media::Track::MetaData> future{promise.get_future()};
64 core::ScopedConnection on_new_message_connection
69 std::cout << __PRETTY_FUNCTION__ << gst_message_type_get_name(msg.
type) << std::endl;
70 if (msg.
type == GST_MESSAGE_TAG)
72 MetaDataExtractor::on_tag_available(msg.
detail.
tag, meta_data);
73 }
else if (msg.
type == GST_MESSAGE_ASYNC_DONE)
75 promise.set_value(meta_data);
80 g_object_set(decoder,
"uri", uri.c_str(), NULL);
81 gst_element_set_state(pipe, GST_STATE_PAUSED);
83 if (std::future_status::ready != future.wait_for(std::chrono::seconds(2)))
85 gst_element_set_state(pipe, GST_STATE_NULL);
86 throw std::runtime_error(
"Problem extracting meta data for track");
89 gst_element_set_state(pipe, GST_STATE_NULL);
96 static void on_new_pad(GstElement*, GstPad* pad, GstElement* fakesink)
100 sinkpad = gst_element_get_static_pad (fakesink,
"sink");
102 if (!gst_pad_is_linked (sinkpad)) {
103 if (gst_pad_link (pad, sinkpad) != GST_PAD_LINK_OK)
104 g_error (
"Failed to link pads!");
107 gst_object_unref (sinkpad);
110 static void on_tag_available(
116 gst_tag_list_foreach(
118 [](
const GstTagList *list,
124 static const std::map<std::string, std::string> gstreamer_to_mpris_tag_lut =
126 {GST_TAG_ALBUM, media::Engine::Xesam::album()},
127 {GST_TAG_ALBUM_ARTIST, media::Engine::Xesam::album_artist()},
128 {GST_TAG_ARTIST, media::Engine::Xesam::artist()},
129 {GST_TAG_LYRICS, media::Engine::Xesam::as_text()},
130 {GST_TAG_COMMENT, media::Engine::Xesam::comment()},
131 {GST_TAG_COMPOSER, media::Engine::Xesam::composer()},
132 {GST_TAG_DATE, media::Engine::Xesam::content_created()},
133 {GST_TAG_ALBUM_VOLUME_NUMBER, media::Engine::Xesam::disc_number()},
134 {GST_TAG_GENRE, media::Engine::Xesam::genre()},
135 {GST_TAG_TITLE, media::Engine::Xesam::title()},
136 {GST_TAG_TRACK_NUMBER, media::Engine::Xesam::track_number()},
137 {GST_TAG_USER_RATING, media::Engine::Xesam::user_rating()}
140 auto md = static_cast<media::Track::MetaData*>(user_data);
141 std::stringstream ss;
143 switch(gst_tag_get_type(tag))
148 if (gst_tag_list_get_boolean(list, tag, &value))
155 if (gst_tag_list_get_int(list, tag, &value))
162 if (gst_tag_list_get_uint(list, tag, &value))
169 if (gst_tag_list_get_int64(list, tag, &value))
176 if (gst_tag_list_get_uint64(list, tag, &value))
183 if (gst_tag_list_get_float(list, tag, &value))
190 if (gst_tag_list_get_double(list, tag, &value))
197 if (gst_tag_list_get_string(list, tag, &value))
209 (gstreamer_to_mpris_tag_lut.count(tag) > 0 ? gstreamer_to_mpris_tag_lut.at(tag) : tag),
221 #endif // GSTREAMER_META_DATA_EXTRACTOR_H_
core::Signal< Message > on_new_message
union gstreamer::Bus::Message::Detail detail
struct gstreamer::Bus::Message::Detail::Tag tag