def getLinksForVideo(self, cItem):
     printDBG("KissCartoonMe.getLinksForVideo [%s]" % cItem)
     urlTab = []
     
     sts, data = self.getPage(cItem['url']) 
     if not sts: return urlTab
     
     tmpTab = self.cm.ph.getAllItemsBeetwenMarkers(data, 'asp.wrap(', ')', False)
     for tmp in tmpTab:
         tmp = tmp.strip()
         if tmp.startswith('"'):
             tmp = tmp[1:-1]
         else:
             tmp = self.cm.ph.getSearchGroups(data, '''var %s =[^'^"]*?["']([^"^']+?)["']''')[0]
         if tmp == '': continue
         try:
             tmp = base64.b64decode(tmp)
             tmp = self.cm.ph.getAllItemsBeetwenMarkers(tmp, '<a ', '</a>')
             for item in tmp:
                 url  = self.cm.ph.getSearchGroups(item, '''href="([^"]+?)"''')[0]
                 if 'googlevideo.com' not in url: continue
                 name = self.cleanHtmlStr(item)
                 urlTab.append({'name':name, 'url':url, 'need_resolve':0})
         except:
             printExc()
             continue
     
     tmpTab = self.cm.ph.getDataBeetwenMarkers(data, '<select id="selectQuality">', '</select>', False)
     tmpTab = self.cm.ph.getAllItemsBeetwenMarkers(data, '<option', '</option>')
     for item in tmpTab:
         url  = self.cm.ph.getSearchGroups(item, '''value="([^"]+?)"''')[0]
         if '' == url: continue
         try:
             url = base64.b64decode(url)
         except:
             continue
         if '://' not in url: continue
         name = self.cleanHtmlStr(item)
         urlTab.append({'name':name, 'url':url, 'need_resolve':0})
         
     if 0 < len(urlTab):
         max_bitrate = int(config.plugins.iptvplayer.kisscartoon_defaultformat.value)
         def __getLinkQuality( itemLink ):
             try:
                 return int(self.cm.ph.getSearchGroups('|'+itemLink['name']+'|', '[^0-9]([0-9]+?)[^0-9]')[0])
             except: return 0
         urlTab = CSelOneLink(urlTab, __getLinkQuality, max_bitrate).getBestSortedList()         
         
     data = self.cm.ph.getAllItemsBeetwenMarkers(data, '<iframe ', '>', withMarkers=True, caseSensitive=False)
     for item in data:
         url  = self.cm.ph.getSearchGroups(item, '''<iframe[^>]+?src=['"]([^'^"]+?)['"]''',  grupsNum=1, ignoreCase=True)[0]
         url = self._getFullUrl(url)
         if url.startswith('http') and 'facebook.com' not in url and 1 == self.up.checkHostSupport(url):
             urlTab.append({'name': self.up.getHostName(url), 'url':url, 'need_resolve':1})
             
     return urlTab
