mpv: add metadata handling

Signed-off-by: Mavridis Philippe <mavridisf@gmail.com>
feat/libmpv-backend
Mavridis Philippe 6 months ago
parent 48da4ab130
commit 41e36f4aca
No known key found for this signature in database
GPG Key ID: 93F66F98F906147D

@ -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

@ -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;

@ -119,6 +119,8 @@ class MpvPart : public KaffeinePart
void slotTogglePlaytimeMode();
void updateMetadata();
signals:
void mpvEvents();

Loading…
Cancel
Save