#!/usr/bin/env python2 import os import random import re import socket import sys import lxml.etree import MySQLdb os.chdir(sys.argv[1]) # Remove any symlinks and empty dirs in the tree for dirpath, dirnames, filenames in os.walk(".", topdown=False): for filename in filenames: filename = os.path.join(dirpath, filename) if os.path.islink(filename): os.unlink(filename) for dirname in dirnames: dirname = os.path.join(dirpath, dirname) os.rmdir(dirname) # Connect to the MythTV database based on the MythTV config with open(os.path.expanduser("~/.mythtv/config.xml")) as f: config_xml = lxml.etree.parse(f, lxml.etree.XMLParser(encoding="utf-8")) db_connection = MySQLdb.connect( host = config_xml.xpath("/Configuration/Database/Host/text()")[0], port = int(config_xml.xpath("/Configuration/Database/Port/text()")[0]), user = config_xml.xpath("/Configuration/Database/UserName/text()")[0], passwd = config_xml.xpath("/Configuration/Database/Password/text()")[0], db = config_xml.xpath("/Configuration/Database/DatabaseName/text()")[0], ) cursor = db_connection.cursor(MySQLdb.cursors.DictCursor) # Regexp for what is allowed in the symlink name unsafe = re.compile("[^a-zA-Z0-9\-_ ,\\.]+") try: localhostname = config_xml.xpath("/Configuration/LocalHostName/text()")[0] except IndexError: localhostname = socket.gethostname() # Find the recordings directory cursor.execute(""" SELECT * FROM settings WHERE value='RecordFilePrefix' AND hostname='%s' """ % localhostname) recordingsdir = cursor.fetchone()["data"] # Now find all the recordings we have at the moment cursor.execute(""" SELECT title, subtitle, CONVERT_TZ(starttime, 'UTC', '%s') as starttime, basename, watched FROM recorded """ % "Australia/Sydney") for row in cursor: title = row["title"] starttime = str(row["starttime"]).replace(":", "-") subtitle = row["subtitle"] basename = row["basename"] watched = bool(row["watched"]) title = unsafe.sub("", title) subtitle = unsafe.sub("", subtitle) extn = os.path.splitext(basename)[1] if subtitle: filename = "%s - %s%s" % (starttime, subtitle, extn) else: filename = "%s%s" % (starttime, extn) if watched: filename = "watched/" + filename source = "%s/%s" % (recordingsdir, basename) dest = "%s/%s" % (title, filename) if not os.path.isfile(source): continue if os.path.isfile(dest): dest = os.path.splitext(dest)[0] + ' - unique' + str(random.randint(1000, 9999)) + extn dirnames = dest.split("/")[:-1] for i in xrange(1, len(dirnames)+1): dirname = "/".join(dirnames[:i]) if not os.path.isdir(dirname): os.mkdir(dirname) try: os.symlink(source, dest) except Exception, e: print e, "--", source, "->", dest sys.exit(1)