def InitialiseRTMP(self, soup): self.log(u"", xbmc.LOGDEBUG) try: flowPlayerScript = unicode( soup.find(u'div', { u'id': u'flowPlayer' }).findNextSibling(u'script').text) rtmpStr = utils.findString(u"TV3Provider::InitialiseRTMP()", u"netConnectionUrl: \"(.+?)\"", flowPlayerScript) rootIndex = rtmpStr[8:].index(u'/') + 9 app = rtmpStr[rootIndex:] swfUrl = self.GetSWFPlayer(flowPlayerScript) playPath = utils.findString( u"TV3Provider::InitialiseRTMP()", u"playlist:\s+\[\s+{\s+url:\s+\"(.+?)\"", flowPlayerScript) rtmpVar = rtmp.RTMP(rtmp=rtmpStr, app=app, swfVfy=swfUrl, playPath=playPath) self.AddSocksToRTMP(rtmpVar) return rtmpVar except (Exception) as exception: if not isinstance(exception, LoggingException): exception = LoggingException.fromException(exception) # Error getting RTMP data exception.addLogMessage(self.language(30057)) raise exception
def InitialiseRTMP(self, assetUrl): self.log(u'assetUrl: %s' % assetUrl, xbmc.LOGDEBUG) # Get the stream info (streamUri, auth) = self.GetStreamInfo(assetUrl) self.log(u'streamUri: %s' % streamUri, xbmc.LOGDEBUG) url = re.search(u'(.*?)mp4:', streamUri).group(1) app = re.search(u'.com/(.*?)mp4:', streamUri).group(1) playPath = re.search(u'(mp4:.*)', streamUri).group(1) if "ll." not in streamUri: app = app + u"?ovpfv=1.1&" + auth else: playPath += "?" + auth self.log(u'url: %s' % url, xbmc.LOGDEBUG) swfPlayer = self.GetSwfPlayer() port = None if self.addon.getSetting('rtmp_port_alt') == "true": port = 443 rtmpvar = rtmp.RTMP(rtmp=url, app=app, swfVfy=swfPlayer, playPath=playPath, pageUrl=urlRoot, port=port) return rtmpvar
def PlayLiveTV(self, html, dummy): """ <li class="first-live-channel selected-channel"> <a href="/player/ie/live/8/" class="live-channel-container"> <span class="sprite live-logo-rte-one">RTÉ One</span> <span class="sprite live-channel-now-playing">Playing</span> <span class="live-channel-info"><span class="live-time">Now:</span>The Works</span> <span class="live-channel-info"><span class="live-time">Next:</span>RTÉ News: Nine O'Clock and Weather (21:00)</span></a> </li> """ self.log(u"", xbmc.LOGDEBUG) swfPlayer = self.GetLiveSWFPlayer() liveChannels = { u'RT\xc9 One' : u'rte1', u'RT\xc9 Two' : u'rte2', u'RT\xc9jr': u'rtejr', u'RT\xc9 News Now' : u'newsnow' } try: soup = BeautifulSoup(html, selfClosingTags=[u'img']) #liveTVInfo = soup.find('span', 'sprite live-channel-now-playing').parent liveTVInfo = soup.find('li', 'selected-channel') channel = liveTVInfo.find('span').string programme = liveTVInfo.find('span', 'live-channel-info').next.nextSibling programme = self.fullDecode(programme).replace(''', "'") infoLabels = {u'Title': channel + u": " + programme } thumbnailPath = self.GetThumbnailPath((channel.replace(u'RT\xc9 ', '')).replace(' ', '')) rtmpStr = u"rtmp://fmsod.rte.ie/live/" app = u"live" swfVfy = swfPlayer playPath = liveChannels[channel] rtmpVar = rtmp.RTMP(rtmp = rtmpStr, app = app, swfVfy = swfVfy, playPath = playPath, live = True) self.AddSocksToRTMP(rtmpVar) self.Play(infoLabels, thumbnailPath, rtmpVar) return True except (Exception) as exception: if not isinstance(exception, LoggingException): exception = LoggingException.fromException(exception) if html is not None: msg = "html:\n\n%s\n\n" % html exception.addLogMessage(msg) # Error playing live TV exception.addLogMessage(self.language(30053)) exception.process(severity = self.logLevel(xbmc.LOGERROR)) return False
def GetPlayListDetailsFromAMF(self, mediaDTO, appFormat, episodeId, live): # ondemand?videoId=2160442511001&lineUpId=&pubId=1290862567001&playerId=1364138050001&affiliateId= app = appFormat % (episodeId, self.publisherId, self.playerId) # rtmp://cp156323.edgefcs.net/ondemand/&mp4:videos/1290862567001/1290862567001_2666234305001_WCL026718-2-4.mp4 rtmpUrl = mediaDTO['FLVFullLengthURL'] playPathIndex = rtmpUrl.index(u'&') + 1 playPath = rtmpUrl[playPathIndex:] rtmpUrl = rtmpUrl[:playPathIndex - 1] rtmpVar = rtmp.RTMP(rtmp = rtmpUrl, playPath = playPath, app = app, swfUrl = self.swfUrl, tcUrl = rtmpUrl, pageUrl = urlRoot, live = live) self.AddSocksToRTMP(rtmpVar) #partNumberTitle = "" #partNumberFile = "" if self.totalParts == 0: self.totalParts = int(mediaDTO[u'customFields'][u'totalparts']) if self.totalParts != 1: partNumber = int(mediaDTO[u'customFields'][u'part']) if partNumber == 1: self.referenceId = mediaDTO[u'referenceId'] #partNumberTitle = " (%d/%d)" % (partNumber, self.totalParts) if self.languageCode == u'ie': longDescription = mediaDTO[u'customFields'][u'longdescgaeilge'] else: if u'longDescription' in mediaDTO: longDescription = mediaDTO[u'longDescription'] else: longDescription = mediaDTO[u'shortDescription'] pattern="\d+" match=re.search(pattern,mediaDTO[u'customFields'][u'episode']) episodeNumber = int(match.group(0)) # Set up info for "Now Playing" screen infoLabels = { u'Title': mediaDTO[u'displayName'], u'Plot': mediaDTO[u'shortDescription'], u'PlotOutline': longDescription, u'tvshowtitle': mediaDTO[u'customFields'][u'seriestitle'], u'genre': mediaDTO[u'customFields'][u'category_c'], # u'mpaa': mediaDTO[u'customFields'][u'rating'], u'episode': episodeNumber, u'season': int(mediaDTO[u'customFields'][u'series']), u'aired': mediaDTO[u'customFields'][u'date'] } logo = mediaDTO[u'videoStillURL'] defaultFilename = mediaDTO[u'displayName'] return (infoLabels, logo, rtmpVar, defaultFilename)
def PlayEpisode(self, episodeId, resumeFlag): self.log(u"%s" % episodeId, xbmc.LOGDEBUG) # "Getting SWF url" self.dialog.update(5, self.language(30089)) swfPlayer = self.GetSWFPlayer() try: if self.dialog.iscanceled(): return False # "Getting episode web page" self.dialog.update(15, self.language(30090)) feedProcessStatus = 0 html = None html = self.httpManager.GetWebPage(showUrl % episodeId, 20000) soup = BeautifulSoup(html, selfClosingTags=[u'img']) feedsPrefix = soup.find(u'meta', {u'name': u"feeds-prefix"})[u'content'] if self.dialog.iscanceled(): return False # "Getting episode info" self.dialog.update(25, self.language(30084)) infoLabels = self.GetEpisodeInfo(episodeId, soup) thumbnail = self.GetThumbnailFromEpisode(episodeId, soup) urlGroups = None feedProcessStatus = 1 if self.dialog.iscanceled(): return False # "Getting playpath data" self.dialog.update(35, self.language(30091)) urlGroups = self.GetStringFromURL( feedsPrefix + episodeId, u"\"url\": \"(/[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9]/)([a-zA-Z0-9]+/)?(.+).f4m\"", 20000) feedProcessStatus = 2 if urlGroups is None: # Log error self.log(u"urlGroups is None", xbmc.LOGERROR) return False (urlDateSegment, extraSegment, urlSegment) = urlGroups rtmpStr = u"rtmpe://fmsod.rte.ie:1935/rtevod" app = u"rtevod" swfVfy = swfPlayer playPath = u"mp4:%s%s/%s_512k.mp4" % (urlDateSegment, urlSegment, urlSegment) playURL = u"%s app=%s playpath=%s swfurl=%s swfvfy=true" % ( rtmp, app, playPath, swfVfy) rtmpVar = rtmp.RTMP(rtmp=rtmpStr, app=app, swfVfy=swfVfy, playPath=playPath) self.AddSocksToRTMP(rtmpVar) defaultFilename = self.GetDefaultFilename(infoLabels[u'Title'], episodeId) self.log(u"(%s) playUrl: %s" % (episodeId, playURL), xbmc.LOGDEBUG) return self.PlayOrDownloadEpisode(infoLabels, thumbnail, rtmpVar, defaultFilename, url=None, subtitles=None, resumeKey=episodeId, resumeFlag=resumeFlag) except (Exception) as exception: if not isinstance(exception, LoggingException): exception = LoggingException.fromException(exception) if html is not None: msg = "html:\n\n%s\n\n" % html exception.addLogMessage(msg) if feedProcessStatus == 1: # Exception while getting data from feed try: feedUrl = 'http://feeds.rasset.ie/rteavgen/player/playlist/?itemId=%s&type=iptv&format=xml' % episodeId html = self.httpManager.GetWebPageDirect(feedUrl) msg = "html:\n\n%s\n\n" % html exception.addLogMessage(msg) except: exception.addLogMessage("Execption getting " + feedUrl) try: feedUrl = 'http://feeds.rasset.ie/rteavgen/player/playlist/?itemId=%s&type=iptv1&format=xml' % episodeId html = self.httpManager.GetWebPageDirect(feedUrl) msg = "html:\n\n%s\n\n" % html exception.addLogMessage(msg) except: exception.addLogMessage("Execption getting " + feedUrl) # Error playing or downloading episode %s exception.addLogMessage(self.language(30051) % episodeId) # Error playing or downloading episode %s exception.process( self.language(30051) % ' ', '', self.logLevel(xbmc.LOGERROR)) return False
def PlayChannel(self, channel, logo): """ RTE 1 jQuery110109518442715161376_1395526161546( { "player":"Get player here from post ", "data":{ "post_id":"17", "freebie":true, "auth":true, "magonly":false, "channel":"RT\u00c9 One", "internal":"off", "streamname":"", "free":true, "videoId":"rte-one", "publisherId":"1242843906001", "playerId":"1454761980001", "playerKey":"AQ~~,AAABIV9E_9E~,lGDQr89oSbKT02RqV22r-E007AitVINH", "appStreamUrl":"", "show":"The Saturday Night Show" }, "flag":"new" }) """ try: jsonData = None values = [{u'api':u'player'}, {u'type':u'name'}, {u'val':channel}] url = self.GetAPIUrl(values) # "Getting channel information" self.dialog.update(10, self.language(30107)) jsonData = self.httpManager.GetWebPage(url, 20000) playerJSON=_json.loads(jsonData) self.log(u"json data:" + unicode(playerJSON)) playerId = playerJSON[u'data'][u'playerId'] publisherId = playerJSON[u'data'][u'publisherId'] playerKey = playerJSON[u'data'][u'playerKey'] viewExperienceUrl = urlRoot + u'/#' + channel #streamType = unicode(self.addon.getSetting( u'AerTV_stream_type' )) #self.log(u"Stream type setting: " + streamType) try: if self.dialog.iscanceled(): return False # "Getting stream url" self.dialog.update(25, self.language(30087)) streamUrl = self.GetStreamUrl(playerKey, viewExperienceUrl, playerId, contentRefId = channel) self.log(u"streamUrl: %s" % streamUrl) except (Exception) as exception: if not isinstance(exception, LoggingException): exception = LoggingException.fromException(exception) self.log(u" channel: %s" % channel) # Error getting rtmp url. exception.addLogMessage(self.language(30066)) # Cannot play video stream raise exception if self.dialog.iscanceled(): return False # "Getting \"Now Playing\" data self.dialog.update(35, self.language(30088)) # Set up info for "Now Playing" screen infoLabels = self.GetInfoLabels(playerJSON) #RTMP if streamUrl.upper().startswith(self.language(30081)): playPathIndex = streamUrl.index(u'&') + 1 playPath = streamUrl[playPathIndex:] qsData = self.GetQSData(channel, playerId, publisherId, playerKey) swfUrl = self.GetSwfUrl(qsData) pageUrl = urlRoot if u'videoId' in playerJSON[u'data']: videoId = playerJSON[u'data'][u'videoId'] else: videoId = playerJSON[u'data'][u'offset'][u'videos'][0] app = u"rtplive?videoId=%s&lineUpId=&pubId=%s&playerId=%s" % (videoId, publisherId, playerId) rtmpVar = rtmp.RTMP(rtmp = streamUrl, app = app, swfUrl = swfUrl, playPath = playPath, pageUrl = pageUrl, live = True) self.AddSocksToRTMP(rtmpVar) self.Play(infoLabels, logo, rtmpVar) else: self.Play(infoLabels, logo, url = streamUrl) return True except (Exception) as exception: if not isinstance(exception, LoggingException): exception = LoggingException.fromException(exception) if jsonData is not None: msg = u"jsonData:\n\n%s\n\n" % jsonData exception.addLogMessage(msg) # Error preparing or playing stream exception.addLogMessage(self.language(30066)) exception.process(severity = self.logLevel(xbmc.LOGERROR)) return False