Skip to content

Commit a9a6756

Browse files
committed
map selected services
1 parent 0618bee commit a9a6756

File tree

3 files changed

+118
-25
lines changed

3 files changed

+118
-25
lines changed

addon.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
22
<addon id="script.module.tvh2kodi"
33
name="Tvheadend Setup for Kodi"
4-
version="2.0"
4+
version="2.1"
55
provider-name="edit4ever">
66
<requires>
77
<import addon="xbmc.python" version="2.6.0"/>
@@ -30,7 +30,7 @@
3030
<screenshot>resources/screenshot-03.jpg</screenshot>
3131
</assets>
3232
<news>
33-
2.0 - add support for DVB-S adapter and LNB configuration | adds CA client support
33+
2.1 - add support for mapping selected services to channels
3434
</news>
3535
</extension>
3636
</addon>

changelog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
v2.1 (2018-01-04)
2+
- add support for mapping selected services to channels
3+
14
v2.0 (2018-01-03)
25
- add support for DVB-S adapter and LNB configuration
36
- add support for Conditional Access Clients

default.py

Lines changed: 113 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2314,6 +2314,118 @@ def netiptv_param_edit(net_uuid_sel, net_info_list, net_name, net_bouquet, net_t
23142314
param_save = requests.get(param_url)
23152315
net_param_load(net_uuid_sel)
23162316

2317+
def services_param_load():
2318+
services_url = 'http://' + tvh_url + ':' + tvh_port + '/api/service/mapper/load'
2319+
services_load = requests.get(services_url).json()
2320+
services_opt_name = ['MAP ALL SERVICES TO CHANNELS', 'MAP SELECTED SERVICES TO CHANNELS']
2321+
services_opt_id = ['','']
2322+
services_opt_label = ['','']
2323+
services_node = {}
2324+
for param in services_load['entries'][0]['params']:
2325+
serv_id = param['id']
2326+
if serv_id != 'services':
2327+
services_opt_id.append(serv_id)
2328+
serv_label = param['caption']
2329+
services_opt_label.append(serv_label)
2330+
serv_value_orig = param['value']
2331+
if serv_value_orig == True:
2332+
serv_value = 'Enabled'
2333+
else:
2334+
serv_value = 'Disabled'
2335+
serv_list_add = serv_label + ': ' + serv_value
2336+
services_opt_name.append(serv_list_add)
2337+
services_node[serv_id] = serv_value_orig
2338+
services_param_edit(services_opt_name, services_opt_id, services_opt_label, services_node)
2339+
2340+
def services_param_edit(services_opt_name, services_opt_id, services_opt_label, services_node):
2341+
sel_param = dialog.select('Edit Options or Select to Map Services', list=services_opt_name)
2342+
if sel_param == 0:
2343+
if dialog.yesno("Map ALL Services to Channels", "Are you sure you want to map all services to channels?"):
2344+
serv_url = 'http://' + tvh_url + ':' + tvh_port + '/api/mpegts/service/grid?limit=999999999&sort=multiplex'
2345+
services = requests.get(serv_url).json()
2346+
serv_total = services['total']
2347+
serv_uuid = []
2348+
for serv_id in services['entries']:
2349+
if serv_id['channel'] == []:
2350+
serv_uuid.append(serv_id['uuid'])
2351+
serv_uuid_str = str(serv_uuid)
2352+
serv_uuid_str = re.sub("u\'","\"",serv_uuid_str)
2353+
serv_uuid_str = re.sub("\'","\"",serv_uuid_str)
2354+
serv_node_str = json.dumps(services_node)
2355+
serv_node_str = re.sub('{','',serv_node_str)
2356+
map_url = 'http://' + tvh_url + ':' + tvh_port + '/api/service/mapper/save?node={"services":' + serv_uuid_str + ',' + serv_node_str
2357+
map_ch = requests.get(map_url)
2358+
status_url = 'http://' + tvh_url + ':' + tvh_port + '/api/service/mapper/status'
2359+
time.sleep(3)
2360+
map_status = requests.get(status_url).json()
2361+
map_total_num = map_status['total']
2362+
map_ok_num = map_status['ok']
2363+
map_fail_num = map_status['fail']
2364+
map_ignore_num = map_status['ignore']
2365+
map_complete = (map_ok_num + map_fail_num + map_ignore_num)
2366+
map_total_perc = ((float(map_complete) / float(serv_total)) * 100)
2367+
dialog.ok("Channel mapping complete.", str(map_ok_num) + " new channels added.", str(map_ignore_num) + " services ignored.", str(map_fail_num) + " services failed.")
2368+
if sel_param == 1:
2369+
serv_url = 'http://' + tvh_url + ':' + tvh_port + '/api/mpegts/service/grid?limit=999999999&sort=multiplex'
2370+
services = requests.get(serv_url).json()
2371+
serv_total = services['total']
2372+
services_uuid = []
2373+
services_list = []
2374+
services_chan = []
2375+
services_sel = []
2376+
for serv in services['entries']:
2377+
try:
2378+
serv_name = serv['svcname']
2379+
except:
2380+
serv_name = 'NO SERVICE NAME'
2381+
serv_uuid = serv['uuid']
2382+
serv_multiplex = serv['multiplex']
2383+
serv_network = serv['network']
2384+
serv_channel = serv['channel']
2385+
services_uuid.append(serv_uuid)
2386+
if serv_channel != []:
2387+
services_chan.append(serv_uuid)
2388+
serv_list = serv_network + ' / ' + serv_multiplex + ' / ' + serv_name + ' ** MAPPED **'
2389+
else:
2390+
serv_list = serv_network + ' / ' + serv_multiplex + ' / ' + serv_name
2391+
services_list.append(serv_list)
2392+
serv_preselect = [i for i, item in enumerate(services_uuid) if item not in set(services_chan)]
2393+
sel_service = dialog.multiselect('Select which services to map to channels', options=services_list, preselect=serv_preselect)
2394+
if sel_service == [] or sel_service == None:
2395+
services_param_load()
2396+
else:
2397+
for sel in sel_service:
2398+
services_sel.append(services_uuid[sel])
2399+
services_node['services'] = services_sel
2400+
serv_node_str = json.dumps(services_node)
2401+
serv_update_url = 'http://' + tvh_url + ':' + tvh_port + '/api/service/mapper/save?node=' + serv_node_str
2402+
serv_update_load = requests.get(serv_update_url)
2403+
status_url = 'http://' + tvh_url + ':' + tvh_port + '/api/service/mapper/status'
2404+
time.sleep(3)
2405+
map_status = requests.get(status_url).json()
2406+
map_total_num = map_status['total']
2407+
map_ok_num = map_status['ok']
2408+
map_fail_num = map_status['fail']
2409+
map_ignore_num = map_status['ignore']
2410+
map_complete = (map_ok_num + map_fail_num + map_ignore_num)
2411+
map_total_perc = ((float(map_complete) / float(serv_total)) * 100)
2412+
dialog.ok("Channel mapping complete.", str(map_ok_num) + " new channels added.", str(map_ignore_num) + " services ignored.", str(map_fail_num) + " services failed.")
2413+
if sel_param > 1:
2414+
serv_param_name = services_opt_label[sel_param]
2415+
serv_param_id = services_opt_id[sel_param]
2416+
serv_param_desc = serv_param_name + ': Select to Enable/Disable'
2417+
sel_param_edit = dialog.select(serv_param_desc, list=enabledisable)
2418+
if sel_param_edit >= 0:
2419+
if sel_param_edit == 0:
2420+
services_node[serv_param_id] = True
2421+
if sel_param_edit == 1:
2422+
services_node[serv_param_id] = False
2423+
services_node['services'] = ''
2424+
serv_node_str = json.dumps(services_node)
2425+
serv_update_url = 'http://' + tvh_url + ':' + tvh_port + '/api/service/mapper/save?node=' + serv_node_str
2426+
serv_update_load = requests.get(serv_update_url)
2427+
services_param_load()
2428+
23172429
def start_scan(net_uuid_sel):
23182430
adapters_url = 'http://' + tvh_url + ':' + tvh_port + '/api/hardware/tree?uuid=root'
23192431
adapters_get = requests.get(adapters_url).json()
@@ -2593,29 +2705,7 @@ def mux_scan():
25932705

25942706
@plugin.route('/services')
25952707
def services():
2596-
if dialog.yesno("Map Services to Channels", "Would you like to try to map all services to channels?"):
2597-
serv_url = 'http://' + tvh_url + ':' + tvh_port + '/api/mpegts/service/grid?limit=999999999&sort=multiplex'
2598-
services = requests.get(serv_url).json()
2599-
serv_total = services['total']
2600-
serv_uuid = []
2601-
for serv_id in services['entries']:
2602-
if serv_id['channel'] == []:
2603-
serv_uuid.append(serv_id['uuid'])
2604-
serv_uuid_str = str(serv_uuid)
2605-
serv_uuid_str = re.sub("u\'","\"",serv_uuid_str)
2606-
serv_uuid_str = re.sub("\'","\"",serv_uuid_str)
2607-
map_url = 'http://' + tvh_url + ':' + tvh_port + '/api/service/mapper/save?node={"services":' + serv_uuid_str + ',"encrypted":false,"merge_same_name":false,"check_availability":false,"type_tags":true,"provider_tags":false,"network_tags":false}'
2608-
map_ch = requests.get(map_url)
2609-
status_url = 'http://' + tvh_url + ':' + tvh_port + '/api/service/mapper/status'
2610-
time.sleep(3)
2611-
map_status = requests.get(status_url).json()
2612-
map_total_num = map_status['total']
2613-
map_ok_num = map_status['ok']
2614-
map_fail_num = map_status['fail']
2615-
map_ignore_num = map_status['ignore']
2616-
map_complete = (map_ok_num + map_fail_num + map_ignore_num)
2617-
map_total_perc = ((float(map_complete) / float(serv_total)) * 100)
2618-
dialog.ok("Channel mapping complete.", str(map_ok_num) + " new channels added.", str(map_ignore_num) + " services ignored.", str(map_fail_num) + " services failed.")
2708+
services_param_load()
26192709

26202710
@plugin.route('/channels')
26212711
def channels():

0 commit comments

Comments
 (0)