Ejemplo n.º 2
0
def getDirectM3U8Playlist(M3U8Url,
                          checkExt=True,
                          variantCheck=True,
                          cookieParams={},
                          checkContent=False,
                          sortWithMaxBitrate=-1,
                          mergeAltAudio=True):
    if checkExt and not M3U8Url.split('?', 1)[0].endswith('.m3u8'):
        return []

    cm = common()
    meta = strwithmeta(M3U8Url).meta
    params, postData = cm.getParamsFromUrlWithMeta(M3U8Url)
    params.update(cookieParams)

    retPlaylists = []
    try:
        finallM3U8Url = meta.get('iptv_m3u8_custom_base_link', '')
        if '' == finallM3U8Url:
            params['with_metadata'] = True
            sts, data = cm.getPage(M3U8Url, params, postData)
            finallM3U8Url = data.meta['url']
        else:
            sts, data = cm.getPage(M3U8Url, params, postData)
            data = data.strip()

        m3u8Obj = m3u8.inits(data, finallM3U8Url)
        if m3u8Obj.is_variant:
            for playlist in m3u8Obj.playlists:
                item = {}
                if not variantCheck or playlist.absolute_uri.split(
                        '?')[-1].endswith('.m3u8'):
                    meta.update({
                        'iptv_proto': 'm3u8',
                        'iptv_bitrate': playlist.stream_info.bandwidth
                    })
                    item['url'] = strwithmeta(playlist.absolute_uri, meta)
                else:
                    meta.pop('iptv_proto', None)
                    item['url'] = decorateUrl(playlist.absolute_uri, meta)

                item['bitrate'] = playlist.stream_info.bandwidth
                if None != playlist.stream_info.resolution:
                    item['with'] = playlist.stream_info.resolution[0]
                    item['heigth'] = playlist.stream_info.resolution[1]
                else:
                    item['with'] = 0
                    item['heigth'] = 0

                item['width'] = item['with']
                item['height'] = item['heigth']
                try:
                    tmpCodecs = playlist.stream_info.codecs.split(',')
                    codecs = []
                    for c in tmpCodecs[::-1]:
                        codecs.append(c.split('.')[0].strip())
                        item['codecs'] = ','.join(codecs)
                except Exception:
                    item['codecs'] = None

                item['name']  = "bitrate: %s res: %dx%d %s" % (item['bitrate'], \
                                                               item['width'], \
                                                               item['height'], \
                                                               item['codecs'] )
                if mergeAltAudio and playlist.alt_audio_streams and item[
                        'url'].meta.get('iptv_proto') == 'm3u8':
                    for audio_stream in playlist.alt_audio_streams:
                        audioUrl = strwithmeta(audio_stream.absolute_uri,
                                               item['url'].meta)
                        altItem = dict(item)
                        altItem['name'] = '[%s] %s' % (audio_stream.name,
                                                       altItem['name'])
                        altItem['url'] = decorateUrl(
                            "merge://audio_url|video_url", {
                                'audio_url': audioUrl,
                                'video_url': altItem['url'],
                                'ff_out_container': 'mpegts',
                                'prefered_merger': 'hlsdl'
                            })
                        retPlaylists.append(altItem)
                else:
                    item['alt_audio_streams'] = playlist.alt_audio_streams
                    retPlaylists.append(item)

            if sortWithMaxBitrate > -1:

                def __getLinkQuality(itemLink):
                    try:
                        return int(itemLink['bitrate'])
                    except Exception:
                        printExc()
                        return 0

                retPlaylists = CSelOneLink(
                    retPlaylists, __getLinkQuality,
                    sortWithMaxBitrate).getSortedLinks()
        else:
            if checkContent and 0 == len(m3u8Obj.segments):
                return []
            item = {
                'name': 'm3u8',
                'url': M3U8Url,
                'codec': 'unknown',
                'with': 0,
                'heigth': 0,
                'width': 0,
                'height': 0,
                'bitrate': 'unknown'
            }
            retPlaylists.append(item)
    except Exception:
        printExc()
    return retPlaylists
