def getLiveChannels(self): live = [] # live.append({ # 'slug': 'bandnews', # 'name': 'Band News', # 'logo': 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/BandNews_TV_logo_2010.svg/1200px-BandNews_TV_logo_2010.svg.png', # 'fanart': 'https://observatoriodatelevisao.bol.uol.com.br/wp-content/uploads/2015/03/BandNews.jpg', # 'thumb': 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/BandNews_TV_logo_2010.svg/1200px-BandNews_TV_logo_2010.svg.png', # 'playable': 'true', # 'plot': None, # 'id': -1, # 'channel_id': -1, # 'duration': None, # 'streamUrl': 'http://evcv.mm.uol.com.br:1935/band/bandnews/playlist.m3u8' # }) threads = [ workers.Thread(self.getGloboplayLive, live), workers.Thread(self.getGlobosatLiveChannels, live), workers.Thread(self.getGlobosatPremiumLiveChannels, live), ] [i.start() for i in threads] [i.join() for i in threads] return live
def justporno(self, url): try: r = client.request(url) s = re.findall('''source\s*src=['"]+([^'"]+)''', r) self.u = [] def request(i): try: c = client.request(i, output='headers') checks = ['video', 'mpegurl'] if any(f for f in checks if f in c['Content-Type']): self.u.append((i, int(c['Content-Length']))) except: pass threads = [] for i in s: threads.append(workers.Thread(request, i)) [i.start() for i in threads] [i.join() for i in threads] u = sorted(self.u, key=lambda x: x[1])[::-1] u = client.request(u[0][0], output='geturl') return u except: return
def fourtube(self, url): try: fourtube_ref = url self.fourtube_base = 'https://www.4tube.com' self.fourtube_embed = '/embed/%s' self.fourtube_player = '/js/player/embed/%s' self.fourtube_post = 'https://tkn.kodicdn.com/%s/desktop/%s' id = re.findall('\/([0-9]+)',url)[0] r = client.request(urlparse.urljoin(self.fourtube_base,self.fourtube_embed % id)) js = re.findall('\/player\/embed\/([^"]+)',r)[0] url = urlparse.urljoin(self.fourtube_base,self.fourtube_player % js) r = client.request(url) url_id,qual = re.compile('ajax\(url,opts\);}}\)\(([\d]+),[\d]+,\[([\d,]+)\]\);').findall(r)[0] qual = qual.replace(',','+') r = client.request(self.fourtube_post % (url_id,qual), post='', headers={'Origin': self.fourtube_base}, referer=fourtube_ref) s = re.compile('token\":\"([^"]+)').findall(r) self.u = [] def request(i): try: c = client.request(i, output='headers') checks = ['video','mpegurl'] if any(f for f in checks if f in c['Content-Type']): self.u.append((i, int(c['Content-Length']))) except: pass threads = [] for i in s: threads.append(workers.Thread(request, i)) [i.start() for i in threads] ; [i.join() for i in threads] u = sorted(self.u, key=lambda x: x[1])[::-1] u = client.request(u[0][0], output='geturl', referer=url) return u except: return
def get(self, netloc, ua, timeout): threads = [] for i in range(0, 15): threads.append(workers.Thread(self.get_cookie, netloc, ua, timeout)) [i.start() for i in threads] for i in range(0, 30): if not self.cookie == None: return self.cookie time.sleep(1)
def getDataFromExternal(self, date, progress_callback=None): channels = self.brplay.channels() threads = [] channel_programs = [] total_channels = len(channels) counter = itertools.count() fetch_from_oiplay = ADDON.getSetting('fetch.oiplay') == 'true' for channel in channels: visible = channel[ 'isFolder'] != 'true' if 'isFolder' in channel else True c = Channel(id=channel['channel_id'], title=channel['name'], logo=channel['logo'], streamUrl=channel['streamUrl'], visible=visible) if fetch_from_oiplay: programs = self.processPrograms(counter, c, date, total_channels, progress_callback) else: programs = [] threads.append( workers.Thread(self.processPrograms, programs, counter, c, date, total_channels, progress_callback)) channel_programs.append((c, programs)) if not fetch_from_oiplay: [i.start() for i in threads] [i.join() for i in threads] for channel, programs in channel_programs: yield channel for program in programs: yield program
def generic(self, url, pattern=None): try: r = client.request(url) if 'chaturbate' in url: if '.m3u8' not in r: return 'offline' if pattern: s = re.findall(r'%s' % pattern, r) else: patterns = [ r'''\s*=\s*[\'\"](http.+?)[\'\"]''', \ r'''\s*=\s*['"](http.+?)['"]''', \ r'''['"][0-9_'"]+:\s[\'\"]([^'"]+)''', \ r'''\(\w+\([\'\"]([^\'\"]*)''', \ r'''[\'\"]\w+[\'\"]:['"]([^'"]*)''', \ r'''\s*=\s*[\'\"](http.+?)[\'\"]''', \ r'''\s*:\s*[\'\"](//.+?)[\'\"]''', \ r'''\:[\'\"](\.+?)[\'\"]''', \ r'''\s*\(\s*[\'\"](http.+?)[\'\"]''', \ r'''\s*=\s*[\'\"](//.+?)[\'\"]''', \ r'''\w*:\s*[\'\"](http.+?)[\'\"]''', \ r'''\w*=[\'\"]([^\'\"]*)''', \ r'''\w*\s*=\s*[\'\"]([^\'\"]*)''', \ r'''(?s)<file>([^<]*)''', \ ] s = [] for pattern in patterns: l = re.findall(pattern, r) s += [ i for i in l if (urlparse.urlparse(i).path).strip('/').split('/') [-1].split('.')[-1] in ['mp4', 'flv', 'm3u8'] ] if s: s = [ i for i in s if (urlparse.urlparse(i).path).strip('/').split('/') [-1].split('.')[-1] in ['mp4', 'flv', 'm3u8'] ] else: s = client.parseDOM(r, 'source', ret='src', attrs={'type': 'video.+?'}) if not s: log_utils.log( 'Error resolving %s :: Error: %s' % (url, str(e)), log_utils.LOGERROR) return s = ['http:' + i if i.startswith('//') else i for i in s] s = [ urlparse.urljoin(url, i) if not i.startswith('http') else i for i in s ] s = [x for y, x in enumerate(s) if x not in s[:y]] self.u = [] def request(i): try: i = i.replace(' ', '%20') c = client.request(i, output='headers', referer=url) checks = ['video', 'mpegurl', 'html'] if any(f for f in checks if f in c['Content-Type']): self.u.append((i, int(c['Content-Length']))) except: pass threads = [] for i in s: threads.append(workers.Thread(request, i)) [i.start() for i in threads] [i.join() for i in threads] u = sorted(self.u, key=lambda x: x[1])[::-1] mobile_mode = kodi.get_setting('mobile_mode') if mobile_mode == 'true': u = client.request(u[-1][0], output='geturl', referer=url) else: u = client.request(u[0][0], output='geturl', referer=url) log_utils.log('Returning %s from XXX-O-DUS Resolver' % str(u), log_utils.LOGNOTICE) return u except Exception as e: log_utils.log('Error resolving %s :: Error: %s' % (url, str(e)), log_utils.LOGERROR)
def video_list(self, cid, url, pagination): try: result = client.request(url) result = json.loads(result) items = result['items'] except: pass for i in range(1, 5): try: if pagination == True: raise Exception() if not 'nextPageToken' in result: raise Exception() page = url + '&pageToken=' + result['nextPageToken'] result = client.request(page) result = json.loads(result) items += result['items'] except: pass try: if pagination == False: raise Exception() next = cid + '&pageToken=' + result['nextPageToken'] except: next = '' for item in items: try: title = item['snippet']['title'] title = title.encode('utf-8') try: url = item['snippet']['resourceId']['videoId'] except: url = item['id']['videoId'] url = url.encode('utf-8') image = item['snippet']['thumbnails']['high']['url'] if '/default.jpg' in image: raise Exception() image = image.encode('utf-8') append = {'title': title, 'url': url, 'image': image} if not next == '': append['next'] = next self.list.append(append) except: pass try: u = [ range(0, len(self.list))[i:i + 50] for i in range(len(range(0, len(self.list))))[::50] ] u = [','.join([self.list[x]['url'] for x in i]) for i in u] u = [self.content_link % i + self.key_link for i in u] threads = [] for i in range(0, len(u)): threads.append(workers.Thread(self.thread, u[i], i)) self.data.append('') [i.start() for i in threads] [i.join() for i in threads] items = [] for i in self.data: items += json.loads(i)['items'] except: pass for item in range(0, len(self.list)): try: vid = self.list[item]['url'] self.list[item]['url'] = self.play_link % vid d = [(i['id'], i['contentDetails']) for i in items] d = [i for i in d if i[0] == vid] d = d[0][1]['duration'] duration = 0 try: duration += 60 * 60 * int(re.findall('(\d*)H', d)[0]) except: pass try: duration += 60 * int(re.findall('(\d*)M', d)[0]) except: pass try: duration += int(re.findall('(\d*)S', d)[0]) except: pass duration = str(duration) self.list[item]['duration'] = duration except: pass return self.list
def getLiveChannels(self): live = [] # live.append({ # 'slug': 'bandnews', # 'name': 'Band News', # 'logo': 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/BandNews_TV_logo_2010.svg/1200px-BandNews_TV_logo_2010.svg.png', # 'fanart': 'https://observatoriodatelevisao.bol.uol.com.br/wp-content/uploads/2015/03/BandNews.jpg', # 'thumb': 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/BandNews_TV_logo_2010.svg/1200px-BandNews_TV_logo_2010.svg.png', # 'playable': 'true', # 'plot': None, # 'id': -1, # 'channel_id': -1, # 'duration': None, # 'streamUrl': 'https://evpp.mm.uol.com.br/geob_band/bandnewstv/playlist.m3u8' # }) if ADDON.getSetting('channels.globoplay') == 'true': live.append({ 'slug': 'futura', 'name': 'Futura', 'fanart': 'http://static.futuraplay.org/img/og-image.jpg', 'thumb': 'https://live-thumbs.video.globo.com/futura24ha/snapshot/', 'logo': 'https://oisa.tmsimg.com/assets/s20386_h3_aa.png', 'playable': 'true', 'id': 4500346, 'channel_id': 1985, 'live': True, 'livefeed': 'false', # use vod player 'brplayprovider': 'globoplay', 'anonymous': True }) live.append({ 'slug': 'sbt', 'name': 'SBT Rio', 'logo': 'https://www.sbt.com.br/assets/images/logo-sbt.png', 'fanart': 'https://i.ytimg.com/vi/Sut2YB6U5fk/maxresdefault.jpg', 'thumb': 'https://i.ytimg.com/vi/Sut2YB6U5fk/maxresdefault.jpg', 'playable': 'true', 'plot': None, 'id': -3, 'channel_id': -3, 'duration': None, # 'streamUrl': 'plugin://plugin.video.youtube/play/?channel_id=UCsRfBAspa72ExrsN347W2xg&live=1' 'streamUrl': youtube.geturl( 'https://www.youtube.com/channel/UCsRfBAspa72ExrsN347W2xg/live' ) }) live.append({ 'slug': 'record news', 'name': 'Record News', 'logo': 'https://oisa.tmsimg.com/assets/s38709_h3_aa.png', 'fanart': 'https://oisa.tmsimg.com/assets/s38709_h3_aa.png', 'thumb': 'https://oisa.tmsimg.com/assets/s38709_h3_aa.png', 'playable': 'true', 'plot': None, 'id': -7, 'channel_id': -7, 'duration': None, 'streamUrl': youtube.geturl( 'https://www.youtube.com/channel/UCuiLR4p6wQ3xLEm15pEn1Xw/live' ) }) if ADDON.getSetting('channels.youtube') == 'true': live.append({ 'slug': 'justica', 'name': u'TV JUSTIÇA', 'logo': 'https://oisa.tmsimg.com/assets/s76237_h3_aa.png', 'fanart': 'https://yt3.ggpht.com/a-/ACSszfHWaYyZbKI54Ws8EsUYOZVLcc_ID2R_LlykCw=s900-mo-c-c0xffffffff-rj-k-no', 'thumb': 'https://yt3.ggpht.com/a-/ACSszfHWaYyZbKI54Ws8EsUYOZVLcc_ID2R_LlykCw=s900-mo-c-c0xffffffff-rj-k-no', 'playable': 'true', 'plot': None, 'id': -4, 'channel_id': -4, 'duration': None, # 'streamUrl': 'plugin://plugin.video.youtube/?action=play_video&videoid=3-7mJteOsxY' 'streamUrl': youtube.geturl( 'https://www.youtube.com/channel/UC0qlZ5jxxueKNzUERcrllNw/live' ) }) live.append({ 'slug': 'senado', 'name': 'TV Senado', 'logo': 'https://oisa.tmsimg.com/assets/s38060_h3_aa.png', 'fanart': 'https://yt3.ggpht.com/a-/ACSszfF-djZe6A1gCCr3q_aUQosHwe3dyTTHVFrXcw=s900-mo-c-c0xffffffff-rj-k-no', 'thumb': 'https://yt3.ggpht.com/a-/ACSszfF-djZe6A1gCCr3q_aUQosHwe3dyTTHVFrXcw=s900-mo-c-c0xffffffff-rj-k-no', 'playable': 'true', 'plot': None, 'id': -5, 'channel_id': -5, 'duration': None, # 'streamUrl': 'plugin://plugin.video.youtube/?action=play_video&videoid=Duvz4PaR7Gw' 'streamUrl': youtube.geturl( 'https://www.youtube.com/user/TVSenadoOficial/live') }) live.append({ 'slug': 'shoptime', 'name': 'Shoptime', 'logo': 'https://oisa.tmsimg.com/assets/s16398_h3_aa.png', 'fanart': 'https://images-shoptime.b2w.io/zion/manifest/icons/5d7e972cec3c839ef0f8ab8cdd7cdb42.opengraph-image.png', 'thumb': 'https://images-shoptime.b2w.io/zion/manifest/icons/5d7e972cec3c839ef0f8ab8cdd7cdb42.opengraph-image.png', 'playable': 'true', 'plot': None, 'id': -6, 'channel_id': -6, 'duration': None, # 'streamUrl': 'plugin://plugin.video.youtube/?action=play_video&videoid=qJ1QpbHn2Bk' 'streamUrl': youtube.geturl( 'https://www.youtube.com/user/CanalShoptime/live') }) threads = [] if ADDON.getSetting('channels.globoplay') == 'true': threads.append(workers.Thread(self.getGloboplayLive, live)) if ADDON.getSetting('channels.globosatplay') == 'true': threads.append(workers.Thread(self.getGlobosatLiveChannels, live)) if ADDON.getSetting('channels.premium') == 'true': threads.append( workers.Thread(self.getGlobosatPremiumLiveChannels, live)) if ADDON.getSetting('channels.premierefc') == 'true': threads.append(workers.Thread(self.getPremiereFcLiveChannel, live)) if ADDON.getSetting('channels.oiplay') == 'true': threads.append(workers.Thread(self.getOiPlayLiveChannels, live)) [i.start() for i in threads] [i.join() for i in threads] return live