解决部分频道的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无法控制的问题。
扫码下方或搜索关注公众号“卫星参数网”,独家内幕新闻!