106 lines
2.3 KiB
Python
Executable file
106 lines
2.3 KiB
Python
Executable file
#!/usr/bin/env python
|
|
#
|
|
# Convert XML files from http://satellites-xml.eu/ to scanfile format
|
|
#
|
|
|
|
import os
|
|
import sys
|
|
import xml.etree.ElementTree as ET
|
|
import re, unicodedata
|
|
|
|
FLAG_NETWORK_SCAN = 1
|
|
FLAG_USE_BAT = 2
|
|
FLAG_USE_ONOT = 4
|
|
FLAG_SKIP_NIT = 8
|
|
|
|
POLARIZATION = {
|
|
'0': 'H',
|
|
'1': 'V',
|
|
'2': 'L',
|
|
'3': 'R'
|
|
}
|
|
|
|
FEC = {
|
|
'0': 'AUTO',
|
|
'1': '1/2',
|
|
'2': '2/3',
|
|
'3': '3/4',
|
|
'4': '5/6',
|
|
'5': '7/8',
|
|
'6': '8/9',
|
|
'7': '3/5',
|
|
'8': '4/5',
|
|
'9': '9/10',
|
|
'15': 'NONE'
|
|
}
|
|
|
|
MODULATION = {
|
|
'0': 'AUTO',
|
|
'1': 'QPSK',
|
|
'2': '8PSK'
|
|
}
|
|
|
|
SYSTEM = {
|
|
'0': 'S',
|
|
'1': 'S2'
|
|
}
|
|
|
|
def inspect(node):
|
|
print(' tag=%s attrib=%s' % (repr(node.tag), repr(node.attrib)))
|
|
|
|
def asciize(str):
|
|
if type(str) != type(u''):
|
|
str = unicode(str, 'UTF-8')
|
|
str = unicodedata.normalize('NFKD', str).encode('ascii', 'ignore')
|
|
str = re.sub('\s\s+', ' ', str)
|
|
str = str.strip().replace(' ', '-')
|
|
return str
|
|
|
|
def parse_sat(node):
|
|
|
|
position = node.attrib['position']
|
|
flags = node.attrib['flags']
|
|
name = node.attrib['name']
|
|
|
|
assert(flags == '0')
|
|
|
|
filename = name.replace('(', '').replace(')', '').replace('/', '+')
|
|
filename = DIR + '/' + asciize(filename)
|
|
|
|
fp = open(filename, "w+")
|
|
fp.write('# Generated by tvheadend from satellites.xml\n')
|
|
|
|
for child in node:
|
|
if child.tag == 'transponder':
|
|
polarization = POLARIZATION[child.attrib['polarization']]
|
|
fec = FEC[child.attrib['fec_inner']]
|
|
freq = child.attrib['frequency']
|
|
rate = child.attrib['symbol_rate']
|
|
modulation = MODULATION[child.attrib['modulation']]
|
|
system = SYSTEM[child.attrib['system']]
|
|
if system == 'S' and modulation == 'QPSK':
|
|
fp.write('%s %s %s %s %s\n' %
|
|
(system, freq, polarization, rate, fec))
|
|
else:
|
|
fp.write('%s %s %s %s %s %s %s\n' %
|
|
(system, freq, polarization, rate, fec, 'AUTO', modulation))
|
|
|
|
fp.close()
|
|
|
|
if len(sys.argv) < 3:
|
|
if len(sys.argv) != 1:
|
|
usage = 'python sat_xml_scan.py'
|
|
else:
|
|
usage = sys.argv[0]
|
|
print('Usage: %s satellite.xml /output/directory/path' % usage)
|
|
sys.exit(0)
|
|
|
|
DIR = sys.argv[2]
|
|
if not os.path.isdir(DIR):
|
|
raise ValueError, "Second argument must be the output directory"
|
|
tree = ET.parse(sys.argv[1])
|
|
root = tree.getroot()
|
|
if root.tag == 'satellites':
|
|
for child in root:
|
|
if child.tag == 'sat':
|
|
parse_sat(child)
|