-
Notifications
You must be signed in to change notification settings - Fork 9
/
addon.py
162 lines (134 loc) · 4.25 KB
/
addon.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import os
import re
import urllib
import urllib2
from xbmc import getCondVisibility as condtition, translatePath as translate
import xbmcaddon
import xbmcgui
addon = xbmcaddon.Addon(id='script.xbmc.debug.log')
ADDON_TITLE = addon.getAddonInfo('name')
ADDON_VERSION = addon.getAddonInfo('version')
UPLOAD_LINK = 'http://xbmclogs.com/show.php?id=%s'
UPLOAD_URL = 'http://xbmclogs.com/'
STRINGS = {
'upload_id': 30001,
'upload_url': 30002,
'no_email_set': 30003,
'you_would_get_an_email': 30005,
'with_a_link_to_your': 30006,
'uploaded_xbmc_logfile': 30007,
'dont_want': 30008,
'open_settings': 30009,
'you_would_get_an_email': 30010,
'with_a_link_to_your': 30011,
'uploaded_xbmc_logfile': 30012,
'dont_want': 30013,
'open_settings': 30014,
'wont_get_mail': 30015,
'do_you_want_to_upload': 30016,
'logfile_to_xbmclogs_com': 30017,
'will_receive_email_to': 30018,
}
REPLACES = (
('//.+?:.+?@', '//USER:PASSWORD@'),
('<user>.+?</user>', '<user>USER</user>'),
('<pass>.+?</pass>', '<pass>PASSWORD</pass>'),
)
class NetworkError(Exception):
pass
def get_email_address():
if addon.getSetting('dont_ask_email') == 'true':
log('dont_ask_email enabled')
return
email_address = addon.getSetting('email')
while not email_address:
try_again = xbmcgui.Dialog().yesno(
heading=_('no_email_set'),
line1=_('you_would_get_an_email'),
line2=_('with_a_link_to_your'),
line3=_('uploaded_xbmc_logfile'),
nolabel=_('dont_want'),
yeslabel=_('open_settings')
)
if not try_again:
return
addon.openSettings()
email_address = addon.getSetting('email')
log('got email address')
return email_address
def ask_upload(email_address):
if email_address:
line3 = _('will_receive_email_to') % email_address
else:
line3 = _('wont_get_mail')
ok = xbmcgui.Dialog().yesno(
heading=ADDON_TITLE,
line1=_('do_you_want_to_upload'),
line2=_('logfile_to_xbmclogs_com'),
line3=line3,
)
return ok
def get_log_content():
log_path = translate('special://logpath')
log_file_path = os.path.join(log_path, 'xbmc.log')
with open(log_file_path, 'r') as f:
log_content = f.read()
for pattern, repl in REPLACES:
log_content = re.sub(pattern, repl, log_content)
return log_content
def upload_log_content(log_content):
post_dict = {
'paste_data': log_content,
'api_submit': True,
'mode': 'xml',
'paste_lang': 'xbmc'
}
response = _post_data(UPLOAD_URL, post_dict)
upload_re = re.compile('<id>([0-9]+)</id>', re.DOTALL)
match = re.search(upload_re, response)
if match:
return match.group(1)
else:
log('Upload failed with response: %s' % repr(response))
def report_mail(email_address, paste_id):
url = 'http://xbmclogs.com/xbmc-addon.php'
post_dict = {
'email': email_address,
'xbmclog_id': paste_id
}
response = _post_data(url, post_dict)
def report_dialog(paste_id):
url = UPLOAD_LINK % paste_id
Dialog = xbmcgui.Dialog()
msg1 = _('upload_id') % paste_id
msg2 = _('upload_url') % url
return Dialog.ok(ADDON_TITLE, msg1, '', msg2)
def _post_data(url, post_dict):
headers = {'User-Agent': '%s-%s' % (ADDON_TITLE, ADDON_VERSION)}
post_data = urllib.urlencode(post_dict)
req = urllib2.Request(url, post_data, headers)
try:
response = urllib2.urlopen(req).read()
except urllib2.HTTPError, error:
raise NetworkError('HTTPError: %s' % error)
return response
def log(msg):
xbmc.log(u'%s: %s' % (ADDON_TITLE, msg))
def _(string_id):
if string_id in STRINGS:
return addon.getLocalizedString(STRINGS[string_id])
else:
log('String is missing: %s' % string_id)
return string_id
def main():
email_address = get_email_address()
if not ask_upload(email_address):
log('aborted, user doesn\'t want')
return
log_content = get_log_content()
paste_id = upload_log_content(log_content)
if email_address:
report_mail(email_address, paste_id)
report_dialog(paste_id)
if __name__ == '__main__':
main()