-#!/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, 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]
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()