如何在Kodi中以字符串形式读取utf8编码的JSON文件(本地/来自internet)?

2024-06-16 12:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我遵循了Kodi简单视频插件tutorial,它与嵌入到main.py文件中的JSON字符串一样工作

本教程提到可以通过其他方式从其他媒体(文件、互联网)获取JSON字符串

到目前为止,我试图将utf-8 JSON文件读入字符串的尝试没有成功

最初,我尝试了以下方法

import json
import codecs
fname = 'c:/temp/iptv/video_data.json'

with open(fname, encoding='utf-8') as f:
    data = f.read()
    VIDEO = json.loads(data)

是什么导致日志文件中出现以下错误

2020-05-09 11:11:29.327 T:19428   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: 'encoding' is an invalid keyword argument for this function
                                            Traceback (most recent call last):
                                              File "C:\Users\Alex Fox\AppData\Roaming\Kodi\addons\plugin.video.example\main.py", line 27, in <module>
                                                with open(fname, encoding='utf-8') as f:
                                            TypeError: 'encoding' is an invalid keyword argument for this function
                                            -->End of Python script error report<--

我调查了这个问题,发现Kodi 18.4使用python27.dll,我假设这个库是从Kodi访问的

我用下面的代码片段将上面的代码替换为main.py文件

import json
import codecs
fname = 'c:/temp/iptv/video_data.json'

with open(fname, 'rb') as f:
    bytes = f.read()
    data = bytes.decode('utf-8')
    VIDEOS = json.loads(data)

在插件运行时,它会在日志文件中生成以下错误记录

2020-05-09 16:54:17.024 T:5700   ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
                                             - NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
                                            Error Type: <type 'exceptions.UnicodeEncodeError'>
                                            Error Contents: 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128)
                                            Traceback (most recent call last):
                                              File "C:\Users\Alex Fox\AppData\Roaming\Kodi\addons\plugin.video.example\main.py", line 239, in <module>
                                                router(sys.argv[2][1:])
                                              File "C:\Users\Alex Fox\AppData\Roaming\Kodi\addons\plugin.video.example\main.py", line 233, in router
                                                list_categories()
                                              File "C:\Users\Alex Fox\AppData\Roaming\Kodi\addons\plugin.video.animatron\main.py", line 137, in list_categories
                                                url = get_url(action='listing', category=category)
                                              File "C:\Users\Alex Fox\AppData\Roaming\Kodi\addons\plugin.video.animatron\main.py", line 66, in get_url
                                                return '{0}?{1}'.format(_url, urlencode(kwargs))
                                              File "C:\bin\Portable\Kodi\system\python\Lib\urllib.py", line 1343, in urlencode
                                                v = quote_plus(str(v))
                                            UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128)
                                            -->End of Python script error report<--

同时在KODI之外执行代码(使用Python 3.8.2测试)

import json
import codecs
fname = 'c:/temp/iptv/animation.json'

with open(fname, 'rb') as f:
    bytes = f.read()
    str   = bytes.decode('utf-8')
    VIDEOS = json.loads(str)
    print(json.dumps(VIDEOS, indent=4))
    for key in VIDEOS.keys():
        print(key)

正确输出JSON转储和视频字典键

Kodi中将utf-8编码的JSON文件/互联网读入字符串的正确方法是什么


Tags: 文件inpyimportjsondatamainvideo
1条回答
网友
1楼 · 发布于 2024-06-16 12:24:08

从web服务器获取数据的解决方案:

从Kodi中的zip文件script.modules.requtests-2.22.0.zip下载并安装

然后添加到addon.xml文件<import addon="script.module.requests" version="2.22.0"/>

<requires>
  <import addon="xbmc.python" version="2.25.0"/>
  <import addon="script.module.requests" version="2.22.0"/>
</requires>

现在在插件的main.py文件中插入以下代码片段

import json
import requests

url = 'http://iptv.server.com/series.json'

VIDEOS = {}
html = requests.get(url)
DATA = json.loads(html.content)
for title in DATA.keys():
    title_utf8 = title.encode('utf-8')
    VIDEOS[title_utf8] = []
    for episode in DATA[title]:
        episode['name']  = episode['name'].encode('utf-8')
        episode['genre'] = episode['genre'].encode('utf-8')
        VIDEOS[title_utf8].append(episode)

启动Kodi并测试插件

下一个代码段用于从本地存储读取文件

import json        

fname = 'c:/temp/iptv/animation.json';

VIDEOS = {}

with open(fname,'r') as f:
    str = f.read()
    DATA = json.loads(str)

for title in DATA.keys():
    title_utf8 = title.encode('utf-8')
    VIDEOS[title_utf8] = []
    for episode in DATA[title]:
        episode['name']  = episode['name'].encode('utf-8')
        episode['genre'] = episode['genre'].encode('utf-8')
        VIDEOS[title_utf8].append(episode)

相关问题 更多 >