解决部分频道的OSD NowNext不能正确更新的方法【2010-11-08更新】
浏览:1043 发布日期:2014-11-29

在dm800/dm8000上收看节目,发现部分频道(如13*4上的频道)不能正确更新Now/Next的EPG信息,其原因是这部分频道所在转发器发送了EIT数据,enigma2收到EIT数据后,将停止用于更新 EPGCache 的Now/Next计时器,而采用EIT数据显示。如果EIT数据不准确(如13*4上),将导致Now/Next不能正确依据EPGCache数据更新。解决方法就是在Python 接口中手动创建一个计时器,来监测EPGCache的变化。修改/usr/lib/enigma2/python/Components/Sources/EventInfo.py文件: 
 
from Components.PerServiceDisplay import PerServiceBase 
from Components.Element import cached 
from enigma import iPlayableService, iServiceInformation, eServiceReference, eEPGCache, eTimer 
from Source import Source 
from time import time 
 
class EventInfo(PerServiceBase, Source, object): 
    NOW = 0 
    NEXT = 1 
     
    def __init__(self, navcore, now_or_next): 
        Source.__init__(self) 
        self.epgTimer = eTimer() 
        self.epgTimer.callback.append(self.epgTimerCheck)
 
        PerServiceBase.__init__(self, navcore,  
            {  
                iPlayableService.evStart: self.gotEvent, 
                iPlayableService.evUpdatedEventInfo: self.gotEvent, 
                iPlayableService.evEnd: self.gotEvent 
            }, with_event=True) 
        self.now_or_next = now_or_next 
        self.epgQuery = eEPGCache.getInstance().lookupEventTime 
        self.NextStartTime = 0  
    @cached 
    def getEvent(self): 
        service = self.navcore.getCurrentService() 
        info = service and service.info() 
        ret = None 
        if info: 
                refstr = info.getInfoString(iServiceInformation.sServiceref) 
                ret = self.epgQuery(eServiceReference(refstr), -1, self.now_or_next and 1 or 0) 
        if not ret or ret.getEventName() == "": 
                ret = info and info.getEvent(self.now_or_next) 
        now = int(time()) 
        if ret : 
            start_time = ret.getBeginTime() 
            duration = ret.getDuration() 
            if self.now_or_next == 0: 
                self.NextStartTime = start_time + duration 
            elif self.now_or_next == 1: 
                self.NextStartTime = start_time 
            if self.NextStartTime > now : 
                self.epgTimer.startLongTimer(self.NextStartTime - now + 8)
 
        return ret 
 
    event = property(getEvent) 
   
    def epgTimerCheck(self): 
        now = int(time()) 
        if now > self.NextStartTime + 1: 
            self.epgTimer.stop() 
            self.changed((self.CHANGED_ALL,))     
 
    def gotEvent(self, what): 
        self.epgTimer.stop() 
        if what == iPlayableService.evEnd: 
            self.changed((self.CHANGED_CLEAR,)) 
        else: 
            self.changed((self.CHANGED_ALL,)) 
 
    def destroy(self): 
        PerServiceBase.destroy(self) 
        Source.destroy(self) 
 
 
红色部分是修改或增加的部分。修改后的文件在此下载:(适用于G50/G51/PLi) 
 
EventInfo.tar.gz (1 K) 下载次数:123    
 
更新说明: 
    20101108   本地EPG数据优先于星上数据,修复昨日版本没有完全更新的bug。 
    20101107   解决切换到视频播放时enigma无法控制的问题。 

扫码下方或搜索关注公众号“卫星参数网”,独家内幕新闻!

卫星参数网公众号