def getAllChannels(portal_mac, url, serial, path):
global key
now = time()
portalurl = "_".join(re.findall("[a-zA-Z0-9]+", portal_mac))
portalurl = path + '/' + portalurl + 'channels'
setMac(portal_mac)
setSerialNumber(serial)
if not os.path.exists(path):
os.makedirs(path)
if os.path.exists(portalurl):
with open(portalurl, 'rb') as data_file:
data = json.load(data_file)
if 'version' not in data or data['version'] != cache_version:
clearCache(url, path)
else:
time_init = float(data['time'])
# Cache 12 Stunden gültig
if ((now - time_init) / 3600) < 12:
#wird der chache auch geladen?
xbmc.log("[ArrowTV] Channels aus Cache", xbmc.LOGINFO)
return data
handshake(url)
epg = getEPG(portal_mac, url, serial, path)
# Genres laden
genres = getGenres(portal_mac, url, serial, path)
genres = genres["genres"]
channels = []
# Alle Kanäle laden
info = retrieveData(url, values={
'type': 'itv',
'action': 'get_all_channels',
'JsHttpRequest': '1-xml'
})
for result in info['js']['data']:
channels.append({
"id": result['id'],
"number": result["number"],
"name": result["name"],
"cmd": result['cmd'],
"logo": result["logo"],
"tmp": result["use_http_tmp_link"],
"genre_id": result['tv_genre_id'],
"epg_id": result['xmltv_id']
})
#GRuppen listen
cache_by_genre = {}
for channel in channels:
gid = str(channel.get("genre_id", ""))
if gid not in cache_by_genre:
cache_by_genre[gid] = []
cache_by_genre[gid].append(channel)
#leere Gruppen nachladen
for gid in genres.keys():
# alle Gruppe auslassen
if gid == "*":
continue
#wenn genre_id schon gelistet dann nicht nachladen
if gid in cache_by_genre and cache_by_genre[gid]:
continue
xbmc.log("[ArrowTV] Lade Channels für leer Genre %s" % gid, xbmc.LOGINFO)
# Erste Seite
info = retrieveData(url, values={
'type': 'itv',
'action': 'get_ordered_list',
'genre': gid,
'force_ch_link_check': '',
'fav': 0,
'sortby': 'number',
'hd': 0,
'p': 1,
'JsHttpRequest': '1-xml'
})
js = info.get("js", {})
total = int(js.get("total_items", 0))
per_page = int(js.get("max_page_items", len(js.get("data", [])) or 1))
pages = max(1, math.ceil(total / per_page))
all_results = js.get("data", []) or []
# Weitere Seiten laden
for page in range(2, pages + 1):
xbmc.log("[ArrowTV] Lade Genre %s Seite %d" % (gid, page), xbmc.LOGINFO)
info = retrieveData(url, values={
'type': 'itv',
'action': 'get_ordered_list',
'genre': gid,
'force_ch_link_check': '',
'fav': 0,
'sortby': 'number',
'hd': 0,
'p': page,
'JsHttpRequest': '1-xml'
})
all_results.extend(info.get("js", {}).get("data", []) or [])
if not all_results:
continue
cache_by_genre[gid] = []
for result in all_results:
channel = {
"id": result['id'],
"number": result["number"],
"name": result["name"],
"cmd": result['cmd'],
"logo": result["logo"],
"tmp": result["use_http_tmp_link"],
"genre_id": result['tv_genre_id'],
"epg_id": result['xmltv_id']
}
channels.append(channel)
cache_by_genre[gid].append(channel)
data = {
"version": cache_version,
"time": now,
"channels": channels
}
with open(portalurl, 'w') as f:
json.dump(data, f, indent=4)
return data