Ejemplo n.º 3
0
    def getLinksForVideo(self, cItem):
        printDBG("TED.getLinksForVideo [%s]" % cItem)
        subTracks = []
        urlTab = []

        #cItem['url'] = 'https://www.ted.com/talks/douglas_adams_parrots_the_universe_and_everything'

        sts, data = self.getPage(cItem['url'])
        if not sts:
            return []

        def _addLinkItem(urlTab, item, url, namePrefix=''):
            try:
                if not self.cm.isValidUrl(url) and not url.startswith(
                        'merge://'):
                    return
                if 'width' in item and 'height' in item:
                    name = '%sx%s (%s)' % (item['width'], item['height'],
                                           item['bitrate'])
                else:
                    name = item.get('name', str(item['bitrate']))
                bitrate = item['bitrate']
                urlTab.append({
                    'name': namePrefix + name,
                    'url': url,
                    'bitrate': bitrate,
                    'need_resolve': 0
                })
            except Exception:
                printExc()

        tmp = self.cm.ph.getDataBeetwenMarkers(data, 'talkPage.init",', ')<',
                                               False)[1]
        try:
            playerData = json_loads(tmp)['__INITIAL_DATA__']
            tmp = playerData.get('media', {}).get('internal', {})
            for key in tmp:
                bitrate = self.cm.ph.getSearchGroups(key, '([0-9]+)k')[0]
                if bitrate == '':
                    continue
                item = tmp[key]
                item['bitrate'] = int(bitrate)
                if '/mp4' not in item.get('mime_type', ''):
                    continue
                _addLinkItem(urlTab, item, item.get('uri', ''))

            tmp = playerData['talks'][0]['player_talks'][0]
            rtmpTab = tmp['resources'].get('rtmp', [])
            if rtmpTab == None:
                rtmpTab = []
            for item in rtmpTab:
                url = item.get('file', '')
                if not url.startswith('mp4:'):
                    continue
                url = 'https://pc.tedcdn.com/' + url[4:]
                _addLinkItem(urlTab, item, url)

            h264Tab = tmp['resources'].get('h264', [])
            if h264Tab == None:
                h264Tab = []
            for item in h264Tab:
                _addLinkItem(urlTab, item, item['file'])

            if len(h264Tab) == 1:
                reObj = re.compile('[/\-\.]([0-9]+k)\.')
                baseMp4Url = urlTab[-1]['url']
                baseBitrate = ph.search(baseMp4Url, reObj)[0]
                hlsItem = tmp['resources'].get('hls', {})
                if hlsItem == None:
                    hlsItem = {}
                url = hlsItem.get('stream', '')
                if url == None:
                    url = ''

                tmp = getDirectM3U8Playlist(self.cm.getFullUrl(
                    url, self.cm.meta['url']),
                                            checkExt=False)
                for item in tmp:
                    url = item['url']
                    if url.startswith('merge://'):
                        url = url.meta.get('video_url', '')
                    bitrate = ph.search(url, reObj)[0]
                    url = baseMp4Url.replace(baseBitrate, bitrate)
                    printDBG(">> %s %s %s" % (url, baseMp4Url, url))
                    _addLinkItem(urlTab, item, url, '[MP4] ')
                #for item in tmp:
                #    _addLinkItem(urlTab, item, item['url'], '[HLS] ')

            def __getLinkQuality(itemLink):
                try:
                    return int(itemLink['bitrate'])
                except Exception:
                    return 0

            urlTab = CSelOneLink(urlTab, __getLinkQuality,
                                 99999999).getSortedLinks()

            if 0 == len(urlTab):
                if self.cm.isValidUrl(tmp['external']['uri']):
                    urlTab.append({
                        'name': tmp['external']['service'],
                        'url': tmp['external']['uri'],
                        'need_resolve': 1
                    })

            userLang = GetDefaultLang()
            promotItem = None
            format = 'srt'
            for item in tmp.get('languages', []):
                subUrl = 'http://www.ted.com/talks/subtitles/id/%s/lang/%s/format/%s' % (
                    tmp['id'], item['languageCode'], format)
                params = {
                    'title':
                    "%s (%s)" % (item['languageName'], item['endonym']),
                    'url': subUrl,
                    'lang': item['languageCode'],
                    'format': format
                }
                if item['languageCode'] == userLang:
                    promotItem = params
                else:
                    subTracks.append(params)

            if promotItem != None:
                subTracks.insert(0, promotItem)

            if len(subTracks):
                for idx in range(len(urlTab)):
                    urlTab[idx]['url'] = strwithmeta(
                        urlTab[idx]['url'], {'external_sub_tracks': subTracks})

        except Exception:
            printExc()

        return urlTab