Osveževanje baze besedil preko web-a #5

This commit is contained in:
2026-03-21 11:24:43 +01:00
parent 64e478eafa
commit 67fa26a0b1
2 changed files with 82 additions and 2 deletions

View File

@@ -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
# ------------------------------------------------------

View File

@@ -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"
}