Bump version to 0.6.0 and add artist tag processing functionality
All checks were successful
Gitea/kapitanbooru-uploader/pipeline/head This commit looks good

This commit is contained in:
Michał Leśniak 2025-03-16 01:28:47 +01:00
parent 0978dd8e3c
commit 96597a4e2b
5 changed files with 225 additions and 172 deletions

View File

@ -142,7 +142,7 @@ class ImageBrowser(tk.Tk):
super().__init__() super().__init__()
self.title("Kapitanbooru Uploader") self.title("Kapitanbooru Uploader")
self.geometry("900x600") self.geometry("900x600")
self.version = "0.5.2" self.version = "0.6.0"
self.acknowledged_version = parse_version(self.version) self.acknowledged_version = parse_version(self.version)
self.settings = Settings() self.settings = Settings()
@ -217,6 +217,10 @@ class ImageBrowser(tk.Tk):
# Check every 5 minutes (300,000 ms) # Check every 5 minutes (300,000 ms)
self.after(300000, self._schedule_update_check) self.after(300000, self._schedule_update_check)
def is_installed_via_pipx(self):
"""Check if the application is installed via pipx"""
return os.environ.get("__PIPX_ORIGIN") == "pipx"
def _check_for_update(self): def _check_for_update(self):
"""Check for updates in a background thread""" """Check for updates in a background thread"""
@ -263,7 +267,11 @@ class ImageBrowser(tk.Tk):
formatted_message = message_template.format( formatted_message = message_template.format(
new_version=new_version, new_version=new_version,
current_version=self.version, current_version=self.version,
update_command="pip install --upgrade kapitanbooru-uploader", update_command=(
"pipx upgrade kapitanbooru-uploader"
if self.is_installed_via_pipx()
else "pip install --upgrade kapitanbooru-uploader"
),
) )
messagebox.showinfo(title, formatted_message) messagebox.showinfo(title, formatted_message)
@ -513,7 +521,9 @@ class ImageBrowser(tk.Tk):
] ]
for text in content: for text in content:
ttk.Label(frame, text=text).grid(row=next(row_counter), column=0, sticky=tk.W) ttk.Label(frame, text=text).grid(
row=next(row_counter), column=0, sticky=tk.W
)
# Repository link # Repository link
repo_frame = ttk.Frame(frame) repo_frame = ttk.Frame(frame)

View File

