def get_media_data(self, key): url = "http://etv.err.ee/services/api/media/mediaData?stream=%s" % key buggalo.addExtraData('url', url) data = self.download_url(url) if data: json_data = json.loads(data) return json_data['media']['src']['hls']
def PseudoTV(): import resources.lib.Overlay as Overlay xbmcgui.Window(10000).setProperty("PseudoTVRunning", "True") try: MyOverlayWindow = Overlay.TVOverlay("script.pseudotv.live.TVOverlay.xml", __cwd__, Skin_Select) except Exception: buggalo.addExtraData("Skin_Select = ", str(Skin_Select)) buggalo.onExceptionRaised() Error('PseudoTV Lite','Error loading "' + Skin_Select + '" skin!','Verify selected skin in settings') return for curthread in threading.enumerate(): try: log("Active Thread: " + str(curthread.name), xbmc.LOGERROR) if curthread.name != "MainThread": try: curthread.join() except: pass log("Joined " + curthread.name) except: pass del MyOverlayWindow xbmcgui.Window(10000).setProperty("PseudoTVRunning", "False")
def getVideoUrl(self,videoid): url = 'http://kanal2.ee/video/playerPlaylistApi?id=%s' % videoid buggalo.addExtraData('url', url) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() videoxml = self.downloadUrl(url) if not videoxml: raise Kanal2Exception(ADDON.getLocalizedString(203)) dl = ElementTree.fromstring(videoxml) for video in dl.findall("playlist/video"): for host in video.findall('streamItems'): videoHost = host.get('host') for stream in video.findall('streamItems/streamItem'): if __settings__.getSetting('hd') == "true": streamUrl = stream.get('streamName').replace(' ', '%20').replace('k2lq1','k2hq1') else: streamUrl = stream.get('streamName').replace(' ', '%20').replace('k2hq1','k2lq1') if not streamUrl: raise Kanal2Exception(ADDON.getLocalizedString(202)) videoUrl = '%s playpath=%s' % (videoHost,streamUrl) item = xbmcgui.ListItem(video.findtext('name'), iconImage = ICON, path = videoUrl) playlist.add(videoUrl,item) firstItem = item #start = 0 xbmcplugin.setResolvedUrl(HANDLE, True, item)
def __init__(self, nChannel): self.conn = None self.eventQueue = list() self.event = threading.Event() self.eventResults = dict() self.categoriesList = None self.source = instantiateSource() self.updateInProgress = False self.updateFailed = False self.settingsChanged = None buggalo.addExtraData('source', self.source.KEY) for key in SETTINGS_TO_CHECK: buggalo.addExtraData('setting: %s' % key, ADDON.getSetting(key)) self.channelList = list() profilePath = xbmc.translatePath(ADDON.getAddonInfo('profile')) if not os.path.exists(profilePath): os.makedirs(profilePath) self.databasePath = os.path.join(profilePath, Database.SOURCE_DB) threading.Thread(name='Database Event Loop', target=self.eventLoop).start()
def __init__(self): super(TVGuide, self).__init__() self.source = None self.notification = None self.redrawingEPG = False self.isClosing = False self.controlAndProgramList = list() self.channelIdx = 0 self.focusPoint = Point() self.epgView = EPGView() # add and removeControls were added post-eden self.hasAddControls = hasattr(self, 'addControls') self.hasRemoveControls = hasattr(self, 'removeControls') buggalo.addExtraData('hasAddControls', self.hasAddControls) buggalo.addExtraData('hasRemoveControls', self.hasRemoveControls) self.mode = MODE_EPG self.currentChannel = None self.osdChannel = None self.osdProgram = None # find nearest half hour self.viewStartDate = datetime.datetime.today() self.viewStartDate -= datetime.timedelta(minutes = self.viewStartDate.minute % 30, seconds = self.viewStartDate.second)
def __init__(self, nChannel): self.connP = None self.eventQueue = list() self.event = threading.Event() self.eventResults = dict() self.categoriesList = None self.source = instantiateSource() self.updateInProgress = False self.updateFailed = False self.settingsChanged = None buggalo.addExtraData('source', self.source.KEY) for key in SETTINGS_TO_CHECK: buggalo.addExtraData('setting: %s' % key, ADDON.getSetting(key)) self.channelList = [] self.channelDict = {} profilePath = xbmc.translatePath(ADDON.getAddonInfo('profile')) if not os.path.exists(profilePath): os.makedirs(profilePath) self.programPath = os.path.join(profilePath, Database.PROGRAM_DB) threading.Thread(name='Database Event Loop', target=self.eventLoop).start()
def getVideoUrl(self, videoid): url = 'http://kanal2.ee/video/playerPlaylistApi?id=%s' % videoid buggalo.addExtraData('url', url) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() videoxml = self.downloadUrl(url) if not videoxml: raise Kanal2Exception(ADDON.getLocalizedString(203)) dl = ElementTree.fromstring(videoxml) for video in dl.findall("playlist/video"): for host in video.findall('streamItems'): videoHost = host.get('host') for stream in video.findall('streamItems/streamItem'): if __settings__.getSetting('hd') == "true": streamUrl = stream.get('streamName').replace( ' ', '%20').replace('k2lq1', 'k2hq1') else: streamUrl = stream.get('streamName').replace( ' ', '%20').replace('k2hq1', 'k2lq1') if not streamUrl: raise Kanal2Exception(ADDON.getLocalizedString(202)) videoUrl = '%s playpath=%s' % (videoHost, streamUrl) item = xbmcgui.ListItem(video.findtext('name'), iconImage=ICON, path=videoUrl) playlist.add(videoUrl, item) firstItem = item #start = 0 xbmcplugin.setResolvedUrl(HANDLE, True, item)
def f_retry(*args, **kwargs): mtries, mdelay = tries, delay try_one_last_time = True while mtries >= -1: if mtries == -1: dialog = xbmcgui.Dialog() ret = dialog.yesno(plugin, settings.getLocalizedString( 30054 ), '', '', settings.getLocalizedString( 30052 ), settings.getLocalizedString( 30053 )) if ret == False: mtries, mdelay = tries, delay else: ok = dialog.ok(plugin, settings.getLocalizedString( 30051 )) buggalo.addExtraData('error', str(e)) raise Exception("retry Error") try: return f(*args, **kwargs) try_one_last_time = False break except ExceptionToCheck, e: if mtries >= 1: msg = "%s, Retrying in %d seconds..." % (str(e), mdelay) if logger: logger.warning(msg) else: print msg time.sleep(mdelay) mdelay *= backoff mtries -= 1
def f_retry(*args, **kwargs): mtries, mdelay = tries, delay try_one_last_time = True while mtries >= -1: if mtries == -1: dialog = xbmcgui.Dialog() ret = dialog.yesno(plugin, settings.getLocalizedString(30054), '', '', settings.getLocalizedString(30052), settings.getLocalizedString(30053)) if ret == False: mtries, mdelay = tries, delay else: ok = dialog.ok(plugin, settings.getLocalizedString(30051)) buggalo.addExtraData('error', str(e)) raise Exception("retry Error") try: return f(*args, **kwargs) try_one_last_time = False break except ExceptionToCheck, e: if mtries >= 1: msg = "%s, Retrying in %d seconds..." % (str(e), mdelay) if logger: logger.warning(msg) else: print msg time.sleep(mdelay) mdelay *= backoff mtries -= 1
def listSchedule(self,channel,date): year,month,day = date.split("-") url = 'http://%s.err.ee/api/loader/GetTimelineDay/?year=%s&month=%s&day=%s' % (channel,year,month,day) buggalo.addExtraData('url', url) html = self.downloadUrl(url) if not html: raise EtvException(ADDON.getLocalizedString(203)) html = json.loads(html) items = list() for s in html: if s['Image']: fanart = 'http://static.err.ee/gridfs/%s?width=720' % s['Image'] else: fanart = FANART title = s['Header'] plot = s['Lead'] infoLabels = { 'plot' : plot, 'title' : title } item = xbmcgui.ListItem(title, iconImage = fanart) item.setInfo('video', infoLabels) item.setProperty('IsPlayable', 'true') item.setProperty('Fanart_Image', fanart) items.append((PATH + '?vaata=%s' % s['Id'], item)) xbmc.executebuiltin("Container.SetViewMode(500)") xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_UNSORTED) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def listSaade(self,seeria,saade): if saade != 'show-category-single-files': url = URL + 'seeria/' + saade + '/' + seeria + '/' + ARCHIVE_ID + '/date-desc/koik' else: url = URL + saade + '/' + seeria + '/' + ARCHIVE_ID + '/date-desc/koik' buggalo.addExtraData('url', url) html = self.downloadUrl(url) items = list() for s in re.finditer('/vaata/([^"]+)">([^<]+)<.*fileDateInList">\(([^)]+)\)',html): title = s.group(2) date = s.group(3) infoLabels = { 'date' : date, 'title' : title } item = xbmcgui.ListItem(title, iconImage = FANART) item.setInfo('video', infoLabels) item.setProperty('IsPlayable', 'true') item.setProperty('Fanart_Image', FANART) items.append((PATH + '?vaata=%s' % s.group(1), item)) xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_DATE) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def get_video_url(self, videoid): """Get actual video file and start playing.""" url = 'https://kanal2.postimees.ee/pluss/video/?id=%s' % videoid buggalo.addExtraData('url', url) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() html = self.download_url(url) if not html: raise Kanal2Exception(ADDON.getLocalizedString(203)) init = re.search("initK2Player.*\', \'episodes\', \'%s\', \'([^\']+)\'\);" % videoid, html, re.DOTALL) try: if init.group(1): dataurl = self.download_url("http://kanal2.postimees.ee/player/playlist/%s?type=episodes" % videoid, True) data = json.loads(dataurl) if not data: raise Kanal2Exception(ADDON.getLocalizedString(202)) videoUrl = "https://kanal-vod.babahhcdn.com/bb1037/_definst_/smil:kanal2/%s/playlist.m3u8?t=%s" % ( data['data']['file'], init.group(1)) infoLabels = { 'title': data['info']['subtitle'], 'plot': data['info']['description'] } item = xbmcgui.ListItem(data['info']['subtitle'], iconImage=ICON, path=videoUrl) item.setInfo('video', infoLabels) playlist.add(videoUrl, item) except AttributeError: raise Kanal2Exception(ADDON.getLocalizedString(204)) # start = 0 xbmcplugin.setResolvedUrl(HANDLE, True, item)
def listSaade(self, seeria, saade): if saade != 'show-category-single-files': url = URL + 'seeria/' + saade + '/' + seeria + '/' + ARCHIVE_ID + '/date-desc/koik' else: url = URL + saade + '/' + seeria + '/' + ARCHIVE_ID + '/date-desc/koik' buggalo.addExtraData('url', url) html = self.downloadUrl(url) items = list() for s in re.finditer( '/vaata/([^"]+)">([^<]+)<.*fileDateInList">\(([^)]+)\)', html): title = s.group(2) date = s.group(3) infoLabels = {'date': date, 'title': title} item = xbmcgui.ListItem(title, iconImage=FANART) item.setInfo('video', infoLabels) item.setProperty('IsPlayable', 'true') item.setProperty('Fanart_Image', FANART) items.append((PATH + '?vaata=%s' % s.group(1), item)) xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_DATE) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def play_live_stream(self, streamurl): buggalo.addExtraData('url', streamurl) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() playlist.add(streamurl) xbmc.Player().play(streamurl)
def get_media_location(self, key): url = "https://etv.err.ee/api/tv/getTvPageData?contentId=%s&contentOnly=true" % key buggalo.addExtraData('url', url) html = self.download_url(url) if html: html = json.loads(html) url = html['showInfo']['media']['src']['hls'] sub = [] languages = [] languages.extend(( self.get_subtitle_language(__settings__.getSetting('primaryLanguage')), self.get_subtitle_language(__settings__.getSetting('secondaryLanguage')) )) try: for language in languages: for subtitle in html['showInfo']['media']['subtitles']: if subtitle['srclang'] == language: xbmc.log('subtitle path: %s' % (subtitle['src']), xbmc.LOGNOTICE) sub = (subtitle['src'], language) break except: pass return url.replace('//', 'https://'), sub else: raise EtvException(ADDON.getLocalizedString(202))
def list_schedule(self, channel, date): year, month, day = date.split("-") url = 'https://etv.err.ee/api/tvSchedule/getTimelineSchedule2?year=%s&month=%s&day=%s&channel=%s' % ( year, month, day, channel) buggalo.addExtraData('url', url) html = self.download_url(url) if not html: raise EtvException(ADDON.getLocalizedString(203)) html = json.loads(html) items = list() for s in html: if s['mediaExist']: if s['horizontalPhotoUrl']: fanart = s['horizontalPhotoUrl'] else: fanart = FANART title = s['programName'] plot = s['name'] infoLabels = { 'plot': plot, 'title': title } item = xbmcgui.ListItem(title, iconImage=fanart) item.setInfo('video', infoLabels) item.setProperty('IsPlayable', 'true') item.setProperty('Fanart_Image', fanart) items.append((PATH + '?vaata=%s' % s['contentId'], item)) xbmc.executebuiltin("Container.SetViewMode(500)") xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_UNSORTED) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def play_item(self, item, title): url = DelfiAddon.get_video(item) buggalo.addExtraData('url', url) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() item = xbmcgui.ListItem(urllib.unquote_plus(title), iconImage=ICON, path=url) playlist.add(url, item) xbmcplugin.setResolvedUrl(HANDLE, True, item)
def playStream(self,saade): url = self.getMediaKey(saade) buggalo.addExtraData('url', url) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() item = xbmcgui.ListItem(saade, iconImage = ICON, path = url) playlist.add(url,item) xbmcplugin.setResolvedUrl(HANDLE, True, item)
def playStream(self, saade): url = self.getMediaKey(saade) buggalo.addExtraData('url', url) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() item = xbmcgui.ListItem(saade, iconImage=ICON, path=url) playlist.add(url, item) xbmcplugin.setResolvedUrl(HANDLE, True, item)
def getMediaKey(self,saade): url = URL + 'vaata/' + saade buggalo.addExtraData('url', url) html = self.downloadUrl(url) if html: key = re.search('data">([^<]+).MXF</', html, re.DOTALL) if key: return key.group(1) + '.flv' else: raise ErrException(ADDON.getLocalizedString(202))
def getMediaLocation(self,key): url = "http://etv.err.ee/api/loader/GetTimeLineContent/%s" % key buggalo.addExtraData('url', url) html = self.downloadUrl(url) if html: html = json.loads(html) for url in html['MediaSources']: return 'rtmp%s' % url['Content'].replace('@','_definst_/') raise EtvException(ADDON.getLocalizedString(202)) else: raise EtvException(ADDON.getLocalizedString(202))
def getMediaKey(self, saade): url = URL + 'vaata/' + saade buggalo.addExtraData('url', url) html = self.downloadUrl(url) if html: key = re.search("var src = '(.*)'", html) if key: # NOTE: .mp4 works as well return 'https:' + key.group(1) else: raise ErrException(ADDON.getLocalizedString(202))
def getMediaKey(self,saade): url = URL + 'vaata/' + saade buggalo.addExtraData('url', url) html = self.downloadUrl(url) if html: key = re.search('hls\': \'([^<]+)\'}', html, re.DOTALL|re.IGNORECASE) if key: # NOTE: .mp4 works as well return 'https:' + key.group(1) else: raise ErrException(ADDON.getLocalizedString(202))
def listVideos(self,saade): telecast = 'http://kanal2.ee/video/showreelapi?telecastid=%s' % self.getTelecastID(saade) fanart = self.downloadAndCacheFanart(saade, True) # download pictures buggalo.addExtraData('url', telecast) telecastxml = self.downloadUrl(telecast) if not telecastxml: raise Kanal2Exception(ADDON.getLocalizedString(203)) try: doc = ElementTree.fromstring(telecastxml.replace('&', '&')) except Exception, ex: raise Kanal2Exception(str(ex))
def list_videos(self, saade): url = "https://kanal2.postimees.ee/pluss/saade/%s?onpage=36" % saade xbmc.log('saate url: %s' % url, xbmc.LOGNOTICE) fanart = self.download_and_cache_fanart(saade, True) # download pictures buggalo.addExtraData('url', url) html = BeautifulSoup(self.download_url(url), 'html.parser') if not html: raise Kanal2Exception(ADDON.getLocalizedString(203)) try: blocks = html.find_all(class_="row onevideo_2col") except Exception, ex: raise Kanal2Exception(str(ex))
def executeJSON(request): """Execute JSON-RPC Command Args: request: Dictionary with JSON-RPC Commands """ rpccmd = json.dumps(request) # create string from dict json_query = xbmc.executeJSONRPC(rpccmd) json_response = json.loads(json_query) # in case of exception this will be sent buggalo.addExtraData('len(json_query)', len(json_query)) buggalo.addExtraData('len(json_response)', len(json_response)) return json_response
def listVideos(self, saade): telecast = 'http://kanal2.ee/video/showreelapi?telecastid=%s' % self.getTelecastID( saade) fanart = self.downloadAndCacheFanart(saade, True) # download pictures buggalo.addExtraData('url', telecast) telecastxml = self.downloadUrl(telecast) if not telecastxml: raise Kanal2Exception(ADDON.getLocalizedString(203)) try: doc = ElementTree.fromstring(telecastxml.replace('&', '&')) except Exception, ex: raise Kanal2Exception(str(ex))
def playStream(self,vaata): if vaata == '00000000-0000-0000-0000-000000000000': raise EtvException(ADDON.getLocalizedString(202)) if ":80/live" in vaata: saade = vaata else: saade = EtvAddon.getMediaLocation(vaata) buggalo.addExtraData('saade', saade) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() item = xbmcgui.ListItem(saade, iconImage = ICON, path = saade) playlist.add(saade,item) xbmcplugin.setResolvedUrl(HANDLE, True, item)
def __init__(self, addon, cachePath): self.cachePath = cachePath self.updateInProgress = False buggalo.addExtraData('source', self.KEY) for key in SETTINGS_TO_CHECK: buggalo.addExtraData('setting: %s' % key, ADDON.getSetting(key)) try: self.conn = sqlite3.connect(os.path.join(self.cachePath, self.SOURCE_DB), detect_types=sqlite3.PARSE_DECLTYPES, check_same_thread = False) self.conn.execute('PRAGMA foreign_keys = ON') self.conn.row_factory = sqlite3.Row self._createTables() except sqlite3.OperationalError, ex: raise SourceUpdateInProgressException(ex)
def executeJSON(request): """Execute JSON-RPC Command Args: request: Dictionary with JSON-RPC Commands """ rpccmd = simplejson.dumps(request) # create string from dict json_query = xbmc.executeJSONRPC(rpccmd) json_query = unicode(json_query, 'utf-8', errors='ignore') json_response = simplejson.loads(json_query) # in case of exception this will be sent buggalo.addExtraData('len(json_query)',len(json_query)); buggalo.addExtraData('len(json_response)', len(json_response)); return json_response
def listErrCategory(self): url = URL buggalo.addExtraData('url', url) html = self.downloadUrl(url) if not html: raise ErrException(ADDON.getLocalizedString(200)) items = list() for k in re.finditer('alamkategooria/([^/]+)">([^<]+)</a>', html): #fanart = self.downloadAndCacheFanart(key, None) item = xbmcgui.ListItem(k.group(2), iconImage=FANART) item.setProperty('Fanart_Image', FANART) items.append((PATH + '?seeria=%s' % k.group(1), item, True)) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def listErrCategory(self): url = URL buggalo.addExtraData('url', url) html = self.downloadUrl(url) if not html: raise ErrException(ADDON.getLocalizedString(200)) items = list() for k in re.finditer('alamkategooria/([^/]+)">([^<]+)</a>',html): #fanart = self.downloadAndCacheFanart(key, None) item = xbmcgui.ListItem(k.group(2), iconImage=FANART) item.setProperty('Fanart_Image', FANART) items.append((PATH + '?seeria=%s' % k.group(1), item, True)) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def list_videos(self, categoryId, page): if "live/" in categoryId or "saated" in categoryId: url = 'http://tv.%s/%s/?page=%s' % (MAIN_URL, categoryId, page) else: url = 'http://tv.%s/saated/%s/?page=%s' % (MAIN_URL, categoryId, page) buggalo.addExtraData('url', url) html = self.download_url(url) if not html: raise DelfiException(ADDON.getLocalizedString(203).encode('utf-8')) items = list() html = html.replace('</div></div></div>', '</div></div></div>\r\n') regex = 'img class="responsive" src="([^"]+)".*c-block-art-title.*href="([^"]+)">([^<]+)</a' for node in re.finditer(regex, html): title = node.group(3) image = node.group(1) videoid = node.group(2) infoLabels = { 'title': title } if image: fanart = image else: fanart = FANART item = xbmcgui.ListItem(title, iconImage=fanart) item.setInfo('video', infoLabels) item.setProperty('IsPlayable', 'true') item.setProperty('Fanart_Image', fanart) items.append((PATH + '?play=%s&title=%s' % (videoid, urllib.quote_plus(title.replace("'", "\'"))), item)) try: pagex = '<a class="item item-next.*href="([^"]+)"' pagination = re.search(pagex, html) if pagination: if pagination.group(1) != "javascript:void(0)": item = xbmcgui.ListItem(ADDON.getLocalizedString(30008).encode('utf-8'), iconImage=fanart) item.setProperty('IsPlayable', 'true') item.setProperty('Fanart_Image', fanart) items.append( (PATH + '?category=%s&%s' % (categoryId, pagination.group(1).replace('?', '')), item, True)) except: pass xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def listSeries(self,seeria): url = URL + '/alamkategooria/%s/' % seeria + ARCHIVE_ID buggalo.addExtraData('url', url) html = self.downloadUrl(url) if not html: raise ErrException(ADDON.getLocalizedString(203)) items = list() if html: item = xbmcgui.ListItem('Üksikud saated', iconImage=FANART) item.setProperty('Fanart_Image', FANART) items.append((PATH + '?seeria=%s&saade=%s' % (seeria, 'show-category-single-files'), item, True)) for s in re.finditer('seeria/([^/]+).*">([^<]+)</a>',html): item = xbmcgui.ListItem(s.group(2), iconImage=FANART) item.setProperty('Fanart_Image', FANART) items.append((PATH + '?seeria=%s&saade=%s' % (seeria,s.group(1)), item, True)) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def get_live_streams(self): url = 'http://tv.delfi.ee/live' buggalo.addExtraData('url', url) html = BeautifulSoup(self.download_url(url), 'html.parser') if not html: raise DelfiException(ADDON.getLocalizedString(202).encode('utf-8')) items = list() live_urls = list() urlid = html.find_all(class_="stream-event") for url in urlid: if url.get('data-dschedule-whref'): live_urls.append(url.get('data-dschedule-whref')) for live_url in live_urls: html = self.download_url(live_url) for m in re.findall('#stream=([^&]+)&', html, re.DOTALL): data = json.loads(urllib.unquote(m)) title = data['title'].replace('+', ' ') stream_hu = '' stream_lu = '' for streams in data['versions']: if streams['caption'] == "HQ": stream_hu = data['rtmp'] + streams['flash'] if streams['caption'] == "LQ": stream_lu = data['rtmp'] + streams['flash'] # try to fall back sd if hd url is not available and vice versa if not stream_hu and not stream_lu: raise DelfiException(ADDON.getLocalizedString(30005).encode('utf-8')) if not stream_hu: stream_hu = stream_lu if not stream_lu: stream_lu = stream_hu if __settings__.getSetting('hd'): streamurl = stream_hu else: streamurl = stream_lu item = xbmcgui.ListItem(title, iconImage=FANART) item.setProperty('Fanart_Image', FANART) items.append((PATH + '?category=live&url=%s' % streamurl, item, True)) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def __init__(self, addon, cachePath): self.cachePath = cachePath self.updateInProgress = False buggalo.addExtraData('source', self.KEY) for key in SETTINGS_TO_CHECK: buggalo.addExtraData('setting: %s' % key, ADDON.getSetting(key)) self.channelList = list() self.player = xbmc.Player() self.osdEnabled = addon.getSetting('enable.osd') == 'true' databasePath = os.path.join(self.cachePath, self.SOURCE_DB) for retries in range(0, 3): try: self.conn = sqlite3.connect( databasePath, detect_types=sqlite3.PARSE_DECLTYPES, check_same_thread=False) self.conn.execute('PRAGMA foreign_keys = ON') self.conn.row_factory = sqlite3.Row # create and drop dummy table to check if database is locked c = self.conn.cursor() c.execute( 'CREATE TABLE database_lock_check(id TEXT PRIMARY KEY)') c.execute('DROP TABLE database_lock_check') c.close() self._createTables() self.settingsChanged = self.wasSettingsChanged(addon) break except sqlite3.OperationalError, ex: raise SourceUpdateInProgressException(ex) except sqlite3.DatabaseError: self.conn = None try: os.unlink(databasePath) except OSError: pass xbmcgui.Dialog().ok(ADDON.getAddonInfo('name'), strings(DATABASE_SCHEMA_ERROR_1), strings(DATABASE_SCHEMA_ERROR_2), strings(DATABASE_SCHEMA_ERROR_3))
def listPrograms(self): url = "http://kanal2.ee/saated" buggalo.addExtraData('url', url) html = self.downloadUrl(url) saated = {} for m in re.finditer('local:(.*)', html): saated = m.group(1).replace('tokens:', '\"tokens\":') saated = saated[:-1] # remove trailing comma saated = saated.replace("\\'", "'") # replace invalid escapes saated = json.loads(saated) # load as JSON items = list() for s in sorted(saated): fanart = self.downloadAndCacheFanart(s['url'], None) # set fetch to None so it would not fetch all the pictures at once item = xbmcgui.ListItem(s['name'], iconImage=fanart) item.setProperty('Fanart_Image', fanart) items.append((PATH + '?program=%s' % s['url'], item, True)) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def listSeries(self, seeria): url = URL + '/alamkategooria/%s/' % seeria + ARCHIVE_ID buggalo.addExtraData('url', url) html = self.downloadUrl(url) if not html: raise ErrException(ADDON.getLocalizedString(203)) items = list() if html: item = xbmcgui.ListItem('Üksikud saated', iconImage=FANART) item.setProperty('Fanart_Image', FANART) items.append((PATH + '?seeria=%s&saade=%s' % (seeria, 'show-category-single-files'), item, True)) for s in re.finditer('seeria/([^/]+).*">([^<]+)</a>', html): item = xbmcgui.ListItem(s.group(2), iconImage=FANART) item.setProperty('Fanart_Image', FANART) items.append((PATH + '?seeria=%s&saade=%s' % (seeria, s.group(1)), item, True)) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def play_stream(self, vaata): if vaata == '00000000-0000-0000-0000-000000000000': raise EtvException(ADDON.getLocalizedString(202)) if "live/" in vaata: saade = vaata else: saade, subs = EtvAddon.get_media_location(vaata) buggalo.addExtraData('saade', saade) xbmc.log('saade: %s' % saade, xbmc.LOGNOTICE) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() item = xbmcgui.ListItem(saade, iconImage=ICON, path=saade) try: if subs: item.setSubtitles(subs) except: pass playlist.add(saade, item) xbmcplugin.setResolvedUrl(HANDLE, True, item)
def list_programs(self): url = "http://kanal2.postimees.ee/pluss/shows?tab=arhiiv" buggalo.addExtraData('url', url) html = self.download_url(url) saated = {} for m in re.finditer('local:(.*)', html): saated = m.group(1).replace('tokens:', '\"tokens\":') saated = saated[:-1] # remove trailing comma saated = saated.replace("\\'", "'") # replace invalid escapes saated = json.loads(saated) # load as JSON items = list() for s in sorted(saated): # set fetch to None so it would not fetch all the pictures at once fanart = self.download_and_cache_fanart(s['url'], None) item = xbmcgui.ListItem(s['name'], iconImage=fanart) item.setProperty('Fanart_Image', fanart) items.append((PATH + '?program=%s' % s['url'], item, True)) xbmcplugin.addDirectoryItems(HANDLE, items) xbmcplugin.endOfDirectory(HANDLE)
def play_video( name, url, thumb, plot, studio, starttime, backup_url ): if url == 'None': dialog = xbmcgui.Dialog() ok = dialog.ok( plugin , settings.getLocalizedString( 30008 ) ) return if url.find('http://urs.pbs.org/redirect/') != -1: try: import requests status = 0 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0'} while status <= 10: if status != 0: time.sleep(3) r = requests.head(url , headers=headers, allow_redirects=False) new_url = r.headers['location'] if new_url != None: break status += 1 infoLabels = { "Title": name , "Studio": "PBS: " + studio, "Plot": plot } playListItem(label = name, image = thumb, path = clean(new_url), infoLabels = infoLabels, PlayPath = False) return except Exception, e: print 'PBS - Using backup_url' if backup_url != 'None': infoLabels = { "Title": name , "Studio": "PBS: " + studio, "Plot": plot } playListItem(label = name, image = thumb, path = clean(backup_url), infoLabels = infoLabels, PlayPath = False) return else: dialog = xbmcgui.Dialog() ok = dialog.ok( plugin , settings.getLocalizedString( 30008 ) ) ok = dialog.ok(plugin, settings.getLocalizedString( 30051 )) buggalo.addExtraData('url', url) buggalo.addExtraData('error', str(e)) buggalo.addExtraData('info', studio + ' - ' + name) raise Exception("redirect_url ERROR") return
def __init__(self, addon, cachePath): self.cachePath = cachePath self.updateInProgress = False buggalo.addExtraData('source', self.KEY) for key in SETTINGS_TO_CHECK: buggalo.addExtraData('setting: %s' % key, ADDON.getSetting(key)) self.channelList = list() self.player = xbmc.Player() self.osdEnabled = addon.getSetting('enable.osd') == 'true' databasePath = os.path.join(self.cachePath, self.SOURCE_DB) for retries in range(0, 3): try: self.conn = sqlite3.connect(databasePath, detect_types=sqlite3.PARSE_DECLTYPES, check_same_thread = False) self.conn.execute('PRAGMA foreign_keys = ON') self.conn.row_factory = sqlite3.Row # create and drop dummy table to check if database is locked c = self.conn.cursor() c.execute('CREATE TABLE database_lock_check(id TEXT PRIMARY KEY)') c.execute('DROP TABLE database_lock_check') c.close() self._createTables() self.settingsChanged = self.wasSettingsChanged(addon) break except sqlite3.OperationalError, ex: raise SourceUpdateInProgressException(ex) except sqlite3.DatabaseError: self.conn = None try: os.unlink(databasePath) except OSError: pass xbmcgui.Dialog().ok(ADDON.getAddonInfo('name'), strings(DATABASE_SCHEMA_ERROR_1), strings(DATABASE_SCHEMA_ERROR_2), strings(DATABASE_SCHEMA_ERROR_3))
def get_video_url(self, videoid): """Get actual video file and start playing.""" url = 'https://kanal2.postimees.ee/pluss/video/?id=%s' % videoid buggalo.addExtraData('url', url) playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() html = self.download_url(url) if not html: raise Kanal2Exception(ADDON.getLocalizedString(203)) init = re.search( "initK2Player.*\', \'episodes\', \'%s\', \'([^\']+)\'\);" % videoid, html, re.DOTALL) try: if init.group(1): dataurl = self.download_url( "http://kanal2.postimees.ee/player/playlist/%s?type=episodes" % videoid, True) data = json.loads(dataurl) if not data: raise Kanal2Exception(ADDON.getLocalizedString(202)) videoUrl = "https://kanal-vod.babahhcdn.com/bb1037/_definst_/smil:kanal2/%s/playlist.m3u8?t=%s" % ( data['data']['file'], init.group(1)) infoLabels = { 'title': data['info']['subtitle'], 'plot': data['info']['description'] } item = xbmcgui.ListItem(data['info']['subtitle'], iconImage=ICON, path=videoUrl) item.setInfo('video', infoLabels) playlist.add(videoUrl, item) except AttributeError: raise Kanal2Exception(ADDON.getLocalizedString(204)) # start = 0 xbmcplugin.setResolvedUrl(HANDLE, True, item)
def buggalo_extradata_settings(): """"add extradata to buggalo""" buggalo.addExtraData('data_dir', data_dir()) buggalo.addExtraData('addon_dir', addon_dir()) buggalo.addExtraData('setting_verbosity', getSetting("verbosity")) buggalo.addExtraData('setting_w_movies', getSetting("w_movies")) buggalo.addExtraData('setting_w_episodes', getSetting("w_episodes")) buggalo.addExtraData('setting_autostart', getSetting("autostart")) buggalo.addExtraData('setting_delay', getSetting("delay")) buggalo.addExtraData('setting_starttype', getSetting("starttype")) buggalo.addExtraData('setting_interval', getSetting("interval")) buggalo.addExtraData('setting_progressdialog', getSetting("progressdialog")) buggalo.addExtraData('setting_watch_user', getSetting("watch_user")) buggalo.addExtraData('setting_extdb', getSetting("extdb")) buggalo.addExtraData('setting_dbpath', getSetting("dbpath")) buggalo.addExtraData('setting_dbfilename', getSetting("dbfilename")) buggalo.addExtraData('setting_dbbackup', getSetting("dbbackup")) buggalo.addExtraData('setting_db_format', getSetting("db_format")) buggalo.addExtraData('setting_mysql_server', getSetting("mysql_server")) buggalo.addExtraData('setting_mysql_port', getSetting("mysql_port")) buggalo.addExtraData('setting_mysql_db', getSetting("mysql_db"))
return data['content'] if data['error'].find('404:') != -1 or data['error'].find( '400:') != -1: break except Exception, e: data['error'] = str(e) retries += 1 dialog = xbmcgui.Dialog() ret = dialog.yesno(plugin, settings.getLocalizedString(30050), data['error'], '', settings.getLocalizedString(30052), settings.getLocalizedString(30053)) if ret == False: getUrl(url) else: ok = dialog.ok(plugin, settings.getLocalizedString(30051)) buggalo.addExtraData('url', url) buggalo.addExtraData('error', data['error']) raise Exception('getUrl Error') def getPage(url, gzip=False): data = {'content': None, 'error': None} try: req = urllib2.Request(url) req.add_header('User-Agent', useragent) content = urllib2.urlopen(req) if gzip: try: if content.info()['Content-Encoding'] == 'gzip': import gzip, StringIO gzip_filehandle = gzip.GzipFile(
def find_trailers(url, name, page, library): save_name = name save_page = page data = getUrl(url).decode('ascii', 'ignore') link_thumb = re.compile( '<a href="(.+?)"><img src="(.+?)" name="thumb').findall(data) thumbs = re.compile('img src="/psize\.php\?dir=(.+?)" style').findall(data) if len(thumbs) == 0: thumb = "DefaultVideo.png" else: thumb = 'http://www.traileraddict.com/' + thumbs[0] title = re.compile( '<div class="abstract"><h2><a href="(.+?)">(.+?)</a></h2><br />', re.DOTALL).findall(data) trailers = re.compile('<dl class="dropdown">(.+?)</dl>', re.DOTALL).findall(data) if len(title) == 0 and len(trailers) == 0: list = common.parseDOM(data, "div", attrs={"class": "info"}) header = common.parseDOM(data, "div", attrs={"class": "trailerheader"}) nexturl = common.parseDOM(header, "a", attrs={"title": "Next Page"}, ret="href") totalItems = len(list) if totalItems == 0: dialog = xbmcgui.Dialog() ok = dialog.ok(plugin, settings.getLocalizedString(30012)) ok = dialog.ok(plugin, settings.getLocalizedString(30051)) buggalo.addExtraData('url', url) buggalo.addExtraData('name', name) raise Exception('find_trailers Error A') return for video in list: h2 = common.parseDOM(video, "h2") title = common.parseDOM(h2, "a")[0] url = 'http://www.traileraddict.com' + common.parseDOM( h2, "a", ret="href")[0] thumb = 'http://www.traileraddict.com' + common.parseDOM( video, "img", attrs={"class": "dimmer"}, ret="src")[0].replace( '-t.jpg', '.jpg') #infoLabels = { "Title": title, "Plot": save_name + ' (' + clean( title ) + ')' } cm = [] run = sys.argv[0] + '?' + urllib.urlencode( { 'mode': '5', 'name': save_name + ' (' + clean(title) + ')', 'url': url, 'download': 'True' }) cm.append((settings.getLocalizedString(30059), "XBMC.RunPlugin(%s)" % run)) cm.append((settings.getLocalizedString( 30014 ), "XBMC.RunPlugin(plugin://plugin.video.couchpotato_manager/movies/add?title=%s)" % save_name)) u = { 'mode': '5', 'name': save_name + ' (' + clean(title) + ')', 'url': url } addListItem(label=clean(title), image=thumb, url=u, isFolder=False, totalItems=totalItems, infoLabels=False, cm=cm) if len(nexturl) > 0: url = 'http://www.traileraddict.com' + nexturl[0] u = { 'mode': '4', 'name': save_name, 'url': url, 'page': str(int(save_page) + 1) } addListItem(label='[Next Page (' + str(int(save_page) + 2) + ')]', image=next_thumb, url=u, isFolder=True, totalItems=0, infoLabels=False) xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE) setViewMode("502", "movies") xbmcplugin.endOfDirectory(int(sys.argv[1])) return item_count = 0 if len(trailers) > 0: check1 = re.compile( '<a href="(.+?)"><img src="\/images\/usr\/arrow\.png" border="0" style="float:right;" \/>(.+?)</a>' ).findall(trailers[0]) check2 = re.compile( '<a href="(.+?)"( style="(.*?)")?>(.+?)<br />').findall( trailers[0]) totalItems = len(check1) totalItems2 = len(check2) if totalItems > 0: url_title = check1 if library == True: return url_title[0][0] for url, title in url_title: url = 'http://www.traileraddict.com' + url cm = [] run = sys.argv[0] + '?' + urllib.urlencode( { 'mode': '5', 'name': save_name + ' (' + clean(title) + ')', 'url': url, 'download': 'True' }) cm.append((settings.getLocalizedString(30059), "XBMC.RunPlugin(%s)" % run)) cm.append((settings.getLocalizedString( 30014 ), "XBMC.RunPlugin(plugin://plugin.video.couchpotato_manager/movies/add?title=%s)" % save_name)) infoLabels = { "Title": title, "Plot": save_name + ' (' + clean(title) + ')' } u = { 'mode': '5', 'name': save_name + ' (' + clean(title) + ')', 'url': url } addListItem(label=clean(title), image=thumb, url=u, isFolder=False, totalItems=totalItems, infoLabels=False, cm=cm) xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE) setViewMode("502", "movies") xbmcplugin.endOfDirectory(int(sys.argv[1])) elif totalItems2 > 0: url_title = check2 if library == True: return url_title[0][0] for url, trash1, trash2, title in url_title: url = 'http://www.traileraddict.com' + url #infoLabels = { "Title": title, "Plot": save_name + ' (' + clean( title ) + ')' } cm = [] run = sys.argv[0] + '?' + urllib.urlencode({ 'mode': '5', 'name': save_name.decode('ascii', 'ignore') + ' (' + clean(title) + ')', 'url': url, 'download': 'True' }) cm.append((settings.getLocalizedString(30059), "XBMC.RunPlugin(%s)" % run)) cm.append((settings.getLocalizedString( 30014 ), "XBMC.RunPlugin(plugin://plugin.video.couchpotato_manager/movies/add?title=%s)" % save_name.decode('ascii', 'ignore'))) u = { 'mode': '5', 'name': save_name.decode('ascii', 'ignore') + ' (' + clean(title) + ')', 'url': url } addListItem(label=clean(title), image=thumb, url=u, isFolder=False, totalItems=totalItems2, infoLabels=False, cm=cm) xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE) setViewMode("502", "movies") xbmcplugin.endOfDirectory(int(sys.argv[1])) else: # dia = xbmcgui.Dialog() # ok = dia.ok(plugin, settings.getLocalizedString(30006) ) # ok = dia.ok(plugin, settings.getLocalizedString( 30051 )) # buggalo.addExtraData('url', url) # buggalo.addExtraData('name', save_name) # raise Exception('find_trailers Error 2') # xbmc.executebuiltin('Notification('+plugin+',Only video clips were found!,5000,'+icon_thumb+')') list = common.parseDOM(data, "div", attrs={"class": "info"}) header = common.parseDOM(data, "div", attrs={"class": "trailerheader"}) nexturl = common.parseDOM(header, "a", attrs={"title": "Next Page"}, ret="href") totalItems = len(list) if totalItems == 0: dialog = xbmcgui.Dialog() ok = dialog.ok(plugin, settings.getLocalizedString(30012)) ok = dialog.ok(plugin, settings.getLocalizedString(30051)) buggalo.addExtraData('url', url) buggalo.addExtraData('name', name) raise Exception('find_trailers Error B') return for video in list: h2 = common.parseDOM(video, "h2") title = common.parseDOM(h2, "a")[0] url = 'http://www.traileraddict.com' + common.parseDOM( h2, "a", ret="href")[0] thumb = 'http://www.traileraddict.com' + common.parseDOM( video, "img", attrs={"class": "dimmer"}, ret="src")[0].replace('-t.jpg', '.jpg') #infoLabels = { "Title": title, "Plot": save_name + ' (' + clean( title ) + ')' } cm = [] run = sys.argv[0] + '?' + urllib.urlencode( { 'mode': '5', 'name': save_name + ' (' + clean(title) + ')', 'url': url, 'download': 'True' }) cm.append((settings.getLocalizedString(30059), "XBMC.RunPlugin(%s)" % run)) cm.append((settings.getLocalizedString( 30014 ), "XBMC.RunPlugin(plugin://plugin.video.couchpotato_manager/movies/add?title=%s)" % save_name)) u = { 'mode': '5', 'name': save_name + ' (' + clean(title) + ')', 'url': url } addListItem(label=clean(title), image=thumb, url=u, isFolder=False, totalItems=totalItems, infoLabels=False, cm=cm) if len(nexturl) > 0: url = 'http://www.traileraddict.com' + nexturl[0] u = { 'mode': '4', 'name': save_name, 'url': url, 'page': str(int(save_page) + 1) } addListItem(label='[Next Page (' + str(int(save_page) + 2) + ')]', image=next_thumb, url=u, isFolder=True, totalItems=0, infoLabels=False) xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE) setViewMode("502", "movies") xbmcplugin.endOfDirectory(int(sys.argv[1])) else: totalItems = len(link_thumb) for url, thumb2 in link_thumb: if clean(title[item_count][1]).find('Trailer') > 0: url = 'http://www.traileraddict.com' + url cm = [] run = sys.argv[0] + '?' + urllib.urlencode( { 'mode': '5', 'name': save_name + ' (' + clean(title[item_count][1]) + ')', 'url': url, 'download': 'True' }) cm.append((settings.getLocalizedString(30059), "XBMC.RunPlugin(%s)" % run)) cm.append((settings.getLocalizedString( 30014 ), "XBMC.RunPlugin(plugin://plugin.video.couchpotato_manager/movies/add?title=%s)" % save_name)) infoLabels = { "Title": title[item_count][1], "Plot": save_name + ' (' + clean(title[item_count][1]) + ')' } u = { 'mode': '5', 'name': save_name + ' (' + clean(title[item_count][1]) + ')', 'url': url } addListItem(label=clean(title[item_count][1]), image=thumb, url=u, isFolder=False, totalItems=totalItems, infoLabels=False, cm=cm) item_count = item_count + 1 xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE) setViewMode("502", "movies") xbmcplugin.endOfDirectory(int(sys.argv[1]))
def getTelecastID(self, telecastID): url = "http://kanal2.ee/saated/" buggalo.addExtraData('url', url) html = self.downloadUrl(url + telecastID) for s in re.finditer('var am_telecast = ([^;]+);', html): return s.group(1)
if __name__ == '__main__': ADDON = xbmcaddon.Addon() PATH = sys.argv[0] HANDLE = int(sys.argv[1]) PARAMS = urlparse.parse_qs(sys.argv[2][1:]) CACHE_PATH = xbmc.translatePath(ADDON.getAddonInfo("Profile")) if not os.path.exists(CACHE_PATH): os.makedirs(CACHE_PATH) FAVORITES_PATH = os.path.join(CACHE_PATH, 'favorites.pickle') RECENT_PATH = os.path.join(CACHE_PATH, 'recent.pickle') FANART_IMAGE = os.path.join(ADDON.getAddonInfo('path'), 'fanart.jpg') buggalo.SUBMIT_URL = 'http://tommy.winther.nu/exception/submit.php' buggalo.addExtraData('cache_path', CACHE_PATH) drDkTvAddon = DrDkTvAddon() try: if 'show' in PARAMS: if PARAMS['show'][0] == 'liveTV': drDkTvAddon.showLiveTV() elif PARAMS['show'][0] == 'listAZ': drDkTvAddon.showAZ() elif PARAMS['show'][0] == 'latest': drDkTvAddon.listEpisodes(drDkTvAddon.api.getLatestPrograms(), addSortMethods=False) elif PARAMS['show'][0] == 'mostViewed': drDkTvAddon.listEpisodes(drDkTvAddon.api.getMostViewed()) elif PARAMS['show'][0] == 'highlights': drDkTvAddon.listEpisodes(drDkTvAddon.api.getSelectedList()) elif PARAMS['show'][0] == 'search': drDkTvAddon.searchSeries()