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
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)
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()
#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()
return i->second->offlineOperations(ref, ptr);
}
-RESULT eServiceCenter::addServiceFactory(int id, iServiceHandler *hnd)
+RESULT eServiceCenter::addServiceFactory(int id, iServiceHandler *hnd, std::list<std::string> &extensions)
{
handler.insert(std::pair<int,ePtr<iServiceHandler> >(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<int, std::list<std::string> >::iterator sit(extensions.begin()); sit != extensions.end(); ++sit)
+ {
+ for (std::list<std::string>::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<iStaticServiceInformation> &ptr)
{
DECLARE_REF(eServiceCenter);
private:
std::map<int,ePtr<iServiceHandler> > handler;
+ std::map<int,std::list<std::string> > extensions;
static eServiceCenter *instance;
#ifdef SWIG
eServiceCenter();
eServiceCenter();
virtual ~eServiceCenter();
+ int getServiceTypeForExtension(const char *str);
+ int getServiceTypeForExtension(const std::string &str);
+
// iServiceHandler
RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr);
RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr);
// eServiceCenter
static RESULT getPrivInstance(ePtr<eServiceCenter> &ptr) { ptr = instance; return 0; }
- RESULT addServiceFactory(int id, iServiceHandler *hnd);
+ RESULT addServiceFactory(int id, iServiceHandler *hnd, std::list<std::string> &extensions);
RESULT removeServiceFactory(int id);
#endif
static SWIG_VOID(RESULT) getInstance(ePtr<iServiceHandler> &SWIG_NAMED_OUTPUT(ptr)) { ptr = instance; return 0; }
eServiceCenter::getPrivInstance(sc);
if (sc)
- sc->addServiceFactory(eServiceFactoryDVB::id, this);
+ {
+ std::list<std::string> extensions;
+ extensions.push_back("ts");
+ sc->addServiceFactory(eServiceFactoryDVB::id, this, extensions);
+ }
m_StaticServiceDVBInfo = new eStaticServiceDVBInformation;
m_StaticServiceDVBBouquetInfo = new eStaticServiceDVBBouquetInformation;
eServiceCenter::getPrivInstance(sc);
if (sc)
- sc->addServiceFactory(eServiceFactoryFS::id, this);
+ {
+ std::list<std::string> extensions;
+ sc->addServiceFactory(eServiceFactoryFS::id, this, extensions);
+ }
m_service_information = new eStaticServiceFSInformation();
}
RESULT eServiceFactoryFS::list(const eServiceReference &ref, ePtr<iListableService> &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;
}
DEFINE_REF(eServiceFS);
-eServiceFS::eServiceFS(const char *path): path(path)
+eServiceFS::eServiceFS(const char *path, const char *additional_extensions): path(path)
{
m_list_valid = 0;
+ if (additional_extensions)
+ {
+ size_t slen=strlen(additional_extensions);
+ char buf[slen+1];
+ char *tmp=0, *cmds = buf;
+ memcpy(buf, additional_extensions, slen+1);
+
+ // strip spaces at beginning
+ while(cmds[0] == ' ')
+ {
+ ++cmds;
+ --slen;
+ }
+
+ // strip spaces at the end
+ while(slen && cmds[slen-1] == ' ')
+ {
+ cmds[slen-1] = 0;
+ --slen;
+ }
+
+ if (slen)
+ {
+ if (*cmds)
+ {
+ int id;
+ char buf2[16];
+ while(1)
+ {
+ tmp = strchr(cmds, ' ');
+ if (tmp)
+ *tmp = 0;
+ if (strstr(cmds, "0x"))
+ {
+ if (sscanf(cmds, "0x%x:%s", &id, buf2) == 2)
+ m_additional_extensions[id].push_back(buf2);
+ else
+ eDebug("parse additional_extension (%s) failed", cmds);
+ }
+ else
+ {
+ if (sscanf(cmds, "%d:%s", &id, buf2) == 2)
+ m_additional_extensions[id].push_back(buf2);
+ else
+ eDebug("parse additional_extension (%s) failed", cmds);
+ }
+ if (!tmp)
+ break;
+ cmds = tmp+1;
+ while (*cmds && *cmds == ' ')
+ ++cmds;
+ }
+ }
+ }
+ }
}
eServiceFS::~eServiceFS()
} 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<eServiceCenter> 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());
}
}
}
return -1;
}
+int eServiceFS::getServiceTypeForExtension(const char *str)
+{
+ for (std::map<int, std::list<std::string> >::iterator sit(m_additional_extensions.begin()); sit != m_additional_extensions.end(); ++sit)
+ {
+ for (std::list<std::string>::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<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
private:
std::string path;
friend class eServiceFactoryFS;
- eServiceFS(const char *path);
+ eServiceFS(const char *path, const char *additional_extensions=0);
+ std::map<int, std::list<std::string> > m_additional_extensions;
int m_list_valid;
std::list<eServiceReference> m_list;
+ int getServiceTypeForExtension(const char *str);
+ int getServiceTypeForExtension(const std::string &str);
public:
virtual ~eServiceFS();
-
+
RESULT getContent(std::list<eServiceReference> &list, bool sorted=false);
PyObject *getContent(const char *format, bool sorted=false);
RESULT getNext(eServiceReference &ptr);
eServiceCenter::getPrivInstance(sc);
if (sc)
- sc->addServiceFactory(eServiceFactoryMP3::id, this);
+ {
+ std::list<std::string> 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();
}