X-Git-Url: https://code.delx.au/mediapc-tools/blobdiff_plain/d939c8d66f7fdda235f91e2178f4219ef7b44c1a..HEAD:/mythsymlink diff --git a/mythsymlink b/mythsymlink index 2bd754e..f0fdfcc 100755 --- a/mythsymlink +++ b/mythsymlink @@ -1,73 +1,59 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 +import MySQLdb 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: +import mythlib + +def main(): + config_xml = mythlib.get_config() + db_connection = mythlib.get_db_connection(config_xml) + recordings_dir = mythlib.get_recordings_dir(config_xml, db_connection) + symlinks_dir = recordings_dir + "-symlinks" + + os.chdir(symlinks_dir) + os.umask(0o22) + + clean_dir() + + for_each_recording(db_connection, handle_recording, recordings_dir) + +def clean_dir(): + 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) + +def for_each_recording(db_connection, fn, *args): + with db_connection.cursor(MySQLdb.cursors.DictCursor) as cursor: + cursor.execute(""" + SELECT + title, + subtitle, + CONVERT_TZ(starttime, 'UTC', '%s') as starttime, + basename, + watched + FROM recorded + """ % "Australia/Sydney") + for row in cursor: + fn(row, *args) + +def handle_recording(row, recordings_dir): 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) + title = sanitize_filename(title) + subtitle = sanitize_filename(subtitle) extn = os.path.splitext(basename)[1] @@ -78,23 +64,30 @@ for row in cursor: if watched: filename = "watched/" + filename - source = "%s/%s" % (recordingsdir, basename) + source = "%s/%s" % (recordings_dir, basename) dest = "%s/%s" % (title, filename) if not os.path.isfile(source): - continue + return if os.path.isfile(dest): - dest = os.path.splitext(dest)[0] + ' - unique' + str(random.randint(1000, 9999)) + extn + 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): + for i in range(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 + except Exception as e: + print(e, "--", source, "->", dest) sys.exit(1) + +def sanitize_filename(filename): + unsafe = re.compile("[^a-zA-Z0-9\-_ ,\\.]+") + return unsafe.sub("", filename) + +if __name__ == "__main__": + main()