Форум XBMC \ Kodi Russia
   

Вернуться   Форум XBMC \ Kodi Russia > Анонсы, Информация и Общие Темы > Подсказки, описания и FAQ по XBMC

Ответ
 
Опции темы Опции просмотра
Старый 27.11.2016, 14:12   #1
SergeSmitch
Senior Member
 
Регистрация: 25.09.2011
Сообщений: 857
Отправить сообщение для SergeSmitch с помощью ICQ Отправить сообщение для SergeSmitch с помощью Skype™
По умолчанию Помогите настроить парсер .xml

Всем привет. Просьба о помощи.
Имеем плагин видео plugin.video.deutsche_sender
Который парсит .xml
addon.py:
PHP код:
import sys
import xbmc
import xbmcgui
import xbmcplugin
import xbmcaddon
import urllib
import urlparse
import os
.path
import xml
.etree.ElementTree as ET


def get_xml_file_path
():
    
""" Return (path, filename) """
    
# .kodi/userdata/addon_data/[addon name]
    
path xbmc.translatePath(
        
addon.getAddonInfo('profile')).decode("utf-8")
    
name addon.getSetting('xml_filename')

    return (
pathname)


def copy_default_xml_file(target_file_name):
    try:
        
path addon.getAddonInfo('path').decode('utf-8')
        
fin open(os.path.join(path"deutschesender.xml"), "r")
        
fout file(target_file_name"w")
        
fout.write(fin.read(-1))  # .encode('utf-8'))
        
fout.close()
        
fin.close()
    
except IOError as e:
        
raise e


# For xml update over gui
def update_xml_file():

    
import requests
    import os

    
class FetchError(Exception):
        
pass

    
# addon = xbmcaddon.Addon()
    
addon_name addon.getAddonInfo("name")
    
source_url addon.getSetting('xml_update_url')
    (
xml_pathxml_name) = get_xml_file_path()

    try:
        if 
not os.path.isdir(xml_path):
            
os.mkdir(xml_path)
    
except OSError as e:
        
err 'Can\'t create folder for addon data.'
        
xbmcgui.Dialog().notification(addon_nameerr,
                                      
xbmcgui.NOTIFICATION_ERROR5000)

    try:
        
requests.get(source_url)
        if 
r.status_code != 200:
            
raise requests.RequestException(response=r)

        
file(xml_path+xml_name"w")
        
o.write(r.text.encode(r.encoding))
        
# o.write(r.text.encode('utf-8')) # Seems wrong for iso*-input
        
o.close()

        
info "File %s updated" % (xml_name,)
        
xbmcgui.Dialog().ok(addon_nameinfo)
    
except requests.RequestException as e:
        
err 'Can\'t fetch %s: %s' % (xml_namee)
        
xbmcgui.Dialog().notification(addon_nameerr,
                                      
xbmcgui.NOTIFICATION_ERROR5000)
        
# raise FetchError(e)
    
except IOError as e:
        
err 'Can\'t create file %s%s: %s' % (xml_path,
                                               
xml_namee)
        
xbmcgui.Dialog().notification(addon_nameerr,
                                      
xbmcgui.NOTIFICATION_ERROR5000)
        
# raise FetchError(e)


def fetch_channels_from_xml(xml_filechannel_name=None):

    
# addon = xbmcaddon.Addon()
    
xml_file "".join(get_xml_file_path())
    if 
not os.path.isfile(xml_file):
        
# 1. Use default file
        
copy_default_xml_file(xml_file)

        
# 2. Toggle update
        
update_xml_file()

    
elems ET.parse(open(xml_file"r")).getroot()

    if 
channel_name is None:
        
# Return list of channels
        
channels elems.findall("channel")
        
ret = []
        for 
channel in channels:
            
ret.append({
                
'name'channel.findtext("name"),
                
# 'thumbnail': item.findtext("thumbnail"),
                # 'fanart': item.findtext("fanart"),
            
})
        return 
ret
    
else:
        
# Return list of items for channel
        
ret = []
        
channels elems.findall("channel")
        for 
channel in channels:
            if 
channel.findtext("name") == channel_name:
                
items channel.find("items").findall("item")
                for 
item in items:
                    
it = {}
                    for 
child in item:
                        
it[child.tag] = child.text
                    ret
.append(it)
                break
        return 
ret


def build_url
(query):
    return 
base_url '?' urllib.urlencode(query)

# Main code

base_url sys.argv[0]
addon xbmcaddon.Addon()

# RunScript handling
if sys.argv[1] == 'update_xml_file':
    
update_xml_file()
else:
    
addon_handle int(sys.argv[1])
    
