support: Configuration migration script

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.
This commit is contained in:
Adam Sutton 2013-08-30 23:07:56 +01:00
parent 21c7aa7252
commit 32edfc623f

233
support/conf_migrate.py Executable file
View file

@ -0,0 +1,233 @@
#!/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))