From: Andreas Monzner Date: Mon, 14 Apr 2008 15:10:50 +0000 (+0000) Subject: better handling for eServiceFS file extensions X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=47367fb1c159557cb3676f67172b9839531c8dc9 better handling for eServiceFS file extensions --- diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index e6e072c..bba846f 100644 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -42,8 +42,9 @@ def FileEntryComponent(name, absolute = None, isDir = False): return res class FileList(MenuList): - def __init__(self, directory, showDirectories = True, showFiles = True, matchingPattern = None, useServiceRef = False, isTop = False, enableWrapAround = False): + def __init__(self, directory, showDirectories = True, showFiles = True, matchingPattern = None, useServiceRef = False, isTop = False, enableWrapAround = False, additionalExtensions = None): MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent) + self.additional_extensions = additionalExtensions self.mount_point = None self.current_directory = None self.useServiceRef = useServiceRef @@ -107,6 +108,8 @@ class FileList(MenuList): directories = [ ] elif self.useServiceRef: root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory) + if self.additional_extensions: + root.setName(self.additional_extensions) serviceHandler = eServiceCenter.getInstance() list = serviceHandler.list(root) diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index dcc601f..6864584 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -62,7 +62,7 @@ class MediaPlayer(Screen, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSup self.addPlaylistParser(PlaylistIOInternal, "e2pls") # 'None' is magic to start at the list of mountpoints - self.filelist = FileList(None, matchingPattern = "(?i)^.*\.(mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob)", useServiceRef = True) + self.filelist = FileList(None, matchingPattern = "(?i)^.*\.(mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 3905a7f..896996b 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -84,7 +84,7 @@ public: #ifndef SWIG std::string name; #endif - std::string getName() { return name; } + std::string getName() const { return name; } void setName( const std::string &n ) { name=n; } eServiceReference() diff --git a/lib/service/service.cpp b/lib/service/service.cpp index a044c66..7721fed 100644 --- a/lib/service/service.cpp +++ b/lib/service/service.cpp @@ -187,18 +187,38 @@ RESULT eServiceCenter::offlineOperations(const eServiceReference &ref, ePtrsecond->offlineOperations(ref, ptr); } -RESULT eServiceCenter::addServiceFactory(int id, iServiceHandler *hnd) +RESULT eServiceCenter::addServiceFactory(int id, iServiceHandler *hnd, std::list &extensions) { handler.insert(std::pair >(id, hnd)); + this->extensions[id]=extensions; return 0; } RESULT eServiceCenter::removeServiceFactory(int id) { handler.erase(id); + extensions.erase(id); return 0; } +int eServiceCenter::getServiceTypeForExtension(const char *str) +{ + for (std::map >::iterator sit(extensions.begin()); sit != extensions.end(); ++sit) + { + for (std::list::iterator eit(sit->second.begin()); eit != sit->second.end(); ++eit) + { + if (*eit == str) + return sit->first; + } + } + return -1; +} + +int eServiceCenter::getServiceTypeForExtension(const std::string &str) +{ + return getServiceTypeForExtension(str.c_str()); +} + /* default handlers */ RESULT iServiceHandler::info(const eServiceReference &, ePtr &ptr) { diff --git a/lib/service/service.h b/lib/service/service.h index 77173c5..3929f75 100644 --- a/lib/service/service.h +++ b/lib/service/service.h @@ -16,6 +16,7 @@ class eServiceCenter: public iServiceHandler DECLARE_REF(eServiceCenter); private: std::map > handler; + std::map > extensions; static eServiceCenter *instance; #ifdef SWIG eServiceCenter(); @@ -26,6 +27,9 @@ public: eServiceCenter(); virtual ~eServiceCenter(); + int getServiceTypeForExtension(const char *str); + int getServiceTypeForExtension(const std::string &str); + // iServiceHandler RESULT play(const eServiceReference &, ePtr &ptr); RESULT record(const eServiceReference &, ePtr &ptr); @@ -35,7 +39,7 @@ public: // eServiceCenter static RESULT getPrivInstance(ePtr &ptr) { ptr = instance; return 0; } - RESULT addServiceFactory(int id, iServiceHandler *hnd); + RESULT addServiceFactory(int id, iServiceHandler *hnd, std::list &extensions); RESULT removeServiceFactory(int id); #endif static SWIG_VOID(RESULT) getInstance(ePtr &SWIG_NAMED_OUTPUT(ptr)) { ptr = instance; return 0; } diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index a8485fa..cd4d339 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -668,7 +668,11 @@ eServiceFactoryDVB::eServiceFactoryDVB() eServiceCenter::getPrivInstance(sc); if (sc) - sc->addServiceFactory(eServiceFactoryDVB::id, this); + { + std::list extensions; + extensions.push_back("ts"); + sc->addServiceFactory(eServiceFactoryDVB::id, this, extensions); + } m_StaticServiceDVBInfo = new eStaticServiceDVBInformation; m_StaticServiceDVBBouquetInfo = new eStaticServiceDVBBouquetInformation; diff --git a/lib/service/servicefs.cpp b/lib/service/servicefs.cpp index 728bb46..1417f91 100644 --- a/lib/service/servicefs.cpp +++ b/lib/service/servicefs.cpp @@ -36,7 +36,10 @@ eServiceFactoryFS::eServiceFactoryFS() eServiceCenter::getPrivInstance(sc); if (sc) - sc->addServiceFactory(eServiceFactoryFS::id, this); + { + std::list extensions; + sc->addServiceFactory(eServiceFactoryFS::id, this, extensions); + } m_service_information = new eStaticServiceFSInformation(); } @@ -67,7 +70,7 @@ RESULT eServiceFactoryFS::record(const eServiceReference &ref, ePtr &ptr) { - ptr = new eServiceFS(ref.path.c_str()); + ptr = new eServiceFS(ref.path.c_str(), ref.getName().length() ? ref.getName().c_str() : 0); return 0; } @@ -87,9 +90,64 @@ RESULT eServiceFactoryFS::offlineOperations(const eServiceReference &, ePtr &list, bool sorted) } else { size_t e = filename.rfind('.'); - std::string extension = (e != std::string::npos) ? filename.substr(e) : ""; - std::transform(extension.begin(), extension.end(), extension.begin(), lower); - int type = -1; - - if (extension == ".ts") - type = eServiceFactoryDVB::id; - else if (extension == ".mp3") - type = 0x1001; - else if (extension == ".ogg") - type = 0x1001; - else if (extension == ".mpg") - type = 0x1001; - else if (extension == ".vob") - type = 0x1001; - else if (extension == ".wav" || extension == ".wave") - type = 0x1001; - else if (extension == ".m3u" || extension == ".pls" || extension == ".e2pls") - type = 4098; // ?? this id is not defined in any service handler, just in python code. - - if (type != -1) + if (e != std::string::npos && e+1 < filename.length()) { - eServiceReference service(type, - 0, - filename); - service.data[0] = 0; - list.push_back(service); + std::string extension = filename.substr(e+1); + std::transform(extension.begin(), extension.end(), extension.begin(), lower); + int type = getServiceTypeForExtension(extension); + + if (type == -1) + { + ePtr sc; + eServiceCenter::getPrivInstance(sc); + type = sc->getServiceTypeForExtension(extension); + } + + if (type != -1) + { + eServiceReference service(type, + 0, + filename); + service.data[0] = 0; + list.push_back(service); + } + else + eDebug("unhandled extension %s", extension.c_str()); } } } @@ -300,4 +355,22 @@ RESULT eServiceFS::startEdit(ePtr &res) return -1; } +int eServiceFS::getServiceTypeForExtension(const char *str) +{ + for (std::map >::iterator sit(m_additional_extensions.begin()); sit != m_additional_extensions.end(); ++sit) + { + for (std::list::iterator eit(sit->second.begin()); eit != sit->second.end(); ++eit) + { + if (*eit == str) + return sit->first; + } + } + return -1; +} + +int eServiceFS::getServiceTypeForExtension(const std::string &str) +{ + return getServiceTypeForExtension(str.c_str()); +} + eAutoInitPtr init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS"); diff --git a/lib/service/servicefs.h b/lib/service/servicefs.h index 390757a..d05eef1 100644 --- a/lib/service/servicefs.h +++ b/lib/service/servicefs.h @@ -27,13 +27,16 @@ DECLARE_REF(eServiceFS); private: std::string path; friend class eServiceFactoryFS; - eServiceFS(const char *path); + eServiceFS(const char *path, const char *additional_extensions=0); + std::map > m_additional_extensions; int m_list_valid; std::list m_list; + int getServiceTypeForExtension(const char *str); + int getServiceTypeForExtension(const std::string &str); public: virtual ~eServiceFS(); - + RESULT getContent(std::list &list, bool sorted=false); PyObject *getContent(const char *format, bool sorted=false); RESULT getNext(eServiceReference &ptr); diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index a38ad41..f74cc8d 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -20,7 +20,16 @@ eServiceFactoryMP3::eServiceFactoryMP3() eServiceCenter::getPrivInstance(sc); if (sc) - sc->addServiceFactory(eServiceFactoryMP3::id, this); + { + std::list extensions; + extensions.push_back("mp3"); + extensions.push_back("ogg"); + extensions.push_back("mpg"); + extensions.push_back("vob"); + extensions.push_back("wav"); + extensions.push_back("wave"); + sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions); + } m_service_info = new eStaticServiceMP3Info(); }