diff options
author | Petri Hintukainen <phintuka@users.sourceforge.net> | 2013-01-18 23:06:43 +0200 |
---|---|---|
committer | Petri Hintukainen <phintuka@users.sourceforge.net> | 2013-01-18 23:06:43 +0200 |
commit | dff2e7bec6d44e6b335389439964ac697704ec1c (patch) | |
tree | e94904ed3794e34a934cd2759bd1005c3bdadc2a | |
parent | 1de4d44ced0415738283133af55eefde9320a2c0 (diff) | |
download | vdr-plugin-bluray-dff2e7bec6d44e6b335389439964ac697704ec1c.tar.gz vdr-plugin-bluray-dff2e7bec6d44e6b335389439964ac697704ec1c.tar.bz2 |
Scan disc metadata for disc title
-rw-r--r-- | discmenu.c | 44 |
1 files changed, 42 insertions, 2 deletions
@@ -26,6 +26,38 @@ static bool IsBluRayFolder(const char *fname) return false; } +static cString GetMetaName(const char *Root) +{ + cString file = cString::sprintf("%s/BDMV/META/DL/bdmt_eng.xml", Root); + cString result(NULL); + struct stat st; + + if (stat(file, &st) == 0) { + FILE *fp = fopen(file, "rt"); + if (fp) { + fseek(fp, 0, SEEK_END); + long len = ftell(fp); + if (len > 0 && len < 0xffff) { + fseek(fp, 0, SEEK_SET); + char buf[len+1]; + if ((size_t)len == fread(buf, 1, len, fp)) { + buf[len] = 0; + char *p = strstr(buf, "<di:name>"); + if (p) { + char *end = strstr(p, "</di:name>"); + if (end) { + *end = 0; + result = p + 9; + } + } + } + } + fclose(fp); + } + } + return result; +} + /* * cDiscItem */ @@ -70,7 +102,13 @@ cDiscMenu::cDiscMenu(cDiscMgr& Mgr, cString& Root) : Sort(); if (mgr.IsMounted()) { - Ins(new cDiscItem(cString::sprintf("BluRay disc (%s)", mgr.GetDev()))); + cString title = GetMetaName(mgr.GetPath()); + if (*title) { + title = cString::sprintf("%s (%s)", *title, mgr.GetDev()); + } else { + title = cString::sprintf("BluRay disc (%s)", mgr.GetDev()); + } + Ins(new cDiscItem(title)); //SetHelp("Eject"); } else { Ins(new cDiscItem("(Disc not mounted)")); @@ -103,7 +141,9 @@ void cDiscMenu::Scan(cString& Root) if (S_ISDIR(st.st_mode)) { if (IsBluRayFolder(buffer)) { - Add(new cDiscItem(e->d_name, buffer)); + + cString s = GetMetaName(buffer); + Add(new cDiscItem(*s ? *s : e->d_name, buffer)); } else { Scan(buffer); |