From 218f0b9b79684db10dd70f4577df40805b994d87 Mon Sep 17 00:00:00 2001 From: Kapitan Date: Tue, 11 Mar 2025 00:46:39 +0100 Subject: [PATCH] Add periodic version check --- kapitanbooru_uploader/ImageBrowser.py | 112 +++++++-- .../locales/en/LC_MESSAGES/messages.po | 206 ++++++++++------ .../locales/pl/LC_MESSAGES/messages.po | 229 ++++++++++-------- kapitanbooru_uploader/requirements.txt | 3 +- pyproject.toml | 5 +- 5 files changed, 351 insertions(+), 204 deletions(-) diff --git a/kapitanbooru_uploader/ImageBrowser.py b/kapitanbooru_uploader/ImageBrowser.py index 6fb5b74..68c48bb 100644 --- a/kapitanbooru_uploader/ImageBrowser.py +++ b/kapitanbooru_uploader/ImageBrowser.py @@ -7,11 +7,14 @@ import threading import tkinter as tk from tkinter import filedialog, messagebox, ttk from typing import Dict, Tuple, Optional +from packaging.version import parse as parse_version +import itertools import networkx as nx import requests from PIL import Image, ImageTk, PngImagePlugin import wdtagger as wdt +import tomli from .I18N import _ from .ProgressFile import ProgressFile @@ -139,7 +142,8 @@ class ImageBrowser(tk.Tk): super().__init__() self.title("Kapitanbooru Uploader") self.geometry("900x600") - self.version = "0.4.4" + self.version = "0.5.0" + self.acknowledged_version = parse_version(self.version) self.settings = Settings() self.tags_repo = TagsRepo(self.settings) @@ -204,6 +208,66 @@ class ImageBrowser(tk.Tk): self.create_widgets() self.bind_events() + # Schedule first update check + self.after(1000, self._schedule_update_check) + + def _schedule_update_check(self): + """Schedule periodic update checks""" + self._check_for_update() + # Check every 5 minutes (300,000 ms) + self.after(300000, self._schedule_update_check) + + def _check_for_update(self): + """Check for updates in a background thread""" + + def check_thread(): + try: + # Fetch pyproject.toml using requests + response = requests.get( + "https://git.mlesniak.pl/kapitan/kapitanbooru-uploader/raw/branch/main/pyproject.toml", + timeout=10, # Add reasonable timeout + ) + response.raise_for_status() # Raise exception for HTTP errors + + remote_toml = tomli.loads(response.text) + remote_version_str = remote_toml["project"]["version"] + remote_version = parse_version(remote_version_str) + current_version = parse_version(self.version) + + if ( + remote_version > current_version + and remote_version > self.acknowledged_version + ): + self.after(0, lambda: self._notify_user(remote_version_str)) + self.acknowledged_version = remote_version + except requests.exceptions.RequestException as e: + print(_("Update check failed: {error}").format(error=e)) + except KeyError as e: + print(_("Malformed pyproject.toml: {error}").format(error=e)) + except Exception as e: + print( + _("Unexpected error during update check: {error}").format(error=e) + ) + + threading.Thread(target=check_thread, daemon=True).start() + + def _notify_user(self, new_version): + """Show update notification with translated messages""" + title = _("Update Available") + message_template = _( + "A new version {new_version} is available!\n" + "You have version {current_version}.\n\n" + "Update using: {update_command}" + ) + + formatted_message = message_template.format( + new_version=new_version, + current_version=self.version, + update_command="pip install --upgrade kapitanbooru-uploader", + ) + + messagebox.showinfo(title, formatted_message) + def reload_ui(self): """Reload UI components with new language""" # Destroy current widgets @@ -417,31 +481,43 @@ class ImageBrowser(tk.Tk): frame = ttk.Frame(about, padding=10) frame.pack(fill="both", expand=True) + row_counter = itertools.count(0) + ttk.Label( frame, text="Kapitanbooru Uploader", font=("TkDefaultFont", 16, "bold") - ).grid(row=0, column=0, sticky=tk.W) + ).grid(row=next(row_counter), column=0, sticky=tk.W) + + current_version = parse_version(self.version) + if current_version < self.acknowledged_version: + ttk.Label( + frame, + text=_("A new version {new_version} is available!").format( + new_version=self.acknowledged_version + ), + foreground="red", + ).grid(row=next(row_counter), column=0, sticky=tk.W) content = [ - (f"Version {self.version}", 1), - ("", 2), - (_("A GUI application for uploading images to KapitanBooru."), 3), - (_("Features include image upload, tag management, automatic"), 4), - (_("tagging with wdtagger, and cache management."), 5), - ("", 6), - (_("Authors:"), 7), - ("Michał Leśniak", 8), - ("", 9), - (_("License: MIT License"), 10), - (f"Copyright © 2025 Michał Leśniak", 11), - ("", 12), + _("Current version: {version}").format(version=self.version), + "", + _("A GUI application for uploading images to KapitanBooru."), + _("Features include image upload, tag management, automatic"), + _("tagging with wdtagger, and cache management."), + "", + _("Authors:"), + "Michał Leśniak", + "", + _("License: MIT License"), + f"Copyright © 2025 Michał Leśniak", + "", ] - for text, row in content: - ttk.Label(frame, text=text).grid(row=row, column=0, sticky=tk.W) + for text in content: + ttk.Label(frame, text=text).grid(row=next(row_counter), column=0, sticky=tk.W) # Repository link repo_frame = ttk.Frame(frame) - repo_frame.grid(row=13, sticky=tk.W) + repo_frame.grid(row=next(row_counter), sticky=tk.W) ttk.Label(repo_frame, text=_("Repository:")).pack(side=tk.LEFT) repo_url = "https://git.mlesniak.pl/kapitan/kapitanbooru-uploader" repo = ttk.Label(repo_frame, text=repo_url, cursor="hand2", foreground="blue") @@ -450,7 +526,7 @@ class ImageBrowser(tk.Tk): # Website link website_frame = ttk.Frame(frame) - website_frame.grid(row=14, sticky=tk.W) + website_frame.grid(row=next(row_counter), sticky=tk.W) ttk.Label(website_frame, text=_("Website:")).pack(side=tk.LEFT) website_url = "https://booru.mlesniak.pl" website = ttk.Label( diff --git a/kapitanbooru_uploader/locales/en/LC_MESSAGES/messages.po b/kapitanbooru_uploader/locales/en/LC_MESSAGES/messages.po index 171dd52..e8c94ff 100644 --- a/kapitanbooru_uploader/locales/en/LC_MESSAGES/messages.po +++ b/kapitanbooru_uploader/locales/en/LC_MESSAGES/messages.po @@ -1,8 +1,8 @@ msgid "" msgstr "" -"Project-Id-Version: Kapitanbooru Uploader 0.4.4\n" +"Project-Id-Version: Kapitanbooru Uploader 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-02 00:39+0100\n" +"POT-Creation-Date: 2025-03-11 00:35+0100\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -43,300 +43,345 @@ msgstr "Found auth_token:" msgid "auth_token not found in the HTML page." msgstr "auth_token not found in the HTML page." -#: ImageBrowser.py:30 +#: ImageBrowser.py:33 msgid "Processing..." msgstr "Processing..." -#: ImageBrowser.py:34 +#: ImageBrowser.py:37 msgid "Processing, please wait..." msgstr "Processing, please wait..." -#: ImageBrowser.py:263 +#: ImageBrowser.py:244 +#, python-brace-format +msgid "Update check failed: {error}" +msgstr "Update check failed: {error}" + +#: ImageBrowser.py:246 +#, python-brace-format +msgid "Malformed pyproject.toml: {error}" +msgstr "Malformed pyproject.toml: {error}" + +#: ImageBrowser.py:249 +#, python-brace-format +msgid "Unexpected error during update check: {error}" +msgstr "Unexpected error during update check: {error}" + +#: ImageBrowser.py:256 +msgid "Update Available" +msgstr "Update Available" + +#: ImageBrowser.py:258 +#, python-brace-format +msgid "" +"A new version {new_version} is available!\n" +"You have version {current_version}.\n" +"\n" +"Update using: {update_command}" +msgstr "" +"A new version {new_version} is available!\n" +"You have version {current_version}.\n" +"\n" +"Update using: {update_command}" + +#: ImageBrowser.py:367 msgid "Błąd przy otwieraniu pliku" msgstr "Error opening file" -#: ImageBrowser.py:305 +#: ImageBrowser.py:409 msgid "Tagger przetworzył:" msgstr "Tagger processed:" -#: ImageBrowser.py:308 +#: ImageBrowser.py:412 msgid "Błąd Taggera dla" msgstr "Tagger error for" -#: ImageBrowser.py:334 +#: ImageBrowser.py:438 msgid "Otwórz folder" msgstr "Open folder" -#: ImageBrowser.py:337 ImageBrowser.py:600 ImageBrowser.py:814 -#: ImageBrowser.py:822 +#: ImageBrowser.py:441 ImageBrowser.py:728 ImageBrowser.py:944 +#: ImageBrowser.py:952 msgid "Wyślij" msgstr "Send" -#: ImageBrowser.py:340 ImageBrowser.py:807 +#: ImageBrowser.py:444 ImageBrowser.py:937 msgid "Wyślij wszystko" msgstr "Send all" -#: ImageBrowser.py:344 ImageBrowser.py:808 ImageBrowser.py:814 +#: ImageBrowser.py:448 ImageBrowser.py:938 ImageBrowser.py:944 msgid "Podmień tagi" msgstr "Replace tags" -#: ImageBrowser.py:347 ImageBrowser.py:809 +#: ImageBrowser.py:451 ImageBrowser.py:939 msgid "Otwórz post" msgstr "Open post" -#: ImageBrowser.py:350 +#: ImageBrowser.py:454 msgid "Zakończ" msgstr "Finish" -#: ImageBrowser.py:352 +#: ImageBrowser.py:456 msgid "Plik" msgstr "File" -#: ImageBrowser.py:356 ImageBrowser.py:430 +#: ImageBrowser.py:460 ImageBrowser.py:557 msgid "Ustawienia" msgstr "Settings" -#: ImageBrowser.py:359 +#: ImageBrowser.py:463 msgid "Wyczyść cache Taggera" msgstr "Clear Tagger cache" -#: ImageBrowser.py:362 +#: ImageBrowser.py:466 msgid "Zregeneruj bazę tagów" msgstr "Regenerate tag database" -#: ImageBrowser.py:364 +#: ImageBrowser.py:468 msgid "Opcje" msgstr "Options" -#: ImageBrowser.py:367 +#: ImageBrowser.py:471 msgid "About" msgstr "About" -#: ImageBrowser.py:368 +#: ImageBrowser.py:472 msgid "Help" msgstr "Help" -#: ImageBrowser.py:373 +#: ImageBrowser.py:477 msgid "About Kapitanbooru Uploader" msgstr "About Kapitanbooru Uploader" -#: ImageBrowser.py:386 +#: ImageBrowser.py:494 +#, python-brace-format +msgid "A new version {new_version} is available!" +msgstr "A new version {new_version} is available!" + +#: ImageBrowser.py:501 +#, python-brace-format +msgid "Current version: {version}" +msgstr "Current version: {version}" + +#: ImageBrowser.py:503 msgid "A GUI application for uploading images to KapitanBooru." msgstr "A GUI application for uploading images to KapitanBooru." -#: ImageBrowser.py:387 +#: ImageBrowser.py:504 msgid "Features include image upload, tag management, automatic" msgstr "Features include image upload, tag management, automatic" -#: ImageBrowser.py:388 +#: ImageBrowser.py:505 msgid "tagging with wdtagger, and cache management." msgstr "tagging with wdtagger, and cache management." -#: ImageBrowser.py:390 +#: ImageBrowser.py:507 msgid "Authors:" msgstr "Authors:" -#: ImageBrowser.py:393 +#: ImageBrowser.py:510 msgid "License: MIT License" msgstr "License: MIT License" -#: ImageBrowser.py:396 +#: ImageBrowser.py:521 msgid "Repository:" msgstr "Repository:" -#: ImageBrowser.py:397 +#: ImageBrowser.py:530 msgid "Website:" msgstr "Website:" -#: ImageBrowser.py:414 +#: ImageBrowser.py:541 msgid "Close" msgstr "Close" -#: ImageBrowser.py:422 ImageBrowser.py:425 +#: ImageBrowser.py:549 ImageBrowser.py:552 msgid "Cache" msgstr "Cache" -#: ImageBrowser.py:422 +#: ImageBrowser.py:549 msgid "Cache Taggera zostało wyczyszczone." msgstr "Tagger cache has been cleared." -#: ImageBrowser.py:425 +#: ImageBrowser.py:552 msgid "Błąd przy czyszczeniu cache:" msgstr "Error clearing cache:" -#: ImageBrowser.py:434 +#: ImageBrowser.py:562 msgid "Login:" msgstr "Login:" -#: ImageBrowser.py:440 +#: ImageBrowser.py:568 msgid "Hasło:" msgstr "Password:" -#: ImageBrowser.py:446 +#: ImageBrowser.py:574 msgid "Base URL:" msgstr "Base URL:" -#: ImageBrowser.py:452 +#: ImageBrowser.py:580 msgid "Default Tags:" msgstr "Default Tags:" -#: ImageBrowser.py:458 +#: ImageBrowser.py:586 msgid "Browser:" msgstr "Browser:" -#: ImageBrowser.py:472 +#: ImageBrowser.py:600 msgid "Language:" msgstr "Language:" -#: ImageBrowser.py:504 +#: ImageBrowser.py:632 msgid "Zapisz" msgstr "Save" -#: ImageBrowser.py:546 +#: ImageBrowser.py:674 msgid "PNG Tags" msgstr "PNG Tags" -#: ImageBrowser.py:558 +#: ImageBrowser.py:686 msgid "Tagger Tags" msgstr "Tagger Tags" -#: ImageBrowser.py:572 +#: ImageBrowser.py:700 msgid "Manual Tags" msgstr "Manual Tags" -#: ImageBrowser.py:580 +#: ImageBrowser.py:708 msgid "Final Tags" msgstr "Final Tags" -#: ImageBrowser.py:605 +#: ImageBrowser.py:733 msgid "Wyświetl" msgstr "Display" -#: ImageBrowser.py:622 +#: ImageBrowser.py:750 msgid "Przetworzono tagi:" msgstr "Processed tags:" -#: ImageBrowser.py:622 ImageBrowser.py:623 ImageBrowser.py:624 +#: ImageBrowser.py:750 ImageBrowser.py:751 ImageBrowser.py:752 msgid "plików" msgstr "files" -#: ImageBrowser.py:623 +#: ImageBrowser.py:751 msgid "Zweryfikowano status uploadu:" msgstr "Upload status verified:" -#: ImageBrowser.py:624 +#: ImageBrowser.py:752 msgid "Zuploadowano:" msgstr "Uploaded:" -#: ImageBrowser.py:652 +#: ImageBrowser.py:780 msgid "Wybierz folder z obrazkami PNG" msgstr "Select folder with PNG images" -#: ImageBrowser.py:683 +#: ImageBrowser.py:813 msgid "Informacja" msgstr "Information" -#: ImageBrowser.py:683 +#: ImageBrowser.py:813 msgid "Brak plików PNG w wybranym folderze." msgstr "No PNG files in the selected folder." -#: ImageBrowser.py:766 +#: ImageBrowser.py:896 msgid "Błąd podczas sprawdzania paczki uploadu:" msgstr "Error while checking upload package:" -#: ImageBrowser.py:842 +#: ImageBrowser.py:972 msgid "Błąd przy obliczaniu MD5:" msgstr "Error calculating MD5:" -#: ImageBrowser.py:898 +#: ImageBrowser.py:1028 msgid "Błąd" msgstr "Error" -#: ImageBrowser.py:898 +#: ImageBrowser.py:1028 msgid "Nie można załadować obrazka:" msgstr "Unable to load image:" -#: ImageBrowser.py:1108 ImageBrowser.py:1118 +#: ImageBrowser.py:1238 ImageBrowser.py:1248 #, python-brace-format msgid "Warning: Tag '{tag}' not found in implication graph" msgstr "Warning: Tag '{tag}' not found in implication graph" -#: ImageBrowser.py:1348 +#: ImageBrowser.py:1478 msgid "Tagger przetwarza..." msgstr "Tagger processing..." -#: ImageBrowser.py:1373 +#: ImageBrowser.py:1503 #, python-brace-format msgid "Wysyłam plik {base_file_name}..." msgstr "Sending file {base_file_name}..." -#: ImageBrowser.py:1414 +#: ImageBrowser.py:1544 msgid "Wysyłanie zakończone powodzeniem!" msgstr "Upload completed successfully!" -#: ImageBrowser.py:1418 ImageBrowser.py:1427 +#: ImageBrowser.py:1548 ImageBrowser.py:1557 #, python-brace-format msgid "" "Wysyłanie zakończone błędem.\n" "Status: {status_code}\n" "Treść: {text}" msgstr "" -"Upload failed.\nStatus: {status_code}\nContent: {text}" +"Upload failed.\n" +"Status: {status_code}\n" +"Content: {text}" -#: ImageBrowser.py:1433 ImageBrowser.py:1436 +#: ImageBrowser.py:1563 ImageBrowser.py:1566 msgid "Wysyłanie" msgstr "Uploading" -#: ImageBrowser.py:1449 +#: ImageBrowser.py:1579 msgid "Błąd wysyłania" msgstr "Upload error" -#: ImageBrowser.py:1469 +#: ImageBrowser.py:1599 msgid "Błąd edycji" msgstr "Edit error" -#: ImageBrowser.py:1469 +#: ImageBrowser.py:1599 msgid "Post nie został znaleziony dla tego pliku" msgstr "Post not found for this file" -#: ImageBrowser.py:1479 +#: ImageBrowser.py:1609 #, python-brace-format msgid "Aktualizuję tagi dla {base_file_name}..." msgstr "Updating tags for {base_file_name}..." -#: ImageBrowser.py:1489 ImageBrowser.py:1499 ImageBrowser.py:1530 +#: ImageBrowser.py:1619 ImageBrowser.py:1629 ImageBrowser.py:1660 msgid "Operacja anulowana" msgstr "Operation cancelled" -#: ImageBrowser.py:1540 +#: ImageBrowser.py:1670 msgid "Tagi zostały zaktualizowane!" msgstr "Tags have been updated!" -#: ImageBrowser.py:1542 +#: ImageBrowser.py:1672 msgid "Sukces edycji" msgstr "Edit successful" -#: ImageBrowser.py:1548 +#: ImageBrowser.py:1678 #, python-brace-format msgid "" "Błąd podczas aktualizacji tagów\n" "Status: {code}" msgstr "" -"Error updating tags\nStatus: {code}" +"Error updating tags\n" +"Status: {code}" -#: ImageBrowser.py:1552 +#: ImageBrowser.py:1682 msgid "Treść:" msgstr "Content:" -#: ImageBrowser.py:1556 +#: ImageBrowser.py:1686 msgid "Krytyczny błąd edycji" msgstr "Critical edit error" -#: ImageBrowser.py:1568 +#: ImageBrowser.py:1698 msgid "Potwierdzenie" msgstr "Confirmation" -#: ImageBrowser.py:1570 +#: ImageBrowser.py:1700 msgid "" "Czy na pewno chcesz wrzucić wszystkie niewrzucone pliki?\n" "Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n" @@ -346,17 +391,18 @@ msgstr "" "Each will be tagged with 'meta:auto_upload'.\n" "Make sure the tags are correct!" -#: ImageBrowser.py:1589 +#: ImageBrowser.py:1724 msgid "Anulowano operację!" msgstr "Operation cancelled!" -#: ImageBrowser.py:1597 +#: ImageBrowser.py:1732 #, python-brace-format msgid "" "Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}" -msgstr "Uploading {file_path} with tags: {final_tags} and rating: {final_rating}" +msgstr "" +"Uploading {file_path} with tags: {final_tags} and rating: {final_rating}" -#: ImageBrowser.py:1608 +#: ImageBrowser.py:1748 msgid "Przesłano pliki!" msgstr "Files have been uploaded!" diff --git a/kapitanbooru_uploader/locales/pl/LC_MESSAGES/messages.po b/kapitanbooru_uploader/locales/pl/LC_MESSAGES/messages.po index b84cbdd..3e01cf2 100644 --- a/kapitanbooru_uploader/locales/pl/LC_MESSAGES/messages.po +++ b/kapitanbooru_uploader/locales/pl/LC_MESSAGES/messages.po @@ -1,8 +1,8 @@ msgid "" msgstr "" -"Project-Id-Version: Kapitanbooru Uploader 0.4.4\n" +"Project-Id-Version: Kapitanbooru Uploader 0.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-02 00:39+0100\n" +"POT-Creation-Date: 2025-03-11 00:35+0100\n" "Language: pl\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -17,8 +17,7 @@ msgstr "Błąd przy otwieraniu przeglądarki:" #: common.py:72 msgid "Login succeeded, but expected cookies were not set." -msgstr "" -"Logowanie powiodło się, ale oczekiwane ciasteczka nie zostały ustawione." +msgstr "Logowanie powiodło się, ale oczekiwane ciasteczka nie zostały ustawione." #: common.py:74 msgid "Login successful. Cookies stored in session." @@ -45,284 +44,324 @@ msgstr "Znaleziono auth_token:" msgid "auth_token not found in the HTML page." msgstr "Nie znaleziono auth_token w stronie HTML." -#: ImageBrowser.py:30 +#: ImageBrowser.py:33 msgid "Processing..." msgstr "Przetwarzanie..." -#: ImageBrowser.py:34 +#: ImageBrowser.py:37 msgid "Processing, please wait..." msgstr "Przetwarzanie, proszę czekać..." -#: ImageBrowser.py:263 +#: ImageBrowser.py:244 +#, python-brace-format +msgid "Update check failed: {error}" +msgstr "Sprawdzenie aktualizacji nie powiodło się: {error}" + +#: ImageBrowser.py:246 +#, python-brace-format +msgid "Malformed pyproject.toml: {error}" +msgstr "Nieprawidłowy plik pyproject.toml: {error}" + +#: ImageBrowser.py:249 +#, python-brace-format +msgid "Unexpected error during update check: {error}" +msgstr "Nieoczekiwany błąd podczas sprawdzania aktualizacji: {error}" + +#: ImageBrowser.py:256 +msgid "Update Available" +msgstr "Aktualizacja dostępna" + +#: ImageBrowser.py:258 +#, python-brace-format +msgid "" +"A new version {new_version} is available!\n" +"You have version {current_version}.\n" +"\n" +"Update using: {update_command}" +msgstr "" +"Dostępna jest nowa wersja {new_version}!\n" +"Masz wersję {current_version}.\n" +"\n" +"Aktualizuj za pomocą: {update_command}" + +#: ImageBrowser.py:367 msgid "Błąd przy otwieraniu pliku" msgstr "Błąd przy otwieraniu pliku" -#: ImageBrowser.py:305 +#: ImageBrowser.py:409 msgid "Tagger przetworzył:" msgstr "Tagger przetworzył:" -#: ImageBrowser.py:308 +#: ImageBrowser.py:412 msgid "Błąd Taggera dla" msgstr "Błąd Taggera dla" -#: ImageBrowser.py:334 +#: ImageBrowser.py:438 msgid "Otwórz folder" msgstr "Otwórz folder" -#: ImageBrowser.py:337 ImageBrowser.py:600 ImageBrowser.py:814 -#: ImageBrowser.py:822 +#: ImageBrowser.py:441 ImageBrowser.py:728 ImageBrowser.py:944 +#: ImageBrowser.py:952 msgid "Wyślij" msgstr "Wyślij" -#: ImageBrowser.py:340 ImageBrowser.py:807 +#: ImageBrowser.py:444 ImageBrowser.py:937 msgid "Wyślij wszystko" msgstr "Wyślij wszystko" -#: ImageBrowser.py:344 ImageBrowser.py:808 ImageBrowser.py:814 +#: ImageBrowser.py:448 ImageBrowser.py:938 ImageBrowser.py:944 msgid "Podmień tagi" msgstr "Podmień tagi" -#: ImageBrowser.py:347 ImageBrowser.py:809 +#: ImageBrowser.py:451 ImageBrowser.py:939 msgid "Otwórz post" msgstr "Otwórz post" -#: ImageBrowser.py:350 +#: ImageBrowser.py:454 msgid "Zakończ" msgstr "Zakończ" -#: ImageBrowser.py:352 +#: ImageBrowser.py:456 msgid "Plik" msgstr "Plik" -#: ImageBrowser.py:356 ImageBrowser.py:430 +#: ImageBrowser.py:460 ImageBrowser.py:557 msgid "Ustawienia" msgstr "Ustawienia" -#: ImageBrowser.py:359 +#: ImageBrowser.py:463 msgid "Wyczyść cache Taggera" msgstr "Wyczyść cache Taggera" -#: ImageBrowser.py:362 +#: ImageBrowser.py:466 msgid "Zregeneruj bazę tagów" msgstr "Zregeneruj bazę tagów" -#: ImageBrowser.py:364 +#: ImageBrowser.py:468 msgid "Opcje" msgstr "Opcje" -#: ImageBrowser.py:367 +#: ImageBrowser.py:471 msgid "About" msgstr "O programie" -#: ImageBrowser.py:368 +#: ImageBrowser.py:472 msgid "Help" msgstr "Pomoc" -#: ImageBrowser.py:373 +#: ImageBrowser.py:477 msgid "About Kapitanbooru Uploader" msgstr "O programie Kapitanbooru Uploader" -#: ImageBrowser.py:386 +#: ImageBrowser.py:494 +#, python-brace-format +msgid "A new version {new_version} is available!" +msgstr "Dostępna jest nowa wersja {new_version}!" + +#: ImageBrowser.py:501 +#, python-brace-format +msgid "Current version: {version}" +msgstr "Obecna wersja: {version}" + +#: ImageBrowser.py:503 msgid "A GUI application for uploading images to KapitanBooru." msgstr "Aplikacja GUI do przesyłania obrazów do KapitanBooru." -#: ImageBrowser.py:387 +#: ImageBrowser.py:504 msgid "Features include image upload, tag management, automatic" msgstr "Funkcje obejmują przesyłanie obrazów, zarządzanie tagami, automatyczne" -#: ImageBrowser.py:388 +#: ImageBrowser.py:505 msgid "tagging with wdtagger, and cache management." msgstr "tagowanie za pomocą wdtagger oraz zarządzanie cache." -#: ImageBrowser.py:390 +#: ImageBrowser.py:507 msgid "Authors:" msgstr "Autorzy:" -#: ImageBrowser.py:393 +#: ImageBrowser.py:510 msgid "License: MIT License" msgstr "Licencja: MIT License" -#: ImageBrowser.py:396 +#: ImageBrowser.py:521 msgid "Repository:" msgstr "Repozytorium:" -#: ImageBrowser.py:397 +#: ImageBrowser.py:530 msgid "Website:" msgstr "Strona internetowa:" -#: ImageBrowser.py:414 +#: ImageBrowser.py:541 msgid "Close" msgstr "Zamknij" -#: ImageBrowser.py:422 ImageBrowser.py:425 +#: ImageBrowser.py:549 ImageBrowser.py:552 msgid "Cache" msgstr "Cache" -#: ImageBrowser.py:422 +#: ImageBrowser.py:549 msgid "Cache Taggera zostało wyczyszczone." msgstr "Cache Taggera zostało wyczyszczone." -#: ImageBrowser.py:425 +#: ImageBrowser.py:552 msgid "Błąd przy czyszczeniu cache:" msgstr "Błąd przy czyszczeniu cache:" -#: ImageBrowser.py:434 +#: ImageBrowser.py:562 msgid "Login:" msgstr "Login:" -#: ImageBrowser.py:440 +#: ImageBrowser.py:568 msgid "Hasło:" msgstr "Hasło:" -#: ImageBrowser.py:446 +#: ImageBrowser.py:574 msgid "Base URL:" msgstr "Base URL:" -#: ImageBrowser.py:452 +#: ImageBrowser.py:580 msgid "Default Tags:" msgstr "Domyślne tagi:" -#: ImageBrowser.py:458 +#: ImageBrowser.py:586 msgid "Browser:" msgstr "Przeglądarka:" -#: ImageBrowser.py:472 +#: ImageBrowser.py:600 msgid "Language:" msgstr "Język:" -#: ImageBrowser.py:504 +#: ImageBrowser.py:632 msgid "Zapisz" msgstr "Zapisz" -#: ImageBrowser.py:546 +#: ImageBrowser.py:674 msgid "PNG Tags" msgstr "Tagi PNG" -#: ImageBrowser.py:558 +#: ImageBrowser.py:686 msgid "Tagger Tags" msgstr "Tagi Taggera" -#: ImageBrowser.py:572 +#: ImageBrowser.py:700 msgid "Manual Tags" msgstr "Tagi ręczne" -#: ImageBrowser.py:580 +#: ImageBrowser.py:708 msgid "Final Tags" msgstr "Ostateczne tagi" -#: ImageBrowser.py:605 +#: ImageBrowser.py:733 msgid "Wyświetl" msgstr "Wyświetl" -#: ImageBrowser.py:622 +#: ImageBrowser.py:750 msgid "Przetworzono tagi:" msgstr "Przetworzono tagi:" -#: ImageBrowser.py:622 ImageBrowser.py:623 ImageBrowser.py:624 +#: ImageBrowser.py:750 ImageBrowser.py:751 ImageBrowser.py:752 msgid "plików" msgstr "plików" -#: ImageBrowser.py:623 +#: ImageBrowser.py:751 msgid "Zweryfikowano status uploadu:" msgstr "Zweryfikowano status uploadu:" -#: ImageBrowser.py:624 +#: ImageBrowser.py:752 msgid "Zuploadowano:" msgstr "Zuploadowano:" -#: ImageBrowser.py:652 +#: ImageBrowser.py:780 msgid "Wybierz folder z obrazkami PNG" msgstr "Wybierz folder z obrazami PNG" -#: ImageBrowser.py:683 +#: ImageBrowser.py:813 msgid "Informacja" msgstr "Informacja" -#: ImageBrowser.py:683 +#: ImageBrowser.py:813 msgid "Brak plików PNG w wybranym folderze." msgstr "Brak plików PNG w wybranym folderze." -#: ImageBrowser.py:766 +#: ImageBrowser.py:896 msgid "Błąd podczas sprawdzania paczki uploadu:" msgstr "Błąd podczas sprawdzania paczki uploadu:" -#: ImageBrowser.py:842 +#: ImageBrowser.py:972 msgid "Błąd przy obliczaniu MD5:" msgstr "Błąd przy obliczaniu MD5:" -#: ImageBrowser.py:898 +#: ImageBrowser.py:1028 msgid "Błąd" msgstr "Błąd" -#: ImageBrowser.py:898 +#: ImageBrowser.py:1028 msgid "Nie można załadować obrazka:" msgstr "Nie można załadować obrazka:" -#: ImageBrowser.py:1108 ImageBrowser.py:1118 +#: ImageBrowser.py:1238 ImageBrowser.py:1248 #, python-brace-format msgid "Warning: Tag '{tag}' not found in implication graph" msgstr "Ostrzeżenie: Tag '{tag}' nie został znaleziony w grafie implikacji" -#: ImageBrowser.py:1348 +#: ImageBrowser.py:1478 msgid "Tagger przetwarza..." msgstr "Tagger przetwarza..." -#: ImageBrowser.py:1373 +#: ImageBrowser.py:1503 #, python-brace-format msgid "Wysyłam plik {base_file_name}..." msgstr "Wysyłam plik {base_file_name}..." -#: ImageBrowser.py:1414 -#, fuzzy +#: ImageBrowser.py:1544 msgid "Wysyłanie zakończone powodzeniem!" -msgstr "Upload zakończony powodzeniem!" +msgstr "Wysyłanie zakończone powodzeniem!" -#: ImageBrowser.py:1418 ImageBrowser.py:1427 -#, fuzzy, python-brace-format +#: ImageBrowser.py:1548 ImageBrowser.py:1557 +#, python-brace-format msgid "" "Wysyłanie zakończone błędem.\n" "Status: {status_code}\n" "Treść: {text}" msgstr "" -"Upload zakończony błędem.\n" +"Wysyłanie zakończone błędem.\n" "Status: {status_code}\n" "Treść: {text}" -#: ImageBrowser.py:1433 ImageBrowser.py:1436 +#: ImageBrowser.py:1563 msgid "Wysyłanie" -msgstr "" +msgstr "Wysyłanie" -#: ImageBrowser.py:1449 -#, fuzzy +#: ImageBrowser.py:1579 msgid "Błąd wysyłania" -msgstr "Błąd edycji" +msgstr "Błąd wysyłania" -#: ImageBrowser.py:1469 +#: ImageBrowser.py:1599 msgid "Błąd edycji" msgstr "Błąd edycji" -#: ImageBrowser.py:1469 +#: ImageBrowser.py:1599 msgid "Post nie został znaleziony dla tego pliku" msgstr "Post nie został znaleziony dla tego pliku" -#: ImageBrowser.py:1479 +#: ImageBrowser.py:1609 #, python-brace-format msgid "Aktualizuję tagi dla {base_file_name}..." msgstr "Aktualizuję tagi dla {base_file_name}..." -#: ImageBrowser.py:1489 ImageBrowser.py:1499 ImageBrowser.py:1530 +#: ImageBrowser.py:1619 ImageBrowser.py:1629 ImageBrowser.py:1660 msgid "Operacja anulowana" msgstr "Operacja anulowana" -#: ImageBrowser.py:1540 +#: ImageBrowser.py:1670 msgid "Tagi zostały zaktualizowane!" msgstr "Tagi zostały zaktualizowane!" -#: ImageBrowser.py:1542 +#: ImageBrowser.py:1672 msgid "Sukces edycji" msgstr "Sukces edycji" -#: ImageBrowser.py:1548 +#: ImageBrowser.py:1678 #, python-brace-format msgid "" "Błąd podczas aktualizacji tagów\n" @@ -331,19 +370,19 @@ msgstr "" "Błąd podczas aktualizacji tagów\n" "Status: {code}" -#: ImageBrowser.py:1552 +#: ImageBrowser.py:1682 msgid "Treść:" msgstr "Treść:" -#: ImageBrowser.py:1556 +#: ImageBrowser.py:1686 msgid "Krytyczny błąd edycji" msgstr "Krytyczny błąd edycji" -#: ImageBrowser.py:1568 +#: ImageBrowser.py:1698 msgid "Potwierdzenie" msgstr "Potwierdzenie" -#: ImageBrowser.py:1570 +#: ImageBrowser.py:1700 msgid "" "Czy na pewno chcesz wrzucić wszystkie niewrzucone pliki?\n" "Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n" @@ -353,18 +392,18 @@ msgstr "" "Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n" "Upewnij się, że tagi są poprawne!" -#: ImageBrowser.py:1589 +#: ImageBrowser.py:1724 msgid "Anulowano operację!" msgstr "Operacja anulowana!" -#: ImageBrowser.py:1597 -#, fuzzy, python-brace-format +#: ImageBrowser.py:1732 +#, python-brace-format msgid "" "Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}" msgstr "" "Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}" -#: ImageBrowser.py:1608 +#: ImageBrowser.py:1748 msgid "Przesłano pliki!" msgstr "Pliki zostały przesłane!" @@ -497,19 +536,3 @@ msgstr "Błąd podczas odczytu tag_aliases:" #: tag_processing.py:181 msgid "Błąd podczas odczytu tags:" msgstr "Błąd podczas odczytu tags:" - -#, python-brace-format -#~ msgid "" -#~ "Upload zakończony błędem.\n" -#~ "Status: 409\n" -#~ "Treść: {error}" -#~ msgstr "" -#~ "Upload zakończony błędem.\n" -#~ "Status: 409\n" -#~ "Treść: {error}" - -#~ msgid "Upload" -#~ msgstr "Upload" - -#~ msgid "Błąd uploadu" -#~ msgstr "Błąd uploadu" diff --git a/kapitanbooru_uploader/requirements.txt b/kapitanbooru_uploader/requirements.txt index 4058538..2b60f76 100644 --- a/kapitanbooru_uploader/requirements.txt +++ b/kapitanbooru_uploader/requirements.txt @@ -3,4 +3,5 @@ Pillow==11.1.0 pywin32==308 Requests==2.32.3 wdtagger==0.13.2 -bs4==0.0.2 \ No newline at end of file +bs4==0.0.2 +tomli==2.2.1 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 72847d5..0ded196 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "kapitanbooru-uploader" -version = "0.4.4" +version = "0.5.0" description = "A GUI application for uploading images to KapitanBooru" authors = [ {name = "Michał Leśniak", email = "kapitan@mlesniak.pl"} @@ -15,7 +15,8 @@ dependencies = [ "pywin32==308", "requests==2.32.3", "wdtagger==0.13.2", - "bs4==0.0.2" + "bs4==0.0.2", + "tomli==2.2.1" ] requires-python = ">=3.13" readme = "README.md"