From: Felix Domke Date: Fri, 29 Jul 2005 15:33:27 +0000 (+0000) Subject: - split out meta parser X-Git-Tag: 2.6.0~5788 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/244459c4b2588ac9ca4b3fcbac05a2f8a7ee1641?ds=sidebyside - split out meta parser - movie selection works now - service information for pvr services work --- diff --git a/lib/dvb/Makefile.am b/lib/dvb/Makefile.am index 857f5001..ca200102 100644 --- a/lib/dvb/Makefile.am +++ b/lib/dvb/Makefile.am @@ -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 index 00000000..8c1f0cfd --- /dev/null +++ b/lib/dvb/metaparser.cpp @@ -0,0 +1,44 @@ +#include +#include + +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 index 00000000..7e2b6779 --- /dev/null +++ b/lib/dvb/metaparser.h @@ -0,0 +1,16 @@ +#ifndef __lib_dvb_metaparser_h +#define __lib_dvb_metaparser_h + +#include +#include + +class eDVBMetaParser +{ +public: + int parseFile(const std::string &filename); + + eServiceReferenceDVB m_ref; + std::string m_name, m_description; +}; + +#endif diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 7b24b434..d80897b9 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -2,6 +2,7 @@ #include #include #include +#include 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); diff --git a/lib/python/Screens/MovieSelection.py b/lib/python/Screens/MovieSelection.py index f5f26528..d3a86899 100644 --- a/lib/python/Screens/MovieSelection.py +++ b/lib/python/Screens/MovieSelection.py @@ -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() diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 5bd25f67..92e26cfa 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -10,6 +10,31 @@ #include #include +#include + +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 &ptr) { - ePtr 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 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 &service, const eServiceReference &ref) diff --git a/lib/service/servicefs.cpp b/lib/service/servicefs.cpp index 739dd0a6..b0d53922 100644 --- a/lib/service/servicefs.cpp +++ b/lib/service/servicefs.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -121,13 +122,15 @@ RESULT eServiceFS::getContent(std::list &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;