From 3d585d14e05ba9c97a4f49b21bc6f1a04b3c6de9 Mon Sep 17 00:00:00 2001 From: Lucas Vivo Date: Thu, 8 Oct 2026 12:26:35 +0200 Subject: [PATCH] audiobook edit sqlite database to remove audiobook genre --- audiobook_metadata/metadata_edit_database.py | 90 ++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 audiobook_metadata/metadata_edit_database.py diff --git a/audiobook_metadata/metadata_edit_database.py b/audiobook_metadata/metadata_edit_database.py new file mode 100644 index 0000000..4fc4758 --- /dev/null +++ b/audiobook_metadata/metadata_edit_database.py @@ -0,0 +1,90 @@ +import json +import re +import sqlite3 +import argparse +from pathlib import Path + +def load_genre(conn, unique=False): + """ + Return all genres from the books table. + + Args: + conn: sqlite3 connection + unique: if True, return unique genres only + + Returns: + list[str] + """ + genres = [] + + for (genres_json,) in conn.execute("SELECT genres FROM books"): + if not genres_json: + continue + + try: + genres.extend(json.loads(genres_json)) + except Exception: + pass + + if unique: + return sorted(set(genres)) + + return genres + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "database", + type=Path, + help="SQL Database Path", + ) + + args = parser.parse_args() + + database = args.database.resolve() + + if not database.is_file(): + parser.error(f"Database is not a file: {database}") + + db = sqlite3.connect(database) + cur = db.cursor() + + list_genres = load_genre(cur,True) + + for genre in list_genres: + print(genre) + + for book_id, genres_json in cur.execute("SELECT id, genres FROM books"): + if not genres_json: + continue + + genres = json.loads(genres_json) + new_genres = [] + + for genre in genres: + genre = re.sub(r'(?i)^audio\s*books?$', '', genre) + genre = re.sub(r'(?i)^audiobooks?$', '', genre) + genre = re.sub(r'(?i)^hörb(uch|ücher)$', '', genre) + genre = re.sub(r'(?i)^hörspiele?$', '', genre) + genre = re.sub(r'(?i)^spoken\s*word$', '', genre) + genre = re.sub(r'(?i)^speech$', '', genre) + + genre = re.sub(r'(?i)^(sci[- ]?fi|sf)$', 'Science Fiction', genre) + genre = re.sub(r'(?i)^nonfiction$', 'NonFiction', genre) + + genre = genre.strip() + + if genre: + new_genres.append(genre) + + new_genres = sorted(set(new_genres)) + + cur.execute( + "UPDATE books SET genres=? WHERE id=?", + (json.dumps(new_genres), book_id), + ) + + db.commit() + +if __name__ == "__main__": + main() \ No newline at end of file