In <[EMAIL PROTECTED]>, Laz wrote:
> On Wednesday 14 February 2007 15:24, Andrew Herron wrote:
> > Does anyone know if the Logical Channel Numbers that are used in the UK
> > on Freeview DVB-T transmissions are currently handled by VDR in anyway?
>
> I'm pretty sure that they're currently ignored. I tend to hand edit my
> channels.conf every now and then to make sure channels are in the corerct
> order with their correct numbers.
>
> The scan utility can output a vdr-format channels.conf with the channel
> numbers included, too.
I've had trouble in the past with VDR disagreeing with the format used
by the output of scan so I've written a script which compares VDR's
channels.conf with the output of scan with Freeview numbering and
outputs a new file with VDR's channel data but resorted and with the
Freeview numbering added.
It uses some file locations etc which are specific to Debian and my
local transmitter, but it can easily be altered by changing the
upper-case variables near the top of the script.
--
TH * http://www.realh.co.uk
#!/usr/bin/env python
import subprocess
import sys
import time
""" Shuts down VDR, performs a scan, then updates VDR's channels.conf with
Freeview numbering. """
INVOKE_RCD = "invoke-rc.d vdr"
STOP_VDR = INVOKE_RCD + " stop"
START_VDR = INVOKE_RCD + " start"
SCAN_COMMAND = "scan -q -o vdr -e 4 -u " \
+ "/usr/share/doc/dvb-utils/examples/scan/dvb-t/uk-Rowridge"
VDR_CHANNELS_FILE = "/var/lib/vdr/channels.conf"
OUTPUT_FILE = VDR_CHANNELS_FILE
def scan():
""" Runs SCAN_COMMAND and returns result as a list of lines. """
print "Scanning"
scan_proc = subprocess.Popen(SCAN_COMMAND, 0, None,
None, subprocess.PIPE, None,
None, False, True)
result = scan_proc.wait()
if result:
raise Exception("scan failed with exit code %d" % result)
return scan_proc.stdout.readlines()
def load_channels_as_lines(filename):
fp = file(filename, 'r')
lines = fp.readlines()
fp.close()
return lines
def lines_to_dict(lines):
""" Processes the lines and creates a dictionary keyed by channel name.
Each value is [line, channel_number]. """
dict = {}
number = 1
for l in lines:
if l.startswith(':@'):
number = int(l[2:].rstrip())
else:
name = l.split(':', 1)[0]
if ';' in name:
name = name.split(';', 1)[0]
dict[name] = [l, number]
number += 1
return dict
def dict_to_sorted_lines(dict):
""" Convert the dictionary back to lines, including :@n where necessary,
all in the correct order. """
# Create an intermediate list of [line, channel_number] for sorting
sortable = []
for v in dict.values():
sortable.append(v)
sortable.sort(key = lambda x: x[1])
# Now generate lines in output format
number = -1
lines = []
for l in sortable:
if l[1] != number:
number = l[1]
lines.append(":@%d\n" % number)
lines.append(l[0])
number += 1
return lines
def renumber_old_from_new(old, new):
""" For each entry in the old dict, this looks up the same channel name in
the new dict and replaces the old channel number with the new one, but
preserves all the other details from old. No return value; alters old
in place. """
for [k, old_val] in old.items():
new_val = new.get(k)
if new_val:
old_val[1] = new_val[1]
def generate_new_lines():
""" Call the various other functions to generate a nice new list of lines
to save as VDR's channels.conf. """
scan_lines = scan()
vdr_lines = load_channels_as_lines(VDR_CHANNELS_FILE)
scan_dict = lines_to_dict(scan_lines)
vdr_dict = lines_to_dict(vdr_lines)
renumber_old_from_new(vdr_dict, scan_dict)
return dict_to_sorted_lines(vdr_dict)
def main():
start_stop_vdr = "-s" in sys.argv
if start_stop_vdr:
print "Stopping VDR"
subprocess.call(STOP_VDR.split())
print "Pausing"
time.sleep(5)
new_lines = generate_new_lines()
fp = file(OUTPUT_FILE, 'w')
fp.writelines(new_lines)
fp.close()
if start_stop_vdr:
print "Starting VDR"
subprocess.call(START_VDR.split())
if __name__ == '__main__':
main()
_______________________________________________
vdr mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr