diff --git a/kaffeine/src/player-parts/libmpv-part/libmpv_event.cpp b/kaffeine/src/player-parts/libmpv-part/libmpv_event.cpp index aa9e50c..6224dbf 100644 --- a/kaffeine/src/player-parts/libmpv-part/libmpv_event.cpp +++ b/kaffeine/src/player-parts/libmpv-part/libmpv_event.cpp @@ -41,7 +41,7 @@ MpvEventThread::MpvEventThread(MpvPart *part) { void MpvEventThread::initPropertyObservers() { mpv_observe_property(m_part->m_mpv, 0, "time-pos", MPV_FORMAT_DOUBLE); mpv_observe_property(m_part->m_mpv, 0, "duration", MPV_FORMAT_DOUBLE); - mpv_observe_property(m_part->m_mpv, 0, "media-title", MPV_FORMAT_STRING); + mpv_observe_property(m_part->m_mpv, 0, "metadata", MPV_FORMAT_NONE); // "The advantage over using this instead of calculating it out of other // properties is that it properly falls back to estimating the playback diff --git a/kaffeine/src/player-parts/libmpv-part/libmpv_part.cpp b/kaffeine/src/player-parts/libmpv-part/libmpv_part.cpp index 65148b5..346acba 100644 --- a/kaffeine/src/player-parts/libmpv-part/libmpv_part.cpp +++ b/kaffeine/src/player-parts/libmpv-part/libmpv_part.cpp @@ -246,6 +246,7 @@ void MpvPart::updatePlaytime(TQTime time) { void MpvPart::customEvent(TQCustomEvent *event) { if (event->type() == MPVPART_EVENT_PROPERTY_CHANGE) { MpvPropertyChangeEvent *pe = (MpvPropertyChangeEvent *)event; + if (pe->property() == "time-pos" && pe->format() == MPV_FORMAT_DOUBLE) { m_time = pe->toTime(); updatePlaytime(m_time); @@ -264,6 +265,10 @@ void MpvPart::customEvent(TQCustomEvent *event) { emit signalNewMeta(m_mrl); } } + + else if (pe->property() == "metadata") { + updateMetadata(); + } } else if (event->type() == MPVPART_EVENT_EOF) { @@ -769,9 +774,59 @@ void MpvPart::hideContextMenu() { } } +void MpvPart::updateMetadata() { + if (!m_mpv) return; + + kdDebug() << "update metadata" << endl; + + // Errors reading metadata are not fatal, as this is not something that + // the user explicitly requests + mpv_node result; + if (mpv_get_property(m_mpv, "metadata", MPV_FORMAT_NODE, &result) < 0) { + kdWarning() << "mpv: error reading metadata" << endl; + return; + } + + if (result.format != MPV_FORMAT_NODE_MAP) { + kdWarning() << "mpv: wrong metadata format" << endl; + return; + } + + mpv_node_list *map = result.u.list; + + for (int i = 0; i < map->num; ++i) { + TQString key(map->keys[i]); + TQString value = TQString::fromUtf8(map->values[i].u.string); + if (key == "title" || key == "icy-name") { + m_mrl.setTitle(value); + } + else if (key == "artist") { + m_mrl.setArtist(value); + } + else if (key == "album") { + m_mrl.setAlbum(value); + } + else if (key == "track" || key == "icy-title") { + m_mrl.setTrack(value); + } + else if (key == "date") { + m_mrl.setYear(value); + } + else if (key == "genre" || key == "icy-genre") { + m_mrl.setGenre(value); + } + else if (key == "comment" || key == "icy-description") { + m_mrl.setComment(value); + } + kdDebug() << "e " << map->keys[i] << ": " << map->values[i].u.string << endl; + } + + mpv_free_node_contents(&result); +} + #define THROW_ERROR(msg, details) \ kdError() << "mpv: " << msg << " (" << details << ")" << endl; \ - KMessageBox::detailedError(nullptr, i18n(msg), details); \ + KMessageBox::detailedError(nullptr, i18n(msg), details); #define THROW_ERROR_FREE(msg, details) \ THROW_ERROR(msg, details) \ @@ -852,7 +907,6 @@ data = result.u.list->values[4].u.ba; } } - // Try to launch ksnapshot TQString ksError; TQCString ksDcop; diff --git a/kaffeine/src/player-parts/libmpv-part/libmpv_part.h b/kaffeine/src/player-parts/libmpv-part/libmpv_part.h index 8658778..a4b056a 100644 --- a/kaffeine/src/player-parts/libmpv-part/libmpv_part.h +++ b/kaffeine/src/player-parts/libmpv-part/libmpv_part.h @@ -119,6 +119,8 @@ class MpvPart : public KaffeinePart void slotTogglePlaytimeMode(); + void updateMetadata(); + signals: void mpvEvents();