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
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
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