def handleMaxImages(self): try: posterDir = os.path.join(self.imagePosterDir) if not os.path.isdir(posterDir): return dirContent = os.listdir(posterDir) if len(dirContent) - 1 >= self.maxSavedImages: # 20% or 30% remove removeCnt = int(self.maxSavedImages * 0.3) if self.maxSavedImages <= 40: removeCnt = int(self.maxSavedImages * 0.2) if self.maxSavedImages == 0: removeCnt = len(dirContent) - 1 cnt = 0 for x in sorted( [(fn, os.stat(os.path.join(self.imagePosterDir, fn))) for fn in dirContent], key=lambda x: x[1].st_mtime): if cnt >= removeCnt: break pth = os.path.join(self.imagePosterDir, x[0]) if x[0] != 'poster.dat' and os.path.isfile(pth): log.logDebug("Deleting poster image... %s" % pth) os.remove(pth) cnt = cnt + 1 if cnt > 0: log.logDebug("%s poster images deleted" % cnt) except: log.logError("Handle max poster images failed.\n%s" % traceback.format_exc()) pass
def end_play(): # @TODO toto sa tak ci tak zjebe ked sa posiela trakt a stlaca sa exit tak to znova zavola dalsie vlakno a potom je crash try: self.cmdTimer.stop() del self.cmdTimer del self.cmdTimer_conn except: log.logDebug("Release cmd timer failed.\n%s" % traceback.format_exc()) sendTrakt = False try: if 'trakt' in self.content_provider.capabilities and self.isValidForTrakt(item): totalSec = (datetime.datetime.now()-playStartAt).total_seconds() durSec = float(item.dataItem['duration']) # movie time from start play after 80% then mark as watched if totalSec >= durSec*0.80: sendTrakt = True else: log.logDebug('Movie not mark as watched ( <80% watch time).') except: log.logError("Trakt AUTO mark as watched failed.\n%s"%traceback.format_exc()) # na DEBUG #sendTrakt = True self.cmdStats(item, 'end', finishCB=endPlayFinish, sendTraktWatchedCmd=sendTrakt)
def load_skin(): try: from enigma import getDesktop desktop_width = getDesktop(0).size().width() log.logDebug("Screen width %s px"%desktop_width) if desktop_width >= 1280: if DMM_IMAGE: if desktop_width == 1920: skin_default_path = os.path.join(settings.SKIN_PATH, "default_dmm_fhd.xml") elif desktop_width == 3840: skin_default_path = os.path.join(settings.SKIN_PATH, "default_dmm_uhd.xml") else: skin_default_path = os.path.join(settings.SKIN_PATH, "default_dmm_hd.xml") else: if desktop_width == 1920: skin_default_path = os.path.join(settings.SKIN_PATH, "default_fhd.xml") elif desktop_width == 3840: skin_default_path = os.path.join(settings.SKIN_PATH, "default_uhd.xml") else: skin_default_path = os.path.join(settings.SKIN_PATH, "default_hd.xml") else: skin_default_path = os.path.join(settings.SKIN_PATH, "default_sd.xml") skin_name = config.plugins.archivCZSK.skin.value skin_path = os.path.join(settings.SKIN_PATH, skin_name + ".xml") if skin_name == 'auto' or not os.path.isfile(skin_path): skin_path = skin_default_path log.info("loading skin %s" % skin_path) loadSkin(skin_path) except: log.logError("Load plugin skin failed.\n%s"%traceback.format_exc())
def create_xml_item(self, item): log.logDebug("%s create xml item - %s"%(self,item)) log.debug("{0} create xml item - {1}".format(self, toString(item))) import time from datetime import datetime t = datetime.now() t1 = t.timetuple() uid = int(time.mktime(t1)) if item.id: item.id = uid #log.logDebug("%s create xml item - %s already exists, skipping"%(self,item)) #log.debug('{0} create xml item - {1} already exists, skipping'.format(self, toString(item))) #return item_id = item.get_id() if self.find_item_by_id(item_id): item_id = uid item.id = uid #log.logDebug("%s create xml item - %s already exists (2), skipping"%(self,item)) #log.debug('{0} create xml item - {1} already exists, skipping'.format(self, toString(item))) #return addon_id = item.addon_id xml_item = SubElement(self.xml_root_element.find('items'), 'item') xml_item.set('id', toUnicode(item_id)) xml_item.set('ctime', str(datetime.now())) if addon_id: xml_item.set('addon_id', toUnicode(addon_id)) name = SubElement(xml_item, 'name') name.text = toUnicode(item.name) params = SubElement(xml_item, 'params') for key, value in item.params.iteritems(): params.set(toUnicode(key), toUnicode(value)) item.id = item_id return xml_item
def check_addon(self, addon, update_xml=True): """ check if addon needs update and if its broken """ try: log.debug("checking updates for %s", addon.name) self._get_server_addon(addon, update_xml) broken = self.remote_addons_dict[addon.id]['broken'] remote_version = self.remote_addons_dict[addon.id]['version'] local_version = addon.version if util.check_version(local_version, remote_version): log.logDebug("Addon '%s' need update (local %s < remote %s)." % (addon.name, local_version, remote_version)) log.debug("%s local version %s < remote version %s", addon.name, local_version, remote_version) log.debug("%s is not up to date", addon.name) return True, broken else: log.logDebug("Addon '%s' (%s) is up to date." % (addon.name, local_version)) log.debug("%s local version %s >= remote version %s", addon.name, local_version, remote_version) log.debug("%s is up to date", addon.name) return False, broken except: log.logError("Check addon '%s' update failed.\n%s" % (addon.name, traceback.format_exc())) raise
def create_xml_item(self, item): log.logDebug("%s create xml item - %s" % (self, item)) log.debug("{0} create xml item - {1}".format(self, toString(item))) import time from datetime import datetime t = datetime.now() t1 = t.timetuple() uid = int(time.mktime(t1)) if item.id: item.id = uid #log.logDebug("%s create xml item - %s already exists, skipping"%(self,item)) #log.debug('{0} create xml item - {1} already exists, skipping'.format(self, toString(item))) #return item_id = item.get_id() if self.find_item_by_id(item_id): item_id = uid item.id = uid #log.logDebug("%s create xml item - %s already exists (2), skipping"%(self,item)) #log.debug('{0} create xml item - {1} already exists, skipping'.format(self, toString(item))) #return addon_id = item.addon_id xml_item = SubElement(self.xml_root_element.find('items'), 'item') xml_item.set('id', toUnicode(item_id)) xml_item.set('ctime', str(datetime.now())) if addon_id: xml_item.set('addon_id', toUnicode(addon_id)) name = SubElement(xml_item, 'name') name.text = toUnicode(item.name) params = SubElement(xml_item, 'params') for key, value in item.params.iteritems(): params.set(toUnicode(key), toUnicode(value)) item.id = item_id return xml_item
def backupOrRevertUpdate(self, backup): try: # symlinks not working archivDir = settings.PLUGIN_PATH if backup: log.logDebug("ArchivUpdater creating backup before update...") #backup archiv if os.path.isdir(self.backupDir): os.rmdir(self.backupDir) shutil.copytree(archivDir, self.backupDir) else: log.logDebug( "ArchivUpdater rverting changes after unsuccessfull update..." ) #revert archiv from backup shutil.rmtree(archivDir) shutil.copytree(self.backupDir, archivDir) except: if backup: log.logError("ArchivUpdater backup before unzip failed.\n%s" % traceback.format_exc()) else: log.logError( "ArchivUpdater revert after unsuccessfull unzip failed.\n%s" % traceback.format_exc()) raise Exception("Bacup/Revert archivCZSK failed.")
def check_addon(self, addon, update_xml=True): """ check if addon needs update and if its broken """ try: log.debug("checking updates for %s", addon.name) self._get_server_addon(addon, update_xml) broken = self.remote_addons_dict[addon.id]['broken'] remote_version = self.remote_addons_dict[addon.id]['version'] local_version = addon.version if util.check_version(local_version, remote_version): log.logDebug("Addon '%s' need update (local %s < remote %s)." % (addon.name, local_version, remote_version)) log.debug("%s local version %s < remote version %s", addon.name, local_version, remote_version) log.debug("%s is not up to date", addon.name) return True, broken else: log.logDebug("Addon '%s' (%s) is up to date." % (addon.name, local_version)) log.debug("%s local version %s >= remote version %s", addon.name, local_version, remote_version) log.debug("%s is up to date", addon.name) return False, broken except: log.logError("Check addon '%s' update failed.\n%s" % (addon.name, traceback.format_exc())) raise
def check_addons(self, new=True): """checks every addon in repository, and update its state accordingly""" log.debug('checking addons') update_needed = [] self._get_server_addons() for addon_id in self.remote_addons_dict.keys(): remote_addon = self.remote_addons_dict[addon_id] if remote_addon['id'] in self.repository._addons: local_addon = self.repository.get_addon(addon_id) if local_addon.check_update(False): update_needed.append(local_addon) elif new: log.debug( "%s not in local repository, adding dummy Addon to update", remote_addon['name']) log.logDebug( "'%s' not in local repository, adding Addon to update" % remote_addon['name']) new_addon = DummyAddon(self.repository, remote_addon['id'], remote_addon['name'], remote_addon['version']) update_needed.append(new_addon) else: log.debug("dont want new addons skipping %s", remote_addon['id']) return update_needed
def load_skin(): try: from enigma import getDesktop desktop_width = getDesktop(0).size().width() log.logDebug("Screen width %s px"%desktop_width) if desktop_width >= 1280: if DMM_IMAGE: if desktop_width == 1920: skin_default_path = os.path.join(settings.SKIN_PATH, "default_dmm_fhd.xml") elif desktop_width == 3840: skin_default_path = os.path.join(settings.SKIN_PATH, "default_dmm_uhd.xml") else: skin_default_path = os.path.join(settings.SKIN_PATH, "default_dmm_hd.xml") else: if desktop_width == 1920: skin_default_path = os.path.join(settings.SKIN_PATH, "default_fhd.xml") elif desktop_width == 3840: skin_default_path = os.path.join(settings.SKIN_PATH, "default_uhd.xml") else: skin_default_path = os.path.join(settings.SKIN_PATH, "default_hd.xml") else: skin_default_path = os.path.join(settings.SKIN_PATH, "default_sd.xml") skin_name = config.plugins.archivCZSK.skin.value skin_path = os.path.join(settings.SKIN_PATH, skin_name + ".xml") if skin_name == 'auto' or not os.path.isfile(skin_path): skin_path = skin_default_path log.info("loading skin %s" % skin_path) log.logDebug("loading skin %s" % skin_path) loadSkin(skin_path) except: log.logError("Load plugin skin failed.\n%s"%traceback.format_exc()) pass
def find_module(self, fullname, path): self.log("%s import '%s'" , self, fullname) if fullname in sys.modules: self.log("%s found '%s' in sys.modules\nUsing python standard importer" , self, fullname) return None if fullname in self.__modules: self.log("%s found '%s' in modules" , self, fullname) return self try: path = self.__path self.log("%s finding modul '%s' in %s" , self, fullname, path) self.__filehandle, self.filename, self.description = imp.find_module(fullname, path) self.log("%s found modul '%s' <filename:%s description:%s>" , self, fullname, self.filename, self.description) except ImportError: self.log("%s cannot found modul %s" , self, fullname) log.logDebug("%s cannot found modul %s" % (self, fullname)) if self.__filehandle: self.__filehandle.close() self.__filehandle = None return None if self.__filehandle is None: self.log("%s cannot import package '%s', try to append it to sys.path" , self, fullname) log.logError("%s cannot import package '%s', try to append it to sys.path" % (self, fullname)) raise ImportError self.log("%s trying to load module '%s'" , self, fullname) return self
def check_download(self, data, retval, extra_args): self.__console = None log.logDebug( "Handle subs check download finish... retval=%s, fname=%s" % (retval, fname)) if retval == 0 and os.path.exists(fname): item.subs = fname self.player.play_item(item)
def _get_server_addons(self): """loads info about addons from remote repository to remote_addons_dict""" log.logDebug("pre update xml") self._download_update_xml() log.logDebug("post update xml") pars = parser.XBMCMultiAddonXMLParser(self.update_xml_file) self.remote_addons_dict = pars.parse_addons()
def open_item_success_cb(result): log.logDebug("Trakt (%s) call success. %s"%(action, result)) #OK, ERROR list_items, command, args = result if args['isError']: return showErrorMessage(self.session, args['msg'], 10, finishCb) else: return showInfoMessage(self.session, args['msg'], 10, finishCb)
def open_item_finish(result): log.logDebug("Stats (%s) call finished.\n%s"%(action,result)) if paused and not sendTraktWatchedCmd: self.content_provider.pause() if sendTraktWatchedCmd: return self.cmdTrakt(item, 'watched', finishCB) elif finishCB is not None: finishCB()
def search(self, addon, mode): self.removeDiacritics() log.logDebug("Seeker start exp='%s', addon='%s', mode='%s'" % (self.searchExp, addon, mode)) seeker.search(self.session, self.searchExp, addon, mode, cb=self.searchCB)
def downloadZip(self): try: self.updateZip = self.updateZip.replace('{commit}', self.commitValue) self.updateZip = self.updateZip.replace('{version}', self.remote_version) self.updateZipFilePath = os.path.join(os.path.dirname(self.tmpPath), 'archivczskupdate.zip') log.logDebug("ArchivUpdater downloading zip %s"%self.updateZip) util.download_to_file(self.updateZip, self.updateZipFilePath) except Exception: log.logError("ArchivUpdater download update zip failed.\n%s"%traceback.format_exc()) raise
def ok(self): if not self.working and len(self.lst_items) > 0: itm = self.getSelectedItem() try: log.logDebug("Opening item '%s'..." % itm) except: log.logError("Something failed.\n%s" % traceback.format_exc()) pass self.contentHandler.open_item(itm)
def pairTrakt_cb(res): import json import urllib2 from Plugins.Extensions.archivCZSK.settings import USER_AGENT def post_json(url, data, headers={}): postdata = json.dumps(data) headers['Content-Type'] = 'application/json' req = urllib2.Request(url, postdata, headers) req.add_header('User-Agent', USER_AGENT) response = urllib2.urlopen(req) data = response.read() response.close() return data try: data = json.loads( post_json(params['trakt']['url'], data={ 'code': params['trakt']['code'], 'client_id': params['trakt']['client_id'], 'client_secret': params['trakt']['client_secret'] }, headers={'Content-Type': 'application/json'})) TOKEN = data['access_token'] REFRESH_TOKEN = data['refresh_token'] expire = data['expires_in'] #seconds created = data['created_at'] EXPIRE = expire + created log.logDebug( "Get token return token=%s, rtoken=%s, exp=%s" % (TOKEN, REFRESH_TOKEN, EXPIRE)) #update settings self.content_provider.video_addon.set_setting( params['settings']['token'], '%s' % TOKEN) self.content_provider.video_addon.set_setting( params['settings']['refreshToken'], '%s' % REFRESH_TOKEN) self.content_provider.video_addon.set_setting( params['settings']['expire'], '%s' % EXPIRE) return showInfoMessage(self.session, params['msg']['success'], 20, continue_cb) except: log.logDebug("Pair trakt failed.\n%s" % traceback.format_exc()) return showErrorMessage(self.session, params['msg']['fail'], 20, continue_cb)
def stop(self): log.logDebug("ContentProvider stop") if not self.__started: log.logDebug("[%s] cannot stop, provider is already stopped"%self) log.debug("[%s] cannot stop, provider is already stopped",self) return self.__started = False self.__paused = False for f in self.on_stop: f() log.debug("[%s] stopped", self)
def start(self): log.logDebug("ContentProvider start") if self.__started: log.logDebug("[%s] cannot start, provider is already started"%self) log.debug("[%s] cannot start, provider is already started",self) return self.__started = True self.__paused = False for f in self.on_start: f() log.debug("[%s] started", self)
def play_stream(self, play_url, play_settings=None, subtitles_url=None, title=None, wholeItem=None): log.info("play_stream(%s, %s, %s, %s)" % (play_url, play_settings, subtitles_url, title)) log.logDebug("play_stream(%s, %s, %s, %s)" % (play_url, play_settings, subtitles_url, title)) if play_url.startswith("rtmp"): rtmp_timeout = int(self.settings.rtmpTimeout.value) rtmp_buffer = int(self.settings.rtmpBuffer.value) if ' timeout=' not in play_url: play_url = "%s timeout=%d" % (play_url, rtmp_timeout) if ' buffer=' not in play_url: play_url = "%s buffer=%d" % (play_url, rtmp_buffer) headers = {} if play_settings.get("user-agent"): headers["User-Agent"] = play_settings["user-agent"] if play_settings.get("extra-headers"): headers.update(play_settings["extra-headers"]) if headers: play_url += "#" + "&".join("%s=%s" % (k, v) for k, v in headers.iteritems()) service_ref = eServiceReference(play_settings.get("stype", 4097), 0, toString(play_url)) if self.video_player is None: self.video_player = self.session.openWithCallback( self.player_exit_callback, ArchivCZSKMoviePlayer, self.player_callback) # set infobar text titleSet = False if wholeItem is not None: try: if 'title' in wholeItem.info: service_ref.setName(toString(wholeItem.info["title"])) self.video_player.setInfoBarText( toString(wholeItem.info["title"])) titleSet = True except: log.logError("Set title from item failed (set default).\n%s" % traceback.format_exc()) if not titleSet: service_ref.setName(toString(title)) self.video_player.setInfoBarText(toString(title)) self.video_player.play_service_ref( service_ref, self._play_item.subs, play_settings.get("resume_time_sec"))
def open_item_success_cb(result): log.logDebug("Trakt (%s) call success. %s" % (action, result)) list_items, command, args = result if command is not None and command.lower() == 'result_msg': #{'msg':msg, 'isError':isError} if args['isError']: showErrorMessage(self.session, args['msg'], 10, finishCb) else: showInfoMessage(self.session, args['msg'], 10, finishCb) else: finishCb(None)
def is3GPPSupported(self): if self.type == 'gstreamer': return self.isMP4Supported() elif self.type == 'eplayer3': log.logDebug("3GPP may be supported (eplayer3)") return None elif self.type == 'eplayer2': log.logDebug("3GPP may be supported (eplayer2)") return None
def start(self): log.logDebug("ContentProvider start") if self.__started: log.logDebug("[%s] cannot start, provider is already started"%self) log.debug("[%s] cannot start, provider is already started",self) return self.__started = True self.__paused = False for f in self.on_start: f() log.debug("[%s] started", self)
def end_play(): try: self.cmdTimer.stop() del self.cmdTimer del self.cmdTimer_conn except: log.logDebug("Release cmd timer failed.\n%s" % traceback.format_exc()) self.content_screen.workingFinished() self.content_provider.resume() self.cmdStats(item, 'end')
def is3GPPSupported(self): if self.type == 'gstreamer': return self.isMP4Supported() elif self.type == 'eplayer3': log.logDebug("3GPP may be supported (eplayer3)") return None elif self.type == 'eplayer2': log.logDebug("3GPP may be supported (eplayer2)") return None
def stop(self): log.logDebug("ContentProvider stop") if not self.__started: log.logDebug("[%s] cannot stop, provider is already stopped"%self) log.debug("[%s] cannot stop, provider is already stopped",self) return self.__started = False self.__paused = False for f in self.on_stop: f() log.debug("[%s] stopped", self)
def updateArchiv(self, callback=None, verbose=True): try: if not callback: log.logDebug("ArchivUpdater update canceled.") self.continueToArchiv() else: # copy files self.downloadZip() log.logDebug( "ArchivUpdater download zip archivCZSK complete...") # remove tree self.backupOrRevertUpdate(True) self.BackupCreate = True self.removeArchivTree() # maybe zipper replace the file log.logDebug( "ArchivUpdater remove archivCZSK files complete...") # unzip unzipper = unzip.unzip() #.../Plugins/Extensions/ log.logDebug("ArchivUpdater extracting to %s" % settings.ENIGMA_PLUGIN_PATH) unzipper.extract(self.updateZipFilePath, settings.ENIGMA_PLUGIN_PATH) log.logDebug("ArchivUpdater unzip archivCZSK complete...") self.removeTempFiles() # restart enigma strMsg = "%s" % _("Update archivCZSK complete.") self.archiv.session.openWithCallback( self.archiv.ask_restart_e2, MessageBox, strMsg, type=MessageBox.TYPE_INFO) except: strMsg = "%s" % _("Update archivCZSK failed.") try: if self.BackupCreate: self.backupOrRevertUpdate(False) except: strMsg = strMsg + "\n\nFATAL ERROR\n\n" + _( "Please revert archivCZSK manualy from following location before restart!!!" ) + "\n\n" + toString(self.backupDir) pass log.logError( "ArchivUpdater update archivCZSK from zip failed.\n%s" % traceback.format_exc()) self.archiv.session.openWithCallback(self.updateFailed, MessageBox, strMsg, type=MessageBox.TYPE_INFO) pass
def showCSFDInfo(session, item): try: #name = removeDiacriticsCsfd(item.name) name = removeDiac(item.name) name = name.replace('.', ' ').replace('_', ' ').replace('-', ' ') name = name.replace(" CZ ", "").replace(" EN ", "").replace( " SK ", "").replace(" DA ", "").replace(" FI ", "").replace( " CH ", "").replace(" HI ", "").replace(" JP ", "").replace(" KH ", "") name = name.replace(" RU ", "").replace(" KO ", "").replace(" SP ", "") year = 0 yearStr = "" try: mask = re.compile('([0-9]{4})', re.DOTALL) yearStr = mask.findall(name)[0] year = int(yearStr) except: pass if ' (' in name: name = name[0:name.index("(")] name = name.strip() log.logDebug("Csfd search '%s', year=%s." % (name, year)) csfdType = int(config.plugins.archivCZSK.csfdMode.getValue()) if csfdType == 1: from Plugins.Extensions.archivCZSK.gui.archivcsfd import ArchivCSFD session.open(ArchivCSFD, name, year) elif csfdType == 2: from Plugins.Extensions.CSFD.plugin import CSFD session.open(CSFD, name) elif csfdType == 3: from Plugins.Extensions.CSFDLite.plugin import CSFDLite try: session.open(CSFDLite, name, yearStr) except: log.logDebug("Trying CsfdLite older version compatibility...") session.open(CSFDLite, name) else: raise Exception("CsfdMode '%s' not supported." % csfdType) except: log.logError( "Show CSFD info failed (plugin may not be installed).\n%s" % traceback.format_exc()) try: showInfoMessage(session, _("Show CSFD info failed."), timeout=6) except: pass
def get_setting(self, setting_id): try: if self.setting_exist(setting_id): setting = getattr(self.main, '%s' % setting_id) if isinstance(setting, ConfigIP): return setting.getText() return setting.getValue() else: log.logDebug("Cannot retrieve setting '%s' - %s" % (setting_id, self.addon)) except: log.logError("Cannot retrieve setting '%s' - %s\n%s" % (setting_id, self.addon, traceback.format_exc())) return ""
def get_setting(self, setting_id): try: setting = getattr(self.main, '%s' % setting_id) except (ValueError, KeyError): log.error('%s cannot retrieve setting %s, Invalid setting id', self, setting_id) log.logDebug("Cannot retrieve setting '%s' - %s" % (setting_id, self.addon)) return "" else: if isinstance(setting, ConfigIP): return setting.getText() return setting.getValue()
def isHLSSupported(self): """ @return: True if its 100% supported @return: None may be supported @return: False not supported """ if self.type == 'gstreamer': fragmentedlib = os.path.join(GSTREAMER_PATH, 'libgstfragmented.so') fragmentedlib2 = os.path.join(GSTREAMER10_PATH, 'libgstfragmented.so') if os.path.isfile(fragmentedlib) or os.path.isfile(fragmentedlib2): log.logDebug("HLS supported") return True log.logDebug( "HLS not supported, missing file '/usr/lib/gstreamer-*/libgstfragmented.so'" ) return False elif self.type == 'eplayer3': log.logDebug("HLS may be supported (eplayer3)") return None elif self.type == 'eplayer2': log.logDebug("HLS may be supported (eplayer2)") return None
def showUpdatePremium(self): try: if not os.path.isdir(os.path.join(settings.ENIGMA_PLUGIN_PATH,'archivCZSKpremium')): strMsg = _('Do you want to try ArchivCZSK premium?')+'\n\n' strMsg += _('More info: ')+'https://czsk.page.link/inf\n' self.archiv.session.openWithCallback(self.showUpdatePremium2, MessageBox, strMsg, type=MessageBox.TYPE_YESNO) else: self.downloadCommit() except: log.logDebug("checkUpdateRequest failed.\n%s"%traceback.format_exc()) self.downloadCommit()
def isRTMPSupported(self): """ @return: True if its 100% supported @return: None may be supported @return: False not supported """ if self.type == 'gstreamer': rtmplib = os.path.join(GSTREAMER_PATH, 'libgstrtmp.so') rtmplib2 = os.path.join(GSTREAMER10_PATH, 'libgstrtmp.so') librtmp = os.path.join(LIB_PATH, 'librtmp.so.0') librtmp2 = os.path.join(LIB_PATH, 'librtmp.so.1') # flv is file container used in rtmp flvlib = os.path.join(GSTREAMER_PATH, 'libgstflv.so') flvlib2 = os.path.join(GSTREAMER10_PATH, 'libgstflv.so') if (os.path.isfile(rtmplib) or os.path.isfile(rtmplib2)) and ( os.path.isfile(librtmp) or os.path.isfile(librtmp2)) and ( os.path.isfile(flvlib) or os.path.isfile(flvlib2)): log.logDebug("RTMP supported for 100%...") return True msg = "" if not (os.path.isfile(rtmplib) or os.path.isfile(rtmplib2)): msg += "\n'libgstrtmp.so' is missing..." if not (os.path.isfile(librtmp) or os.path.isfile(librtmp2)): msg += "\n'%s' or '%s' is missing..." % (librtmp, librtmp2) if not (os.path.isfile(flvlib) or os.path.isfile(flvlib2)): msg += "\n'libgstflv.so' is missing..." log.logDebug( "RTMP not supported (some file missing '/usr/lib/gstreamer-*')...%s" % msg) return False elif self.type == 'eplayer2': # dont know any eplayer2 which supports rtmp # also not used anymore so setting to false log.logDebug("RTMP may be supported (eplayer2)...") return False elif self.type == 'eplayer3': rtmplib = '/usr/lib/librtmp.so' log.logDebug("RTMP may be supported (eplayer3)...") if os.path.isfile(rtmplib): log.logDebug("RTMP may be supported (eplayer3)...\n%s" % rtmplib) # some older e2 images not support rtmp # even if there is this library(missing support in servicemp3) return None
def showCSFDInfo(self, session, searchExp): try: name = removeDiac(searchExp) name = name.replace('.', ' ').replace('_', ' ').replace('*', '') # remove languages ... "Mother - CZ, EN, KO (2017)" name = re.sub("\s-\s[A-Z]{2}(,\s[A-Z]{2})*\s\(", " (", name) year = 0 yearStr = "" try: mask = re.compile('([0-9]{4})', re.DOTALL) yearStr = mask.findall(name)[0] year = int(yearStr) except: pass # remove year name = re.sub("\([0-9]{4}\)", "", name) name = name.strip() log.logDebug("Csfd search '%s', year=%s." % (name, year)) csfdType = int(config.plugins.archivCZSK.csfdMode.getValue()) if csfdType == 1: from Plugins.Extensions.archivCZSK.gui.archivcsfd import ArchivCSFD session.open(ArchivCSFD, name, year) elif csfdType == 2: from Plugins.Extensions.CSFD.plugin import CSFD session.open(CSFD, name) elif csfdType == 3: from Plugins.Extensions.CSFDLite.plugin import CSFDLite try: session.open(CSFDLite, name, yearStr) except: log.logDebug( "Trying CsfdLite older version compatibility...") session.open(CSFDLite, name) else: raise Exception("CsfdMode '%s' not supported." % csfdType) except: log.logError( "Show CSFD info failed (plugin may not be installed).\n%s" % traceback.format_exc()) try: showInfoMessage(session, _("Show CSFD info failed."), timeout=6) except: pass
def download_to_file_async(url, dest, callback=None, data=None, headers=None, timeout=60): def got_data(data): if data: try: with open(dest, "wb") as f: f.write(data) except Exception as e: log.logError("download_to_file_async: %s"% toString(e)) callback(None, None) else: callback(url, dest) else: callback(None, None) log.logDebug("download_to_file_async: %s -> %s"% (toString(url), toString(dest))) return url_get_data_async(url, got_data, data, headers, timeout)
def isRTMPSupported(self): """ @return: True if its 100% supported @return: None may be supported @return: False not supported """ if self.type == 'gstreamer': rtmplib = os.path.join(GSTREAMER_PATH, 'libgstrtmp.so') rtmplib2 = os.path.join(GSTREAMER10_PATH, 'libgstrtmp.so') librtmp = os.path.join(LIB_PATH, 'librtmp.so.0') librtmp2 = os.path.join(LIB_PATH, 'librtmp.so.1') # flv is file container used in rtmp flvlib = os.path.join(GSTREAMER_PATH, 'libgstflv.so') flvlib2 = os.path.join(GSTREAMER10_PATH, 'libgstflv.so') if (os.path.isfile(rtmplib) or os.path.isfile(rtmplib2)) and (os.path.isfile(librtmp) or os.path.isfile(librtmp2)) and (os.path.isfile(flvlib) or os.path.isfile(flvlib2)): log.logDebug("RTMP supported for 100%...") return True msg = "" if not (os.path.isfile(rtmplib) or os.path.isfile(rtmplib2)): msg+= "\n'libgstrtmp.so' is missing..." if not (os.path.isfile(librtmp) or os.path.isfile(librtmp2)): msg+= "\n'%s' or '%s' is missing..."%(librtmp, librtmp2) if not (os.path.isfile(flvlib) or os.path.isfile(flvlib2)): msg+= "\n'libgstflv.so' is missing..." log.logDebug("RTMP not supported (some file missing '/usr/lib/gstreamer-*')...%s"%msg) return False elif self.type == 'eplayer2': # dont know any eplayer2 which supports rtmp # also not used anymore so setting to false log.logDebug("RTMP may be supported (eplayer2)...") return False elif self.type == 'eplayer3': rtmplib = '/usr/lib/librtmp.so' log.logDebug("RTMP may be supported (eplayer3)...") if os.path.isfile(rtmplib): log.logDebug("RTMP may be supported (eplayer3)...\n%s"%rtmplib) # some older e2 images not support rtmp # even if there is this library(missing support in servicemp3) return None
def showCSFDInfo(session, item): try: #name = removeDiacriticsCsfd(item.name) name = removeDiac(item.name) name = name.replace('.', ' ').replace('_', ' ').replace('*','') # remove languages ... "Mother - CZ, EN, KO (2017)" name = re.sub("\s-\s[A-Z]{2}(,\s[A-Z]{2})*\s\(", " (", name) year = 0 yearStr = "" try: mask = re.compile('([0-9]{4})', re.DOTALL) yearStr = mask.findall(name)[0] year = int(yearStr) except: pass # remove year name = re.sub("\([0-9]{4}\)","", name) name = name.strip() log.logDebug("Csfd search '%s', year=%s."%(name,year)) csfdType = int(config.plugins.archivCZSK.csfdMode.getValue()) if csfdType == 1: from Plugins.Extensions.archivCZSK.gui.archivcsfd import ArchivCSFD session.open(ArchivCSFD, name, year) elif csfdType == 2: from Plugins.Extensions.CSFD.plugin import CSFD session.open(CSFD, name) elif csfdType == 3: from Plugins.Extensions.CSFDLite.plugin import CSFDLite try: session.open(CSFDLite, name, yearStr) except: log.logDebug("Trying CsfdLite older version compatibility...") session.open(CSFDLite, name) else: raise Exception("CsfdMode '%s' not supported." % csfdType) except: log.logError("Show CSFD info failed (plugin may not be installed).\n%s"%traceback.format_exc()) try: showInfoMessage(session, _("Show CSFD info failed."), timeout=6) except: pass
def check_archiv(): try: if self.downloadUpdateXml(): from Plugins.Extensions.archivCZSK.version import version local_version = version xmlroot = util.load_xml(self.updateXmlFilePath).getroot() self.remote_version = xmlroot.attrib.get('version') log.logDebug("ArchivUpdater version local/remote: %s/%s" % (local_version, self.remote_version)) if util.check_version(local_version, self.remote_version): self.needUpdate = True else: self.needUpdate = False else: self.needUpdate = False except: log.logError("ArchivUpdater compare versions failed.\n%s"%traceback.format_exc())
def setAspect(self, aspect, policy, policy2): log.info('aspect: %s policy: %s policy2: %s' % (str(aspect), str(policy), str(policy2))) log.logDebug('aspect: %s policy: %s policy2: %s' % (str(aspect), str(policy), str(policy2))) if aspect: try: open("/proc/stb/video/aspect", "w").write(aspect) except IOError as e: print e if policy: try: open("/proc/stb/video/policy", "w").write(policy) except IOError as e: print e if policy2: try: open("/proc/stb/video/policy2", "w").write(policy2) except IOError as e: print e
def updateArchiv(self, callback=None, verbose=True): try: if not callback: log.logDebug("ArchivUpdater update canceled.") self.continueToArchiv() else: # copy files self.downloadZip() log.logDebug("ArchivUpdater download zip archivCZSK complete...") # remove tree self.backupOrRevertUpdate(True) self.BackupCreate = True self.removeArchivTree() # maybe zipper replace the file log.logDebug("ArchivUpdater remove archivCZSK files complete...") # unzip unzipper = unzip.unzip() #.../Plugins/Extensions/ log.logDebug("ArchivUpdater extracting to %s" % settings.ENIGMA_PLUGIN_PATH) unzipper.extract(self.updateZipFilePath, settings.ENIGMA_PLUGIN_PATH) log.logDebug("ArchivUpdater unzip archivCZSK complete...") self.removeTempFiles() # restart enigma strMsg = "%s" % _("Update archivCZSK complete.") self.archiv.session.openWithCallback(self.archiv.ask_restart_e2, MessageBox, strMsg, type=MessageBox.TYPE_INFO) except: strMsg = "%s" % _("Update archivCZSK failed.") try: if self.BackupCreate: self.backupOrRevertUpdate(False) except: strMsg = strMsg + "\n\nFATAL ERROR\n\n"+_("Please revert archivCZSK manualy from following location before restart!!!")+"\n\n"+toString(self.backupDir) pass log.logError("ArchivUpdater update archivCZSK from zip failed.\n%s"%traceback.format_exc()) self.archiv.session.openWithCallback(self.updateFailed, MessageBox, strMsg, type=MessageBox.TYPE_INFO) pass
def check_addons(self, new=True): """checks every addon in repository, and update its state accordingly""" log.debug('checking addons') update_needed = [] self._get_server_addons() for addon_id in self.remote_addons_dict.keys(): remote_addon = self.remote_addons_dict[addon_id] if remote_addon['id'] in self.repository._addons: local_addon = self.repository.get_addon(addon_id) if local_addon.check_update(False): update_needed.append(local_addon) elif new: log.debug("%s not in local repository, adding dummy Addon to update", remote_addon['name']) log.logDebug("'%s' not in local repository, adding Addon to update"%remote_addon['name']) new_addon = DummyAddon(self.repository, remote_addon['id'], remote_addon['name'], remote_addon['version']) update_needed.append(new_addon) else: log.debug("dont want new addons skipping %s", remote_addon['id']) return update_needed
def play_stream(self, play_url, play_settings=None, subtitles_url=None, title=None, wholeItem=None): log.info("play_stream(%s, %s, %s, %s)"%(play_url, play_settings, subtitles_url, title)) log.logDebug("play_stream(%s, %s, %s, %s)"%(play_url, play_settings, subtitles_url, title)) if play_url.startswith("rtmp"): rtmp_timeout = int(self.settings.rtmpTimeout.value) rtmp_buffer = int(self.settings.rtmpBuffer.value) if ' timeout=' not in play_url: play_url = "%s timeout=%d" % (play_url, rtmp_timeout) if ' buffer=' not in play_url: play_url = "%s buffer=%d" % (play_url, rtmp_buffer) headers = {} if play_settings.get("user-agent"): headers["User-Agent"] = play_settings["user-agent"] if play_settings.get("extra-headers"): headers.update(play_settings["extra-headers"]) if headers: play_url += "#" + "&".join("%s=%s"%(k,v) for k,v in headers.iteritems()) service_ref = eServiceReference(play_settings.get("stype", 4097), 0, toString(play_url)) if self.video_player is None: self.video_player = self.session.openWithCallback(self.player_exit_callback, ArchivCZSKMoviePlayer, self.player_callback) # set infobar text titleSet = False if wholeItem is not None: try: if 'title' in wholeItem.info: service_ref.setName(toString(wholeItem.info["title"])) self.video_player.setInfoBarText(toString(wholeItem.info["title"])) titleSet = True except: log.logError("Set title from item failed (set default).\n%s"%traceback.format_exc()) if not titleSet: service_ref.setName(toString(title)) self.video_player.setInfoBarText(toString(title)) self.video_player.play_service_ref(service_ref, self._play_item.subs, play_settings.get("resume_time_sec"))
def backupOrRevertUpdate(self, backup): try: # symlinks not working archivDir = settings.PLUGIN_PATH if backup: log.logDebug("ArchivUpdater creating backup before update...") #backup archiv if os.path.isdir(self.backupDir): os.rmdir(self.backupDir) shutil.copytree(archivDir, self.backupDir) else: log.logDebug("ArchivUpdater rverting changes after unsuccessfull update...") #revert archiv from backup shutil.rmtree(archivDir) shutil.copytree(self.backupDir, archivDir) except: if backup: log.logError("ArchivUpdater backup before unzip failed.\n%s"%traceback.format_exc()) else: log.logError("ArchivUpdater revert after unsuccessfull unzip failed.\n%s"%traceback.format_exc()) raise Exception("Bacup/Revert archivCZSK failed.")
def handle_substitles_and_play(self, item): def check_download(self, data, retval, extra_args): self.__console = None log.logDebug("Handle subs check download finish... retval=%s, fname=%s"%(retval, fname)) if retval == 0 and os.path.exists(fname): item.subs = fname self.player.play_item(item) try: subs = '' if not isinstance(item, PPlaylist) and hasattr(item, 'subs'): subs = "%s"%item.subs if subs.startswith('http'): spl = subs.split('/') fname = os.path.join(config.plugins.archivCZSK.tmpPath.getValue(), spl[len(spl)-1]) try: download_web_file(subs, fname) item.subs = fname self.player.play_item(item) except urllib2.URLError: #SSL cert problem if subs.startswith('https:\\'): # only for https log.logDebug("Handle substitle file failed (try download by CURL).\n%s"%traceback.format_exc()) # download file by CURL self.__console = Console() self.__console.ePopen('curl -kfo %s %s' % (fname, subs), check_download) else: log.logError("Handle substitle file failed.\n%s"%traceback.format_exc()) self.player.play_item(item) except: log.logError("Handle substitle file failed.\n%s"%traceback.format_exc()) self.player.play_item(item) else: self.player.play_item(item) except: log.logError("Handle substitle file failed.\n%s"%traceback.format_exc()) self.player.play_item(item)
def __init__(self): self.type = 'gstreamer' self.version = 0 if os.path.isdir(GSTREAMER10_PATH): print 'found gstreamer' log.logDebug('Found gstreamer 1.0') self.type = 'gstreamer' self.version = '1.0' elif os.path.isdir(GSTREAMER_PATH): print 'found gstreamer' log.logDebug('Found gstreamer 0.10') self.type = 'gstreamer' self.version = '0.10' elif os.path.isfile(EPLAYER3_PATH): log.logDebug('Found eplayer3') print 'found eplayer3' self.type = 'eplayer3' elif os.path.isfile(EPLAYER2_PATH): log.logDebug('Found eplayer2') print 'found eplayer2' self.type = 'eplayer2'
def pause(self): log.logDebug("ContentProvider pause") if not self.__started: log.logDebug("[%s] cannot pause, provider not started yet"%self) log.debug("[%s] cannot pause, provider not started yet",self) return if self.__paused: log.logDebug("[%s] cannot pause, provider is already paused"%self) log.debug("[%s] cannot pause, provider is already paused",self) return self.__paused = True for f in self.on_pause: f() log.debug("[%s] paused", self)
def resume(self): log.logDebug("ContentProvider resume") if not self.__started: log.logDebug("[%s] cannot resume, provider not started yet"%self) log.debug("[%s] cannot resume, provider not started yet",self) return if not self.__paused: log.logDebug("[%s] cannot resume, provider is already running"%self) log.debug("[%s] cannot resume, provider is already running",self) return self.__paused = False for f in self.on_resume: f() log.debug("[%s] resumed", self)
def isMMSSupported(self): """ @return: True if its 100% supported @return: None may be supported @return: False not supported """ if self.type == 'gstreamer': mmslib = os.path.join(GSTREAMER_PATH, 'libgstmms.so') mmslib2 = os.path.join(GSTREAMER10_PATH, 'libgstmms.so') if os.path.isfile(mmslib) or os.path.isfile(mmslib2): log.logDebug("MMS supported") return True log.logDebug("MMS not supported, missing file '/usr/lib/gstreamer-*/libgstmms.so'") return False elif self.type == 'eplayer3': log.logDebug("MMS may be supported (eplayer3)") return None elif self.type == 'eplayer2': log.logDebug("MMS may be supported (eplayer2)") return None
def isHTTPSupported(self): """ @return: True if its 100% supported @return: None may be supported @return: False not supported """ if self.type == 'gstreamer': httplib = os.path.join(GSTREAMER_PATH, 'libgstsouphttpsrc.so') httplib2 = os.path.join(GSTREAMER10_PATH, 'libgstsouphttpsrc.so') if os.path.isfile(httplib) or os.path.isfile(httplib2): log.logDebug("HTTP supported") return True log.logDebug("HTTP not supported, missing file '/usr/lib/gstreamer-*/libgstsouphttpsrc.so'") return False elif self.type == 'eplayer3': log.logDebug("HTTP may be supported (eplayer3)") return True elif self.type == 'eplayer2': log.logDebug("HTTP may be supported (eplayer2)") return True
def isRTSPSupported(self): """ @return: True if its 100% supported @return: None may be supported @return: False not supported """ if self.type == 'gstreamer': rtsplib = os.path.join(GSTREAMER_PATH, 'libgstrtsp.so') rtplib = os.path.join(GSTREAMER_PATH, 'libgstrtp.so') rtpmanager = os.path.join(GSTREAMER_PATH, 'libgstrtpmanager.so') rtsplib2 = os.path.join(GSTREAMER10_PATH, 'libgstrtsp.so') rtplib2 = os.path.join(GSTREAMER10_PATH, 'libgstrtp.so') rtpmanager2 = os.path.join(GSTREAMER10_PATH, 'libgstrtpmanager.so') if ((os.path.isfile(rtsplib) and os.path.isfile(rtplib) and os.path.isfile(rtpmanager)) or (os.path.isfile(rtsplib2) and os.path.isfile(rtplib2) and os.path.isfile(rtpmanager2))): log.logDebug("RTSP supported for 100%...") return True msg = "" if not (os.path.isfile(rtsplib) or os.path.isfile(rtsplib2)): msg+= "\n'libgstrtsp.so' is missing..." if not (os.path.isfile(rtplib) or os.path.isfile(rtplib2)): msg+= "\n'libgstrtp.so' is missing..." if not (os.path.isfile(rtpmanager2) or os.path.isfile(rtpmanager)): msg+= "\n'libgstrtpmanager.so' is missing..." log.logDebug("RTSP may be supported (some file missing '/usr/lib/gstreamer-*')...%s"%msg) return False elif self.type == 'eplayer3': log.logDebug("RTSP may be supported (eplayer3)") return None elif self.type == 'eplayer2': log.logDebug("RTSP may be supported (eplayer2)") return None
def open_item_error_cb(failure): log.logDebug("Trakt (%s) call failed. %s"%(action,failure)) return showErrorMessage(self.session, "Operation failed.", 10, finishCb)
def check_download(self, data, retval, extra_args): self.__console = None log.logDebug("Handle subs check download finish... retval=%s, fname=%s"%(retval, fname)) if retval == 0 and os.path.exists(fname): item.subs = fname self.player.play_item(item)