def __call__(self, arg, check_children=None, normalize=False, as_string=False): check_children = check_children or False res = [] if ET.iselement(arg): res.extend(check_node(self, arg)) else: try: new_arg = get_elem(arg) res.extend(check_node(self, new_arg)) except ValueError: # no element, so try to check the content try: self.check_content(arg) except Exception as E: res.append(E) if res: self.logger.debug('found %d errors', len(res)) for e in res: self.logger.debug(' %s: %s', e.__class__.__name__, e.message) raise res[0] if normalize: if not hasattr(self, '_normalized_value'): raise self.error("%s has no normalized value" % self.name) else: return self._normalized_value else: return True
def _get_elem(elem): """Assume an ETree.Element object or a string representation. Return the ETree.Element object""" if not ET.iselement(elem): try: elem = ET.fromstring(elem) except Exception: py2and3.print_("Value Error", elem) raise ValueError("Cannot convert to element") return elem
def _get_elem(elem): """Assume an ETree.Element object or a string representation. Return the ETree.Element object""" if not ET.iselement(elem): try: elem = ET.fromstring(elem) except: py2and3.print_("Value Error", elem) raise ValueError("Cannot convert to element") return elem
def ConvertXmlToDict(root, dictclass=XmlDictObject): """ Converts an XML file or ElementTree Element to a dictionary """ # If a string is passed in, try to open it as a file if isinstance(root, basestring): import cStringIO root = cStringIO.StringIO(root) root = ElementTree.parse(root).getroot() elif not ElementTree.iselement(root): raise TypeError, 'Expected ElementTree.Element or file path string' return dictclass({root.tag: _ConvertXmlToDictRecurse(root, dictclass)})
def __call__(self, *args, **kw): el = self.__class__(self.tag, self.attrib) if kw.has_key('c'): if args: raise ValueError( "You may either provide positional arguments or a " "'c' keyword argument, but not both") args = kw['c'] del kw['c'] if not isinstance(args, (list, tuple)): args = (args, ) for name, value in kw.items(): if value is None: del kw[name] continue kw[name] = unicode(value) if name.endswith('_'): kw[name[:-1]] = value del kw[name] if name.find('__') != -1: new_name = name.replace('__', ':') kw[new_name] = value del kw[name] el.attrib.update(kw) el.text = self.text last = None for item in self.getchildren(): last = item el.append(item) for arg in flatten(args): if arg is None: continue if not et.iselement(arg): if last is None: if el.text is None: el.text = unicode(arg) else: el.text += unicode(arg) else: if last.tail is None: last.tail = unicode(arg) else: last.tail += unicode(arg) else: last = arg el.append(last) return el
def __call__(self, *args, **kw): el = self.__class__(self.tag, self.attrib) if kw.has_key('c'): if args: raise ValueError( "You may either provide positional arguments or a " "'c' keyword argument, but not both") args = kw['c'] del kw['c'] if not isinstance(args, (list, tuple)): args = (args,) for name, value in kw.items(): if value is None: del kw[name] continue kw[name] = unicode(value) if name.endswith('_'): kw[name[:-1]] = value del kw[name] if name.find('__') != -1: new_name = name.replace('__', ':') kw[new_name] = value del kw[name] el.attrib.update(kw) el.text = self.text last = None for item in self.getchildren(): last = item el.append(item) for arg in flatten(args): if arg is None: continue if not et.iselement(arg): if last is None: if el.text is None: el.text = unicode(arg) else: el.text += unicode(arg) else: if last.tail is None: last.tail = unicode(arg) else: last.tail += unicode(arg) else: last = arg el.append(last) return el
def tagnorm(self, tag_or_elem): """Normalize the tag name, optionally stripping namespaces and downcasing. 'elem' may be an Element or a string""" if ET.iselement(tag_or_elem): tag = tag_or_elem.tag else: tag = tag_or_elem if self.no_ns: res = self.STRIP_NS.sub('', tag) else: res = tag if self.downcase: res = res.lower() return res
def CalculateDataLength(data): """Attempts to determine the length of the data to send. This method will respond with a length only if the data is a string or and ElementTree element. Args: data: object If this is not a string or ElementTree element this funtion will return None. """ if isinstance(data, str): return len(data) elif isinstance(data, list): return None elif ElementTree.iselement(data): return len(ElementTree.tostring(data)) elif hasattr(data, 'read'): # If this is a file-like object, don't try to guess the length. return None else: return len(str(data))
def SetXmlBlob(self, blob): """Sets the contents of the extendedProperty to XML as a child node. Since the extendedProperty is only allowed one child element as an XML blob, setting the XML blob will erase any preexisting extension elements in this object. Args: blob: str, ElementTree Element or atom.ExtensionElement representing the XML blob stored in the extendedProperty. """ # Erase any existing extension_elements, clears the child nodes from the # extendedProperty. self.extension_elements = [] if isinstance(blob, atom.ExtensionElement): self.extension_elements.append(blob) elif ElementTree.iselement(blob): self.extension_elements.append(atom._ExtensionElementFromElementTree( blob)) else: self.extension_elements.append(atom.ExtensionElementFromString(blob))
def __SendDataPart(data, connection): """This method is deprecated, use atom.http._send_data_part""" deprecated('call to deprecated function __SendDataPart') if isinstance(data, str): #TODO add handling for unicode. connection.send(data) return elif ElementTree.iselement(data): connection.send(ElementTree.tostring(data)) return # Check to see if data is a file-like object that has a read method. elif hasattr(data, 'read'): # Read the file and send it a chunk at a time. while 1: binarydata = data.read(100000) if binarydata == '': break connection.send(binarydata) return else: # The data object was not a file. # Try to convert to a string and send the data. connection.send(str(data)) return
def getVideoListXML(self): findVideo = False paginationUrl = '' if self.page > 0: paginationUrl = "&start_rec=" + str(self.page * PAGE_MOVIES) try: elems = ET.parse(urllib.urlopen(self.url + paginationUrl)).getroot() epgItems = elems.findall("epg_item") if not epgItems: epgItems = elems.findall("directory_stats/video") if not epgItems: epgItems = elems.findall("directory_standard/video") if not epgItems: epgItems = elems.findall("video") if not epgItems: epgItems = elems.findall("directory_video/video") pub = elems.findall("publication_status") if pub[0].attrib['publication_status_id'] == '4': d = xbmcgui.Dialog() d.ok('Brak video', pub[0].attrib['name'].encode('utf-8')) #print "test[6]: " + str(len(epgItems)) listsize = len(epgItems) xbmcplugin.setContent(HANDLE, 'episodes') xbmcplugin.addSortMethod( handle=HANDLE, sortMethod=xbmcplugin.SORT_METHOD_UNSORTED) xbmcplugin.addSortMethod(handle=HANDLE, sortMethod=xbmcplugin.SORT_METHOD_LABEL) for epgItem in epgItems: prop = { 'title': epgItem.find("title").text.encode('utf-8'), 'TVShowTitle': self.name } if epgItem.attrib['hptitle'] <> '': prop['title'] = epgItem.attrib['hptitle'].encode('utf-8') if epgItem.attrib['release_date']: prop['aired'] = epgItem.attrib['release_date'] if epgItem.get('episode_number'): prop['episode'] = epgItem.attrib['episode_number'] prop['description'] = '' textNode = epgItem.find('text_paragraph_standard/text') #print "test[8]:" + textNode.text.encode('utf-8') if ET.iselement(textNode): prop['description'] = textNode.text.encode('utf-8') prop['description'] = prop['description'].replace( "<BR/>", "") iconUrl = '' videoUrl = '' iconFileNode = epgItem.find('video/image') if not iconFileNode: iconFileNode = epgItem.find('image') if iconFileNode: iconFileName = iconFileNode.attrib['file_name'] iconFileName = iconFileName.split('.') iconUrl = 'http://s.v3.tvp.pl/images/6/2/4/uid_%s_width_700.jpg' % iconFileName[ 0] iconTitle = iconFileNode.find('title').text.encode('utf-8') if len(iconTitle) > 4 and iconTitle <> prop['title']: if iconTitle <> 'zdjecie domyślne' and iconTitle <> 'image' and iconTitle <> 'obrazek': iconTitle = iconTitle.split(',')[0] prop['title'] = iconTitle + " - " + prop['title'] #print "test[4]: " + iconUrl videMainNode = epgItem.find('video') if ET.iselement(videMainNode): #print "test[7]: " + str(ET.dump(videMainNode)) # 2400 00:41:28 2488 # 2100 00:35:50 2150 if videMainNode.attrib['release_date']: prop['aired'] = videMainNode.attrib['release_date'] if videMainNode.attrib['episode_number']: prop['episode'] = videMainNode.attrib['episode_number'] videoText = videMainNode.find('text_paragraph_lead/text') if ET.iselement(videoText): if len(prop['description']) < videoText.text.encode( 'utf-8'): prop['description'] = videoText.text.encode( 'utf-8') prop['time'] = int(videMainNode.attrib['duration']) iconTitle = videMainNode.find('title').text.encode('utf-8') if len(iconTitle) > 4 and iconTitle <> prop['title']: if iconTitle <> 'zdjecie domyślne' and iconTitle <> 'image' and iconTitle <> 'obrazek': iconTitle = iconTitle.split(',')[0] prop['title'] = prop['title'] + " - " + iconTitle videoNode = epgItem.find('video/video_format') if not videoNode: videoNode = epgItem.find('video_format') if videoNode: videoUrl = videoNode.attrib['temp_sdt_url'] if videoUrl != '': #if self.watched(videoUrl): # prop['overlay'] = 7 self.addVideoLink(prop, videoUrl, iconUrl, listsize) #print "test[4]: " + prop['title'] + ", " + iconUrl + ", " + videoUrl findVideo = True except urllib2.HTTPError, e: err = str(e) msg = e.read() xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' % (err, msg, 5))
def newfunc(checker, node): if not isinstance(checker, XCheck): return [NotACheckerError("{0} is not an XCheck instance".format(checker))] if not ET.iselement(node): return [NotAnElementError("{0} is not an Element".format(node))] return func(checker, node)
if proxy == 'true': url = base64.b64decode(proxy_cache) + urllib.quote_plus(url) if dbg == 'true': log.info('TVN - getVideoUrl() -> link: ' + url) try: response = self.common.getURLRequestData({ 'url': url , 'use_host': True, 'host': self.contentUserAgent, 'use_cookie': False, 'use_post': False, 'return_data': False }) except Exception, exception: traceback.print_exc() self.exception.getError(str(exception)) exit() xmlDoc = ET.parse(response).getroot() runtime = xmlDoc.find(method + "/" + groupName + "/run_time") videoTime = 0 #print ET.dump(runtime) if ET.iselement(runtime): videoTimeStr = runtime.text if videoTimeStr: videoTimeElems = videoTimeStr.split(":") videoTime = int(videoTimeElems[0])*60*60+int(videoTimeElems[1])*60+int(videoTimeElems[2]) plot = xmlDoc.find(method + "/" + groupName + "/lead") videoPlot = "" if ET.iselement(plot): videoPlot = plot.text if videoPlot: videoPlot = plot.text.encode('utf-8') videos = xmlDoc.findall(method + "/" + groupName + "/videos/main/video_content/row") videoUrls = [] strTab = [] for video in videos:
'url': url, 'use_host': True, 'host': self.contentUserAgent, 'use_cookie': False, 'use_post': False, 'return_data': False }) except Exception, exception: traceback.print_exc() self.exception.getError(str(exception)) exit() xmlDoc = ET.parse(response).getroot() runtime = xmlDoc.find(method + "/" + groupName + "/run_time") videoTime = 0 #print ET.dump(runtime) if ET.iselement(runtime): videoTimeStr = runtime.text if videoTimeStr: videoTimeElems = videoTimeStr.split(":") videoTime = int(videoTimeElems[0]) * 60 * 60 + int( videoTimeElems[1]) * 60 + int(videoTimeElems[2]) plot = xmlDoc.find(method + "/" + groupName + "/lead") videoPlot = "" if ET.iselement(plot): videoPlot = plot.text if videoPlot: videoPlot = plot.text.encode('utf-8') videos = xmlDoc.findall(method + "/" + groupName + "/videos/main/video_content/row") videoUrls = []
def getVideoListXML(self): findVideo=False paginationUrl = '' if self.page > 0: paginationUrl = "&start_rec=" + str(self.page * PAGE_MOVIES) try: elems = ET.parse(urllib.urlopen(self.url+paginationUrl)).getroot() epgItems = elems.findall("epg_item") if not epgItems: epgItems = elems.findall("directory_stats/video") if not epgItems: epgItems = elems.findall("directory_standard/video") if not epgItems: epgItems = elems.findall("video") if not epgItems: epgItems = elems.findall("directory_video/video") pub = elems.findall("publication_status") if pub[0].attrib['publication_status_id']=='4': d = xbmcgui.Dialog() d.ok('Brak video', pub[0].attrib['name'].encode('utf-8')) #print "test[6]: " + str(len(epgItems)) listsize = len(epgItems) xbmcplugin.setContent(HANDLE, 'episodes') xbmcplugin.addSortMethod( handle=HANDLE, sortMethod=xbmcplugin.SORT_METHOD_UNSORTED ) xbmcplugin.addSortMethod( handle=HANDLE, sortMethod=xbmcplugin.SORT_METHOD_LABEL ) for epgItem in epgItems: prop = { 'title': epgItem.find("title").text.encode('utf-8'), 'TVShowTitle': self.name } if epgItem.attrib['hptitle'] <> '': prop['title'] = epgItem.attrib['hptitle'].encode('utf-8') if epgItem.attrib['release_date']: prop['aired'] = epgItem.attrib['release_date'] if epgItem.get('episode_number'): prop['episode'] = epgItem.attrib['episode_number'] prop['description'] = '' textNode = epgItem.find('text_paragraph_standard/text') #print "test[8]:" + textNode.text.encode('utf-8') if ET.iselement(textNode): prop['description'] = textNode.text.encode('utf-8') prop['description'] = prop['description'].replace("<BR/>", "") iconUrl = '' videoUrl = '' iconFileNode = epgItem.find('video/image') if not iconFileNode: iconFileNode = epgItem.find('image') if iconFileNode: iconFileName = iconFileNode.attrib['file_name'] iconFileName = iconFileName.split('.') iconUrl = 'http://s.v3.tvp.pl/images/6/2/4/uid_%s_width_700.jpg' % iconFileName[0] iconTitle = iconFileNode.find('title').text.encode('utf-8') if len(iconTitle) > 4 and iconTitle <> prop['title']: if iconTitle <> 'zdjecie domyślne' and iconTitle <> 'image' and iconTitle <> 'obrazek': iconTitle = iconTitle.split(',')[0] prop['title'] = iconTitle + " - " + prop['title'] #print "test[4]: " + iconUrl videMainNode = epgItem.find('video') if ET.iselement(videMainNode): #print "test[7]: " + str(ET.dump(videMainNode)) # 2400 00:41:28 2488 # 2100 00:35:50 2150 if videMainNode.attrib['release_date']: prop['aired'] = videMainNode.attrib['release_date'] if videMainNode.attrib['episode_number']: prop['episode'] = videMainNode.attrib['episode_number'] videoText = videMainNode.find('text_paragraph_lead/text') if ET.iselement(videoText): if len(prop['description']) < videoText.text.encode('utf-8'): prop['description'] = videoText.text.encode('utf-8') prop['time'] = int(videMainNode.attrib['duration']) iconTitle = videMainNode.find('title').text.encode('utf-8') if len(iconTitle) > 4 and iconTitle <> prop['title']: if iconTitle <> 'zdjecie domyślne' and iconTitle <> 'image' and iconTitle <> 'obrazek': iconTitle = iconTitle.split(',')[0] prop['title'] = prop['title'] + " - " + iconTitle videoNode = epgItem.find('video/video_format') if not videoNode: videoNode = epgItem.find('video_format') if videoNode: videoUrl = videoNode.attrib['temp_sdt_url'] if videoUrl != '': #if self.watched(videoUrl): # prop['overlay'] = 7 self.addVideoLink(prop,videoUrl,iconUrl,listsize) #print "test[4]: " + prop['title'] + ", " + iconUrl + ", " + videoUrl findVideo=True except urllib2.HTTPError, e: err = str(e) msg = e.read() xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' % ( err, msg, 5) )
def get_project(self, pageIndex): """ 클래스 생성자에 초기화된 search값의 오픈소스 프로젝트를 검색한다. pageIndex는 검색결과의 몇번째 페이지를 보여줄 것인지를 결정한다. """ url = self.url + self.search+"&page="+str(pageIndex) f = urllib.urlopen(url) # Parse the response into a structured XML object tree = ET.parse(f) # Did Ohloh return an error? elem = tree.getroot() error = elem.find("error") if error != None: print 'Ohloh returned:', ET.tostring(error), sys.exit() # project header header = dict() project_list = list() header['items_available'] = elem.find("items_available").text header['items_returned'] = elem.find("items_returned").text header['first_item_position'] = int(elem.find("first_item_position").text) # Output all the immediate child properties of an Account for projects in elem.findall("result/project"): data = dict() data['header'] = header data['id'] = projects.find("id").text data['name'] = projects.find("name").text data['homepage_url'] = projects.find("homepage_url").text #data['description'] = (projects.find("description").text).replace('"','') data['description'] = " TEST " # 로고 정보를 가지고 있지 않은 프로젝트도 있음 if(ET.iselement(projects.find("medium_logo_url"))): data['medium_logo_url'] = projects.find("medium_logo_url").text data['small_logo_url'] = projects.find("small_logo_url").text else: data['medium_logo_url'] = "#" data['small_logo_url'] = "#" data['ohloh_url'] = "https://www.ohloh.net/p/"+data['id'] licenses = list() # Multi-License parsing for item in projects.findall("licenses/license"): license = dict() license['name'] = item.find("name").text license['nice_name'] = item.find("nice_name").text license['license_url'] = self.license_base+item.find("name").text licenses.append(license) # 라이선스 정보가 아예 없을경우에는 'unknown' 으로 표시함 if (len(licenses) == 0): item = dict() item['name'] = 'unknown' item['nice_name'] = 'unknown' item['license_url'] = '#' licenses.append(item) data['licenses'] = licenses project_list.append(data) ## Return arrays of JSON type string data return project_list def save_result(search_result): """ do save """ return None
def get_project(self, pageIndex): """ 클래스 생성자에 초기화된 search값의 오픈소스 프로젝트를 검색한다. pageIndex는 검색결과의 몇번째 페이지를 보여줄 것인지를 결정한다. """ url = self.url + self.search + "&page=" + str(pageIndex) f = urllib.urlopen(url) # Parse the response into a structured XML object tree = ET.parse(f) # Did Ohloh return an error? elem = tree.getroot() error = elem.find("error") if error != None: print 'Ohloh returned:', ET.tostring(error), sys.exit() # project header header = dict() project_list = list() header['items_available'] = elem.find("items_available").text header['items_returned'] = elem.find("items_returned").text header['first_item_position'] = int( elem.find("first_item_position").text) # Output all the immediate child properties of an Account for projects in elem.findall("result/project"): data = dict() data['header'] = header data['id'] = projects.find("id").text data['name'] = projects.find("name").text data['homepage_url'] = projects.find("homepage_url").text #data['description'] = (projects.find("description").text).replace('"','') data['description'] = " TEST " # 로고 정보를 가지고 있지 않은 프로젝트도 있음 if (ET.iselement(projects.find("medium_logo_url"))): data['medium_logo_url'] = projects.find("medium_logo_url").text data['small_logo_url'] = projects.find("small_logo_url").text else: data['medium_logo_url'] = "#" data['small_logo_url'] = "#" data['ohloh_url'] = "https://www.ohloh.net/p/" + data['id'] licenses = list() # Multi-License parsing for item in projects.findall("licenses/license"): license = dict() license['name'] = item.find("name").text license['nice_name'] = item.find("nice_name").text license['license_url'] = self.license_base + item.find( "name").text licenses.append(license) # 라이선스 정보가 아예 없을경우에는 'unknown' 으로 표시함 if (len(licenses) == 0): item = dict() item['name'] = 'unknown' item['nice_name'] = 'unknown' item['license_url'] = '#' licenses.append(item) data['licenses'] = licenses project_list.append(data) ## Return arrays of JSON type string data return project_list def save_result(search_result): """ do save """ return None
class tvn: mode = 0 __settings__ = xbmcaddon.Addon(sys.modules["__main__"].scriptID) __moduleSettings__ = settings.TVSettings() contentHost = 'http://tvnplayer.pl' mediaHost = 'http://redir.atmcdn.pl' authKey = 'b4bc971840de63d105b3166403aa1bea' startUrl = '/api/?platform=Mobile&terminal=Android&format=xml&v=2.0&authKey=' + authKey contentUserAgent = 'Apache-HttpClient/UNAVAILABLE (java 1.4)' if platform == 'Samsung TV': contentHost = 'https://api.tvnplayer.pl' authKey = 'ba786b315508f0920eca1c34d65534cd' startUrl = '/api/?platform=ConnectedTV&terminal=Samsung&format=xml&v=2.0&authKey=' + authKey contentUserAgent = 'Mozilla/5.0 (SmartHub; SMART-TV; U; Linux/SmartTV; Maple2012) AppleWebKit/534.7 (KHTML, like Gecko) SmartTV Safari/534.7' mediaMainUrl = '/scale/o2/tvn/web-content/m/' mediaUserAgent = 'Dalvik/1.2.0 (Linux; U; Android 2.2.1; GT-I5700 Build/FRG83)' contentUser = '******' contentPass = '******' def __init__(self): log.info("Starting TVN Player") self.parser = Parser.Parser() self.navigation = Navigation.VideoNav() self.common = pCommon.common() self.exception = Errors.Exception() if quality_manual == 'true': ptv.setSetting('tvn_quality_temp', '') elif quality_manual == 'false': ptv.setSetting('tvn_quality_temp', quality) def addDir(self, name, id, mode, category, iconimage, videoUrl='', listsize=0, season=0): u = sys.argv[0] + "?mode=" + mode + "&name=" + urllib.quote_plus( name) + "&category=" + urllib.quote_plus( category) + "&id=" + urllib.quote_plus(id) if season > 0: u = u + "&season=" + str(season) ok = True liz = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage) if category == 'episode': liz.setProperty("IsPlayable", "true") liz.setInfo(type="Video", infoLabels={"Title": name}) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=videoUrl, listitem=liz, isFolder=False, totalItems=listsize) else: liz.setInfo(type="Video", infoLabels={"Title": name}) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=True, totalItems=listsize) return ok def addVideoLink(self, prop, url, iconimage, listsize=0): ok = True folder = False if proxy == 'true': folder = True if not 'description' in prop: prop['description'] = '' if not 'time' in prop: prop['time'] = 0 if not 'aired' in prop: prop['aired'] = '' if not 'overlay' in prop: prop['overlay'] = 0 if not 'TVShowTitle' in prop: prop['TVShowTitle'] = '' if not 'episode' in prop: prop['episode'] = 0 liz = xbmcgui.ListItem(prop['title'], iconImage="DefaultFolder.png", thumbnailImage=iconimage) liz.setProperty("IsPlayable", "true") liz.setInfo(type="Video", infoLabels={ "Title": prop['title'], "Plot": prop['description'], "Duration": str(prop['time']), "Premiered": prop['aired'], "Overlay": prop['overlay'], "TVShowTitle": prop['TVShowTitle'], "Episode": prop['episode'] }) if dstpath != "None" or not dstpath: cm = self.navigation.addVideoContextMenuItems({ 'service': SERVICE, 'title': urllib.quote_plus(prop['title']), 'url': urllib.quote_plus(url), 'path': os.path.join(dstpath, SERVICE) }) liz.addContextMenuItems(cm, replaceItems=False) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=url, listitem=liz, isFolder=folder, totalItems=listsize) return ok def addVideoProxyLink(self, prop, url, iconimage, listsize=0): ok = True u = '%s?service=%s&url=%s&type=playSelectedMovie&name=%s' % ( sys.argv[0], SERVICE, urllib.quote_plus(url), prop['title']) folder = False if proxy == 'true': folder = True if not 'description' in prop: prop['description'] = '' if not 'time' in prop: prop['time'] = 0 if not 'aired' in prop: prop['aired'] = '' if not 'overlay' in prop: prop['overlay'] = 0 if not 'TVShowTitle' in prop: prop['TVShowTitle'] = '' if not 'episode' in prop: prop['episode'] = 0 if dbg == 'true': log.info('TVN - addVideoProxyLink() -> prop[]: ' + str(prop)) liz = xbmcgui.ListItem(prop['title'], iconImage="DefaultFolder.png", thumbnailImage=iconimage) liz.setProperty("IsPlayable", "true") liz.setInfo(type="Video", infoLabels={ "Title": prop['title'], "Plot": prop['description'], "Duration": str(prop['time']), "Premiered": prop['aired'], "Overlay": prop['overlay'], "TVShowTitle": prop['TVShowTitle'], "Episode": prop['episode'] }) if dstpath != "None" or not dstpath: cm = self.navigation.addVideoContextMenuItems({ 'service': SERVICE, 'title': urllib.quote_plus(prop['title']), 'url': urllib.quote_plus(url), 'path': os.path.join(dstpath, SERVICE) }) liz.addContextMenuItems(cm, replaceItems=False) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, isFolder=folder, totalItems=listsize) return ok def listsCategories(self): if quality_manual == 'true': ptv.setSetting('tvn_quality_temp', '') elif quality_manual == 'false': ptv.setSetting('tvn_quality_temp', quality) if self.category != 'None' and self.id != 'None': method = 'getItems' groupName = 'items' page = 1 + self.page urlQuery = '&type=%s&id=%s&limit=%s&page=%s&sort=newest&m=%s' % ( self.category, self.id, str(PAGE_LIMIT), str(page), method) if self.season > 0: urlQuery = urlQuery + "&season=" + str(self.season) else: method = 'mainInfo' groupName = 'categories' urlQuery = '&m=' + method if dbg == 'true': log.info('TVN - listCategories() -> link: ' + self.contentHost + self.startUrl + urlQuery) try: #response = urllib2.urlopen(req) response = self.common.getURLRequestData({ 'url': self.contentHost + self.startUrl + urlQuery, 'use_host': True, 'host': self.contentUserAgent, 'use_cookie': False, 'use_post': False, 'return_data': False }) except Exception, exception: traceback.print_exc() self.exception.getError(str(exception)) exit() xmlDoc = ET.parse(response).getroot() categories = xmlDoc.findall(method + "/" + groupName + "/row") countItemNode = xmlDoc.find(method + "/count_items") showNextPage = False if ET.iselement(countItemNode): countItem = int(countItemNode.text) if countItem > int(PAGE_LIMIT) * (1 + self.page): showNextPage = True listsize = len(categories) seasons = xmlDoc.find(method + "/seasons") showSeasons = False if ET.iselement(seasons) and self.season == 0: showSeasons = True listsize = listsize + seasons.__len__() numSeasons = seasons.__len__() else: numSeasons = 0 hasVideo = False if self.season <> 0 or (self.season == numSeasons): for category in categories: titleNode = category.find('name') if not ET.iselement(titleNode): titleNode = category.find('title') if ET.iselement(titleNode): name = titleNode.text.encode('utf-8') else: name = 'brak' episodeNode = category.find('episode') if ET.iselement(episodeNode): episodeNo = episodeNode.text if episodeNo: if episodeNode.text != "0": name = name + ", odcinek " + str(episodeNode.text) seasonNode = category.find('season') if ET.iselement(seasonNode): seasonNo = seasonNode.text if seasonNo: if seasonNo != "0": name = name + ", sezon " + str(seasonNo) airDateNode = category.find('start_date') if ET.iselement(airDateNode): airDateStr = airDateNode.text if airDateStr: airDate = strptime(airDateStr, "%Y-%m-%d %H:%M") #if airDate < now = localtime() if airDate > now: name = name + " (planowany)" #print airDate.text type = category.find('type').text.encode('utf-8') id = category.find('id').text.encode('utf-8') videoUrl = '' if type == 'episode': videoProp = self.getVideoUrl(type, id) videoUrl = videoProp[0] iconUrl = self.getIconUrl(category) if videoUrl == "": self.addDir(name, id, self.mode, type, iconUrl, videoUrl, listsize) else: prop = { 'title': name, 'TVShowTitle': name, 'aired': airDate, 'episode': 0, 'description': videoProp[2], 'time': int(videoProp[1]) } if self.watched(videoUrl): prop['overlay'] = 7 if dbg == 'true': log.info( 'TVN Player - listCategories() -> videoUrl: ' + videoUrl) if proxy == 'true': hasVideo = False if dbg == 'true': log.info( 'TVN - listCategories()[proxy] -> prop[]: ' + str(prop)) self.addVideoProxyLink(prop, videoUrl, iconUrl, listsize) else: hasVideo = True self.addVideoLink(prop, videoUrl, iconUrl, listsize) if showSeasons: for season in seasons: iconUrl = self.getIconUrl(season) self.addDir( season.find('name').text, self.id, self.mode, self.category, iconUrl, "", listsize, season.find('id').text) if showNextPage: self.addNextPage() xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_UNSORTED) xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_LABEL) if hasVideo: xbmcplugin.setContent(int(sys.argv[1]), 'episodes') xbmcplugin.endOfDirectory(int(sys.argv[1]))