args urlparse.parse_qs(sys.argv[2][1:])

    
xbmcplugin.setContent(addon_handle'movies')
    
# addon = xbmcaddon.Addon()

    
mode args.get('mode'None)
    if 
mode is None:
        
channels fetch_channels_from_xml(addon.getSetting('xml_filename'))
        
listing = []
        for 
channel in channels:
            
channel_name channel.get('name''?')
            
url build_url({'mode''channel''channel_name'channel_name})
            
li xbmcgui.ListItem(channel_nameiconImage='DefaultFolder.png')

            
# Set 'IsPlayable' property to 'true'.
            # This is mandatory for playable items!
            
li.setProperty('IsPlayable''true')

            
# Add the list item to a virtual Kodi folder.
            # is_folder = False means that this item won't open any sub-list.
            
is_folder True

            
# Add our item to the listing as a 3-element tuple.
            
listing.append((urlliis_folder))
            
# xbmcplugin.addDirectoryItem(handle=addon_handle, url=url,
            #                            listitem=li, isFolder=True)

        
xbmcplugin.addDirectoryItems(addon_handlelistinglen(listing))
        
xbmcplugin.endOfDirectory(addon_handle)

    
elif mode[0] == 'channel':
        
channel_name str(args.get('channel_name')[0])
        
items fetch_channels_from_xml(
            
addon.getSetting('xml_filename'), channel_name)
        
listing = []
        for 
item in items:
            
title item.get('title''?')
            
url item.get('link''?')
            
# if "://" in url: # seems not required
            #    url = urllib.quote(url)

            
li xbmcgui.ListItem(titleiconImage='DefaultVideo.png')
            
li.setProperty('IsPlayable''true')
            
is_folder False
            listing
.append((urlliis_folder))
            
# xbmcplugin.addDirectoryItem(handle=addon_handle,
            #  url=url, listitem=li)

        
xbmcplugin.addDirectoryItems(addon_handlelistinglen(listing))
        
