filter short name brakets in getContent ('N')
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 11 Jan 2007 12:50:19 +0000 (12:50 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 11 Jan 2007 12:50:19 +0000 (12:50 +0000)
add possibility to get short names with getContent ('n')
the same for epg.search...
filter short name brakets in Converter/ServiceName

lib/base/estring.cpp
lib/base/estring.h
lib/dvb/epgcache.cpp
lib/python/Components/Converter/ServiceName.py
lib/python/Components/EpgList.py
lib/service/servicedvb.cpp

index 777462996e67bacd679102428469dfb53b5a9ae8..487dceecceb630186a7ad5e47a6e8c1664efbe1e 100644 (file)
@@ -5,6 +5,24 @@
 #include <lib/base/encoding.h>
 #include <lib/base/estring.h>
 
+std::string buildShortName( const std::string &str )
+{
+       std::string tmp;
+       static char stropen[3] = { 0xc2, 0x86, 0x00 };
+       static char strclose[3] = { 0xc2, 0x87, 0x00 };
+       unsigned int open=std::string::npos-1;
+       while ( (open = str.find(stropen, open+2)) != std::string::npos )
+       {
+               unsigned int close = str.find(strclose, open);
+               if ( close != std::string::npos )
+               {
+                       tmp+=str.substr( open+2, close-(open+2) );
+                       eDebug("now %s", tmp.c_str());
+               }
+       }
+       return tmp.length() ? tmp : str;
+}
+
 std::string getNum(int val, int sys)
 {
 //     Returns a string that contain the value val as string
index 3402228068da88ff8643801f0b354f47db96b667..68e0970f410a657ce81c78e51bf3470f4e3c132a 100644 (file)
@@ -6,6 +6,8 @@
 #include <stdio.h>
 #include "eerror.h"
 
+std::string buildShortName( const std::string &str );
+
 int strnicmp(const char*, const char*, int);
 
 std::string getNum(int num, int base=10);
index 42b21833c3fa447bb6597971d02741666c8f9e3c..c76b0c0689cf04a371386b5006b4d815ecc9e9cb 100644 (file)
@@ -12,6 +12,7 @@
 #include <sys/vfs.h> // for statfs
 // #include <libmd5sum.h>
 #include <lib/base/eerror.h>
+#include <lib/base/estring.h>
 #include <lib/dvb/pmt.h>
 #include <lib/dvb/db.h>
 #include <lib/python/python.h>
@@ -1619,6 +1620,7 @@ void fillTuple(ePyObject tuple, char *argstring, int argcount, ePyObject service
                                tmp = service;
                                inc_refcount = true;
                                break;
+                       case 'n': // short service name
                        case 'N': // service name
                                tmp = service_name;
                                inc_refcount = true;
@@ -1678,6 +1680,7 @@ int handleEvent(ePtr<eServiceEvent> &ptr, ePyObject dest_list, char* argstring,
 //   C = Current Time
 //   R = Service Reference
 //   N = Service Name
+//   n = Short Service Name
 // then for each service follows a tuple
 //   first tuple entry is the servicereference (as string... use the ref.toString() function)
 //   the second is the type of query
@@ -1740,7 +1743,7 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc)
                PyLong_FromLong(eDVBLocalTimeHandler::getInstance()->nowTime()) :
                ePyObject();
 
-       bool must_get_service_name = strchr(argstring, 'N') ? true : false;
+       int must_get_service_name = strchr(argstring, 'N') ? 1 : strchr(argstring, 'n') ? 2 : 0;
 
        // create dest list
        ePyObject dest_list=PyList_New(0);
@@ -1828,6 +1831,19 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc)
                                        {
                                                std::string name;
                                                sptr->getName(ref, name);
+
+                                               if (must_get_service_name == 1)
+                                               {
+                                                       unsigned int pos;
+                                                       // filter short name brakets
+                                                       while((pos = name.find("\xc2\x86")) != std::string::npos)
+                                                               name.erase(pos,2);
+                                                       while((pos = name.find("\xc2\x87")) != std::string::npos)
+                                                               name.erase(pos,2);
+                                               }
+                                               else
+                                                       name = buildShortName(name);
+
                                                if (name.length())
                                                        service_name = PyString_FromString(name.c_str());
                                        }
@@ -1920,6 +1936,7 @@ void fillTuple2(ePyObject tuple, const char *argstring, int argcount, eventData
                                tmp = service_reference;
                                inc_refcount = true;
                                break;
+                       case 'n': // short service name
                        case 'N': // service name
                                tmp = service_name;
                                inc_refcount = true;
@@ -1946,6 +1963,7 @@ void fillTuple2(ePyObject tuple, const char *argstring, int argcount, eventData
 //   E = Event Extended Description
 //   R = Service Reference
 //   N = Service Name
+//   n = Short Service Name
 //  the second tuple entry is the MAX matches value
 //  the third tuple entry is the type of query
 //     0 = search for similar broadcastings (SIMILAR_BROADCASTINGS_SEARCH)
@@ -2224,24 +2242,41 @@ PyObject *eEPGCache::search(ePyObject arg)
                                                                eDebug("event not found !!!!!!!!!!!");
                                                }
                                        // create service name
-                                               if (!service_name && strchr(argstring,'N'))
+                                               if (!service_name)
                                                {
-                                                       ePtr<iStaticServiceInformation> sptr;
-                                                       eServiceCenterPtr service_center;
-                                                       eServiceCenter::getPrivInstance(service_center);
-                                                       if (service_center)
+                                                       int must_get_service_name = strchr(argstring, 'N') ? 1 : strchr(argstring, 'n') ? 2 : 0;
+                                                       if (must_get_service_name)
                                                        {
-                                                               service_center->info(ref, sptr);
-                                                               if (sptr)
+                                                               ePtr<iStaticServiceInformation> sptr;
+                                                               eServiceCenterPtr service_center;
+                                                               eServiceCenter::getPrivInstance(service_center);
+                                                               if (service_center)
                                                                {
-                                                                       std::string name;
-                                                                       sptr->getName(ref, name);
-                                                                       if (name.length())
-                                                                               service_name = PyString_FromString(name.c_str());
+                                                                       service_center->info(ref, sptr);
+                                                                       if (sptr)
+                                                                       {
+                                                                               std::string name;
+                                                                               sptr->getName(ref, name);
+
+                                                                               if (must_get_service_name == 1)
+                                                                               {
+                                                                                       unsigned int pos;
+                                                                                       // filter short name brakets
+                                                                                       while((pos = name.find("\xc2\x86")) != std::string::npos)
+                                                                                               name.erase(pos,2);
+                                                                                       while((pos = name.find("\xc2\x87")) != std::string::npos)
+                                                                                               name.erase(pos,2);
+                                                                               }
+                                                                               else
+                                                                                       name = buildShortName(name);
+
+                                                                               if (name.length())
+                                                                                       service_name = PyString_FromString(name.c_str());
+                                                                       }
                                                                }
+                                                               if (!service_name)
+                                                                       service_name = PyString_FromString("<n/a>");
                                                        }
-                                                       if (!service_name)
-                                                               service_name = PyString_FromString("<n/a>");
                                                }
                                        // create servicereference string
                                                if (!service_reference && strchr(argstring,'R'))
index 7c463a62162fd87cc3120a41fe360a0b2175d6d4..9ccbda58c0d1130ac97c13156bd27cd4c9e1105f 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 from Components.Converter.Converter import Converter
 from enigma import iServiceInformation, iPlayableService
 from Components.Element import cached
@@ -27,7 +28,7 @@ class ServiceName(Converter, object):
                        return ""
                
                if self.type == self.NAME:
-                       return info.getName()
+                       return info.getName().replace('\xc2\x86', '').replace('\xc2\x87', '')
                elif self.type == self.PROVIDER:
                        return self.getServiceInfoValue(info, iServiceInformation.sProvider)
 
index ca209bda72a5087fc1879df92e0c6b1d5b762726..384009454c2de7b38e788bf75e4c9a6c5b7229a6 100644 (file)
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 from HTMLComponent import *
 from GUIComponent import *
 
@@ -164,25 +163,16 @@ class EPGList(HTMLComponent, GUIComponent):
 
        def buildMultiEntry(self, changecount, service, eventId, begTime, duration, EventName, nowTime, service_name):
                rec=begTime and (self.timer.isInTimer(eventId, begTime, duration, service) > ((duration/10)*8))
-               sname = service_name
                r1=self.service_rect
                r2=self.progress_rect
                r3=self.descr_rect
                r4=self.start_end_rect
                res = [ None ] # no private data needed
-               re = compile('\xc2\x86.*?\xc2\x87')
-               list = re.findall(sname)
-               if len(list):
-                       sname=''
-                       for substr in list:
-                               sname+=substr[2:len(substr)-2]
-                       if len(sname) == 0:
-                               sname = service_name;
                if rec:
-                       res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width()-21, r1.height(), 0, RT_HALIGN_LEFT, sname))
+                       res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width()-21, r1.height(), 0, RT_HALIGN_LEFT, service_name))
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r1.left()+r1.width()-16, r1.top(), 21, 21, loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, 'epgclock-fs8.png'))))
                else:
