Skip to content

Commit 084ae94

Browse files
authored
[script.logviewer] 2.1.8+matrix.1 (#2857)
1 parent 6bf8c3e commit 084ae94

5 files changed

Lines changed: 155 additions & 40 deletions

File tree

script.logviewer/addon.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<addon id="script.logviewer" name="Log Viewer for Kodi" provider-name="i96751414" version="2.1.7+matrix.1">
2+
<addon id="script.logviewer" name="Log Viewer for Kodi" provider-name="i96751414" version="2.1.8+matrix.1">
33
<requires>
44
<import addon="xbmc.python" version="3.0.0"/>
55
</requires>
@@ -15,8 +15,10 @@
1515
<source>https://github.com/i96751414/script.logviewer</source>
1616
<summary lang="en_GB">View Kodi logfile directly on Kodi</summary>
1717
<summary lang="pt_PT">Veja o log do Kodi directamente no Kodi</summary>
18+
<summary lang="sv_SE">Visa Kodi-loggfilen direkt i Kodi</summary>
1819
<description lang="en_GB">Tools to easily check and analyse Kodi log file.</description>
1920
<description lang="pt_PT">Ferramenta para verificar e ler facilmente o log do Kodi.</description>
21+
<description lang="sv_SE">Verktyg för att enkelt kontrollera och analysera Kodi-loggfiler.</description>
2022
<platform>all</platform>
2123
<news>
2224
- Make text window skin independent
@@ -29,4 +31,4 @@
2931
<screenshot>resources/images/screenshot-3.jpg</screenshot>
3032
</assets>
3133
</extension>
32-
</addon>
34+
</addon>
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# Kodi Media Center language file
2+
# Addon Name: Log Viewer for Kodi
3+
# Addon id: scripy.logviewer
4+
# Addon Provider: i96751414
5+
#
6+
msgid ""
7+
msgstr ""
8+
"Project-Id-Version: \n"
9+
"Report-Msgid-Bugs-To: \n"
10+
"POT-Creation-Date: 2017-08-06 12:03+0100\n"
11+
"PO-Revision-Date: 2025-10-01 11:47+0200\n"
12+
"Last-Translator: Daniel Nylander <github@danielnylander.se>\n"
13+
"Language-Team: sv\n"
14+
"Language: sv\n"
15+
"MIME-Version: 1.0\n"
16+
"Content-Type: text/plain; charset=UTF-8\n"
17+
"Content-Transfer-Encoding: 8bit\n"
18+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
19+
"X-Generator: Poedit 3.7\n"
20+
21+
msgctxt "#30000"
22+
msgid "Log Viewer for Kodi"
23+
msgstr "Loggvisare för Kodi"
24+
25+
msgctxt "#30001"
26+
msgid "Show Log"
27+
msgstr "Visa logg"
28+
29+
msgctxt "#30002"
30+
msgid "Show old Log"
31+
msgstr "Visa gammal logg"
32+
33+
msgctxt "#30003"
34+
msgid "Invalid number of lines. Showing full log"
35+
msgstr "Ogiltigt antal rader. Visar hela loggen"
36+
37+
msgctxt "#30004"
38+
msgid "Failed to open:"
39+
msgstr "Misslyckades med att öppna:"
40+
41+
msgctxt "#30005"
42+
msgid "Invert Log (most recent first)"
43+
msgstr "Invertera loggen (nyaste först)"
44+
45+
msgctxt "#30006"
46+
msgid "All"
47+
msgstr "Alla"
48+
49+
msgctxt "#30007"
50+
msgid "100"
51+
msgstr "100"
52+
53+
msgctxt "#30008"
54+
msgid "50"
55+
msgstr "50"
56+
57+
msgctxt "#30009"
58+
msgid "20"
59+
msgstr "20"
60+
61+
msgctxt "#30010"
62+
msgid "Number of lines to show"
63+
msgstr "Antal rader som ska visas"
64+
65+
msgctxt "#30011"
66+
msgid "Settings"
67+
msgstr "Inställningar"
68+
69+
msgctxt "#30012"
70+
msgid "General"
71+
msgstr "Allmänt"
72+
73+
msgctxt "#30013"
74+
msgid "Use custom text box"
75+
msgstr "Använd anpassad textruta"
76+
77+
msgctxt "#30014"
78+
msgid "Show log when an error occurs"
79+
msgstr "Visa logg när ett fel inträffar"
80+
81+
msgctxt "#30015"
82+
msgid "Upload Log file"
83+
msgstr "Skicka upp loggfil"
84+
85+
msgctxt "#30016"
86+
msgid "Error"
87+
msgstr "Fel"
88+
89+
msgctxt "#30017"
90+
msgid "Unable to locate log file..."
91+
msgstr "Det går inte att hitta loggfilen..."
92+
93+
msgctxt "#30018"
94+
msgid "Parse exceptions only"
95+
msgstr "Tolka endast undantag"
96+
97+
msgctxt "#30019"
98+
msgid "Enable HTTP server"
99+
msgstr "Aktivera HTTP-server"
100+
101+
msgctxt "#30020"
102+
msgid "Port"
103+
msgstr "Port"

script.logviewer/resources/lib/httpserver.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def tail_handler(ctx):
3535
ctx.send_response_and_end(500)
3636
return
3737

38-
offset = int(ctx.request.get("offset", 0))
38+
offset = int(ctx.query.get("offset", 0))
3939
reader = LogReader(ctx.log_path)
4040
reader.set_offset(offset)
4141
content = encode(reader.tail())
@@ -58,7 +58,7 @@ def favicon_handler(ctx):
5858
shutil.copyfileobj(f, ctx.wfile)
5959

6060

61-
class ServerHandler(BaseHTTPRequestHandler):
61+
class HTTPRequestHandler(BaseHTTPRequestHandler, object):
6262
protocol_version = "HTTP/1.1"
6363
log_path = log_location(False)
6464

@@ -68,23 +68,29 @@ class ServerHandler(BaseHTTPRequestHandler):
6868
"/favicon.ico": favicon_handler,
6969
}
7070

