
This attmepts to rebuild the DVB network (not including satconf/adapters) and also the channel list. This is 90+% of the work and should be enough for most users to get up and running a bit more quickly.
233 lines
6 KiB
Python
Executable file
233 lines
6 KiB
Python
Executable file
#!/usr/bin/env python
|
|
#
|
|
# Load all channels/service info and attempt to create a translation from
|
|
# the old setup to the new
|
|
#
|
|
|
|
import os, sys, re, json, glob
|
|
import pprint
|
|
|
|
# Parse args
|
|
root = '.'
|
|
if len(sys.argv) > 1:
|
|
root = sys.argv[1]
|
|
|
|
# Generate UUID
|
|
def uuid ():
|
|
import uuid
|
|
return uuid.uuid4().hex
|
|
|
|
# Load channels
|
|
chns = {}
|
|
for f in glob.glob(os.path.join(root, 'channels', '*')):
|
|
try:
|
|
s = open(f).read()
|
|
d = json.loads(s)
|
|
chns[d['name']] = {
|
|
'svcs': [],
|
|
'name': d['name'] if 'name' in d else None,
|
|
'icon': d['icon'] if 'icon' in d else None,
|
|
'tags': d['tags'] if 'tags' in d else None,
|
|
'num' : d['channel_number'] if 'channel_number' in d else 0
|
|
}
|
|
except: pass
|
|
|
|
# Load adapters
|
|
adps = {}
|
|
for f in glob.glob(os.path.join(root, 'dvbadapters', '*')):
|
|
try:
|
|
s = open(f).read()
|
|
d = json.loads(s)
|
|
t = d['type']
|
|
if t.startswith('DVB'):
|
|
t = t[4]
|
|
else:
|
|
t = 'A'
|
|
adps[os.path.basename(f)] = {
|
|
'type' : t,
|
|
'nets' : {}
|
|
}
|
|
except: pass
|
|
|
|
# Load muxes
|
|
muxs = {}
|
|
for f in glob.glob(os.path.join(root, 'dvbmuxes', '*', '*')):
|
|
try:
|
|
a = os.path.basename(os.path.dirname(f))
|
|
if a not in adps: continue
|
|
t = adps[a]['type']
|
|
s = open(f).read()
|
|
d = json.loads(s)
|
|
k = '%s:%04X:%04X' % (t, d['originalnetworkid'], d['transportstreamid'])
|
|
m = {
|
|
'key' : k,
|
|
'type': t,
|
|
'onid': d['originalnetworkid'],
|
|
'tsid': d['transportstreamid'],
|
|
'freq': d['frequency'],
|
|
'symr': d['symbol_rate'] if 'symbol_rate' in d else None,
|
|
'fec' : d['fec'] if 'fec' in d else None,
|
|
'fech': d['fec_hi'] if 'fec_hi' in d else None,
|
|
'fecl': d['fec_lo'] if 'fec_lo' in d else None,
|
|
'gi' : d['guard_interval'] if 'guard_interval' in d else None,
|
|
'hier': d['hierarchy'] if 'hierarchy' in d else None,
|
|
'bw' : d['bandwidth'] if 'bandwidth' in d else None,
|
|
'txm' : d['tranmission_mode'] if 'tranmission_mode' in d else None,
|
|
'mod' : d['modulation'] if 'modulation' in d else None,
|
|
'del' : d['delivery_system'] if 'delivery_system' in d else None,
|
|
'cons': d['constellation'] if 'constellation' in d else None,
|
|
'pol' : d['polarisation'] if 'polarisation' in d else None,
|
|
'svcs': {}
|
|
}
|
|
muxs[os.path.basename(f)] = m
|
|
n = None
|
|
if 'satconf' in d:
|
|
n = d['satconf']
|
|
if n not in adps[a]['nets']:
|
|
adps[a]['nets'][n] = {}
|
|
adps[a]['nets'][n][k] = m
|
|
except Exception, e:
|
|
print e
|
|
raise e
|
|
pass
|
|
|
|
# Load servies
|
|
svcs = {}
|
|
for f in glob.glob(os.path.join(root, 'dvbtransports', '*', '*')):
|
|
try:
|
|
m = os.path.basename(os.path.dirname(f))
|
|
if m not in muxs: continue
|
|
m = muxs[m]
|
|
s = open(f).read()
|
|
d = json.loads(s)
|
|
k = '%s:%04X:%04X:%04X' % (m['type'], m['onid'], m['tsid'], d['service_id'])
|
|
m['svcs'][k] = d
|
|
except Exception, e:
|
|
print e
|
|
raise e
|
|
pass
|
|
|
|
# Build networks
|
|
nets = []
|
|
for a in adps:
|
|
a = adps[a]
|
|
for m in a['nets']:
|
|
m = a['nets'][m]
|
|
f = False
|
|
for n in nets:
|
|
if n['type'] != a['type']: continue
|
|
x = set(n['muxs'].keys())
|
|
y = set(m.keys())
|
|
i = x.intersection(x, y)
|
|
c = (2 * len(i)) / (len(x) + len(y))
|
|
if c > 0.5:
|
|
f = True
|
|
for k in m:
|
|
if k not in n['muxs']:
|
|
n['muxs'][k] = m[k]
|
|
else:
|
|
n['muxs'][k]['svcs'].update(m[k]['svcs'])
|
|
if not f:
|
|
n = {
|
|
'type': a['type'],
|
|
'muxs': m
|
|
}
|
|
nets.append(n)
|
|
|
|
# Output networks
|
|
p = os.path.join(root, 'input', 'linuxdvb', 'networks')
|
|
if not os.path.exists(p):
|
|
os.makedirs(p)
|
|
i = 0
|
|
for n in nets:
|
|
|
|
# Network config
|
|
if n['type'] == 'A':
|
|
c = 'linuxdvb_network_atsc'
|
|
else:
|
|
c = 'linuxdvb_network_dvb' + n['type'].lower()
|
|
d = {
|
|
'networkname' : 'Network %s %d' % (n['type'], i),
|
|
'nid' : 0,
|
|
'autodiscovery' : False,
|
|
'skipinitscan' : True,
|
|
'class' : c
|
|
}
|
|
u = uuid()
|
|
p2 = os.path.join(p, u)
|
|
os.mkdir(p2)
|
|
open(os.path.join(p2, 'config'), 'w').write(json.dumps(d))
|
|
|
|
# Process muxes
|
|
for m in n['muxs']:
|
|
m = n['muxs'][m]
|
|
d = {
|
|
'frequency' : m['freq'],
|
|
'onid' : m['onid'],
|
|
'tsid' : m['tsid']
|
|
}
|
|
if m['type'] == 'C':
|
|
d['symbol_rate'] = m['symr']
|
|
d['fec'] = m['fec']
|
|
d['constellation'] = m['cons']
|
|
elif m['type'] == 'T':
|
|
d['bandwidth'] = m['bw']
|
|
d['constellation'] = m['cons']
|
|
d['tranmission_mode'] = m['txm']
|
|
d['guard_interval'] = m['gi']
|
|
d['hierarchy'] = m['hier']
|
|
d['fec_lo'] = m['fecl']
|
|
d['fec_hi'] = m['fech']
|
|
elif m['type'] == 'S':
|
|
d['symbol_rate'] = m['symr']
|
|
d['fec'] = m['fec']
|
|
d['polarisation'] = m['pol']
|
|
d['modulation'] = m['mod']
|
|
else:
|
|
d['constellation'] = m['cons']
|
|
u = uuid()
|
|
p3 = os.path.join(p2, 'muxes', u)
|
|
os.makedirs(p3)
|
|
open(os.path.join(p3, 'config'), 'w').write(json.dumps(d))
|
|
|
|
# Process services
|
|
for s in m['svcs']:
|
|
s = m['svcs'][s]
|
|
d = {
|
|
'sid' : s['service_id'],
|
|
'svcname' : s['servicename'] if 'servicename' in s else '',
|
|
'dvb_servicetype' : s['stype'] if 'stype' in s else 0
|
|
}
|
|
u = uuid()
|
|
p4 = os.path.join(p3, 'services')
|
|
if not os.path.exists(p4):
|
|
os.makedirs(p4)
|
|
open(os.path.join(p4, u), 'w').write(json.dumps(d))
|
|
|
|
# Find channel
|
|
c = s['channelname'] if 'channelname' in s else None
|
|
if not c or c not in chns:
|
|
continue
|
|
c = chns[c]
|
|
c['svcs'].append(u)
|
|
|
|
# Output channels
|
|
if not os.path.exists(os.path.join(root, 'channel')):
|
|
os.mkdir(os.path.join(root, 'channel'))
|
|
for c in chns:
|
|
c = chns[c]
|
|
if 'name' not in c: continue
|
|
|
|
# Create UUID
|
|
u = uuid()
|
|
d = {
|
|
'name' : c['name'],
|
|
'services' : ','.join(c['svcs'])
|
|
}
|
|
if c['icon']:
|
|
d['icon'] = c['icon']
|
|
if c['tags']:
|
|
d['tags'] = c['tags']
|
|
if c['num']:
|
|
d['number'] = c['num']
|
|
open(os.path.join(root, 'channel', u), 'w').write(json.dumps(d))
|