@ -1,8 +1,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Kapitanbooru Uploader 0.5.2\n" "Project-Id-Version: Kapitanbooru Uploader 0.6.0\n"
"Report-Msgid-Bugs-To: kapitan@mlesniak.pl\n" "Report-Msgid-Bugs-To: kapitan@mlesniak.pl\n"
"POT-Creation-Date: 2025-03-15 19:42+0100\n" "POT-Creation-Date: 2025-03-16 01:22+0100\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@ -51,26 +51,26 @@ msgstr "Processing..."
msgid "Processing, please wait..." msgid "Processing, please wait..."
msgstr "Processing, please wait..." msgstr "Processing, please wait..."
#: ImageBrowser.py:244 #: ImageBrowser.py:248
#, python-brace-format #, python-brace-format
msgid "Update check failed: {error}" msgid "Update check failed: {error}"
msgstr "Update check failed: {error}" msgstr "Update check failed: {error}"
#: ImageBrowser.py:246 #: ImageBrowser.py:250
#, python-brace-format #, python-brace-format
msgid "Malformed pyproject.toml: {error}" msgid "Malformed pyproject.toml: {error}"
msgstr "Malformed pyproject.toml: {error}" msgstr "Malformed pyproject.toml: {error}"
#: ImageBrowser.py:249 #: ImageBrowser.py:253
#, python-brace-format #, python-brace-format
msgid "Unexpected error during update check: {error}" msgid "Unexpected error during update check: {error}"
msgstr "Unexpected error during update check: {error}" msgstr "Unexpected error during update check: {error}"
#: ImageBrowser.py:256 #: ImageBrowser.py:260
msgid "Update Available" msgid "Update Available"
msgstr "Update Available" msgstr "Update Available"
#: ImageBrowser.py:258 #: ImageBrowser.py:262
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"A new version {new_version} is available!\n" "A new version {new_version} is available!\n"
@ -83,240 +83,240 @@ msgstr ""
"\n" "\n"
"Update using: {update_command}" "Update using: {update_command}"
#: ImageBrowser.py:367 #: ImageBrowser.py:375
msgid "Błąd przy otwieraniu pliku" msgid "Błąd przy otwieraniu pliku"
msgstr "Error opening file" msgstr "Error opening file"
#: ImageBrowser.py:409 #: ImageBrowser.py:417
msgid "Tagger przetworzył:" msgid "Tagger przetworzył:"
msgstr "Tagger processed:" msgstr "Tagger processed:"
#: ImageBrowser.py:412 #: ImageBrowser.py:420
msgid "Błąd Taggera dla" msgid "Błąd Taggera dla"
msgstr "Tagger error for" msgstr "Tagger error for"
#: ImageBrowser.py:438 #: ImageBrowser.py:446
msgid "Otwórz folder" msgid "Otwórz folder"
msgstr "Open folder" msgstr "Open folder"
#: ImageBrowser.py:441 ImageBrowser.py:728 ImageBrowser.py:944 #: ImageBrowser.py:449 ImageBrowser.py:738 ImageBrowser.py:954
#: ImageBrowser.py:952 #: ImageBrowser.py:962
msgid "Wyślij" msgid "Wyślij"
msgstr "Send" msgstr "Send"
#: ImageBrowser.py:444 ImageBrowser.py:937 #: ImageBrowser.py:452 ImageBrowser.py:947
msgid "Wyślij wszystko" msgid "Wyślij wszystko"
msgstr "Send all" msgstr "Send all"
#: ImageBrowser.py:448 ImageBrowser.py:938 ImageBrowser.py:944 #: ImageBrowser.py:456 ImageBrowser.py:948 ImageBrowser.py:954
msgid "Podmień tagi" msgid "Podmień tagi"
msgstr "Replace tags" msgstr "Replace tags"
#: ImageBrowser.py:451 ImageBrowser.py:939 #: ImageBrowser.py:459 ImageBrowser.py:949
msgid "Otwórz post" msgid "Otwórz post"
msgstr "Open post" msgstr "Open post"
#: ImageBrowser.py:454 #: ImageBrowser.py:462
msgid "Zakończ" msgid "Zakończ"
msgstr "Finish" msgstr "Finish"
#: ImageBrowser.py:456 #: ImageBrowser.py:464
msgid "Plik" msgid "Plik"
msgstr "File" msgstr "File"
#: ImageBrowser.py:460 ImageBrowser.py:557 #: ImageBrowser.py:468 ImageBrowser.py:567
msgid "Ustawienia" msgid "Ustawienia"
msgstr "Settings" msgstr "Settings"
#: ImageBrowser.py:463 #: ImageBrowser.py:471
msgid "Wyczyść cache Taggera" msgid "Wyczyść cache Taggera"
msgstr "Clear Tagger cache" msgstr "Clear Tagger cache"
#: ImageBrowser.py:466 #: ImageBrowser.py:474
msgid "Zregeneruj bazę tagów" msgid "Zregeneruj bazę tagów"
msgstr "Regenerate tag database" msgstr "Regenerate tag database"
#: ImageBrowser.py:468 #: ImageBrowser.py:476
msgid "Opcje" msgid "Opcje"
msgstr "Options" msgstr "Options"
#: ImageBrowser.py:471 #: ImageBrowser.py:479
msgid "About" msgid "About"
msgstr "About" msgstr "About"
#: ImageBrowser.py:472 #: ImageBrowser.py:480
msgid "Help" msgid "Help"
msgstr "Help" msgstr "Help"
#: ImageBrowser.py:477 #: ImageBrowser.py:485
msgid "About Kapitanbooru Uploader" msgid "About Kapitanbooru Uploader"
msgstr "About Kapitanbooru Uploader" msgstr "About Kapitanbooru Uploader"
#: ImageBrowser.py:494 #: ImageBrowser.py:502
#, python-brace-format #, python-brace-format
msgid "A new version {new_version} is available!" msgid "A new version {new_version} is available!"
msgstr "A new version {new_version} is available!" msgstr "A new version {new_version} is available!"
#: ImageBrowser.py:501 #: ImageBrowser.py:509
#, python-brace-format #, python-brace-format
msgid "Current version: {version}" msgid "Current version: {version}"
msgstr "Current version: {version}" msgstr "Current version: {version}"
#: ImageBrowser.py:503 #: ImageBrowser.py:511
msgid "A GUI application for uploading images to KapitanBooru." msgid "A GUI application for uploading images to KapitanBooru."
msgstr "A GUI application for uploading images to KapitanBooru." msgstr "A GUI application for uploading images to KapitanBooru."
#: ImageBrowser.py:504 #: ImageBrowser.py:512
msgid "Features include image upload, tag management, automatic" msgid "Features include image upload, tag management, automatic"
msgstr "Features include image upload, tag management, automatic" msgstr "Features include image upload, tag management, automatic"
#: ImageBrowser.py:505 #: ImageBrowser.py:513
msgid "tagging with wdtagger, and cache management." msgid "tagging with wdtagger, and cache management."
msgstr "tagging with wdtagger, and cache management." msgstr "tagging with wdtagger, and cache management."
#: ImageBrowser.py:507 #: ImageBrowser.py:515
msgid "Authors:" msgid "Authors:"
msgstr "Authors:" msgstr "Authors:"
#: ImageBrowser.py:510 #: ImageBrowser.py:518
msgid "License: MIT License" msgid "License: MIT License"
msgstr "License: MIT License" msgstr "License: MIT License"
#: ImageBrowser.py:521 #: ImageBrowser.py:531
msgid "Repository:" msgid "Repository:"
msgstr "Repository:" msgstr "Repository:"
#: ImageBrowser.py:530 #: ImageBrowser.py:540
msgid "Website:" msgid "Website:"
msgstr "Website:" msgstr "Website:"
#: ImageBrowser.py:541 #: ImageBrowser.py:551
msgid "Close" msgid "Close"
msgstr "Close" msgstr "Close"
#: ImageBrowser.py:549 ImageBrowser.py:552 #: ImageBrowser.py:559 ImageBrowser.py:562
msgid "Cache" msgid "Cache"
msgstr "Cache" msgstr "Cache"
#: ImageBrowser.py:549 #: ImageBrowser.py:559
msgid "Cache Taggera zostało wyczyszczone." msgid "Cache Taggera zostało wyczyszczone."
msgstr "Tagger cache has been cleared." msgstr "Tagger cache has been cleared."
#: ImageBrowser.py:552 #: ImageBrowser.py:562
msgid "Błąd przy czyszczeniu cache:" msgid "Błąd przy czyszczeniu cache:"
msgstr "Error clearing cache:" msgstr "Error clearing cache:"
#: ImageBrowser.py:562 #: ImageBrowser.py:572
msgid "Login:" msgid "Login:"
msgstr "Login:" msgstr "Login:"
#: ImageBrowser.py:568 #: ImageBrowser.py:578
msgid "Hasło:" msgid "Hasło:"
msgstr "Password:" msgstr "Password:"
#: ImageBrowser.py:574 #: ImageBrowser.py:584
msgid "Base URL:" msgid "Base URL:"
msgstr "Base URL:" msgstr "Base URL:"
#: ImageBrowser.py:580 #: ImageBrowser.py:590
msgid "Default Tags:" msgid "Default Tags:"
msgstr "Default Tags:" msgstr "Default Tags:"
#: ImageBrowser.py:586 #: ImageBrowser.py:596
msgid "Browser:" msgid "Browser:"
msgstr "Browser:" msgstr "Browser:"
#: ImageBrowser.py:600 #: ImageBrowser.py:610
msgid "Language:" msgid "Language:"
msgstr "Language:" msgstr "Language:"
#: ImageBrowser.py:632 #: ImageBrowser.py:642
msgid "Zapisz" msgid "Zapisz"
msgstr "Save" msgstr "Save"
#: ImageBrowser.py:674 #: ImageBrowser.py:684
msgid "PNG Tags" msgid "PNG Tags"
msgstr "PNG Tags" msgstr "PNG Tags"
#: ImageBrowser.py:686 #: ImageBrowser.py:696
msgid "Tagger Tags" msgid "Tagger Tags"
msgstr "Tagger Tags" msgstr "Tagger Tags"
#: ImageBrowser.py:700 #: ImageBrowser.py:710
msgid "Manual Tags" msgid "Manual Tags"
msgstr "Manual Tags" msgstr "Manual Tags"
#: ImageBrowser.py:708 #: ImageBrowser.py:718
msgid "Final Tags" msgid "Final Tags"
msgstr "Final Tags" msgstr "Final Tags"
#: ImageBrowser.py:733 #: ImageBrowser.py:743
msgid "Wyświetl" msgid "Wyświetl"
msgstr "Display" msgstr "Display"
#: ImageBrowser.py:750 #: ImageBrowser.py:760
msgid "Przetworzono tagi:" msgid "Przetworzono tagi:"
msgstr "Processed tags:" msgstr "Processed tags:"
#: ImageBrowser.py:750 ImageBrowser.py:751 ImageBrowser.py:752 #: ImageBrowser.py:760 ImageBrowser.py:761 ImageBrowser.py:762
msgid "plików" msgid "plików"
msgstr "files" msgstr "files"
#: ImageBrowser.py:751 #: ImageBrowser.py:761
msgid "Zweryfikowano status uploadu:" msgid "Zweryfikowano status uploadu:"
msgstr "Upload status verified:" msgstr "Upload status verified:"
#: ImageBrowser.py:752 #: ImageBrowser.py:762
msgid "Zuploadowano:" msgid "Zuploadowano:"
msgstr "Uploaded:" msgstr "Uploaded:"
#: ImageBrowser.py:780 #: ImageBrowser.py:790
msgid "Wybierz folder z obrazkami PNG" msgid "Wybierz folder z obrazkami PNG"
msgstr "Select folder with PNG images" msgstr "Select folder with PNG images"
#: ImageBrowser.py:813 #: ImageBrowser.py:823
msgid "Informacja" msgid "Informacja"
msgstr "Information" msgstr "Information"
#: ImageBrowser.py:813 #: ImageBrowser.py:823
msgid "Brak plików PNG w wybranym folderze." msgid "Brak plików PNG w wybranym folderze."
msgstr "No PNG files in the selected folder." msgstr "No PNG files in the selected folder."
#: ImageBrowser.py:896 #: ImageBrowser.py:906
msgid "Błąd podczas sprawdzania paczki uploadu:" msgid "Błąd podczas sprawdzania paczki uploadu:"
msgstr "Error while checking upload package:" msgstr "Error while checking upload package:"
#: ImageBrowser.py:972 #: ImageBrowser.py:982
msgid "Błąd przy obliczaniu MD5:" msgid "Błąd przy obliczaniu MD5:"
msgstr "Error calculating MD5:" msgstr "Error calculating MD5:"
#: ImageBrowser.py:1028 #: ImageBrowser.py:1038
msgid "Błąd" msgid "Błąd"
msgstr "Error" msgstr "Error"
#: ImageBrowser.py:1028 #: ImageBrowser.py:1038
msgid "Nie można załadować obrazka:" msgid "Nie można załadować obrazka:"
msgstr "Unable to load image:" msgstr "Unable to load image:"
#: ImageBrowser.py:1238 ImageBrowser.py:1248 #: ImageBrowser.py:1248 ImageBrowser.py:1258
#, python-brace-format #, python-brace-format
msgid "Warning: Tag '{tag}' not found in implication graph" msgid "Warning: Tag '{tag}' not found in implication graph"
msgstr "Warning: Tag '{tag}' not found in implication graph" msgstr "Warning: Tag '{tag}' not found in implication graph"
#: ImageBrowser.py:1478 #: ImageBrowser.py:1488
msgid "Tagger przetwarza..." msgid "Tagger przetwarza..."
msgstr "Tagger processing..." msgstr "Tagger processing..."
#: ImageBrowser.py:1503 #: ImageBrowser.py:1513
#, python-brace-format #, python-brace-format
msgid "Wysyłam plik {base_file_name}..." msgid "Wysyłam plik {base_file_name}..."
msgstr "Sending file {base_file_name}..." msgstr "Sending file {base_file_name}..."
#: ImageBrowser.py:1544 #: ImageBrowser.py:1554
msgid "Wysyłanie zakończone powodzeniem!" msgid "Wysyłanie zakończone powodzeniem!"
msgstr "Upload completed successfully!" msgstr "Upload completed successfully!"
#: ImageBrowser.py:1548 ImageBrowser.py:1557 #: ImageBrowser.py:1558 ImageBrowser.py:1567
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Wysyłanie zakończone błędem.\n" "Wysyłanie zakończone błędem.\n"
@ -327,40 +327,40 @@ msgstr ""
"Status: {status_code}\n" "Status: {status_code}\n"
"Content: {text}" "Content: {text}"
#: ImageBrowser.py:1563 ImageBrowser.py:1566 #: ImageBrowser.py:1573 ImageBrowser.py:1576
msgid "Wysyłanie" msgid "Wysyłanie"
msgstr "Uploading" msgstr "Uploading"
#: ImageBrowser.py:1579 #: ImageBrowser.py:1589
msgid "Błąd wysyłania" msgid "Błąd wysyłania"
msgstr "Upload error" msgstr "Upload error"
#: ImageBrowser.py:1599 #: ImageBrowser.py:1609
msgid "Błąd edycji" msgid "Błąd edycji"
msgstr "Edit error" msgstr "Edit error"
#: ImageBrowser.py:1599 #: ImageBrowser.py:1609
msgid "Post nie został znaleziony dla tego pliku" msgid "Post nie został znaleziony dla tego pliku"
msgstr "Post not found for this file" msgstr "Post not found for this file"
#: ImageBrowser.py:1609 #: ImageBrowser.py:1619
#, python-brace-format #, python-brace-format
msgid "Aktualizuję tagi dla {base_file_name}..." msgid "Aktualizuję tagi dla {base_file_name}..."
msgstr "Updating tags for {base_file_name}..." msgstr "Updating tags for {base_file_name}..."
#: ImageBrowser.py:1619 ImageBrowser.py:1629 ImageBrowser.py:1660 #: ImageBrowser.py:1629 ImageBrowser.py:1639 ImageBrowser.py:1670
msgid "Operacja anulowana" msgid "Operacja anulowana"
msgstr "Operation cancelled" msgstr "Operation cancelled"
#: ImageBrowser.py:1670 #: ImageBrowser.py:1680
msgid "Tagi zostały zaktualizowane!" msgid "Tagi zostały zaktualizowane!"
msgstr "Tags have been updated!" msgstr "Tags have been updated!"
#: ImageBrowser.py:1672 #: ImageBrowser.py:1682
msgid "Sukces edycji" msgid "Sukces edycji"
msgstr "Edit successful" msgstr "Edit successful"
#: ImageBrowser.py:1678 #: ImageBrowser.py:1688
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Błąd podczas aktualizacji tagów\n" "Błąd podczas aktualizacji tagów\n"
@ -369,19 +369,19 @@ msgstr ""
"Error updating tags\n" "Error updating tags\n"
"Status: {code}" "Status: {code}"
#: ImageBrowser.py:1682 #: ImageBrowser.py:1692
msgid "Treść:" msgid "Treść:"
msgstr "Content:" msgstr "Content:"
#: ImageBrowser.py:1686 #: ImageBrowser.py:1696
msgid "Krytyczny błąd edycji" msgid "Krytyczny błąd edycji"
msgstr "Critical edit error" msgstr "Critical edit error"
#: ImageBrowser.py:1698 #: ImageBrowser.py:1708
msgid "Potwierdzenie" msgid "Potwierdzenie"
msgstr "Confirmation" msgstr "Confirmation"
#: ImageBrowser.py:1700 #: ImageBrowser.py:1710
msgid "" msgid ""
"Czy na pewno chcesz wrzucić wszystkie niewrzucone pliki?\n" "Czy na pewno chcesz wrzucić wszystkie niewrzucone pliki?\n"
"Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n" "Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n"
@ -391,18 +391,18 @@ msgstr ""
"Each will be tagged with 'meta:auto_upload'.\n" "Each will be tagged with 'meta:auto_upload'.\n"
"Make sure the tags are correct!" "Make sure the tags are correct!"
#: ImageBrowser.py:1724 #: ImageBrowser.py:1734
msgid "Anulowano operację!" msgid "Anulowano operację!"
msgstr "Operation cancelled!" msgstr "Operation cancelled!"
#: ImageBrowser.py:1732 #: ImageBrowser.py:1742
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}" "Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}"
msgstr "" msgstr ""
"Uploading {file_path} with tags: {final_tags} and rating: {final_rating}" "Uploading {file_path} with tags: {final_tags} and rating: {final_rating}"
#: ImageBrowser.py:1748 #: ImageBrowser.py:1758
msgid "Przesłano pliki!" msgid "Przesłano pliki!"
msgstr "Files have been uploaded!" msgstr "Files have been uploaded!"
@ -426,11 +426,15 @@ msgstr "Error fetching character tags:"
msgid "Błąd przy pobieraniu tagów copyright:" msgid "Błąd przy pobieraniu tagów copyright:"
msgstr "Error fetching copyright tags:" msgstr "Error fetching copyright tags:"
#: tag_processing.py:165 #: tag_processing.py:48
msgid "Błąd przy pobieraniu tagów artystów:"
msgstr "Error fetching artist tags:"
#: tag_processing.py:200
msgid "Błąd podczas odczytu tag_aliases:" msgid "Błąd podczas odczytu tag_aliases:"
msgstr "Error reading tag aliases:" msgstr "Error reading tag aliases:"
#: tag_processing.py:181 #: tag_processing.py:216
msgid "Błąd podczas odczytu tags:" msgid "Błąd podczas odczytu tags:"
msgstr "Error reading tags:" msgstr "Error reading tags:"

