]> code.delx.au - mediapc-tools/blobdiff - mythsymlink
toggle-nightlight.desktop
[mediapc-tools] / mythsymlink
index 06ece07aedfb84423bbc83e0a05432c0211b8fa3..f0fdfcce2fb09f0f0dbcd85c0a928588ba612946 100755 (executable)
@@ -1,64 +1,59 @@
-#!/usr/bin/python2
+#!/usr/bin/env python3
 
 import MySQLdb
 import os
+import random
 import re
-import socket
 import sys
 
-from socket import gethostname
-
-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
-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
-
-db_connection = MySQLdb.connect(
-    host = config_values["DBHostName"],
-    user = config_values["DBUserName"],
-    passwd = config_values["DBPassword"],
-    db = config_values["DBName"]
-)
-cursor = db_connection.cursor(MySQLdb.cursors.DictCursor)
-
-# Regexp for what is allowed in the symlink name
-unsafe = re.compile("[^a-zA-Z0-9\-_ ,\\.]+")
-
-# Find the recordings directory
-cursor.execute("""
-    SELECT * FROM settings
-    WHERE value='RecordFilePrefix' AND hostname='%s'
-""" % socket.gethostname())
-recordingsdir = cursor.fetchone()["data"]
-
-# Now find all the recordings we have at the moment
-cursor.execute("""
-    SELECT title, subtitle, starttime, basename, watched FROM recorded
-""")
-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]
 
 
@@ -69,17 +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
 
     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)
 
-    os.symlink(source, dest)
+    try:
+        os.symlink(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()