示例#1
0
    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
示例#2
0
    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
示例#3
0
    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&#39;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('&#39;', "'")

            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
示例#4
0
    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)
示例#5
0
    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
示例#6
0
    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