def __init__(self): CBaseHostClass.__init__(self, { 'history': 'videa', 'cookie': 'videa.cookie' }) self.USER_AGENT = 'User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0' self.HEADER = self.cm.getDefaultHeader() self.DEFAULT_ICON_URL = zlib.decompress( base64.b64decode( 'eJzLKCkpsNLXLy8v10vLTK9MzclNrSpJLUkt1sso1S/LTElNjM/JT8/XyypIBwBrnxCf' )) self.MAIN_URL = zlib.decompress( base64.b64decode('eJzLKCkpKLbS1y/LTElN1MsoBQAy9gXg')) self.vmk = self.MAIN_URL + zlib.decompress( base64.b64decode('eJzTz04sSU3PL8pMzAYAGM8EUg==')) self.vmcs = self.MAIN_URL + zlib.decompress( base64.b64decode('eJzTTy5OLMkvykvMBgAUvAP2')) self.vmkrs = self.MAIN_URL + zlib.decompress( base64.b64decode('eJzTL8tMSc2Pz04tSi1OLQYAKFYFmA==')) self.vivn = GetIPTVPlayerVerstion() self.porv = self.gits() self.pbtp = '-' self.btps = config.plugins.iptvplayer.boxtipus.value self.brdr = config.plugins.iptvplayer.boxrendszer.value self.aid = config.plugins.iptvplayer.videa_id.value self.aid_ki = '' self.vszkzrs = [] self.defaultParams = { 'header': self.HEADER, 'use_cookie': False, 'load_cookie': False, 'save_cookie': False, 'cookiefile': self.COOKIE_FILE }
def __init__(self): CBaseHostClass.__init__(self, { 'history': 'nonstopmozi', 'cookie': 'nonstopmozi.cookie' }) self.DEFAULT_ICON_URL = zlib.decompress( base64.b64decode( 'eJzLKCkpsNLXLy8v10vLTK9MzclNrSpJLUkt1sso1c/LzysuyS/Iza/KjM/JT8/XK8hLBwDdxxNq' )) self.USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0' self.HEADER = self.cm.getDefaultHeader() self.AJAX_HEADER = dict(self.HEADER) self.AJAX_HEADER.update({'X-Requested-With': 'XMLHttpRequest'}) self.MAIN_URL = 'https://nonstopmozi.com' self.vivn = GetIPTVPlayerVerstion() self.porv = self.gits() self.pbtp = '-' self.btps = config.plugins.iptvplayer.boxtipus.value self.brdr = config.plugins.iptvplayer.boxrendszer.value self.aid = config.plugins.iptvplayer.nonstopmozi_id.value self.aid_ki = '' self.ilk = False self.defaultParams = { 'header': self.HEADER, 'use_cookie': True, 'load_cookie': True, 'save_cookie': True, 'cookiefile': self.COOKIE_FILE }
def __init__(self): CBaseHostClass.__init__(self, { 'history': 'm4sport.hu', 'cookie': 'm4sport.cookie' }) self.USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0' self.HEADER = { 'User-Agent': self.USER_AGENT, 'DNT': '1', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br' } self.AJAX_HEADER = dict(self.HEADER) self.AJAX_HEADER.update({'X-Requested-With': 'XMLHttpRequest'}) self.MAIN_URL = zlib.decompress( base64.b64decode( 'eJzLKCkpKLbS1y8vL9fLNSkuyC8q0cso1S/LTEnNz9YHAK3xCyM=')) self.DEFAULT_ICON_URL = zlib.decompress( base64.b64decode( 'eJzLKCkpsNLXLy8v10vLTK9MzclNrSpJLUkt1sso1c81KS7ILyqJz8lPz9cryEsHAI25EXM=' )) self.ICON_URL_ELO = zlib.decompress( base64.b64decode( 'eJzLKCkpsNLXLy8v10vLTK9MzclNrSpJLUkt1sso1c81KS7ILyqJz8lPz49PzcnXK8hLBwDYJxMS' )) self.ICON_URL_FOCI = zlib.decompress( base64.b64decode( 'eJzLKCkpsNLXLy8v10vLTK9MzclNrSpJLUkt1sso1c81KS7ILyqJz8lPz49Py0/O1CvISwcA66gTcw==' )) self.vivn = GetIPTVPlayerVerstion() self.porv = self.gits() self.pbtp = '-' self.btps = config.plugins.iptvplayer.boxtipus.value self.brdr = config.plugins.iptvplayer.boxrendszer.value self.aid = config.plugins.iptvplayer.m4sport_id.value self.aid_ki = '' self.eblf = zlib.decompress( base64.b64decode( 'eJzLKCkpKLbS1y8vL9fLNSkuyC8q0cso1U9KzMrLz87PzslMT8xKBAAIlg4p') ) self.defaultParams = { 'header': self.HEADER, 'use_cookie': True, 'load_cookie': True, 'save_cookie': True, 'cookiefile': self.COOKIE_FILE }
def __init__(self): CBaseHostClass.__init__(self, {'history':'mozicsillag.cc', 'cookie':'mozicsillag.cc.cookie'}) self.USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0' self.HEADER = {'User-Agent': self.USER_AGENT, 'DNT':'1', 'Accept': 'text/html'} self.AJAX_HEADER = dict(self.HEADER) self.AJAX_HEADER.update( {'X-Requested-With': 'XMLHttpRequest'} ) self.MAIN_URL = 'https://mozicsillag.me/' self.DEFAULT_ICON_URL = strwithmeta('https://mozicsillag.me/img/logo.png', {'Referer':self.getMainUrl()}) self.vivn = GetIPTVPlayerVerstion() self.porv = self.gits() self.pbtp = '-' self.btps = config.plugins.iptvplayer.boxtipus.value self.brdr = config.plugins.iptvplayer.boxrendszer.value self.aid = config.plugins.iptvplayer.mozicsillag_id.value self.aid_ki = '' self.ilk = False self.cacheLinks = {} self.cacheFilters = {} self.cacheFiltersKeys = [] self.cacheSortOrder = [] self.defaultParams = {'header':self.HEADER, 'with_metadata':True, 'use_cookie': True, 'load_cookie': True, 'save_cookie': True, 'cookiefile': self.COOKIE_FILE}
def __init__(self): CBaseHostClass.__init__(self, {'history':'filmezz.club', 'cookie':'filmezzeu.cookie'}) self.DEFAULT_ICON_URL = 'http://plugins.movian.tv/data/3c3f8bf962820103af9e474604a0c83ca3b470f3' self.USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' self.HEADER = {'User-Agent': self.USER_AGENT, 'DNT':'1', 'Accept': 'text/html'} self.AJAX_HEADER = dict(self.HEADER) self.AJAX_HEADER.update( {'X-Requested-With': 'XMLHttpRequest'} ) self.MAIN_URL = 'https://filmezz.club/' self.vivn = GetIPTVPlayerVerstion() self.porv = self.gits() self.pbtp = '-' self.btps = config.plugins.iptvplayer.boxtipus.value self.brdr = config.plugins.iptvplayer.boxrendszer.value self.aid = config.plugins.iptvplayer.filmezzeu_id.value self.aid_ki = '' self.ilk = False self.cacheLinks = {} self.cacheFilters = {} self.cacheFiltersKeys = [] self.loggedIn = None self.login = '' self.password = '' self.defaultParams = {'header':self.HEADER, 'use_cookie': True, 'load_cookie': True, 'save_cookie': True, 'cookiefile': self.COOKIE_FILE}
def __serversListDownloadFinished(self, arg, status): def ServerComparator(x, y): try: val1 = int(x['version'].replace('.', '')) except: val1 = 0 try: val2 = int(y['version'].replace('.', '')) except: val2 = 0 #printDBG("ServerComparator val1[%d], val2[%d]" % (val1, val2)) return cmp(val1, val2) try: currVerNum = int(GetIPTVPlayerVerstion().replace('.', '')) except: printDBG('Version of the current instalation [%s]' % GetIPTVPlayerVerstion()) currVerNum = 0 pythonVer = GetShortPythonVersion() url = self.downloader.getUrl() filePath = self.downloader.getFullFileName() self.downloader = None if DMHelper.STS.DOWNLOADED != status: self.serverIdx += 1 if self.serverIdx < len(UpdateMainAppImpl.SERVERS_LIST_URLS): self.stepGetServerLists() else: urls = "" for idx in range(self.serverIdx): urls += "%s, " % (UpdateMainAppImpl.SERVERS_LIST_URLS[idx]) if 1 < len(urls): urls = urls[:-2] self.stepFinished( -1, _("Problem with downloading the server list from [%s].") % urls) else: # process servers list serversList = [] try: with open(filePath) as fileHandle: jsonData = json.load(fileHandle, 'utf-8') #printDBG("__serversListDownloadFinished jsonData [%r]" % jsonData) for server in jsonData['servers']: serverOK = True extServer = {} for key in [ 'name', 'version', 'url', 'subdir', 'pyver', 'packagetype' ]: if key not in server.iterkeys(): serverOK = False break else: extServer[key] = server[key].encode('utf8') #printDBG("") if not serverOK: continue newServer = dict(extServer) serversList.append(newServer) except: printExc() self.stepFinished( -1, _("Problem with downloading the server list.")) return if config.plugins.iptvplayer.hiddenAllVersionInUpdate.value: self.__addLastVersion( serversList ) # get last version from gitorious.org only for developers self.serversList = serversList if 0 < len(serversList): options = [] self.serversList.sort(cmp=ServerComparator, reverse=True) for idx in range(len(serversList)): server = serversList[idx] if not config.plugins.iptvplayer.hiddenAllVersionInUpdate.value: try: newVerNum = int(server['version'].replace('.', '')) except: continue #printDBG("newVerNum[%s], currVerNum[%s]" % (newVerNum, currVerNum)) if newVerNum < currVerNum and not config.plugins.iptvplayer.downgradePossible.value: continue if newVerNum == currVerNum: continue if 'X.X' != server['pyver'] and pythonVer != server[ 'pyver']: continue if config.plugins.iptvplayer.possibleUpdateType.value not in [ server['packagetype'], 'all' ]: #"sourcecode", "precompiled" continue name = "| %s | python %s | %s | %s |" % ( server['version'], server['pyver'], server['packagetype'], server['name']) #printDBG("server list: " + name) options.append((name, idx)) if 1 == len( options ) and not config.plugins.iptvplayer.downgradePossible.value: self.__selServerCallBack(options[0]) elif 0 < len(options): self.session.openWithCallback( self.__selServerCallBack, ChoiceBox, title=_("Select update server"), list=options) else: self.stepFinished( -1, _("There is no update for the current configuration.")) else: self.stepFinished(-1, _("Update not available."))
def getSubTitle(self): return _("Currently you have version [%s].") % GetIPTVPlayerVerstion()
class IPTVSetupMainWidget(Screen): IPTV_VERSION = GetIPTVPlayerVerstion() skin = """ <screen position="center,center" size="600,300" title="E2iPlayer setup version %s"> <widget name="sub_title" position="10,10" zPosition="2" size="580,90" valign="center" halign="center" font="Regular;24" transparent="1" foregroundColor="white" /> <widget name="info_field" position="10,100" zPosition="2" size="580,200" valign="top" halign="center" font="Regular;22" transparent="1" foregroundColor="white" /> <widget name="spinner" zPosition="2" position="463,200" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_1" zPosition="1" position="463,200" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_2" zPosition="1" position="479,200" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_3" zPosition="1" position="495,200" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_4" zPosition="1" position="511,200" size="16,16" transparent="1" alphatest="blend" /> </screen>""" % (IPTV_VERSION) def __init__(self, session, autoStart=False): printDBG( "IPTVUpdateMainWindow.__init__ -------------------------------") Screen.__init__(self, session) self["sub_title"] = Label(_(" ")) self["info_field"] = Label(_(" ")) self["actions"] = ActionMap(["SetupActions", "ColorActions"], { "cancel": self.cancelPressed, "ok": self.startPressed, }, -1) try: for idx in range(5): spinnerName = "spinner" if idx: spinnerName += '_%d' % idx self[spinnerName] = Cover3() except Exception: printExc() self.spinnerPixmap = [ LoadPixmap(GetIconDir('radio_button_on.png')), LoadPixmap(GetIconDir('radio_button_off.png')) ] self.onClose.append(self.__onClose) #self.onLayoutFinish.append(self.onStart) self.onShow.append(self.onStart) #flags self.autoStart = autoStart self.underCloseMessage = False self.underClosing = False self.deferredAction = None self.started = False self.setupImpl = IPTVSetupImpl(self.finished, self.chooseQuestion, self.showMessage, self.setInfo) def __del__(self): printDBG("IPTVSetupMainWidget.__del__ -------------------------------") def __onClose(self): printDBG("IPTVSetupMainWidget.__onClose -----------------------------") self.setupImpl.terminate() IPTVPlayerNeedInit(False) def onStart(self): self.onShow.remove(self.onStart) printDBG("IPTVSetupMainWidget.onStart") self["sub_title"].setText(_("Information")) self["info_field"].setText( _("IPTVPlayer need some additional setup.\nSuch as downloading and installation additional binaries.\nPress OK to start." )) if self.autoStart: self.startPressed() def cancelPressed(self): printDBG("IPTVSetupMainWidget.cancelPressed") if self.underClosing: return self.underCloseMessage = True message = _( "Skipping IPTVPlayer setup may cause problems.\nAre you sure to skip IPTVPlayer setup?" ) self.session.openWithCallback(self.cancelAnswer, MessageBox, text=message, type=MessageBox.TYPE_YESNO) def startPressed(self): printDBG("IPTVSetupMainWidget.startPressed") if self.underClosing: return if self.started: return self.started = True self.setupImpl.start() def cancelAnswer(self, ret): printDBG("IPTVSetupMainWidget.cancelAnswer") if self.underClosing: return if ret: self.underClosing = True self.close() else: if None != self.deferredAction: deferredAction = self.deferredAction self.deferredAction = None deferredAction() def showMessage(self, message, type, callback): printDBG("IPTVSetupMainWidget.showMessage") if self.underClosing: return if self.underCloseMessage: self.deferredAction = boundFunction(self.doShowMessage, message, type, callback) else: self.doShowMessage(message, type, callback) def doShowMessage(self, message, type, callback): self.session.openWithCallback(callback, MessageBox, text=message, type=type) def chooseQuestion(self, title, list, callback): printDBG("IPTVSetupMainWidget.chooseQuestion") if self.underClosing: return if self.underCloseMessage: self.deferredAction = boundFunction(self.dochooseQuestion, title, list, callback) else: self.dochooseQuestion(title, list, callback) def dochooseQuestion(self, title, list, callback): title += " " # workaround for truncation message by stupid E2 title = title.replace('\n', ' ').replace(' ', chr(160)) self.session.openWithCallback(callback, ChoiceBox, title=title, list=list) def setInfo(self, title, message): if self.underClosing: return if None != title: self["sub_title"].setText(title) if None != message: self["info_field"].setText(message) def finished(self): if self.underClosing: return if self.underCloseMessage: self.deferredAction = self.doFinished else: self.doFinished() def doFinished(self): self.close()
def __init__(self, session, inList, outList, numOfLockedItems=0, groupName='', groupObj=None): printDBG( "PlayerSelectorWidget.__init__ --------------------------------") screenwidth = getDesktop(0).size().width() iconSize = GetAvailableIconSize() if len( inList ) >= 30 and iconSize == 100 and screenwidth and screenwidth > 1100: numOfRow = 4 numOfCol = 8 elif len(inList) > 16 and iconSize == 100: numOfRow = 4 numOfCol = 5 elif len(inList) > 12 and iconSize == 100: numOfRow = 4 numOfCol = 4 elif len(inList) > 9: if screenwidth and screenwidth == 1920: numOfRow = 4 numOfCol = 8 else: numOfRow = 3 numOfCol = 4 elif len(inList) > 6: numOfRow = 3 numOfCol = 3 elif len(inList) > 3: numOfRow = 2 numOfCol = 3 else: numOfRow = 1 numOfCol = 3 try: confNumOfRow = int(config.plugins.iptvplayer.numOfRow.value) confNumOfCol = int(config.plugins.iptvplayer.numOfCol.value) # 0 - means AUTO if confNumOfRow > 0: numOfRow = confNumOfRow if confNumOfCol > 0: numOfCol = confNumOfCol except Exception: pass # position of first img offsetCoverX = 25 if screenwidth and screenwidth == 1920: offsetCoverY = 100 else: offsetCoverY = 80 # image size coverWidth = iconSize coverHeight = iconSize # space/distance between images disWidth = int(coverWidth / 3) disHeight = int(coverHeight / 4) # marker size should be larger than img markerWidth = 45 + coverWidth markerHeight = 45 + coverHeight # position of first marker offsetMarkerX = offsetCoverX - (markerWidth - coverWidth) / 2 offsetMarkerY = offsetCoverY - (markerHeight - coverHeight) / 2 # how to calculate position of image with indexes indxX, indxY: #posX = offsetCoverX + (coverWidth + disWidth) * indxX #posY = offsetCoverY + (coverHeight + disHeight) * indxY # how to calculate position of marker for image with posX, posY #markerPosX = posX - (markerWidth - coverWidth)/2 #markerPosY = posY - (markerHeight - coverHeight)/2 tmpX = coverWidth + disWidth tmpY = coverHeight + disHeight self.numOfRow = numOfRow self.numOfCol = numOfCol # position of first cover self.offsetCoverX = offsetCoverX self.offsetCoverY = offsetCoverY # space/distance between images self.disWidth = disWidth self.disHeight = disHeight # image size self.coverWidth = coverWidth self.coverHeight = coverHeight # marker size should be larger than img self.markerWidth = markerWidth self.markerHeight = markerHeight self.inList = list(inList) self.currList = self.inList self.outList = outList self.groupName = groupName self.groupObj = groupObj self.numOfLockedItems = numOfLockedItems self.IconsSize = iconSize #do ladowania ikon self.MarkerSize = self.IconsSize + 45 self.lastSelection = PlayerSelectorWidget.LAST_SELECTION.get( self.groupName, 0) self.calcDisplayVariables() # pagination self.pageItemSize = 16 self.pageItemStartX = (offsetCoverX + tmpX * numOfCol + offsetCoverX - disWidth - self.numOfPages * self.pageItemSize) / 2 if screenwidth and screenwidth == 1920: self.pageItemStartY = 60 else: self.pageItemStartY = 40 if screenwidth and screenwidth == 1920: skin = """ <screen name="IPTVPlayerPlayerSelectorWidget" position="center,center" title="E2iPlayer %s" size="%d,%d"> <widget name="statustext" position="0,0" zPosition="1" size="%d,50" font="Regular;36" halign="center" valign="center" transparent="1"/> <widget name="marker" zPosition="2" position="%d,%d" size="%d,%d" transparent="1" alphatest="blend" /> <widget name="page_marker" zPosition="3" position="%d,%d" size="%d,%d" transparent="1" alphatest="blend" /> <widget name="menu" zPosition="3" position="%d,10" size="70,30" transparent="1" alphatest="blend" /> """ % ( GetIPTVPlayerVerstion(), offsetCoverX + tmpX * numOfCol + offsetCoverX - disWidth, # width of window offsetCoverY + tmpY * numOfRow + offsetCoverX - disHeight, # height of window offsetCoverX + tmpX * numOfCol + offsetCoverX - disWidth, # width of status line offsetMarkerX, offsetMarkerY, # first marker position markerWidth, markerHeight, # marker size self.pageItemStartX, self.pageItemStartY, # pagination marker self.pageItemSize, self.pageItemSize, offsetCoverX + tmpX * numOfCol + offsetCoverX - disWidth - 70, ) else: skin = """ <screen name="IPTVPlayerPlayerSelectorWidget" position="center,center" title="E2iPlayer %s" size="%d,%d"> <widget name="statustext" position="0,0" zPosition="1" size="%d,50" font="Regular;26" halign="center" valign="center" transparent="1"/> <widget name="marker" zPosition="2" position="%d,%d" size="%d,%d" transparent="1" alphatest="blend" /> <widget name="page_marker" zPosition="3" position="%d,%d" size="%d,%d" transparent="1" alphatest="blend" /> <widget name="menu" zPosition="3" position="%d,10" size="70,30" transparent="1" alphatest="blend" /> """ % ( GetIPTVPlayerVerstion(), offsetCoverX + tmpX * numOfCol + offsetCoverX - disWidth, # width of window offsetCoverY + tmpY * numOfRow + offsetCoverX - disHeight, # height of window offsetCoverX + tmpX * numOfCol + offsetCoverX - disWidth, # width of status line offsetMarkerX, offsetMarkerY, # first marker position markerWidth, markerHeight, # marker size self.pageItemStartX, self.pageItemStartY, # pagination marker self.pageItemSize, self.pageItemSize, offsetCoverX + tmpX * numOfCol + offsetCoverX - disWidth - 70, ) for y in range(1, numOfRow + 1): for x in range(1, numOfCol + 1): skinCoverLine = """<widget name="cover_%s%s" zPosition="4" position="%d,%d" size="%d,%d" transparent="1" alphatest="blend" />""" % ( x, y, (offsetCoverX + tmpX * (x - 1)), # pos X image (offsetCoverY + tmpY * (y - 1)), # pos Y image coverWidth, coverHeight) skin += '\n' + skinCoverLine # add pagination items for pageItemOffset in range(self.numOfPages): pageItemX = self.pageItemStartX + pageItemOffset * self.pageItemSize skinCoverLine = """<ePixmap zPosition="2" position="%d,%d" size="%d,%d" pixmap="%s" transparent="1" alphatest="blend" />""" % ( pageItemX, self.pageItemStartY, self.pageItemSize, self.pageItemSize, GetIconDir('radio_button_off.png')) skin += '\n' + skinCoverLine skin += '</screen>' self.skin = skin self.session = session Screen.__init__(self, session) self.session.nav.event.append(self.__event) self.onClose.append(self.__onClose) # load icons self.pixmapList = [] for idx in range(0, self.numOfItems): self.pixmapList.append( LoadPixmap( GetIconDir('PlayerSelector/' + self.currList[idx][1] + '%i.png' % self.IconsSize))) self.markerPixmap = LoadPixmap( GetIconDir('PlayerSelector/marker%i.png' % self.MarkerSize)) self.markerPixmapSel = LoadPixmap( GetIconDir('PlayerSelector/markerSel%i.png' % self.MarkerSize)) self.pageMarkerPixmap = LoadPixmap(GetIconDir('radio_button_on.png')) self.menuPixmap = LoadPixmap(GetIconDir('menu.png')) self["actions"] = ActionMap( [ "WizardActions", "DirectionActions", "ColorActions", "IPTVPlayerListActions" ], { "ok": self.ok_pressed, "back": self.back_pressed, "left": self.keyLeft, "right": self.keyRight, "up": self.keyUp, "down": self.keyDown, "blue": self.keyBlue, "menu": self.keyMenu, }, -1) self["marker"] = Cover3() self["page_marker"] = Cover3() self["menu"] = Cover3() for y in range(1, self.numOfRow + 1): for x in range(1, self.numOfCol + 1): strIndex = "cover_%s%s" % (x, y) self[strIndex] = Cover3() self["statustext"] = Label(self.currList[0][0]) self.onLayoutFinish.append(self.onStart) self.visible = True self.reorderingMode = False self.reorderingItemSelected = False
class IPTVSubDownloaderWidget(Screen): IPTV_VERSION = GetIPTVPlayerVerstion() screenwidth = getDesktop(0).size().width() if screenwidth and screenwidth == 1920: skin = """ <screen name="IPTVSubDownloaderWidget" position="center,center" size="1590,825" title="E2iPlayer v%s"> <ePixmap position="5,9" zPosition="4" size="30,30" pixmap="%s" transparent="1" alphatest="on" /> <widget render="Label" source="key_red" position="45,9" size="140,32" zPosition="5" valign="center" halign="left" backgroundColor="black" font="Regular;32" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> <widget name="headertext" position="15,55" zPosition="1" size="1580,30" font="Regular;30" transparent="1" backgroundColor="#00000000" /> <widget name="statustext" position="15,148" zPosition="1" size="1580,180" font="Regular;30" halign="center" valign="center" transparent="1" backgroundColor="#00000000" /> <widget name="list" position="5,115" zPosition="2" size="1580,410" enableWrapAround="1" scrollbarMode="showOnDemand" transparent="1" backgroundColor="#00000000" /> <widget name="console" position="5,570" zPosition="1" size="1580,140" font="Regular;26" transparent="1" backgroundColor="#00000000" /> <ePixmap zPosition="4" position="5,535" size="1580,5" pixmap="%s" transparent="1" /> <widget name="spinner" zPosition="2" position="508,240" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_1" zPosition="1" position="508,240" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_2" zPosition="1" position="524,240" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_3" zPosition="1" position="540,240" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_4" zPosition="1" position="556,240" size="16,16" transparent="1" alphatest="blend" /> </screen> """ % (IPTV_VERSION, GetIconDir('red.png'), GetIconDir('line.png')) else: skin = """ <screen name="IPTVSubDownloaderWidget" position="center,center" size="1090,525" title="E2iPlayer v%s"> <ePixmap position="30,9" zPosition="4" size="30,30" pixmap="%s" transparent="1" alphatest="on" /> <widget render="Label" source="key_red" position="65,9" size="210,27" zPosition="5" valign="center" halign="left" backgroundColor="black" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> <widget name="headertext" position="5,47" zPosition="1" size="1080,23" font="Regular;20" transparent="1" backgroundColor="#00000000" /> <widget name="statustext" position="5,140" zPosition="1" size="1080,180" font="Regular;20" halign="center" valign="center" transparent="1" backgroundColor="#00000000" /> <widget name="list" position="5,100" zPosition="2" size="1080,280" enableWrapAround="1" scrollbarMode="showOnDemand" transparent="1" backgroundColor="#00000000" /> <widget name="console" position="5,400" zPosition="1" size="1080,170" font="Regular;20" transparent="1" backgroundColor="#00000000" /> <ePixmap zPosition="4" position="5,395" size="1080,5" pixmap="%s" transparent="1" /> <widget name="spinner" zPosition="2" position="508,240" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_1" zPosition="1" position="508,240" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_2" zPosition="1" position="524,240" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_3" zPosition="1" position="540,240" size="16,16" transparent="1" alphatest="blend" /> <widget name="spinner_4" zPosition="1" position="556,240" size="16,16" transparent="1" alphatest="blend" /> </screen> """ % (IPTV_VERSION, GetIconDir('red.png'), GetIconDir('line.png')) def __init__(self, session, params={}): # params: vk_title, movie_title printDBG("IPTVSubDownloaderWidget.__init__ desktop IPTV_VERSION[%s]\n" % (IPTVSubDownloaderWidget.IPTV_VERSION)) self.session = session path = GetSkinsDir(config.plugins.iptvplayer.skin.value) + "/subplaylist.xml" if os_path.exists(path): try: with open(path, "r") as f: self.skin = f.read() f.close() except Exception: printExc("Skin read error: " + path) Screen.__init__(self, session) self["key_red"] = StaticText(_("Cancel")) self["list"] = IPTVMainNavigatorList() self["list"].connectSelChanged(self.onSelectionChanged) self["statustext"] = Label("Loading...") self["actions"] = ActionMap(["IPTVPlayerListActions", "WizardActions", "DirectionActions", "ColorActions", "NumberActions"], { "red": self.red_pressed, "green": self.green_pressed, "yellow": self.yellow_pressed, "blue": self.blue_pressed, "ok": self.ok_pressed, "back": self.back_pressed, }, -1) self["headertext"] = Label() self["console"] = Label() self["sequencer"] = Label() try: for idx in range(5): spinnerName = "spinner" if idx: spinnerName += '_%d' % idx self[spinnerName] = Cover3() except Exception: printExc() self.spinnerPixmap = [LoadPixmap(GetIconDir('radio_button_on.png')), LoadPixmap(GetIconDir('radio_button_off.png'))] self.showHostsErrorMessage = True self.onClose.append(self.__onClose) #self.onLayoutFinish.append(self.onStart) self.onShow.append(self.onStart) #Defs self.params = dict(params) self.params['discover_info'] = self.discoverInfoFromTitle() self.params['movie_url'] = strwithmeta(self.params.get('movie_url', '')) self.params['url_params'] = self.params['movie_url'].meta self.movieTitle = self.params['discover_info']['movie_title'] self.workThread = None self.host = None self.hostName = '' self.nextSelIndex = 0 self.currSelIndex = 0 self.prevSelList = [] self.categoryList = [] self.currList = [] self.currItem = CDisplayListItem() self.visible = True ################################################################# # Inits for Proxy Queue ################################################################# # register function in main Queue if None == asynccall.gMainFunctionsQueueTab[1]: asynccall.gMainFunctionsQueueTab[1] = asynccall.CFunctionProxyQueue(self.session) asynccall.gMainFunctionsQueueTab[1].clearQueue() asynccall.gMainFunctionsQueueTab[1].setProcFun(self.doProcessProxyQueueItem) #main Queue self.mainTimer = eTimer() self.mainTimer_conn = eConnectCallback(self.mainTimer.timeout, self.processProxyQueue) # every 100ms Proxy Queue will be checked self.mainTimer_interval = 100 self.mainTimer.start(self.mainTimer_interval, True) # spinner timer self.spinnerTimer = eTimer() self.spinnerTimer_conn = eConnectCallback(self.spinnerTimer.timeout, self.updateSpinner) self.spinnerTimer_interval = 200 self.spinnerEnabled = False ################################################################# self.downloadedSubItems = [] #end def __init__(self, session): def __del__(self): printDBG("IPTVSubDownloaderWidget.__del__ --------------------------") def __onClose(self): self["list"].disconnectSelChanged(self.onSelectionChanged) self.mainTimer_conn = None self.mainTimer = None self.spinnerTimer_conn = None self.spinnerTimer = None try: asynccall.gMainFunctionsQueueTab[1].setProcFun(None) asynccall.gMainFunctionsQueueTab[1].clearQueue() except Exception: printExc() def onStart(self): self.onShow.remove(self.onStart) #self.onLayoutFinish.remove(self.onStart) self.loadSpinner() self.hideSpinner() #self.hideButtons() self.confirmMovieTitle() def confirmMovieTitle(self): # first ask user to provide movie title self.session.openWithCallback(self.confirmMovieTitleCallBack, GetVirtualKeyboard(), title=(_("Confirm the title of the movie")), text=self.movieTitle) def confirmMovieTitleCallBack(self, text=None): if isinstance(text, basestring): self.movieTitle = text self.listSubtitlesProviders() else: self.close() def hideButtons(self, buttons=['green', 'yellow', 'blue']): try: for button in buttons: self['icon_' + button].hide() self['label_' + button].hide() except Exception: printExc() def red_pressed(self): self.close(None) def green_pressed(self): pass def yellow_pressed(self): pass def blue_pressed(self): pass def back_pressed(self): printDBG("IPTVSubDownloaderWidget.back_pressed") try: if self.isInWorkThread(): if self.workThread.kill(): self.workThread = None self["statustext"].setText(_("Operation aborted!")) return except Exception: return if self.visible: if len(self.prevSelList) > 0: self.nextSelIndex = self.prevSelList.pop() self.categoryList.pop() printDBG("back_pressed prev sel index %s" % self.nextSelIndex) if len(self.prevSelList) > 0: self.requestListFromHost('Previous') else: self.listSubtitlesProviders() else: #There is no prev categories, so exit self.confirmMovieTitle() else: self.showWindow() #end back_pressed(self): def ok_pressed(self): if self.visible: sel = None try: sel = self["list"].l.getCurrentSelection()[0] except Exception: self.getRefreshedCurrList() return if sel is None: printDBG("ok_pressed sel is None") return elif len(self.currList) <= 0: printDBG("ok_pressed list is empty") self.getRefreshedCurrList() return else: printDBG("ok_pressed selected item: %s" % (sel.name)) item = self.getSelItem() self.currItem = item #Get current selection currSelIndex = self["list"].getCurrentIndex() #remember only prev categories if item.type in [CDisplayListItem.TYPE_SUB_PROVIDER]: try: self.hostName = item.privateData['sub_provider'] self.loadHost() except Exception: printExc() elif item.type in [CDisplayListItem.TYPE_SUBTITLE]: self.requestListFromHost('ForDownloadSubFile', currSelIndex, '') elif item.type == CDisplayListItem.TYPE_CATEGORY: printDBG("ok_pressed selected TYPE_CATEGORY") self.currSelIndex = currSelIndex self.requestListFromHost('ForItem', currSelIndex, '') elif item.type == CDisplayListItem.TYPE_MORE: printDBG("ok_pressed selected TYPE_MORE") self.currSelIndex = currSelIndex self.requestListFromHost('ForMore', currSelIndex, '') else: self.showWindow() #end ok_pressed(self): def loadHost(self): try: _temp = __import__('Plugins.Extensions.IPTVPlayer.subproviders.subprov_' + self.hostName, globals(), locals(), ['IPTVSubProvider'], -1) params = dict(self.params) params['confirmed_title'] = self.movieTitle self.host = _temp.IPTVSubProvider(params) if not isinstance(self.host, ISubProvider): printDBG("Host [%r] does not inherit from ISubProvider" % self.hostName) self.close() return except Exception: printExc('Cannot import class IPTVSubProvider for host [%r]' % self.hostName) self.close() return # request initial list from host self.getInitialList() def loadSpinner(self): try: if "spinner" in self: self["spinner"].setPixmap(self.spinnerPixmap[0]) for idx in range(4): spinnerName = 'spinner_%d' % (idx + 1) self[spinnerName].setPixmap(self.spinnerPixmap[1]) except Exception: printExc() def showSpinner(self): if None != self.spinnerTimer: self._setSpinnerVisibility(True) self.spinnerTimer.start(self.spinnerTimer_interval, True) def hideSpinner(self): self._setSpinnerVisibility(False) def _setSpinnerVisibility(self, visible=True): self.spinnerEnabled = visible try: if "spinner" in self: for idx in range(5): spinnerName = "spinner" if idx: spinnerName += '_%d' % idx self[spinnerName].visible = visible except Exception: printExc() def updateSpinner(self): try: if self.spinnerEnabled and None != self.workThread: if self.workThread.isAlive(): if "spinner" in self: x, y = self["spinner"].getPosition() x += self["spinner"].getWidth() if x > self["spinner_4"].getPosition()[0]: x = self["spinner_1"].getPosition()[0] self["spinner"].setPosition(x, y) if None != self.spinnerTimer: self.spinnerTimer.start(self.spinnerTimer_interval, True) return elif not self.workThread.isFinished(): message = _("It seems that the subtitle's provider \"%s\" has crashed. Do you want to report this problem?") % self.hostName message += "\n" message += _('\nMake sure you are using the latest version of the plugin.') message += _('\nYou can also report problem here: \nhttps://github.com/OpenVisionE2/e2iplayer-ov/issues') self.session.openWithCallback(self.reportHostCrash, MessageBox, text=message, type=MessageBox.TYPE_YESNO) self.hideSpinner() except Exception: printExc() def reportHostCrash(self, ret): try: if ret: try: exceptStack = self.workThread.getExceptStack() reporter = GetPluginDir('iptvdm/reporthostcrash.py') msg = urllib_quote('%s|%s|%s|%s' % ('HOST_CRASH', IPTVSubDownloaderWidget.IPTV_VERSION, self.hostName, self.getCategoryPath())) self.crashConsole = iptv_system('python "%s" "http://iptvplayer.vline.pl/reporthostcrash.php?msg=%s" "%s" 2&>1 > /dev/null' % (reporter, msg, exceptStack)) printDBG(msg) except Exception: printExc() self.workThread = None self.prevSelList = [] self.back_pressed() except Exception: printExc() def processProxyQueue(self): if None != self.mainTimer: asynccall.gMainFunctionsQueueTab[1].processQueue() self.mainTimer.start(self.mainTimer_interval, True) return def doProcessProxyQueueItem(self, item): try: if None == item.retValue[0] or self.workThread == item.retValue[0]: if isinstance(item.retValue[1], asynccall.CPQParamsWrapper): getattr(self, method)(*item.retValue[1]) else: getattr(self, item.clientFunName)(item.retValue[1]) else: printDBG('>>>>>>>>>>>>>>> doProcessProxyQueueItem callback from old workThread[%r][%s]' % (self.workThread, item.retValue)) except Exception: printExc() def getCategoryPath(self): def _getCat(cat, num): if '' == cat: return '' cat = ' > ' + cat if 1 < num: cat += (' (x%d)' % num) return cat if len(self.categoryList): str = self.hostName else: str = _("Select subtitles provider:") prevCat = '' prevNum = 0 for cat in self.categoryList: if prevCat != cat: str += _getCat(prevCat, prevNum) prevCat = cat prevNum = 1 else: prevNum += 1 str += _getCat(prevCat, prevNum) return str def getRefreshedCurrList(self): currSelIndex = self["list"].getCurrentIndex() self.requestListFromHost('Refresh', currSelIndex) def getInitialList(self): self.nexSelIndex = 0 self.prevSelList = [] self.categoryList = [] self.currList = [] self.currItem = CDisplayListItem() self["headertext"].setText(self.getCategoryPath()) self.requestListFromHost('Initial') def requestListFromHost(self, type, currSelIndex=-1, privateData=''): if not self.isInWorkThread(): self["list"].hide() if type not in ['ForDownloadSubFile']: #hide bottom panel self["console"].setText('') if type in ['ForItem', 'Initial']: self.prevSelList.append(self.currSelIndex) self.categoryList.append(self.currItem.name) #new list, so select first index self.nextSelIndex = 0 selItem = None if currSelIndex > -1 and len(self.currList) > currSelIndex: selItem = self.currList[currSelIndex] if selItem.itemIdx > -1 and len(self.currList) > selItem.itemIdx: currSelIndex = selItem.itemIdx dots = ""#_("...............") IDS_DOWNLOADING = _("Downloading") + dots IDS_LOADING = _("Loading") + dots IDS_REFRESHING = _("Refreshing") + dots try: if type == 'Refresh': self["statustext"].setText(IDS_REFRESHING) self.workThread = asynccall.AsyncMethod(self.host.getCurrentList, boundFunction(self.callbackGetList, {'refresh': 1, 'selIndex': currSelIndex}), True)(1) elif type == 'ForMore': self["statustext"].setText(IDS_DOWNLOADING) self.workThread = asynccall.AsyncMethod(self.host.getMoreForItem, boundFunction(self.callbackGetList, {'refresh': 2, 'selIndex': currSelIndex}), True)(currSelIndex) elif type == 'Initial': self["statustext"].setText(IDS_DOWNLOADING) self.workThread = asynccall.AsyncMethod(self.host.getInitList, boundFunction(self.callbackGetList, {}), True)() elif type == 'Previous': self["statustext"].setText(IDS_DOWNLOADING) self.workThread = asynccall.AsyncMethod(self.host.getPrevList, boundFunction(self.callbackGetList, {}), True)() elif type == 'ForItem': self["statustext"].setText(IDS_DOWNLOADING) self.workThread = asynccall.AsyncMethod(self.host.getListForItem, boundFunction(self.callbackGetList, {}), True)(currSelIndex, 0) elif type == 'ForDownloadSubFile': self["statustext"].setText(IDS_DOWNLOADING) self.workThread = asynccall.AsyncMethod(self.host.downloadSubtitleFile, boundFunction(self.downloadSubtitleFileCallback, {}), True)(currSelIndex) else: printDBG('requestListFromHost unknown list type: ' + type) self["headertext"].setText(self.getCategoryPath()) self.showSpinner() except Exception: printExc('The current host crashed') #end requestListFromHost(self, type, currSelIndex = -1, privateData = ''): def callbackGetList(self, addParam, thread, ret): asynccall.gMainFunctionsQueueTab[1].addToQueue("reloadList", [thread, {'add_param': addParam, 'ret': ret}]) def downloadSubtitleFileCallback(self, addParam, thread, ret): asynccall.gMainFunctionsQueueTab[1].addToQueue("subtitleFileDownloaded", [thread, {'add_param': addParam, 'ret': ret}]) def subtitleFileDownloaded(self, params): printDBG("IPTVSubDownloaderWidget.subtitleFileDownloaded") self["statustext"].setText("") self["list"].show() ret = params['ret'] if ret.status != RetHost.OK or 1 != len(ret.value): disMessage = _('Download subtiles failed.') + '\n' if ret.message and ret.message != '': disMessage += ret.message lastErrorMsg = GetIPTVPlayerLastHostError() if lastErrorMsg != '': disMessage += "\n" + _('Last error: "%s"') % lastErrorMsg self.session.open(MessageBox, disMessage, type=MessageBox.TYPE_ERROR) else: # subtitle downloaded, ask for finish ret = ret.value[0] self.downloadedSubItems.append(ret) message = _('Subtitles \"%s\" downloaded correctly.') % ret.path message += '\n' + _('Do you want to finish?') self.session.openWithCallback(self.askFinishCallback, MessageBox, text=message, type=MessageBox.TYPE_YESNO) def askFinishCallback(self, ret): try: if ret: item = self.downloadedSubItems[-1] track = {'title': item.name, 'lang': item.lang, 'path': item.path, 'id': item.imdbid} self.close(track) except Exception: printExc() def reloadList(self, params): printDBG("IPTVSubDownloaderWidget.reloadList") refresh = params['add_param'].get('refresh', 0) selIndex = params['add_param'].get('selIndex', 0) ret = params['ret'] printDBG("IPTVSubDownloaderWidget.reloadList refresh[%s], selIndex[%s]" % (refresh, selIndex)) if 0 < refresh and 0 < selIndex: self.nextSelIndex = selIndex if ret.status != RetHost.OK: printDBG("++++++++++++++++++++++ reloadList ret.status = %s" % ret.status) self.currList = ret.value self["list"].setList([(x,) for x in self.currList]) self["headertext"].setText(self.getCategoryPath()) if len(self.currList) <= 0: disMessage = _("No item to display. \nPress OK to refresh.\n") if ret.message and ret.message != '': disMessage += ret.message lastErrorMsg = GetIPTVPlayerLastHostError() if lastErrorMsg != '': disMessage += "\n" + _('Last error: "%s"') % lastErrorMsg disMessage += '\n\n' + _('Simplify the title and try again.') self["statustext"].setText(disMessage) self["list"].hide() else: #restor previus selection if len(self.currList) > self.nextSelIndex: self["list"].moveToIndex(self.nextSelIndex) #else: #selection will not be change so manualy call self.changeBottomPanel() self["statustext"].setText("") self["list"].show() #end reloadList(self, ret): def listSubtitlesProviders(self): printDBG("IPTVSubDownloaderWidget.listSubtitlesProviders") subProvidersList = [] napisy24pl = {'title': "Napisy24.pl", 'sub_provider': 'napisy24pl'} openSubtitles = {'title': "OpenSubtitles.org API", 'sub_provider': 'opensubtitlesorg'} openSubtitles2 = {'title': "OpenSubtitles.org WWW", 'sub_provider': 'opensubtitlesorg2'} openSubtitles3 = {'title': "OpenSubtitles.org REST", 'sub_provider': 'opensubtitlesorg3'} napiprojektpl = {'title': "Napiprojekt.pl", 'sub_provider': 'napiprojektpl'} podnapisinet = {'title': "Podnapisi.net", 'sub_provider': 'podnapisinet'} titlovi = {'title': "Titlovi.com", 'sub_provider': 'titlovicom'} subscene = {'title': "Subscene.com", 'sub_provider': 'subscenecom'} youtube = {'title': "Youtube.com", 'sub_provider': 'youtubecom'} popcornsubtitles = {'title': "PopcornSubtitles.com", 'sub_provider': 'popcornsubtitles'} subtitlesgr = {'title': "Subtitles.gr", 'sub_provider': 'subtitlesgr'} prijevodi = {'title': "Prijevodi-Online.org", 'sub_provider': 'prijevodi'} subsro = {'title': "Subs.ro", 'sub_provider': 'subsro'} defaultLang = GetDefaultLang() if 'youtube_id' in self.params['url_params'] and '' != self.params['url_params']['youtube_id']: subProvidersList.append(youtube) if 'popcornsubtitles_url' in self.params['url_params'] and '' != self.params['url_params']['popcornsubtitles_url']: subProvidersList.append(popcornsubtitles) if 'hr' == defaultLang: subProvidersList.append(prijevodi) if 'el' == defaultLang: subProvidersList.append(subtitlesgr) if 'ro' == defaultLang: subProvidersList.append(subsro) if 'pl' == defaultLang: subProvidersList.append(napisy24pl) if IsSubtitlesParserExtensionCanBeUsed(): subProvidersList.append(napiprojektpl) subProvidersList.append(openSubtitles2) subProvidersList.append(openSubtitles3) subProvidersList.append(openSubtitles) subProvidersList.append(podnapisinet) subProvidersList.append(titlovi) subProvidersList.append(subscene) if 'pl' != defaultLang: subProvidersList.append(napisy24pl) if IsSubtitlesParserExtensionCanBeUsed(): subProvidersList.append(napiprojektpl) if 'el' != defaultLang: subProvidersList.append(subtitlesgr) if 'hr' != defaultLang: subProvidersList.append(prijevodi) if 'ro' != defaultLang: subProvidersList.append(subsro) self.currList = [] for item in subProvidersList: params = CDisplayListItem(item['title'], item.get('desc', ''), CDisplayListItem.TYPE_SUB_PROVIDER) params.privateData = {'sub_provider': item['sub_provider']} self.currList.append(params) idx = 0 selIndex = 0 for idx in range(len(self.currList)): if self.hostName == self.currList[idx].privateData['sub_provider']: selIndex = idx break self["list"].setList([(x,) for x in self.currList]) #restor previus selection if len(self.currList) > selIndex: self["list"].moveToIndex(selIndex) self.changeBottomPanel() self["headertext"].setText(self.getCategoryPath()) self["statustext"].setText("") self["list"].show() def changeBottomPanel(self): selItem = self.getSelItem() if selItem and selItem.description != '': data = selItem.description sData = data.replace('\n', '') sData = data.replace('[/br]', '\n') self["console"].setText(sData) else: self["console"].setText(_('Searching subtitles for "%s"') % self.params['movie_title']) def onSelectionChanged(self): self.changeBottomPanel() def isInWorkThread(self): return None != self.workThread and (not self.workThread.isFinished() or self.workThread.isAlive()) def getSelItem(self): currSelIndex = self["list"].getCurrentIndex() if len(self.currList) <= currSelIndex: printDBG("ERROR: getSelItem there is no item with index: %d, listOfItems.len: %d" % (currSelIndex, len(self.currList))) return None return self.currList[currSelIndex] def hideWindow(self): self.visible = False self.hide() def showWindow(self): self.visible = True self.show() def discoverInfoFromTitle(self, movieTitle=None): dInfo = {'movie_title': None, 'season': None, 'episode': None} if movieTitle == None: movieTitle = self.params.get('movie_title', '') # discovered information dInfo = {'movie_title': None, 'season': None, 'episode': None} dInfo['movie_title'] = CParsingHelper.getNormalizeStr(movieTitle) # try to guess season and episode number try: tmp = CParsingHelper.getSearchGroups(' ' + dInfo['movie_title'] + ' ', 's([0-9]+?)e([0-9]+?)[^0-9]', 2) dInfo.update({'season': int(tmp[0]), 'episode': int(tmp[1])}) except Exception: try: tmp = CParsingHelper.getSearchGroups(' ' + dInfo['movie_title'] + ' ', '[^0-9]([0-9]+?)x([0-9]+?)[^0-9]', 2) dInfo.update({'season': int(tmp[0]), 'episode': int(tmp[1])}) except Exception: pass return dInfo