#!/usr/bin/env python3
import os
import sys
import subprocess
import xml.etree.ElementTree as ET
guisettings = '/var/lib/vdr/.kodi/userdata/guisettings.xml'
cache_dir = '/var/lib/vdr/.kodi/.display_cache'
videoscreen_template = """
{}
"""
def get_output_names():
"""
get connected display names from xrandr for a given DISPLAY
environment variable
"""
output = subprocess.check_output(
["xrandr"],
env={"DISPLAY": os.environ["DISPLAY"]}
).decode("utf-8").splitlines()
return [l.split()[0] for l in output if " connected " in l]
def parse_template(template_path, template, output=""):
"""read videoscreen settings from backup or create a stub file"""
try:
xml_tree = ET.parse(template_path)
except FileNotFoundError:
print("{} not found, creating stub file".format(template_path))
xml_template = ET.fromstring(template.format(output))
xml_tree = ET.ElementTree(xml_template)
finally:
xml_tree.write(template_path)
return xml_tree
def backup_videoscreen():
"""parse guisettings.xml for display name an backup videoscreen data"""
tree = parse_template(guisettings, videoscreen_template, "Default")
root = tree.getroot()
videoscreen = root.find('videoscreen')
output = videoscreen.find('monitor').text
xml_path = os.path.join(cache_dir, '{}-videodevice.xml'.format(output))
base_tree = ET.fromstring('')
xml_tree = ET.ElementTree(base_tree)
backup_root = xml_tree.getroot()
backup_root.insert(0, videoscreen)
xml_tree.write(xml_path)
print("written backup for {} to {}".format(output, xml_path))
def change_videoscreen(output, new_videoscreen):
"""change videoscreen node to content of backup file"""
tree = parse_template(guisettings, videoscreen_template, output)
root = tree.getroot()
videoscreen = root.find('videoscreen')
root.insert(0, new_videoscreen)
root.remove(videoscreen)
tree.write(guisettings)
return tree
if __name__ == '__main__':
output = get_output_names()[0]
if not output:
sys.exit("Error: no screen name found")
try:
os.makedirs(cache_dir, exist_ok=True)
except PermissionError:
sys.exit("Error: insufficient permissions to create cachedir {}".format(
cache_dir))
try:
backup_videoscreen()
except FileNotFoundError:
print("{} does not exist".format(guisettings))
xml_path = os.path.join(cache_dir, '{}-videodevice.xml'.format(output))
videodir_xml = parse_template(xml_path, videoscreen_template, output)
videodir_xml.getroot()
new_videoscreen = videodir_xml.find('videoscreen')
guisettings_xml = change_videoscreen(output, new_videoscreen)