-                       res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_LEFT, sname))
+                       res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_LEFT, service_name))
                if begTime is not None:
                        if nowTime < begTime:
                                begin = localtime(begTime)
@@ -207,7 +197,7 @@ class EPGList(HTMLComponent, GUIComponent):
 
        def fillMultiEPG(self, services, stime=-1):
                t = time()
-               test = [ '0RIBDTCN' ]
+               test = [ '0RIBDTCn' ]
                for service in services:
                        tuple = (service.ref.toString(), 0, stime)
                        test.append( tuple )
@@ -218,7 +208,7 @@ class EPGList(HTMLComponent, GUIComponent):
 
        def updateMultiEPG(self, direction):
                t = time()
-               test = [ 'RIBDTCN' ]
+               test = [ 'RIBDTCn' ]
                for x in self.list:
                        service = x[1]
                        begTime = x[3]
index 62fc0482736d2cb3e2eab754de3d747361c42d79..238f838fa704385a0a1d09e3a621a67fc6b7b212 100644 (file)
@@ -65,16 +65,7 @@ RESULT eStaticServiceDVBInformation::getName(const eServiceReference &ref, std::
                                if (!service_center->info(parent, service_info))
                                {
                                        if (!service_info->getName(parent, name))
-                                       {
-                                               // just show short name
-                                               unsigned int pos = name.find("\xc2\x86");
-                                               if ( pos != std::string::npos )
-                                                       name.erase(0, pos+2);
-                                               pos = name.find("\xc2\x87");
-                                               if ( pos != std::string::npos )
-                                                       name.erase(pos);
-                                               name+=" - ";
-                                       }
+                                               name=buildShortName(name) + " - ";
                                }
                        }
                }
