From 67fa26a0b15689e62f59bf568dc02a2104101c67 Mon Sep 17 00:00:00 2001 From: Valentin Korenjak Date: Sat, 21 Mar 2026 11:24:43 +0100 Subject: [PATCH] =?UTF-8?q?Osve=C5=BEevanje=20baze=20besedil=20preko=20web?= =?UTF-8?q?-a=20#5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projector.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++- settings.json | 3 +- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/projector.py b/projector.py index ab4690d..ad1aa9a 100755 --- a/projector.py +++ b/projector.py @@ -11,6 +11,8 @@ import sys import ctypes import tkinter.messagebox as messagebox from web.server import start_server_thread +import urllib.request +import tempfile DB_PATH = 'songs.db' SETTINGS_PATH = 'settings.json' @@ -50,7 +52,8 @@ class SongProjector: "screen_width_percent": 60, "font_bold": True, "show_song_info": True, - "split_by_stanza": False # TODO: mogoče nekoč (prelom po kitici namesto po višini) + "split_by_stanza": False, # TODO: mogoče nekoč (prelom po kitici namesto po višini) + "db_update_url": "" } if not os.path.exists(SETTINGS_PATH): @@ -302,6 +305,9 @@ class SongProjector: subprocess.Popen([sys.executable, os.path.join(BASE_DIR, "add_song.py")]) # fixme: novi proces ne dobi stdin-a; predelati na tkinter aplikacijo? self.exit_program() return + elif self.song_number == "9901": + self.update_songs_database() + return try: song_id = int(self.song_number) @@ -505,6 +511,79 @@ class SongProjector: else: self.label.config(text="Ni zadetkov.") + # ------------------------------------------------------ + # Posodobitev baze pesmi + # ------------------------------------------------------ + def update_songs_database(self): + url = self.settings.get("db_update_url", "").strip() + if not url: + msg = "URL za posodobitev ni nastavljen v settings.json." + print(msg) + self.label.config(text=msg) + self.song_number = "" + return + + msg = f"Prenašam posodobitev iz: {url}..." + print(msg) + self.label.config(text=msg) + self.root.update() + + temp_db_path = None + try: + # Prenos datoteke + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + temp_db_path = tmp_file.name + with urllib.request.urlopen(url) as response: + tmp_file.write(response.read()) + + # Preverjanje integritete + print("Preverjam integriteto prenesene baze...") + check_conn = sqlite3.connect(temp_db_path) + check_cursor = check_conn.cursor() + + # PRAGMA integrity_check + check_cursor.execute("PRAGMA integrity_check") + integrity_result = check_cursor.fetchone()[0] + if integrity_result != "ok": + raise Exception(f"Integriteta baze ni OK: {integrity_result}") + + # Preverjanje obstoja tabele songs + check_cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='songs'") + if not check_cursor.fetchone(): + raise Exception("Tabela 'songs' ne obstaja v preneseni bazi.") + + # Upsert v trenutno bazo + print("Izvajam upsert v lokalno bazo...") + check_cursor.execute("SELECT id, title, lyrics FROM songs") + new_songs = check_cursor.fetchall() + + upsert_count = 0 + for song_id, title, lyrics in new_songs: + self.cursor.execute(""" + INSERT INTO songs (id, title, lyrics) VALUES (?, ?, ?) + ON CONFLICT(id) DO UPDATE SET title=excluded.title, lyrics=excluded.lyrics + """, (song_id, title, lyrics)) + upsert_count += 1 + + self.conn.commit() + check_conn.close() + + final_msg = f"Posodobitev uspešna! Posodobljenih/dodanih {upsert_count} pesmi." + print(final_msg) + self.label.config(text=final_msg) + + except Exception as e: + error_msg = f"Napaka pri posodobitvi: {e}" + print(error_msg) + self.label.config(text=error_msg) + finally: + if temp_db_path and os.path.exists(temp_db_path): + try: + os.remove(temp_db_path) + except: + pass + self.song_number = "" + # ------------------------------------------------------ # Izhod # ------------------------------------------------------ diff --git a/settings.json b/settings.json index 1a09da9..b6793d2 100644 --- a/settings.json +++ b/settings.json @@ -7,5 +7,6 @@ "font_bold": false, "show_song_info": true, "split_by_stanza": false, - "web_port": 5000 + "web_port": 5000, + "db_update_url": "https://k5c.korenjak.si/s/dKeE6eXMmBPteQF/download" }