- split out meta parser
authorFelix Domke <tmbinc@elitedvb.net>
Fri, 29 Jul 2005 15:33:27 +0000 (15:33 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Fri, 29 Jul 2005 15:33:27 +0000 (15:33 +0000)
 - movie selection works now
 - service information for pvr services work

lib/dvb/Makefile.am
lib/dvb/metaparser.cpp [new file with mode: 0644]
lib/dvb/metaparser.h [new file with mode: 0644]
lib/dvb/pmt.cpp
lib/python/Screens/MovieSelection.py
lib/service/servicedvb.cpp
lib/service/servicefs.cpp

index 857f50013f849106f43d9c05fe9080c16e4f4c31..ca20010201c32dfcccb063456f50524bc2019e37 100644 (file)
@@ -5,4 +5,4 @@ noinst_LIBRARIES = libenigma_dvb.a
 
 libenigma_dvb_a_SOURCES = dvb.cpp demux.cpp frontend.cpp esection.cpp db.cpp \
        sec.cpp scan.cpp crc32.cpp pmt.cpp decoder.cpp eit.cpp rotor_calc.cpp \
-       epgcache.cpp dvbtime.cpp
+       epgcache.cpp dvbtime.cpp metaparser.cpp
diff --git a/lib/dvb/metaparser.cpp b/lib/dvb/metaparser.cpp
new file mode 100644 (file)
index 0000000..8c1f0cf
--- /dev/null
@@ -0,0 +1,44 @@
+#include <lib/dvb/metaparser.h>
+#include <errno.h>
+
+int eDVBMetaParser::parseFile(const std::string &tsname)
+{
+               /* if it's a PVR channel, recover service id. */
+       std::string filename = tsname + ".meta";
+               
+       FILE *f = fopen(filename.c_str(), "r");
+       if (!f)
+               return -ENOENT;
+
+       int linecnt = 0;
+       
+       while (1)
+       {
+               char line[1024];
+               if (!fgets(line, 1024, f))
+                       break;
+               if (*line && line[strlen(line)-1] == '\n')
+                       line[strlen(line)-1] = 0;
+
+               if (*line && line[strlen(line)-1] == '\r')
+                       line[strlen(line)-1] = 0;
+
+               switch (linecnt)
+               {
+               case 0:
+                       m_ref = (eServiceReferenceDVB&)eServiceReference(line);
+                       break;
+               case 1:
+                       m_name = line;
+                       break;
+               case 2:
+                       m_description = line;
+                       break;
+               default:
+                       break;
+               }
+               ++linecnt;
+       }
+       fclose(f);
+       return 0;
+}
diff --git a/lib/dvb/metaparser.h b/lib/dvb/metaparser.h
new file mode 100644 (file)
index 0000000..7e2b677
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef __lib_dvb_metaparser_h
+#define __lib_dvb_metaparser_h
+
+#include <string>
+#include <lib/dvb/idvb.h>
+
+class eDVBMetaParser
+{
+public:
+       int parseFile(const std::string &filename);
+
+       eServiceReferenceDVB m_ref;
+       std::string m_name, m_description;
+};
+
+#endif
index 7b24b4340f1fb5d9dc78bcbef7796242b7f9022b..d80897b95e48754245c45d624fc9585e5e314f4c 100644 (file)
@@ -2,6 +2,7 @@
 #include <lib/dvb/pmt.h>
 #include <lib/dvb/specs.h>
 #include <lib/dvb/dvb.h>
+#include <lib/dvb/metaparser.h>
 
 eDVBServicePMTHandler::eDVBServicePMTHandler()
 {
@@ -143,6 +144,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref)
                res = m_resourceManager->allocateChannel(chid, m_channel);
        } else
        {
+               eDVBMetaParser parser;
+               
+               if (parser.parseFile(ref.path))
+                       eWarning("no .meta file found, trying original service ref.");
+               else
+                       m_reference = parser.m_ref;
+               
                eDebug("alloc PVR");
                        /* allocate PVR */
                res = m_resourceManager->allocatePVRChannel(m_pvr_channel);
index f5f2652824023453e6a607e492cef67782487d4c..d3a86899b0d51c5d24a11a07b05ad75088fa957c 100644 (file)
@@ -13,7 +13,7 @@ class MovieSelection(Screen):
                self.movemode = False
                self.bouquet_mark_edit = False
                
-               self["list"] = MovieList(eServiceReference("2:0:1:0:0:0:0:0:0:0:/"))
+               self["list"] = MovieList(eServiceReference("2:0:1:0:0:0:0:0:0:0:/hdd/movies/"))
                
                #self["okbutton"] = Button("ok", [self.channelSelected])
                
@@ -25,5 +25,5 @@ class MovieSelection(Screen):
                self["actions"].csel = self
 
        def movieSelected(self):
-#              self.session.nav.playService(self["list"].getCurrent())
+               self.session.nav.playService(self["list"].getCurrent()[0])
                self.close()
index 5bd25f672cd298895e76a50a9f1f63f3aab767b7..92e26cfa8d3e6a7198632b0bf2e58b41354e5c4b 100644 (file)
 #include <lib/dvb/db.h>
 
 #include <lib/service/servicedvbrecord.h>
+#include <lib/dvb/metaparser.h>
+
+class eStaticServiceDVBPVRInformation: public iStaticServiceInformation
+{
+       DECLARE_REF(eStaticServiceDVBPVRInformation);
+       eServiceReference m_ref;
+       eDVBMetaParser m_parser;
+public:
+       eStaticServiceDVBPVRInformation(const eServiceReference &ref);
+       RESULT getName(const eServiceReference &ref, std::string &name);
+};
+
+DEFINE_REF(eStaticServiceDVBPVRInformation);
+
+eStaticServiceDVBPVRInformation::eStaticServiceDVBPVRInformation(const eServiceReference &ref)
+{
+       m_ref = ref;
+       m_parser.parseFile(ref.path);
+}
+
+RESULT eStaticServiceDVBPVRInformation::getName(const eServiceReference &ref, std::string &name)
+{
+       ASSERT(ref == m_ref);
+       name = m_parser.m_name.size() ? m_parser.m_name : ref.path;
+}
 
 DEFINE_REF(eServiceFactoryDVB)
 
@@ -109,13 +134,21 @@ RESULT eServiceFactoryDVB::list(const eServiceReference &ref, ePtr<iListableServ
 
 RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr<iStaticServiceInformation> &ptr)
 {
-       ePtr<eDVBService> service;
-       int r = lookupService(service, ref);
-       if (r)
-               return r;
-               /* eDVBService has the iStaticServiceInformation interface, so we pass it here. */
-       ptr = service;
-       return 0;
+               /* do we have a PVR service? */
+       if (ref.path.size())
+       {
+               ptr = new eStaticServiceDVBPVRInformation(ref);
+               return 0;
+       } else
+       {
+               ePtr<eDVBService> service;
+               int r = lookupService(service, ref);
+               if (r)
+                       return r;
+                       /* eDVBService has the iStaticServiceInformation interface, so we pass it here. */
+               ptr = service;
+               return 0;
+       }
 }
 
 RESULT eServiceFactoryDVB::lookupService(ePtr<eDVBService> &service, const eServiceReference &ref)
index 739dd0a6707c03d8cbdc617695ca7b1aa3f4b8ea..b0d5392283fd44e24c6fc309e62c66641cc6ae30 100644 (file)
@@ -4,6 +4,7 @@
 #include <errno.h>
 #include <lib/service/servicefs.h>
 #include <lib/service/service.h>
+#include <lib/service/servicedvb.h>
 #include <lib/base/init_num.h>
 #include <lib/base/init.h>
 #include <dirent.h>
@@ -121,13 +122,15 @@ RESULT eServiceFS::getContent(std::list<eServiceReference> &list)
                        list.push_back(service);
                } else
                {
-                       eServiceReference service(eServiceFactoryFS::id, 
-                               eServiceReference::isDirectory|
-                               eServiceReference::canDescent|eServiceReference::mustDescent|
-                               eServiceReference::shouldSort|eServiceReference::sort1,
-                               filename);
-                       service.data[0] = 0;
-                       list.push_back(service);
+                               /* FIIIIIX ME */
+                       if (filename.substr(filename.size()-3) == ".ts")
+                       {
+                               eServiceReference service(eServiceFactoryDVB::id,
+                                       0,
+                                       filename);
+                               service.data[0] = 0;
+                               list.push_back(service);
+                       }
                }
        }
        return 0;