View File

@ -1,8 +1,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Kapitanbooru Uploader 0.5.2\n" "Project-Id-Version: Kapitanbooru Uploader 0.6.0\n"
"Report-Msgid-Bugs-To: kapitan@mlesniak.pl\n" "Report-Msgid-Bugs-To: kapitan@mlesniak.pl\n"
"POT-Creation-Date: 2025-03-15 19:42+0100\n" "POT-Creation-Date: 2025-03-16 01:22+0100\n"
"Language: pl\n" "Language: pl\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@ -53,26 +53,26 @@ msgstr "Przetwarzanie..."
msgid "Processing, please wait..." msgid "Processing, please wait..."
msgstr "Przetwarzanie, proszę czekać..." msgstr "Przetwarzanie, proszę czekać..."
#: ImageBrowser.py:244 #: ImageBrowser.py:248
#, python-brace-format #, python-brace-format
msgid "Update check failed: {error}" msgid "Update check failed: {error}"
msgstr "Sprawdzenie aktualizacji nie powiodło się: {error}" msgstr "Sprawdzenie aktualizacji nie powiodło się: {error}"
#: ImageBrowser.py:246 #: ImageBrowser.py:250
#, python-brace-format #, python-brace-format
msgid "Malformed pyproject.toml: {error}" msgid "Malformed pyproject.toml: {error}"
msgstr "Nieprawidłowy plik pyproject.toml: {error}" msgstr "Nieprawidłowy plik pyproject.toml: {error}"
#: ImageBrowser.py:249 #: ImageBrowser.py:253
#, python-brace-format #, python-brace-format
msgid "Unexpected error during update check: {error}" msgid "Unexpected error during update check: {error}"
msgstr "Nieoczekiwany błąd podczas sprawdzania aktualizacji: {error}" msgstr "Nieoczekiwany błąd podczas sprawdzania aktualizacji: {error}"
#: ImageBrowser.py:256 #: ImageBrowser.py:260
msgid "Update Available" msgid "Update Available"
msgstr "Aktualizacja dostępna" msgstr "Aktualizacja dostępna"
#: ImageBrowser.py:258 #: ImageBrowser.py:262
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"A new version {new_version} is available!\n" "A new version {new_version} is available!\n"
@ -85,240 +85,240 @@ msgstr ""
"\n" "\n"
"Aktualizuj za pomocą: {update_command}" "Aktualizuj za pomocą: {update_command}"
#: ImageBrowser.py:367 #: ImageBrowser.py:375
msgid "Błąd przy otwieraniu pliku" msgid "Błąd przy otwieraniu pliku"
msgstr "Błąd przy otwieraniu pliku" msgstr "Błąd przy otwieraniu pliku"
#: ImageBrowser.py:409 #: ImageBrowser.py:417
msgid "Tagger przetworzył:" msgid "Tagger przetworzył:"
msgstr "Tagger przetworzył:" msgstr "Tagger przetworzył:"
#: ImageBrowser.py:412 #: ImageBrowser.py:420
msgid "Błąd Taggera dla" msgid "Błąd Taggera dla"
msgstr "Błąd Taggera dla" msgstr "Błąd Taggera dla"
#: ImageBrowser.py:438 #: ImageBrowser.py:446
msgid "Otwórz folder" msgid "Otwórz folder"
msgstr "Otwórz folder" msgstr "Otwórz folder"
#: ImageBrowser.py:441 ImageBrowser.py:728 ImageBrowser.py:944 #: ImageBrowser.py:449 ImageBrowser.py:738 ImageBrowser.py:954
#: ImageBrowser.py:952 #: ImageBrowser.py:962
msgid "Wyślij" msgid "Wyślij"
msgstr "Wyślij" msgstr "Wyślij"
#: ImageBrowser.py:444 ImageBrowser.py:937 #: ImageBrowser.py:452 ImageBrowser.py:947
msgid "Wyślij wszystko" msgid "Wyślij wszystko"
msgstr "Wyślij wszystko" msgstr "Wyślij wszystko"
#: ImageBrowser.py:448 ImageBrowser.py:938 ImageBrowser.py:944 #: ImageBrowser.py:456 ImageBrowser.py:948 ImageBrowser.py:954
msgid "Podmień tagi" msgid "Podmień tagi"
msgstr "Podmień tagi" msgstr "Podmień tagi"
#: ImageBrowser.py:451 ImageBrowser.py:939 #: ImageBrowser.py:459 ImageBrowser.py:949
msgid "Otwórz post" msgid "Otwórz post"
msgstr "Otwórz post" msgstr "Otwórz post"
#: ImageBrowser.py:454 #: ImageBrowser.py:462
msgid "Zakończ" msgid "Zakończ"
msgstr "Zakończ" msgstr "Zakończ"
#: ImageBrowser.py:456 #: ImageBrowser.py:464
msgid "Plik" msgid "Plik"
msgstr "Plik" msgstr "Plik"
#: ImageBrowser.py:460 ImageBrowser.py:557 #: ImageBrowser.py:468 ImageBrowser.py:567
msgid "Ustawienia" msgid "Ustawienia"
msgstr "Ustawienia" msgstr "Ustawienia"
#: ImageBrowser.py:463 #: ImageBrowser.py:471
msgid "Wyczyść cache Taggera" msgid "Wyczyść cache Taggera"
msgstr "Wyczyść cache Taggera" msgstr "Wyczyść cache Taggera"
#: ImageBrowser.py:466 #: ImageBrowser.py:474
msgid "Zregeneruj bazę tagów" msgid "Zregeneruj bazę tagów"
msgstr "Zregeneruj bazę tagów" msgstr "Zregeneruj bazę tagów"
#: ImageBrowser.py:468 #: ImageBrowser.py:476
msgid "Opcje" msgid "Opcje"
msgstr "Opcje" msgstr "Opcje"
#: ImageBrowser.py:471 #: ImageBrowser.py:479
msgid "About" msgid "About"
msgstr "O programie" msgstr "O programie"
#: ImageBrowser.py:472 #: ImageBrowser.py:480
msgid "Help" msgid "Help"
msgstr "Pomoc" msgstr "Pomoc"
#: ImageBrowser.py:477 #: ImageBrowser.py:485
msgid "About Kapitanbooru Uploader" msgid "About Kapitanbooru Uploader"
msgstr "O programie Kapitanbooru Uploader" msgstr "O programie Kapitanbooru Uploader"
#: ImageBrowser.py:494 #: ImageBrowser.py:502
#, python-brace-format #, python-brace-format
msgid "A new version {new_version} is available!" msgid "A new version {new_version} is available!"
msgstr "Dostępna jest nowa wersja {new_version}!" msgstr "Dostępna jest nowa wersja {new_version}!"
#: ImageBrowser.py:501 #: ImageBrowser.py:509
#, python-brace-format #, python-brace-format
msgid "Current version: {version}" msgid "Current version: {version}"
msgstr "Obecna wersja: {version}" msgstr "Obecna wersja: {version}"
#: ImageBrowser.py:503 #: ImageBrowser.py:511
msgid "A GUI application for uploading images to KapitanBooru." msgid "A GUI application for uploading images to KapitanBooru."
msgstr "Aplikacja GUI do przesyłania obrazów do KapitanBooru." msgstr "Aplikacja GUI do przesyłania obrazów do KapitanBooru."
#: ImageBrowser.py:504 #: ImageBrowser.py:512
msgid "Features include image upload, tag management, automatic" msgid "Features include image upload, tag management, automatic"
msgstr "Funkcje obejmują przesyłanie obrazów, zarządzanie tagami, automatyczne" msgstr "Funkcje obejmują przesyłanie obrazów, zarządzanie tagami, automatyczne"
#: ImageBrowser.py:505 #: ImageBrowser.py:513
msgid "tagging with wdtagger, and cache management." msgid "tagging with wdtagger, and cache management."
msgstr "tagowanie za pomocą wdtagger oraz zarządzanie cache." msgstr "tagowanie za pomocą wdtagger oraz zarządzanie cache."
#: ImageBrowser.py:507 #: ImageBrowser.py:515
msgid "Authors:" msgid "Authors:"
msgstr "Autorzy:" msgstr "Autorzy:"
#: ImageBrowser.py:510 #: ImageBrowser.py:518
msgid "License: MIT License" msgid "License: MIT License"
msgstr "Licencja: MIT License" msgstr "Licencja: MIT License"
#: ImageBrowser.py:521 #: ImageBrowser.py:531
msgid "Repository:" msgid "Repository:"
msgstr "Repozytorium:" msgstr "Repozytorium:"
#: ImageBrowser.py:530 #: ImageBrowser.py:540
msgid "Website:" msgid "Website:"
msgstr "Strona internetowa:" msgstr "Strona internetowa:"
#: ImageBrowser.py:541 #: ImageBrowser.py:551
msgid "Close" msgid "Close"
msgstr "Zamknij" msgstr "Zamknij"
#: ImageBrowser.py:549 ImageBrowser.py:552 #: ImageBrowser.py:559 ImageBrowser.py:562
msgid "Cache" msgid "Cache"
msgstr "Cache" msgstr "Cache"
#: ImageBrowser.py:549 #: ImageBrowser.py:559
msgid "Cache Taggera zostało wyczyszczone." msgid "Cache Taggera zostało wyczyszczone."
msgstr "Cache Taggera zostało wyczyszczone." msgstr "Cache Taggera zostało wyczyszczone."
#: ImageBrowser.py:552 #: ImageBrowser.py:562
msgid "Błąd przy czyszczeniu cache:" msgid "Błąd przy czyszczeniu cache:"
msgstr "Błąd przy czyszczeniu cache:" msgstr "Błąd przy czyszczeniu cache:"
#: ImageBrowser.py:562 #: ImageBrowser.py:572
msgid "Login:" msgid "Login:"
msgstr "Login:" msgstr "Login:"
#: ImageBrowser.py:568 #: ImageBrowser.py:578
msgid "Hasło:" msgid "Hasło:"
msgstr "Hasło:" msgstr "Hasło:"
#: ImageBrowser.py:574 #: ImageBrowser.py:584
msgid "Base URL:" msgid "Base URL:"
msgstr "Base URL:" msgstr "Base URL:"
#: ImageBrowser.py:580 #: ImageBrowser.py:590
msgid "Default Tags:" msgid "Default Tags:"
msgstr "Domyślne tagi:" msgstr "Domyślne tagi:"
#: ImageBrowser.py:586 #: ImageBrowser.py:596
msgid "Browser:" msgid "Browser:"
msgstr "Przeglądarka:" msgstr "Przeglądarka:"
#: ImageBrowser.py:600 #: ImageBrowser.py:610
msgid "Language:" msgid "Language:"
msgstr "Język:" msgstr "Język:"
#: ImageBrowser.py:632 #: ImageBrowser.py:642
msgid "Zapisz" msgid "Zapisz"
msgstr "Zapisz" msgstr "Zapisz"
#: ImageBrowser.py:674 #: ImageBrowser.py:684
msgid "PNG Tags" msgid "PNG Tags"
msgstr "Tagi PNG" msgstr "Tagi PNG"
#: ImageBrowser.py:686 #: ImageBrowser.py:696
msgid "Tagger Tags" msgid "Tagger Tags"
msgstr "Tagi Taggera" msgstr "Tagi Taggera"
#: ImageBrowser.py:700 #: ImageBrowser.py:710
msgid "Manual Tags" msgid "Manual Tags"
msgstr "Tagi ręczne" msgstr "Tagi ręczne"
#: ImageBrowser.py:708 #: ImageBrowser.py:718
msgid "Final Tags" msgid "Final Tags"
msgstr "Ostateczne tagi" msgstr "Ostateczne tagi"
#: ImageBrowser.py:733 #: ImageBrowser.py:743
msgid "Wyświetl" msgid "Wyświetl"
msgstr "Wyświetl" msgstr "Wyświetl"
#: ImageBrowser.py:750 #: ImageBrowser.py:760
msgid "Przetworzono tagi:" msgid "Przetworzono tagi:"
msgstr "Przetworzono tagi:" msgstr "Przetworzono tagi:"
#: ImageBrowser.py:750 ImageBrowser.py:751 ImageBrowser.py:752 #: ImageBrowser.py:760 ImageBrowser.py:761 ImageBrowser.py:762
msgid "plików" msgid "plików"
msgstr "plików" msgstr "plików"
#: ImageBrowser.py:751 #: ImageBrowser.py:761
msgid "Zweryfikowano status uploadu:" msgid "Zweryfikowano status uploadu:"
msgstr "Zweryfikowano status uploadu:" msgstr "Zweryfikowano status uploadu:"
#: ImageBrowser.py:752 #: ImageBrowser.py:762
msgid "Zuploadowano:" msgid "Zuploadowano:"
msgstr "Zuploadowano:" msgstr "Zuploadowano:"
#: ImageBrowser.py:780 #: ImageBrowser.py:790
msgid "Wybierz folder z obrazkami PNG" msgid "Wybierz folder z obrazkami PNG"
msgstr "Wybierz folder z obrazami PNG" msgstr "Wybierz folder z obrazami PNG"
#: ImageBrowser.py:813 #: ImageBrowser.py:823
msgid "Informacja" msgid "Informacja"
msgstr "Informacja" msgstr "Informacja"
#: ImageBrowser.py:813 #: ImageBrowser.py:823
msgid "Brak plików PNG w wybranym folderze." msgid "Brak plików PNG w wybranym folderze."
msgstr "Brak plików PNG w wybranym folderze." msgstr "Brak plików PNG w wybranym folderze."
#: ImageBrowser.py:896 #: ImageBrowser.py:906
msgid "Błąd podczas sprawdzania paczki uploadu:" msgid "Błąd podczas sprawdzania paczki uploadu:"
msgstr "Błąd podczas sprawdzania paczki uploadu:" msgstr "Błąd podczas sprawdzania paczki uploadu:"
#: ImageBrowser.py:972 #: ImageBrowser.py:982
msgid "Błąd przy obliczaniu MD5:" msgid "Błąd przy obliczaniu MD5:"
msgstr "Błąd przy obliczaniu MD5:" msgstr "Błąd przy obliczaniu MD5:"
#: ImageBrowser.py:1028 #: ImageBrowser.py:1038
msgid "Błąd" msgid "Błąd"
msgstr "Błąd" msgstr "Błąd"
#: ImageBrowser.py:1028 #: ImageBrowser.py:1038
msgid "Nie można załadować obrazka:" msgid "Nie można załadować obrazka:"
msgstr "Nie można załadować obrazka:" msgstr "Nie można załadować obrazka:"
#: ImageBrowser.py:1238 ImageBrowser.py:1248 #: ImageBrowser.py:1248 ImageBrowser.py:1258
#, python-brace-format #, python-brace-format
msgid "Warning: Tag '{tag}' not found in implication graph" msgid "Warning: Tag '{tag}' not found in implication graph"
msgstr "Ostrzeżenie: Tag '{tag}' nie został znaleziony w grafie implikacji" msgstr "Ostrzeżenie: Tag '{tag}' nie został znaleziony w grafie implikacji"
#: ImageBrowser.py:1478 #: ImageBrowser.py:1488
msgid "Tagger przetwarza..." msgid "Tagger przetwarza..."
msgstr "Tagger przetwarza..." msgstr "Tagger przetwarza..."
#: ImageBrowser.py:1503 #: ImageBrowser.py:1513
#, python-brace-format #, python-brace-format
msgid "Wysyłam plik {base_file_name}..." msgid "Wysyłam plik {base_file_name}..."
msgstr "Wysyłam plik {base_file_name}..." msgstr "Wysyłam plik {base_file_name}..."
#: ImageBrowser.py:1544 #: ImageBrowser.py:1554
msgid "Wysyłanie zakończone powodzeniem!" msgid "Wysyłanie zakończone powodzeniem!"
msgstr "Wysyłanie zakończone powodzeniem!" msgstr "Wysyłanie zakończone powodzeniem!"
#: ImageBrowser.py:1548 ImageBrowser.py:1557 #: ImageBrowser.py:1558 ImageBrowser.py:1567
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Wysyłanie zakończone błędem.\n" "Wysyłanie zakończone błędem.\n"
@ -329,40 +329,40 @@ msgstr ""
"Status: {status_code}\n" "Status: {status_code}\n"
"Treść: {text}" "Treść: {text}"
#: ImageBrowser.py:1563 ImageBrowser.py:1566 #: ImageBrowser.py:1573 ImageBrowser.py:1576
msgid "Wysyłanie" msgid "Wysyłanie"
msgstr "Wysyłanie" msgstr "Wysyłanie"
#: ImageBrowser.py:1579 #: ImageBrowser.py:1589
msgid "Błąd wysyłania" msgid "Błąd wysyłania"
msgstr "Błąd wysyłania" msgstr "Błąd wysyłania"
#: ImageBrowser.py:1599 #: ImageBrowser.py:1609
msgid "Błąd edycji" msgid "Błąd edycji"
msgstr "Błąd edycji" msgstr "Błąd edycji"
#: ImageBrowser.py:1599 #: ImageBrowser.py:1609
msgid "Post nie został znaleziony dla tego pliku" msgid "Post nie został znaleziony dla tego pliku"
msgstr "Post nie został znaleziony dla tego pliku" msgstr "Post nie został znaleziony dla tego pliku"
#: ImageBrowser.py:1609 #: ImageBrowser.py:1619
#, python-brace-format #, python-brace-format
msgid "Aktualizuję tagi dla {base_file_name}..." msgid "Aktualizuję tagi dla {base_file_name}..."
msgstr "Aktualizuję tagi dla {base_file_name}..." msgstr "Aktualizuję tagi dla {base_file_name}..."
#: ImageBrowser.py:1619 ImageBrowser.py:1629 ImageBrowser.py:1660 #: ImageBrowser.py:1629 ImageBrowser.py:1639 ImageBrowser.py:1670
msgid "Operacja anulowana" msgid "Operacja anulowana"
msgstr "Operacja anulowana" msgstr "Operacja anulowana"
#: ImageBrowser.py:1670 #: ImageBrowser.py:1680
msgid "Tagi zostały zaktualizowane!" msgid "Tagi zostały zaktualizowane!"
msgstr "Tagi zostały zaktualizowane!" msgstr "Tagi zostały zaktualizowane!"
#: ImageBrowser.py:1672 #: ImageBrowser.py:1682
msgid "Sukces edycji" msgid "Sukces edycji"
msgstr "Sukces edycji" msgstr "Sukces edycji"
#: ImageBrowser.py:1678 #: ImageBrowser.py:1688
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Błąd podczas aktualizacji tagów\n" "Błąd podczas aktualizacji tagów\n"
@ -371,19 +371,19 @@ msgstr ""
"Błąd podczas aktualizacji tagów\n" "Błąd podczas aktualizacji tagów\n"
"Status: {code}" "Status: {code}"
#: ImageBrowser.py:1682 #: ImageBrowser.py:1692
msgid "Treść:" msgid "Treść:"
msgstr "Treść:" msgstr "Treść:"
#: ImageBrowser.py:1686 #: ImageBrowser.py:1696
msgid "Krytyczny błąd edycji" msgid "Krytyczny błąd edycji"
msgstr "Krytyczny błąd edycji" msgstr "Krytyczny błąd edycji"
#: ImageBrowser.py:1698 #: ImageBrowser.py:1708
msgid "Potwierdzenie" msgid "Potwierdzenie"
msgstr "Potwierdzenie" msgstr "Potwierdzenie"
#: ImageBrowser.py:1700 #: ImageBrowser.py:1710
msgid "" msgid ""
"Czy na pewno chcesz wrzucić wszystkie niewrzucone pliki?\n" "Czy na pewno chcesz wrzucić wszystkie niewrzucone pliki?\n"
"Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n" "Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n"
@ -393,18 +393,18 @@ msgstr ""
"Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n" "Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n"
"Upewnij się, że tagi są poprawne!" "Upewnij się, że tagi są poprawne!"
#: ImageBrowser.py:1724 #: ImageBrowser.py:1734
msgid "Anulowano operację!" msgid "Anulowano operację!"
msgstr "Operacja anulowana!" msgstr "Operacja anulowana!"
#: ImageBrowser.py:1732 #: ImageBrowser.py:1742
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}" "Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}"
msgstr "" msgstr ""
"Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}" "Wysyłanie {file_path} z tagami: {final_tags} i ratingiem: {final_rating}"
#: ImageBrowser.py:1748 #: ImageBrowser.py:1758
msgid "Przesłano pliki!" msgid "Przesłano pliki!"
msgstr "Pliki zostały przesłane!" msgstr "Pliki zostały przesłane!"
@ -428,11 +428,15 @@ msgstr "Błąd przy pobieraniu tagów postaci:"
msgid "Błąd przy pobieraniu tagów copyright:" msgid "Błąd przy pobieraniu tagów copyright:"
msgstr "Błąd przy pobieraniu tagów copyright:" msgstr "Błąd przy pobieraniu tagów copyright:"
#: tag_processing.py:165 #: tag_processing.py:48
msgid "Błąd przy pobieraniu tagów artystów:"
msgstr "Błąd przy pobieraniu tagów artystów:"
#: tag_processing.py:200
msgid "Błąd podczas odczytu tag_aliases:" msgid "Błąd podczas odczytu tag_aliases:"
msgstr "Błąd podczas odczytu tag_aliases:" msgstr "Błąd podczas odczytu tag_aliases:"
#: tag_processing.py:181 #: tag_processing.py:216
msgid "Błąd podczas odczytu tags:" msgid "Błąd podczas odczytu tags:"
msgstr "Błąd podczas odczytu tags:" msgstr "Błąd podczas odczytu tags:"

