1
|
# -*- coding: utf-8 -*-
|
2
|
# Iris 9900HD XBMC Addon
|
3
|
|
4
|
import sys
|
5
|
import httplib
|
6
|
|
7
|
import urllib, urllib2, cookielib, datetime, time, re, os, string
|
8
|
import xbmcplugin, xbmcgui, xbmcaddon, xbmcvfs, xbmc
|
9
|
import cgi, gzip
|
10
|
from StringIO import StringIO
|
11
|
import json
|
12
|
|
13
|
canal=None
|
14
|
|
15
|
channelListUrl= '/json/channel/list'
|
16
|
#switchChannel= this.sendCmd('channel/switch', { cid: cid }, callback);
|
17
|
|
18
|
UTF8 = 'utf-8'
|
19
|
|
20
|
addon = xbmcaddon.Addon('plugin.video.iris-9900-hd')
|
21
|
__addonname__ = addon.getAddonInfo('name')
|
22
|
__language__ = addon.getLocalizedString
|
23
|
|
24
|
|
25
|
home = addon.getAddonInfo('path').decode(UTF8)
|
26
|
icon = xbmc.translatePath(os.path.join(home, 'icon.png'))
|
27
|
addonfanart = xbmc.translatePath(os.path.join(home, 'fanart.jpg'))
|
28
|
|
29
|
qp = urllib.quote_plus
|
30
|
uqp = urllib.unquote_plus
|
31
|
|
32
|
def log(txt):
|
33
|
message = '%s: %s' % (__addonname__, txt.encode('ascii', 'ignore'))
|
34
|
xbmc.log(msg=message, level=xbmc.LOGDEBUG)
|
35
|
|
36
|
def cleanname(name):
|
37
|
return name.replace(''',"'").replace('’',"'").replace('&','&').replace(''',"'").replace('"','"')
|
38
|
|
39
|
def demunge(munge):
|
40
|
try:
|
41
|
munge = urllib.unquote_plus(munge).decode(UTF8)
|
42
|
except:
|
43
|
pass
|
44
|
return munge
|
45
|
|
46
|
|
47
|
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36'
|
48
|
defaultHeaders = {'User-Agent':USER_AGENT,
|
49
|
'Accept':"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
50
|
'Accept-Encoding':'gzip,deflate,sdch',
|
51
|
'Cookie': 'qlqhzyhjljcfffyy=21636d1e642c874112d9674ac8e8b002',
|
52
|
'Accept-Language':'en-US,en;q=0.8'}
|
53
|
|
54
|
def getRequest(url, user_data=None, headers = defaultHeaders , alert=True):
|
55
|
|
56
|
log("getRequest URL:"+str(url))
|
57
|
opener = urllib2.build_opener()
|
58
|
urllib2.install_opener(opener)
|
59
|
|
60
|
log("getRequest URL:"+str(url))
|
61
|
req = urllib2.Request(url.encode(UTF8), user_data, headers)
|
62
|
|
63
|
try:
|
64
|
response = urllib2.urlopen(req)
|
65
|
if response.info().getheader('Content-Encoding') == 'gzip':
|
66
|
log("Content Encoding == gzip")
|
67
|
buf = StringIO( response.read())
|
68
|
f = gzip.GzipFile(fileobj=buf)
|
69
|
link1 = f.read()
|
70
|
else:
|
71
|
link1=response.read()
|
72
|
|
73
|
except urllib2.URLError, e:
|
74
|
if alert:
|
75
|
xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' % ( __addonname__, e , 10000) )
|
76
|
link1 = ""
|
77
|
|
78
|
if not (str(url).endswith('.zip')):
|
79
|
link1 = str(link1).replace('\n','')
|
80
|
return(link1)
|
81
|
|
82
|
|
83
|
def as_complex(lista):
|
84
|
return complex(dct['current'], dct['chnlist_head'], dct['main'], dct['subs'], dct['chnlist'])
|
85
|
|
86
|
|
87
|
def ListaCanales(fanart):
|
88
|
ilist = []
|
89
|
azheaders = defaultHeaders
|
90
|
azheaders['X-Requested-With'] = 'XMLHttpRequest'
|
91
|
url='http://' + addon.getSetting('ip_deco') + channelListUrl
|
92
|
log('Ruta para obtener canales: ' + url)
|
93
|
pg = getRequest(url, None, azheaders)
|
94
|
lista=json.loads(pg)
|
95
|
lista2=lista['chnlist']
|
96
|
#print(lista2)
|
97
|
for item in lista2:
|
98
|
try:
|
99
|
#log('Nombre: ' + item['name'])
|
100
|
#log('ID: ' + str(item['id']))
|
101
|
name = cleanname(item['name']).encode(UTF8)
|
102
|
id = cleanname(str(item['id'])).encode(UTF8)
|
103
|
#log(name)
|
104
|
#log(id)
|
105
|
mode = 'VC'
|
106
|
pathe='http://' + addon.getSetting('ip_deco') + '/live.ts'
|
107
|
u = '%s?url=%s&name=%s&mode=%s&id=%s' % (sys.argv[0],qp(url), qp(name), mode, qp(id))
|
108
|
print u
|
109
|
liz=xbmcgui.ListItem(name, '','DefaultVideo.png', icon,path=pathe)
|
110
|
liz.setProperty( "Folder", "false" )
|
111
|
liz.setProperty("IsPlayable", "true")
|
112
|
liz.setInfo( 'Video', { "Title": name, })
|
113
|
ilist.append((u, liz, True))
|
114
|
except:
|
115
|
pass
|
116
|
xbmcplugin.addDirectoryItems(int(sys.argv[1]), ilist, len(ilist))
|
117
|
|
118
|
def VerCanal(cid):
|
119
|
log("++++++++++++++++++++++++++++++++++ VOY A CAMBIAR DE CANAL +++++++++++++++++++++++++++++++++")
|
120
|
azheaders = defaultHeaders
|
121
|
azheaders['X-Requested-With'] = 'XMLHttpRequest'
|
122
|
url='http://' + addon.getSetting('ip_deco') + '/api/channel/switch'
|
123
|
url2='http://' + addon.getSetting('ip_deco') + channelListUrl
|
124
|
values = {'cid': qp(cid)}
|
125
|
data = urllib.urlencode(values)
|
126
|
current_id=''
|
127
|
while str(cid) != str(current_id):
|
128
|
pg2 = getRequest(url, data, azheaders)
|
129
|
xbmc.sleep(2000)
|
130
|
pg = getRequest(url2, None, azheaders)
|
131
|
lista=json.loads(pg)
|
132
|
lista2=lista['current']
|
133
|
current_id=lista2['channel_id']
|
134
|
log (str(cid) + " ----> " + str(current_id))
|
135
|
url = 'http://' + addon.getSetting('ip_deco') + '/live.ts'
|
136
|
print url.encode(UTF8, 'ignore')
|
137
|
item=xbmcgui.ListItem(path=url.encode(UTF8, 'ignore'), iconImage="DefaultVideo.png", thumbnailImage=icon)
|
138
|
item.setProperty("IsPlayable", "true")
|
139
|
item.setProperty( "Folder", "false" )
|
140
|
xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, item)
|
141
|
xbmc.Player().play(item=url, listitem=item)
|
142
|
return
|
143
|
|
144
|
|
145
|
# PROCEDIMIENTO PRINCIPAL
|
146
|
xbmcplugin.setContent(int(sys.argv[1]), 'movies')
|
147
|
|
148
|
parms = {}
|
149
|
try:
|
150
|
parms = dict( arg.split( "=" ) for arg in ((sys.argv[2][1:]).split( "&" )) )
|
151
|
for key in parms:
|
152
|
parms[key] = demunge(parms[key])
|
153
|
except:
|
154
|
parms = {}
|
155
|
|
156
|
p = parms.get
|
157
|
|
158
|
mode = p('mode',None)
|
159
|
|
160
|
if mode== None: ListaCanales(p('fanart'))
|
161
|
elif mode=='VC': VerCanal(p('id'))
|
162
|
|
163
|
xbmcplugin.endOfDirectory(int(sys.argv[1]))
|