71-
# noinspection PyPep8Naming
71+
# noinspection PyPep8Naming, PyAttributeOutsideInit
7272
def do_GET(self):
73+
self._response_started = False
7374
try:
74-
# noinspection PyAttributeOutsideInit
7575
self.url = urlparse.urlsplit(self.path)
76-
self.request = dict(urlparse.parse_qsl(self.url.query))
77-
if self.url.path in self.get_routes:
78-
self.get_routes[self.url.path](self)
76+
self.query = dict(urlparse.parse_qsl(self.url.query))
77+
78+
handler = self.get_routes.get(self.url.path)
79+
if handler is None:
80+
self.send_response_and_end(404)
7981
else:
80-
self.send_response(404)
81-
self.end_headers()
82-
except BrokenPipeError as e:
83-
raise e
82+
handler(self)
8483
except Exception as e:
85-
logging.error(e)
86-
self.send_response(500)
87-
self.end_headers()
84+
if self._response_started:
85+
raise e
86+
else:
87+
logging.error(e, exc_info=True)
88+
self.send_response_and_end(500)
89+
90+
def send_response(self, *args, **kwargs):
91+
# noinspection PyAttributeOutsideInit
92+
self._response_started = True
93+
super(HTTPRequestHandler, self).send_response(*args, **kwargs)
8894

8995
def send_response_and_end(self, code, message=None):
9096
self.send_response(code, message=message)

script.logviewer/resources/lib/logviewer.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def log_location(old=False):
7373
return str_to_unicode(log_path)
7474

7575