xbmcplugin.endOfDirectory(addon_handle

Задача , перенастроить на парсинг своего .xml
PHP код:
<frior:query xmlns:frior="http://0.0.0.0:8080" frior:count="622" frior:created="2016-11-27T11:55:24" frior:version="1.5">
<
results>
<
sat idx="2" degree="360" name="Eutelsat 36A/36B">
<
tp idx="260" freq="12130" polar="0" sr="27500" tsid="20" orgnetid="112" netname=" " change_svc_possibility="1" streaming_possibility="0">
<
svc idx="0" type="0" sid="20105" vpid="205" apid="305" ppid="205" scrambled="1" blocked="0" fav="4136">
<
service num="1" lcn="238" vtype="27" atype="4">Первый канал HD</service>
<
evt id="29395" stime="2016-11-27T10:45" etime="2016-11-27T12:30">
<
name>ЮБИЛЕЙНЫЙ КОНЦЕРТ</name>
<
text>ВЯЧЕСЛАВА ДОБРЫНИНА (S)</text>
</
evt>
</
svc>
<
svc idx="1" type="0" sid="20106" vpid="206" apid="306" ppid="206" scrambled="1" blocked="0" fav="4136">
<
service num="2" lcn="239" vtype="27" atype="4">Россия HD</service>
<
evt id="3039" stime="2016-11-27T11:20" etime="2016-11-27T15:00">
<
name>МЕЗАЛЬЯНС фильм</name>
<
text>(null)</text>
</
evt>
</
svc>
<
svc idx="232" type="0" sid="20101" vpid="201" apid="301" ppid="201" scrambled="1" blocked="0" fav="4192">
<
service num="233" lcn="234" vtype="27" atype="4">Nat Geo Wild HD</service>
<
evt id="10453" stime="2016-11-27T11:25" etime="2016-11-27T12:20">
<
name>ДИКАЯ КОЛУМБИЯ:</name>
<
text>ЧИРИБИКЕТЕПУТЕШЕСТВИЕ К СЕРДЦУ АМАЗОНКИ (12+)</text>
</
evt>
</
svc>
<
svc idx="233" type="0" sid="20102" vpid="202" apid="302" ppid="202" scrambled="1" blocked="0" fav="4192">
<
service num="234" lcn="235" vtype="27" atype="4">RTG HD</service>
<
evt id="58292" stime="2016-11-27T11:30" etime="2016-11-27T12:00">
<
name>ПОДЗЕМНЫЙ МИР ХРЕБТА</name>
<
text>АЗИШ-ТАУ (16+)</text>
</
evt>
</
svc>
<
svc idx="234" type="0" sid="20103" vpid="203" apid="303" ppid="203" scrambled="1" blocked="0" fav="4384">
<
service num="235" lcn="236" vtype="27" atype="4">Mezzo Live HD</service>
<
evt id="12919" stime="2016-11-27T11:30" etime="2016-11-27T12:00">
<
name>ИНТЕРМЕЦЦО</name>
<
text>(null)</text>
</
evt>
</
svc>
<
svc idx="235" type="0" sid="20104" vpid="204" apid="304" ppid="204" scrambled="1" blocked="0" fav="4128">
<
service num="236" lcn="237" vtype="27" atype="4">MGM HD</service>
<
evt id="4373" stime="2016-11-27T11:40" etime="2016-11-27T13:20">
<
name>СТАРСКИ И ХАТЧ (12+)</name>
<
text>
криминальная комедия Тодда ФиллипсаВ роляхБен СтиллерОуэн УилсонСнуп Догг2004г.
</
text>
</
evt>
</
svc>
</
tp>
<
tp idx="272" freq="12322" polar="0" sr="27500" tsid="1" orgnetid="112" netname=" " change_svc_possibility="1" streaming_possibility="0">
<
svc idx="2" type="0" sid="123" vpid="223" apid="323" ppid="223" scrambled="1" blocked="0" fav="0">
<
service num="3" lcn="23" vtype="27" atype="4">STV</service>
<
evt id="21781" stime="2016-11-27T11:25" etime="2016-11-27T12:00">
<
name>МУЗЫКАЛЬНЫЙ БЛОК</name>
<
text>(null)</text>
</
evt>
</
svc>
<
svc idx="3" type="0" sid="124" vpid="224" apid="324" ppid="224" scrambled="1" blocked="0" fav="4096">
<
service num="4" lcn="24" vtype="27" atype="4">КВН ТВ (ТЕСТ)</service>
<
evt id="58677" stime="2016-11-27T11:30" etime="2016-11-27T13:40">
<
name>ИГРЫ КОМАНДЫ</name>
<
text>
"ТРИОД И ДИОД" (СМОЛЕНСК) - Высшая лигапервый четвертьфинал 2012 (16+)
</
text>
</
evt>
</
svc>
<
svc idx="18" type="0" sid="101" vpid="201" apid="301" ppid="201" scrambled="1" blocked="0" fav="0">
<
service num="19" lcn="1" vtype="27" atype="4">365 дней ТВ</service>
<
evt id="3175" stime="2016-11-27T11:50" etime="2016-11-27T12:45">
<
name>БИТВА ЗА АФРИКУ (12+)</name>
<
text>(null)</text>
</
evt>
</
svc>
<
svc idx="19" type="0" sid="102" vpid="202" apid="302" ppid="202" scrambled="1" blocked="0" fav="0">
<
service num="20" lcn="2" vtype="27" atype="4">Авто Плюс</service>
<
evt id="3746" stime="2016-11-27T11:00" etime="2016-11-27T12:00">
<
name>КРУТОЙ ТЮНИНГ (16+)</name>
<
text>(null)</text>
</
evt>
</
svc>
<
svc idx="20" type="0" sid="103" vpid="203" apid="303" ppid="203" scrambled="1" blocked="0" fav="0">
<
service num="21" lcn="3" vtype="27" atype="4">Европа Плюс ТВ</service>
<
evt id="11767" stime="2016-11-27T09:00" etime="2016-11-27T13:00">
<
name>HIT NON STOP! (12+)</name>
<
text>(null)</text>
</
evt>
</
svc>
<
svc idx="21" type="0" sid="104" vpid="204" apid="304" ppid="204" scrambled="1" blocked="0" fav="2">
<
service num="22" lcn="4" vtype="27" atype="4">ИНДИЙСКОЕ КИНО</service>
<
evt id="43323" stime="2016-11-27T09:10" etime="2016-11-27T12:10">
<
name>ЧЕТВЕРКА СУМАСШЕДШИХ</name>
<
text>
комедияВ роляхАршад ВарсиДжухи ЧавлаИрфан КханДия МирзаИндия2009 (16+)
</
text>
</
evt>
</
svc>
<
svc idx="22" type="0" sid="105" vpid="205" apid="305" ppid="205" scrambled="1" blocked="0" fav="2">
<
service num="23" lcn="5" vtype="27" atype="4">КИНОМИКС</service>
<
evt id="53816" stime="2016-11-27T11:40" etime="2016-11-27T13:05">
<
name>ПОД МАСКОЙ ЖИГОЛО</name>
<
text>
комедия Джона ТуртурроВ роляхДжон ТуртурроВуди АлленВанесса ПарадиЛиев ШрайберШэрон СтоунСофия ВергараСША2013. 16+
</
text>
</
evt>
</
svc>
<
svc idx="23" type="0" sid="106" vpid="206" apid="306" ppid="206" scrambled="1" blocked="0" fav="2">
<
service num="24" lcn="6" vtype="27" atype="4">КИНОСВИДАНИЕ</service>
<
evt id="23459" stime="2016-11-27T11:50" etime="2016-11-27T13:30">
<
name>МОЙ ПЕРВЫЙ РАЗ</name>
<
text>
мелодрамаВ роляхЭстер КомарМартин КаннавоВенсан ПересЖюдит Эль ЗейнФранция2012. 16+
</
text>
</
evt>
</
svc>
<
svc idx="24" type="0" sid="107" vpid="207" apid="307" ppid="207" scrambled="1" blocked="0" fav="2">
<
service num="25" lcn="7" vtype="27" atype="4">КИНОХИТ</service>
<
evt id="46631" stime="2016-11-27T10:40" etime="2016-11-27T12:40">
<
name>ДРУГОЙ МИР</name>
<
text>
фантастический триллер Лена УайзменаВ роляхКейт БекинсэйлСкотт СпидменМайкл ШинСША-Германия-Венгрия-Великобритания2003. 18+
</
text>
</
evt>
</
svc>
<
svc idx="25" type="0" sid="108" vpid="208" apid="308" ppid="208" scrambled="1" blocked="0" fav="2">
<
service num="26" lcn="8" vtype="27" atype="4">КИНОКОМЕДИЯ</service>
<
evt id="46089" stime="2016-11-27T11:00" etime="2016-11-27T12:45">
<
name>КАК УКРАСТЬ БРИЛЛИАНТ</name>
<
text>
авантюрная комедияВ роляхПирс БроснанЭмма ТомпсонТимоти СполлСелия ИмриЛуиз БургуэнСША-Франция2013 (16+)
</
text>
</
evt>
</
svc

Для начала хочу добиться хотя-бы вывода в список тега:
<service
Проблеммы:
1. Ввел новый адрес .xml в настройках.
При обновлении выдает ошибку.
Лог:
13:59:10 T:2904 ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
- NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
Error Type: <type 'exceptions.TypeError'>
Error Contents: encode() argument 1 must be string, not None
Traceback (most recent call last):
File "D:\kodi-16.1-Jarvis\portable_data\addons\plugin.video.deutsche_ sender-master\addon.py", line 131, in <module>
update_xml_file()
File "D:\kodi-16.1-Jarvis\portable_data\addons\plugin.video.deutsche_ sender-master\addon.py", line 62, in update_xml_file
o.write(r.text.encode(r.encoding))
TypeError: encode() argument 1 must be string, not None
-->End of Python script error report<--

Удалил - o.write(r.text.encode(r.encoding))
Раскоментировал - # o.write(r.text.encode('utf-8')) # Seems wrong for iso*-input
Файл начал обновляться без ошибок.
2. Дальше тупик , какие-бы теги не подставлял в addon.py: , из тела своего .xml
Список не появляется
В кодировке ли дело , еще в чем ? Не пойму за недостатком знаний.
Посему прошу помощи сообщества. Растолкуйте неразумному как сделать правильно.
Исходный код оригинального .xml , про кодировку в теле ничего не имеет.
У моего - <?xml version="1.0" encoding="UTF-8"?>
Надеюсь на помощь.
SergeSmitch вне форума   Ответить с цитированием
 

Старый 27.11.2016, 23:24   #2
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,883
По умолчанию

У вас задача модифицировать исходный плагин или распарсить свой xml? Если последнее, то открываете любой по ElementTree и вперед. Для начала потренируетесь на кошках, в смысле, на скрипте вне Коди.
__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
------------------------------
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
------------------------------
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
------------------------------
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.
Roman_V_M вне форума   Ответить с цитированием
Ответ
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите настроить RSS Ленту Новостей на русском языке orudie Поддержка платформы Windows 1 25.03.2014 17:53
Как настроить подключение по Wi-Fi ? Starcomputer Поддержка платформы Linux \ Live 43 17.02.2014 09:25
Помогите настроить ТВ monte-kristo Поддержка платформы Mac 1 15.04.2013 11:00
Помогите настроить ТМТ плеер+BR dimakv Поддержка платформы Windows 14 03.01.2013 21:51
Помогите настроить bluetooth! needDrivers Поддержка платформы Linux \ Live 5 15.04.2011 08:33


Текущее время: 20:41. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.