@@ -730,6 +721,7 @@ RESULT eDVBServiceList::getContent(std::list<eServiceReference> &list, bool sort
 //   S = Service Reference (as python string object .. same as ref.toString())
 //   C = Service Reference (as python string object .. same as ref.toCompareString())
 //   N = Service Name (as python string object)
+//   n = Short Service Name (short name brakets used) (as python string object)
 //   when exactly one return value per service is selected in the format string,
 //   then each value is directly a list entry
 //   when more than one value is returned per service, then the list is a list of
@@ -750,7 +742,7 @@ PyObject *eDVBServiceList::getContent(const char* format, bool sorted)
                ePtr<iStaticServiceInformation> sptr;
                eServiceCenterPtr service_center;
 
-               if (strchr(format, 'N'))
+               if (strchr(format, 'N') || strchr(format, 'n'))
                        eServiceCenter::getPrivInstance(service_center);
 
                ret = PyList_New(services);
@@ -782,6 +774,30 @@ PyObject *eDVBServiceList::getContent(const char* format, bool sorted)
                                                {
                                                        std::string name;
                                                        sptr->getName(ref, name);
+
+                                                       // filter short name brakets
+                                                       unsigned int pos;
+                                                       while((pos = name.find("\xc2\x86")) != std::string::npos)
+                                                               name.erase(pos,2);
+                                                       while((pos = name.find("\xc2\x87")) != std::string::npos)
+                                                               name.erase(pos,2);
+
+                                                       if (name.length())
+                                                               tmp = PyString_FromString(name.c_str());
+                                               }
+                                       }
+                                       if (!tmp)
+                                               tmp = PyString_FromString("<n/a>");
+                                       break;
+                               case 'n':  // short service name
+                                       if (service_center)
+                                       {
+                                               service_center->info(ref, sptr);
+                                               if (sptr)
+                                               {
+                                                       std::string name;
+                                                       sptr->getName(ref, name);
+                                                       name = buildShortName(name);
                                                        if (name.length())
                                                                tmp = PyString_FromString(name.c_str());
                                                }