76-
log_entry_regex = re.compile(r"(?:\d{4}-\d{2}-\d{2} )?\d{2}:\d{2}:\d{2}")
76+
log_entry_regex = re.compile(r"^(?:\d{4}-\d{2}-\d{2} )?\d{2}:\d{2}:\d{2}")
7777
log_error_regex = re.compile(r" (ERROR|error)(?: <[^>]*>)?: ")
7878
log_warning_regex = re.compile(r" (WARNING|warning)(?: <[^>]*>)?: ")
7979
log_exception_regex = re.compile(log_error_regex.pattern + "EXCEPTION ")
@@ -93,30 +93,40 @@ def set_styles(content):
9393
return content
9494

9595

96-
def parse_errors(content, set_style=False, exceptions_only=False):
97-
if content == "":
98-
return ""
96+
def preserve_indentation(line):
97+
stripped = line.lstrip(" ")
98+
return (len(line) - len(stripped)) * "\u00a0" + stripped
9999

100-
parsed_content = []
101-
found_error = False
100+
101+
def parse_errors(content, exceptions_only=False):
102102
pattern = log_exception_regex if exceptions_only else log_error_regex
103+
found_error = False
103104

104105
for line in content.splitlines():
105106
if log_entry_regex.match(line):
106107
if pattern.search(line):
107108
found_error = True
108-
parsed_content.append(line)
109+
yield line
109110
else:
110111
found_error = False
111112
elif found_error:
112-
parsed_content.append(line)
113+
yield line
113114

114-
parsed_content = "\n".join(parsed_content)
115+
116+
def process_content_lines(lines, set_style=False):
117+
content = "\n".join(preserve_indentation(line) for line in lines)
115118

116119
if set_style:
117-
parsed_content = set_styles(parsed_content)
120+
content = set_styles(content)
121+
122+
return content
118123

119-
return parsed_content
124+
125+
def get_errors(content, set_style=False, exceptions_only=False):
126+
if not content:
127+
return ""
128+
129+
return process_content_lines(parse_errors(content, exceptions_only=exceptions_only), set_style=set_style)
120130

121131

122132
def get_content(old=False, invert=False, line_number=0, set_style=False):
@@ -126,15 +136,9 @@ def get_content(old=False, invert=False, line_number=0, set_style=False):
126136
path = log_location(old)
127137
if path is None:
128138
xbmcgui.Dialog().ok(translate(30016), translate(30017))
129-
return
130-
131-
f = LogReader(path)
132-
content = f.read(invert, line_number)
139+
return None
133140

134-
if set_style:
135-
content = set_styles(content)
136-
137-
return content
141+
return process_content_lines(LogReader(path).read_lines(invert, line_number), set_style=set_style)
138142

139143

140144
def window(title, content, default=True, timeout=1):

script.logviewer/resources/lib/service.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import xbmcgui
88

99
from resources.lib import logviewer, utils
10-
from resources.lib.httpserver import ThreadedHTTPServer, ServerHandler
10+
from resources.lib.httpserver import ThreadedHTTPServer, HTTPRequestHandler
1111
from resources.lib.logreader import LogReader
1212

1313

@@ -80,7 +80,7 @@ def __init__(self, port):
8080
super(HTTPServerRunner, self).__init__()
8181

8282
def run(self):
83-
self._server = server = ThreadedHTTPServer(("", self._port), ServerHandler)
83+
self._server = server = ThreadedHTTPServer(("", self._port), HTTPRequestHandler)
8484
logging.debug("Server started at port %d", self._port)
8585
logging.debug("Local IP is %s", xbmc.getIPAddress())
8686
server.serve_forever()
@@ -120,9 +120,9 @@ def run(self):
120120

121121
while not self._monitor.waitForAbort(1) and self._running:
122122
content = reader.tail()
123-
parsed_errors = logviewer.parse_errors(content, set_style=True, exceptions_only=exceptions)
124-
if parsed_errors:
125-
logviewer.window(utils.ADDON_NAME, parsed_errors, default=utils.is_default_window())
123+
errors = logviewer.get_errors(content, set_style=True, exceptions_only=exceptions)
124+
if errors:
125+
logviewer.window(utils.ADDON_NAME, errors, default=utils.is_default_window())
126126

127127
def stop(self):
128128
self._running = False

0 commit comments

Comments
 (0)