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