]> code.delx.au - mediapc-tools/blob - mythsymlink
mythsymlink: umask
[mediapc-tools] / mythsymlink
1 #!/usr/bin/env python3
2
3 import MySQLdb
4 import os
5 import random
6 import re
7 import sys
8
9 import mythlib
10
11 def main():
12 config_xml = mythlib.get_config()
13 db_connection = mythlib.get_db_connection(config_xml)
14 recordings_dir = mythlib.get_recordings_dir(config_xml, db_connection)
15 symlinks_dir = recordings_dir + "-symlinks"
16
17 os.chdir(symlinks_dir)
18 os.umask(0o22)
19
20 clean_dir()
21
22 for_each_recording(db_connection, handle_recording, recordings_dir)
23
24 def clean_dir():
25 for dirpath, dirnames, filenames in os.walk(".", topdown=False):
26 for filename in filenames:
27 filename = os.path.join(dirpath, filename)
28 if os.path.islink(filename):
29 os.unlink(filename)
30 for dirname in dirnames:
31 dirname = os.path.join(dirpath, dirname)
32 os.rmdir(dirname)
33
34 def for_each_recording(db_connection, fn, *args):
35 with db_connection.cursor(MySQLdb.cursors.DictCursor) as cursor:
36 cursor.execute("""
37 SELECT
38 title,
39 subtitle,
40 CONVERT_TZ(starttime, 'UTC', '%s') as starttime,
41 basename,
42 watched
43 FROM recorded
44 """ % "Australia/Sydney")
45 for row in cursor:
46 fn(row, *args)
47
48 def handle_recording(row, recordings_dir):
49 title = row["title"]
50 starttime = str(row["starttime"]).replace(":", "-")
51 subtitle = row["subtitle"]
52 basename = row["basename"]
53 watched = bool(row["watched"])
54
55 title = sanitize_filename(title)
56 subtitle = sanitize_filename(subtitle)
57 extn = os.path.splitext(basename)[1]
58
59
60 if subtitle:
61 filename = "%s - %s%s" % (starttime, subtitle, extn)
62 else:
63 filename = "%s%s" % (starttime, extn)
64 if watched:
65 filename = "watched/" + filename
66
67 source = "%s/%s" % (recordings_dir, basename)
68 dest = "%s/%s" % (title, filename)
69
70 if not os.path.isfile(source):
71 return
72
73 if os.path.isfile(dest):
74 dest = os.path.splitext(dest)[0] + " - unique" + str(random.randint(1000, 9999)) + extn
75
76 dirnames = dest.split("/")[:-1]
77 for i in range(1, len(dirnames)+1):
78 dirname = "/".join(dirnames[:i])
79 if not os.path.isdir(dirname):
80 os.mkdir(dirname)
81
82 try:
83 os.symlink(source, dest)
84 except Exception as e:
85 print(e, "--", source, "->", dest)
86 sys.exit(1)
87
88 def sanitize_filename(filename):
89 unsafe = re.compile("[^a-zA-Z0-9\-_ ,\\.]+")
90 return unsafe.sub("", filename)
91
92 if __name__ == "__main__":
93 main()