示例#1
0
    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
示例#3
0
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
示例#4
0
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)})
示例#5
0
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)})
示例#6
0
 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
示例#7
0
 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
示例#8
0
    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
示例#9
0
    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
示例#10
0
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))
示例#11
0
  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))
示例#12
0
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
示例#13
0
    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))
示例#14
0
 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)
示例#15
0
文件: tvn.py 项目: mmdl/sd-xbmc
        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:
示例#16
0
                '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 = []
示例#17
0
文件: tvp.py 项目: mmdl/sd-xbmc
    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) )
示例#18
0
文件: Project.py 项目: 4mba/practice
    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
            
示例#19
0
    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
示例#20
0
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]))