View File

@ -34,6 +34,20 @@ def get_copyright_tags(tags_repo: TagsRepo):
print(_("Błąd przy pobieraniu tagów copyright:"), e) print(_("Błąd przy pobieraniu tagów copyright:"), e)
return set() return set()
@lru_cache(maxsize=1)
def get_artist_tags(tags_repo: TagsRepo):
"""Zwraca zbiór nazw tagów z kategorii Artist (kategoria = 1) z bazy tags.sqlite"""
try:
conn = tags_repo.get_conn()
cursor = conn.cursor()
cursor.execute("SELECT name FROM tags WHERE category = 1")
rows = cursor.fetchall()
conn.close()
return {row[0] for row in rows}
except Exception as e:
print(_("Błąd przy pobieraniu tagów artystów:"), e)
return set()
# Wzorce i ustawienia związane z tagami # Wzorce i ustawienia związane z tagami
COEFFICIENT_PATTERN = re.compile(r"^.*?(:\d+|\d+\.\d+)$") COEFFICIENT_PATTERN = re.compile(r"^.*?(:\d+|\d+\.\d+)$")
@ -58,12 +72,22 @@ AUTO_METATAGS = [
"detailed_background", "detailed_background",
"ultra-detailed", "ultra-detailed",
"wallpaper", "wallpaper",
"score_9",
"score_8_up",
"score_7_up",
"score_6_up",
"score_5_up",
"score_4_up",
"score_3_up",
"score_2_up",
"score_1_up",
] ]
TAG_FIXES = { TAG_FIXES = {
"2boy": "2boys", "2boy": "2boys",
"2girl": "2girls", "2girl": "2girls",
"exercise": "exercising", "exercise": "exercising",
"keyboard_(computer)": "computer_keyboard", "keyboard_(computer)": "computer_keyboard",
"official_art": "official_style",
} }
MULTI_TAG_FIXES = { MULTI_TAG_FIXES = {
"black_choker_with_heart_charm": ["black_choker", "heart_choker"], "black_choker_with_heart_charm": ["black_choker", "heart_choker"],
@ -119,6 +143,7 @@ def parse_parameters(param_str, tags_repo: TagsRepo):
# Pobierz tagi z bazy # Pobierz tagi z bazy
character_tags = get_character_tags(tags_repo) character_tags = get_character_tags(tags_repo)
copyright_tags = get_copyright_tags(tags_repo) copyright_tags = get_copyright_tags(tags_repo)
artist_tags = get_artist_tags(tags_repo)
# Dla tagów należących do kategorii Character # Dla tagów należących do kategorii Character
for tag in list(tags): # iterujemy po kopii zbioru for tag in list(tags): # iterujemy po kopii zbioru
@ -130,6 +155,16 @@ def parse_parameters(param_str, tags_repo: TagsRepo):
if tag in copyright_tags: if tag in copyright_tags:
tags.discard(tag) tags.discard(tag)
tags.add("copyright:" + tag) tags.add("copyright:" + tag)
# Dla tagów należących do kategorii Artist
artist_tags_counter = 0
for tag in list(tags):
if tag in artist_tags:
tags.discard(tag)
tags.add(tag + "_(style)")
tags.add("style_parody")
artist_tags_counter += 1
if artist_tags_counter > 1:
tags.add("multiple_style_parody")
tags = list(tags) tags = list(tags)
tags.sort() tags.sort()

View File

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "kapitanbooru-uploader" name = "kapitanbooru-uploader"
version = "0.5.2" version = "0.6.0"
description = "A GUI application for uploading images to KapitanBooru" description = "A GUI application for uploading images to KapitanBooru"
authors = [{ name = "Michał Leśniak", email = "kapitan@mlesniak.pl" }] authors = [{ name = "Michał Leśniak", email = "kapitan@mlesniak.pl" }]
dependencies = [ dependencies = [