]> code.delx.au - mediapc-tools/blobdiff - mythcleandb
MythTV maintenance scripts
[mediapc-tools] / mythcleandb
diff --git a/mythcleandb b/mythcleandb
new file mode 100755 (executable)
index 0000000..6e000fb
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+import mythlib
+
+def main(dry_run):
+    config_xml = mythlib.get_config()
+    db_connection = mythlib.get_db_connection(config_xml)
+    recordings_dir = mythlib.get_recordings_dir(config_xml, db_connection)
+
+    orphan_db_records = list(find_orphan_db_records(db_connection, recordings_dir))
+    for basename in orphan_db_records:
+        if dry_run:
+            print("Found orphan:", basename)
+        else:
+            print("Deleting orphan:", basename)
+            delete_orphan_record(db_connection, basename)
+
+def print_usage_exit():
+    print("Usage: %s [-f|-n]" % sys.argv[0])
+    sys.exit(1)
+
+def find_orphan_db_records(db_connection, recordings_dir):
+    with db_connection.cursor() as cursor:
+        cursor.execute("""
+            SELECT basename
+            FROM recorded
+            WHERE progend < now()
+        """)
+        for row in cursor:
+            basename = row[0]
+            if not is_valid_record(recordings_dir, basename):
+                yield basename
+
+def is_valid_record(recordings_dir, basename):
+    filename = "%s/%s" % (recordings_dir, basename)
+    try:
+        size = os.stat(filename).st_size
+    except FileNotFoundError:
+        size = 0
+
+    return size > 0
+
+def delete_orphan_record(db_connection, basename):
+    with db_connection.cursor() as cursor:
+        cursor.execute("delete from recorded where basename='%s'" % basename)
+
+if __name__ == "__main__":
+    if len(sys.argv) != 2:
+        print_usage_exit()
+
+    if sys.argv[1] == "-f":
+        dry_run = False
+    elif sys.argv[1] == "-n":
+        dry_run = True
+    else:
+        print_usage_exit()
+
+    main(dry_run)