summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xAntennaPodDbFixer.py51
1 files changed, 42 insertions, 9 deletions
diff --git a/AntennaPodDbFixer.py b/AntennaPodDbFixer.py
index 56d77a4..dfc83ad 100755
--- a/AntennaPodDbFixer.py
+++ b/AntennaPodDbFixer.py
@@ -5,8 +5,15 @@ import shutil
import os
import sys
+def usage():
+ return sys.argv[0] + " [--help] [corrupt.db]"
+
if len(sys.argv) > 1:
- inputPath = sys.argv[1]
+ if sys.argv[1] == "--help":
+ print(usage())
+ exit(0)
+ else:
+ inputPath = sys.argv[1]
else:
inputPath = input("Enter file path to your corrupted AntennaPod database: ")
@@ -21,7 +28,11 @@ if dbpage_ext != DBPAGE_SYM:
print("https://sqlite.org/dbpage.html (required by .recover)", file=sys.stderr)
exit(1)
-corruptedVersion = subprocess.run(["sqlite3", inputPath, "PRAGMA user_version;"], capture_output=True, text=True).stdout.strip()
+corruptedVersion = subprocess.run(
+ ["sqlite3", inputPath, "PRAGMA user_version;"],
+ capture_output=True,
+ text=True
+ ).stdout.strip()
if corruptedVersion == "0":
print("Error: File not found, not a database, or too corrupted for this script.")
exit()
@@ -29,8 +40,13 @@ print("Corrupted file version: " + corruptedVersion)
emptyPath = "empty/" + corruptedVersion + ".db"
if not os.path.isfile(emptyPath):
- emptyPath = input("Enter file path to an EMPTY AntennaPod database with the same version. If needed, you can download old app versions on F-Droid and export an empty database: ")
- emptyVersion = subprocess.run(["sqlite3", emptyPath, "PRAGMA user_version;"], capture_output=True, text=True).stdout.strip()
+ print("If needed, you can download old app versions on F-Droid and export an empty database.")
+ emptyPath = input("Enter file path to an EMPTY AntennaPod database with the same version: ")
+ emptyVersion = subprocess.run(
+ ["sqlite3", emptyPath, "PRAGMA user_version;"],
+ capture_output=True,
+ text=True
+ ).stdout.strip()
print("Empty file version: " + emptyVersion)
if corruptedVersion != emptyVersion:
print("Error: Version does not match")
@@ -48,12 +64,17 @@ if os.path.exists(corruptedPath): os.remove(corruptedPath)
# Recover to SQL commands and insert back into a database
print("Recovering database.")
-subprocess.run(["sqlite3", inputPath, ".recover --ignore-freelist"], check=True, stdout=open(sqlPath, 'w'))
+subprocess.run(
+ ["sqlite3", inputPath, ".recover --ignore-freelist"],
+ check=True,
+ stdout=open(sqlPath, 'w')
+ )
f = open(sqlPath,'r')
filedata = f.read()
f.close()
f = open(sqlPath,'w')
-f.write(filedata.replace("CREATE TABLE sqlite_sequence(name,seq);","")) # Avoid a warning that could be confusing to users
+# Avoid a warning that could be confusing to users
+f.write(filedata.replace("CREATE TABLE sqlite_sequence(name,seq);",""))
f.close()
subprocess.run(["sqlite3", corruptedPath], stdin=open(sqlPath, 'r'))
print()
@@ -63,7 +84,12 @@ print()
def query(db, query):
result = ""
try:
- result = subprocess.run(["sqlite3", "-json", db, query], capture_output=True, check=True, text=True).stdout
+ result = subprocess.run(
+ ["sqlite3", "-json", db, query],
+ capture_output=True,
+ check=True,
+ text=True
+ ).stdout
return json.loads(result)
except subprocess.CalledProcessError as err:
print(err.stderr)
@@ -75,10 +101,17 @@ tables = query(emptyPath, "SELECT name FROM sqlite_schema WHERE type='table';")
for table in tables:
table = table["name"]
print("Copying " + table + "...")
- columns = query(emptyPath, "SELECT GROUP_CONCAT(NAME,',') AS columns FROM PRAGMA_TABLE_INFO('" + table + "')")[0]["columns"]
+ columns = query(
+ emptyPath,
+ "SELECT GROUP_CONCAT(NAME,',') AS columns FROM PRAGMA_TABLE_INFO('" + table + "')"
+ )[0]["columns"]
query(outputPath, "DELETE FROM " + table)
- query(outputPath, "attach '" + corruptedPath + "' AS old; INSERT INTO main." + table + " SELECT " + columns + " from old." + table + ";")
+ query(
+ outputPath,
+ "attach '" + corruptedPath + "' AS old; INSERT INTO main." + table + " SELECT " +
+ columns + " from old." + table + ";"
+ )
print()
# Cleanup