-#!/usr/bin/python
+#!/usr/bin/env python2
-import MySQLdb
import os
+import random
import re
import socket
import sys
-from socket import gethostname
+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)
+ 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
-config_values = {}
-for line in open(os.path.expanduser("~/.mythtv/mysql.txt")):
- line = line.strip()
- if line and not line.startswith("#"):
- (key, value) = line.split("=")
- config_values[key] = value
+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_values["DBHostName"],
- user = config_values["DBUserName"],
- passwd = config_values["DBPassword"],
- db = config_values["DBName"]
+ 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'
-""" % socket.gethostname())
+ 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, starttime, basename, watched FROM recorded
+ SELECT title, subtitle, starttime, basename, watched FROM recorded
""")
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)
-
- 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)
-
- os.symlink(source, dest)
-
+ 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)