summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Hintukainen <phintuka@users.sourceforge.net>2013-01-18 23:06:43 +0200
committerPetri Hintukainen <phintuka@users.sourceforge.net>2013-01-18 23:06:43 +0200
commitdff2e7bec6d44e6b335389439964ac697704ec1c (patch)
treee94904ed3794e34a934cd2759bd1005c3bdadc2a
parent1de4d44ced0415738283133af55eefde9320a2c0 (diff)
downloadvdr-plugin-bluray-dff2e7bec6d44e6b335389439964ac697704ec1c.tar.gz
vdr-plugin-bluray-dff2e7bec6d44e6b335389439964ac697704ec1c.tar.bz2
Scan disc metadata for disc title
-rw-r--r--discmenu.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/discmenu.c b/discmenu.c
index 7868772..bff8528 100644
--- a/discmenu.c
+++ b/discmenu.c
@@ -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);