Add periodic version check
All checks were successful
Gitea/kapitanbooru-uploader/pipeline/head This commit looks good
All checks were successful
Gitea/kapitanbooru-uploader/pipeline/head This commit looks good
This commit is contained in:
parent
b559f965f5
commit
218f0b9b79
@ -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(
|
||||
|
@ -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!"
|
||||
|
||||
|
@ -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"
|
||||
|
@ -3,4 +3,5 @@ Pillow==11.1.0
|
||||
pywin32==308
|
||||
Requests==2.32.3
|
||||
wdtagger==0.13.2
|
||||
bs4==0.0.2
|
||||
bs4==0.0.2
|
||||
tomli==2.2.1
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user