Bump version to 0.8.0 and add support for all image formats
	
		
			
	
		
	
	
		
	
		
			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:
		| @@ -1,148 +1,38 @@ | |||||||
| import glob | import glob | ||||||
| import hashlib | import hashlib | ||||||
| import inspect |  | ||||||
| import os | import os | ||||||
| import queue | import queue | ||||||
| import threading | import threading | ||||||
| import tkinter as tk | import tkinter as tk | ||||||
| from tkinter import filedialog, messagebox, ttk | from tkinter import filedialog, messagebox, ttk | ||||||
| from typing import Dict, Tuple, Optional | from typing import Dict, Tuple, Optional | ||||||
|  | import concurrent.futures | ||||||
| from packaging.version import parse as parse_version | from packaging.version import parse as parse_version | ||||||
| import itertools | import itertools | ||||||
|  |  | ||||||
| import networkx as nx | import networkx as nx | ||||||
| import requests | import requests | ||||||
| from PIL import Image, ImageTk, PngImagePlugin | from PIL import Image, ImageTk | ||||||
| import wdtagger as wdt | import wdtagger as wdt | ||||||
| import tomli | import tomli | ||||||
|  |  | ||||||
|  | from .ProcessingDialog import ProcessingDialog | ||||||
| from .I18N import _ | from .I18N import _ | ||||||
| from .ProgressFile import ProgressFile | from .ProgressFile import ProgressFile | ||||||
| from .TagsRepo import TagsRepo | from .TagsRepo import TagsRepo | ||||||
| from .autocomplete import TagManager | from .autocomplete import TagManager | ||||||
| from .common import get_auth_token, login, open_tag_wiki_url, open_webbrowser | from .common import get_auth_token, login, open_tag_wiki_url, open_webbrowser | ||||||
| from .settings import Settings | from .settings import Settings | ||||||
| from .tag_processing import TAG_FIXES, parse_parameters, process_tag | from .tag_processing import TAG_FIXES, extract_parameters, parse_parameters, process_tag | ||||||
| from .tagger_cache import TaggerCache | from .tagger_cache import TaggerCache | ||||||
|  |  | ||||||
|  |  | ||||||
| class ProcessingDialog: |  | ||||||
|     def __init__(self, root, target_function, *args): |  | ||||||
|         self.root = root |  | ||||||
|         self.top = tk.Toplevel(root) |  | ||||||
|         self.top.title(_("Processing...")) |  | ||||||
|         self.top.geometry("300x150") |  | ||||||
|         self.top.protocol("WM_DELETE_WINDOW", self.on_close) |  | ||||||
|  |  | ||||||
|         self.label = tk.Label(self.top, text=_("Processing, please wait...")) |  | ||||||
|         self.label.pack(pady=10) |  | ||||||
|  |  | ||||||
|         # Start with indeterminate progress bar |  | ||||||
|         self.progress = ttk.Progressbar(self.top, mode="indeterminate") |  | ||||||
|         self.progress.pack(pady=10, fill="x") |  | ||||||
|         self.progress.start(10) |  | ||||||
|  |  | ||||||
|         sig = inspect.signature(target_function) |  | ||||||
|         if "secondary_progress_queue" in sig.parameters: |  | ||||||
|             self.sub_progress = ttk.Progressbar(self.top, mode="indeterminate") |  | ||||||
|             self.sub_progress.pack(pady=10, fill="x") |  | ||||||
|             self.sub_progress.start(10) |  | ||||||
|  |  | ||||||
|         # Setup communication queue and periodic checker |  | ||||||
|         self.queue = queue.Queue() |  | ||||||
|         self.sub_queue = queue.Queue() |  | ||||||
|         self.running = True |  | ||||||
|         self.cancel_event = threading.Event()  # Cancellation flag |  | ||||||
|         self.thread = threading.Thread( |  | ||||||
|             target=self.run_task, args=(target_function, *args) |  | ||||||
|         ) |  | ||||||
|         self.thread.start() |  | ||||||
|         self.top.after(100, self.process_queue) |  | ||||||
|  |  | ||||||
|     def process_queue(self): |  | ||||||
|         """Process messages from the background thread""" |  | ||||||
|         while self.running: |  | ||||||
|             try: |  | ||||||
|                 msg = self.queue.get_nowait() |  | ||||||
|  |  | ||||||
|                 if msg[0] == "mode": |  | ||||||
|                     self.progress.config(mode=msg[1]) |  | ||||||
|                     if msg[1] == "determinate": |  | ||||||
|                         self.progress["value"] = 0 |  | ||||||
|                         self.progress.stop() |  | ||||||
|                     elif msg[1] == "indeterminate": |  | ||||||
|                         self.progress["value"] = 0 |  | ||||||
|                         self.progress.start() |  | ||||||
|                 elif msg[0] == "max": |  | ||||||
|                     self.progress["maximum"] = msg[1] |  | ||||||
|                 elif msg[0] == "progress": |  | ||||||
|                     self.progress["value"] = msg[1] |  | ||||||
|                 elif msg[0] == "label": |  | ||||||
|                     self.label.config(text=msg[1]) |  | ||||||
|  |  | ||||||
|                 self.top.update_idletasks() |  | ||||||
|             except queue.Empty: |  | ||||||
|                 break |  | ||||||
|  |  | ||||||
|             try: |  | ||||||
|                 msg = self.sub_queue.get_nowait() |  | ||||||
|  |  | ||||||
|                 if msg[0] == "mode": |  | ||||||
|                     self.sub_progress.config(mode=msg[1]) |  | ||||||
|                     if msg[1] == "determinate": |  | ||||||
|                         self.sub_progress["value"] = 0 |  | ||||||
|                         self.sub_progress.stop() |  | ||||||
|                     elif msg[1] == "indeterminate": |  | ||||||
|                         self.sub_progress["value"] = 0 |  | ||||||
|                         self.sub_progress.start() |  | ||||||
|                 elif msg[0] == "max": |  | ||||||
|                     self.sub_progress["maximum"] = msg[1] |  | ||||||
|                 elif msg[0] == "progress": |  | ||||||
|                     self.sub_progress["value"] = msg[1] |  | ||||||
|  |  | ||||||
|                 self.top.update_idletasks() |  | ||||||
|             except queue.Empty: |  | ||||||
|                 break |  | ||||||
|  |  | ||||||
|         if self.running: |  | ||||||
|             self.top.after(100, self.process_queue) |  | ||||||
|  |  | ||||||
|     def run_task(self, target_function, *args): |  | ||||||
|         """Execute target function with progress queue if supported""" |  | ||||||
|         try: |  | ||||||
|             sig = inspect.signature(target_function) |  | ||||||
|             kwargs = {} |  | ||||||
|             if "progress_queue" in sig.parameters: |  | ||||||
|                 kwargs["progress_queue"] = self.queue |  | ||||||
|             if "secondary_progress_queue" in sig.parameters: |  | ||||||
|                 kwargs["secondary_progress_queue"] = self.sub_queue |  | ||||||
|             if "cancel_event" in sig.parameters: |  | ||||||
|                 kwargs["cancel_event"] = self.cancel_event |  | ||||||
|             target_function(*args, **kwargs) |  | ||||||
|         finally: |  | ||||||
|             self.close_dialog() |  | ||||||
|  |  | ||||||
|     def close_dialog(self): |  | ||||||
|         """Safely close the dialog""" |  | ||||||
|         if self.running: |  | ||||||
|             self.running = False |  | ||||||
|             self.progress.stop() |  | ||||||
|             self.top.after(0, self.top.destroy) |  | ||||||
|         self.root.after(100, self.thread.join) |  | ||||||
|  |  | ||||||
|     def on_close(self): |  | ||||||
|         """Handle manual window closure""" |  | ||||||
|         self.running = False |  | ||||||
|         self.cancel_event.set()  # Notify target function that cancellation is requested |  | ||||||
|         self.top.destroy() |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class ImageBrowser(tk.Tk): | class ImageBrowser(tk.Tk): | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
|         super().__init__() |         super().__init__() | ||||||
|         self.title("Kapitanbooru Uploader") |         self.title("Kapitanbooru Uploader") | ||||||
|         self.geometry("900x600") |         self.geometry("900x600") | ||||||
|         self.version = "0.7.0" |         self.version = "0.8.0" | ||||||
|         self.acknowledged_version = parse_version(self.version) |         self.acknowledged_version = parse_version(self.version) | ||||||
|  |  | ||||||
|         self.settings = Settings() |         self.settings = Settings() | ||||||
| @@ -359,9 +249,7 @@ class ImageBrowser(tk.Tk): | |||||||
|         # Pobierz tagi z pliku |         # Pobierz tagi z pliku | ||||||
|         try: |         try: | ||||||
|             img = Image.open(file_path) |             img = Image.open(file_path) | ||||||
|             parameters = "" |             parameters = extract_parameters(img, file_path) | ||||||
|             if isinstance(img, PngImagePlugin.PngImageFile): |  | ||||||
|                 parameters = img.info.get("parameters", "") |  | ||||||
|             png_tags = set( |             png_tags = set( | ||||||
|                 [ |                 [ | ||||||
|                     x |                     x | ||||||
| @@ -785,27 +673,37 @@ class ImageBrowser(tk.Tk): | |||||||
|     def select_folder(self): |     def select_folder(self): | ||||||
|         """ |         """ | ||||||
|         Otwiera okno dialogowe wyboru folderu z obrazkami |         Otwiera okno dialogowe wyboru folderu z obrazkami | ||||||
|         i wczytuje pliki PNG z wybranego folderu. |         i wczytuje pliki PNG, JPEG, WebP, AVIF i GIF z wybranego folderu. | ||||||
|         """ |         """ | ||||||
|         folder = filedialog.askdirectory(title=_("Wybierz folder z obrazkami PNG")) |         folder = filedialog.askdirectory( | ||||||
|  |             title=_("Wybierz folder z obrazkami PNG, JPEG, WebP, AVIF i GIF") | ||||||
|  |         ) | ||||||
|         if folder: |         if folder: | ||||||
|             self.folder_path = folder |             self.folder_path = folder | ||||||
|             self.load_images() |             self.load_images() | ||||||
|  |  | ||||||
|     def load_images(self): |     def load_images(self): | ||||||
|         """ |         """ | ||||||
|         Ładuje pliki PNG z wybranego folderu. |         Ładuje pliki PNG, JPEG, WebP, AVIF i GIF z wybranego folderu. | ||||||
|         """ |         """ | ||||||
|         pattern = os.path.join(self.folder_path, "*.png") |         extensions = ("*.png", "*.jpg", "*.jpeg", "*.webp", "*.avif", "*.gif") | ||||||
|         self.image_files = sorted(glob.glob(pattern)) |         self.image_files = sorted( | ||||||
|  |             file | ||||||
|  |             for ext in extensions | ||||||
|  |             for file in glob.glob(os.path.join(self.folder_path, ext), recursive=True) | ||||||
|  |         ) | ||||||
|         self.total_files = len(self.image_files) |         self.total_files = len(self.image_files) | ||||||
|         self.image_files_md5 = { |         self.image_files_md5 = { | ||||||
|             file: self.compute_md5(file) for file in self.image_files |             file: md5 | ||||||
|  |             for file, md5 in zip( | ||||||
|  |                 self.image_files, self.compute_md5_parallel(self.image_files) | ||||||
|  |             ) | ||||||
|         } |         } | ||||||
|         self.tagger_processed.clear() |         self.tagger_processed.clear() | ||||||
|         for md5 in self.image_files_md5.values(): |         for md5 in self.image_files_md5.values(): | ||||||
|             if self.tagger_cache[md5]: |             if self.tagger_cache[md5]: | ||||||
|                 self.tagger_processed.add(md5) |                 self.tagger_processed.add(md5) | ||||||
|  |         # Clear the entire listbox to prepare for reloading new items | ||||||
|         self.listbox.delete(0, tk.END) |         self.listbox.delete(0, tk.END) | ||||||
|         self.uploaded.clear() |         self.uploaded.clear() | ||||||
|         self.upload_verified = 0 |         self.upload_verified = 0 | ||||||
| @@ -820,7 +718,8 @@ class ImageBrowser(tk.Tk): | |||||||
|             self.post_load_processing() |             self.post_load_processing() | ||||||
|         else: |         else: | ||||||
|             messagebox.showinfo( |             messagebox.showinfo( | ||||||
|                 _("Informacja"), _("Brak plików PNG w wybranym folderze.") |                 _("Informacja"), | ||||||
|  |                 _("Brak plików PNG, JPEG, WebP, AVIF lub GIF w wybranym folderze."), | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
|     def post_load_processing(self): |     def post_load_processing(self): | ||||||
| @@ -972,17 +871,22 @@ class ImageBrowser(tk.Tk): | |||||||
|             open_webbrowser(url, self.settings) |             open_webbrowser(url, self.settings) | ||||||
|  |  | ||||||
|     def compute_md5(self, file_path, chunk_size=8192): |     def compute_md5(self, file_path, chunk_size=8192): | ||||||
|         """Oblicza MD5 dla danego pliku.""" |         """Compute MD5 for a single file.""" | ||||||
|         hash_md5 = hashlib.md5() |         hash_md5 = hashlib.md5() | ||||||
|         try: |         try: | ||||||
|             with open(file_path, "rb") as f: |             with open(file_path, "rb") as f: | ||||||
|                 for chunk in iter(lambda: f.read(chunk_size), b""): |                 for chunk in iter(lambda: f.read(chunk_size), b""): | ||||||
|                     hash_md5.update(chunk) |                     hash_md5.update(chunk) | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             print(_("Błąd przy obliczaniu MD5:"), e) |             print(_("Error computing MD5:"), e) | ||||||
|             return "" |             return "" | ||||||
|         return hash_md5.hexdigest() |         return hash_md5.hexdigest() | ||||||
|  |  | ||||||
|  |     def compute_md5_parallel(self, file_paths): | ||||||
|  |         """Compute MD5 for multiple files in parallel.""" | ||||||
|  |         with concurrent.futures.ThreadPoolExecutor() as executor: | ||||||
|  |             return list(executor.map(self.compute_md5, file_paths)) | ||||||
|  |  | ||||||
|     def on_listbox_select(self, event): |     def on_listbox_select(self, event): | ||||||
|         """ |         """ | ||||||
|         Wywoływane po wybraniu pliku z listy. |         Wywoływane po wybraniu pliku z listy. | ||||||
| @@ -1019,9 +923,7 @@ class ImageBrowser(tk.Tk): | |||||||
|         file_path = self.image_files[index] |         file_path = self.image_files[index] | ||||||
|         try: |         try: | ||||||
|             img = Image.open(file_path) |             img = Image.open(file_path) | ||||||
|             parameters = "" |             parameters = extract_parameters(img, file_path) | ||||||
|             if isinstance(img, PngImagePlugin.PngImageFile): |  | ||||||
|                 parameters = img.info.get("parameters", "") |  | ||||||
|             self.current_image_original = img.copy() |             self.current_image_original = img.copy() | ||||||
|             self.current_parameters = parameters |             self.current_parameters = parameters | ||||||
|             self.update_display_image() |             self.update_display_image() | ||||||
|   | |||||||
							
								
								
									
										119
									
								
								kapitanbooru_uploader/ProcessingDialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								kapitanbooru_uploader/ProcessingDialog.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | |||||||
|  | from .I18N import _ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import inspect | ||||||
|  | import queue | ||||||
|  | import threading | ||||||
|  | import tkinter as tk | ||||||
|  | from tkinter import ttk | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ProcessingDialog: | ||||||
|  |     def __init__(self, root, target_function, *args): | ||||||
|  |         self.root = root | ||||||
|  |         self.top = tk.Toplevel(root) | ||||||
|  |         self.top.title(_("Processing...")) | ||||||
|  |         self.top.geometry("300x150") | ||||||
|  |         self.top.protocol("WM_DELETE_WINDOW", self.on_close) | ||||||
|  |  | ||||||
|  |         self.label = tk.Label(self.top, text=_("Processing, please wait...")) | ||||||
|  |         self.label.pack(pady=10) | ||||||
|  |  | ||||||
|  |         # Start with indeterminate progress bar | ||||||
|  |         self.progress = ttk.Progressbar(self.top, mode="indeterminate") | ||||||
|  |         self.progress.pack(pady=10, fill="x") | ||||||
|  |         self.progress.start(10) | ||||||
|  |  | ||||||
|  |         sig = inspect.signature(target_function) | ||||||
|  |         if "secondary_progress_queue" in sig.parameters: | ||||||
|  |             self.sub_progress = ttk.Progressbar(self.top, mode="indeterminate") | ||||||
|  |             self.sub_progress.pack(pady=10, fill="x") | ||||||
|  |             self.sub_progress.start(10) | ||||||
|  |  | ||||||
|  |         # Setup communication queue and periodic checker | ||||||
|  |         self.queue = queue.Queue() | ||||||
|  |         self.sub_queue = queue.Queue() | ||||||
|  |         self.running = True | ||||||
|  |         self.cancel_event = threading.Event()  # Cancellation flag | ||||||
|  |         self.thread = threading.Thread( | ||||||
|  |             target=self.run_task, args=(target_function, *args) | ||||||
|  |         ) | ||||||
|  |         self.thread.start() | ||||||
|  |         self.top.after(100, self.process_queue) | ||||||
|  |  | ||||||
|  |     def process_queue(self): | ||||||
|  |         """Process messages from the background thread""" | ||||||
|  |         while self.running: | ||||||
|  |             try: | ||||||
|  |                 msg = self.queue.get_nowait() | ||||||
|  |  | ||||||
|  |                 if msg[0] == "mode": | ||||||
|  |                     self.progress.config(mode=msg[1]) | ||||||
|  |                     if msg[1] == "determinate": | ||||||
|  |                         self.progress["value"] = 0 | ||||||
|  |                         self.progress.stop() | ||||||
|  |                     elif msg[1] == "indeterminate": | ||||||
|  |                         self.progress["value"] = 0 | ||||||
|  |                         self.progress.start() | ||||||
|  |                 elif msg[0] == "max": | ||||||
|  |                     self.progress["maximum"] = msg[1] | ||||||
|  |                 elif msg[0] == "progress": | ||||||
|  |                     self.progress["value"] = msg[1] | ||||||
|  |                 elif msg[0] == "label": | ||||||
|  |                     self.label.config(text=msg[1]) | ||||||
|  |  | ||||||
|  |                 self.top.update_idletasks() | ||||||
|  |             except queue.Empty: | ||||||
|  |                 break | ||||||
|  |  | ||||||
|  |             try: | ||||||
|  |                 msg = self.sub_queue.get_nowait() | ||||||
|  |  | ||||||
|  |                 if msg[0] == "mode": | ||||||
|  |                     self.sub_progress.config(mode=msg[1]) | ||||||
|  |                     if msg[1] == "determinate": | ||||||
|  |                         self.sub_progress["value"] = 0 | ||||||
|  |                         self.sub_progress.stop() | ||||||
|  |                     elif msg[1] == "indeterminate": | ||||||
|  |                         self.sub_progress["value"] = 0 | ||||||
|  |                         self.sub_progress.start() | ||||||
|  |                 elif msg[0] == "max": | ||||||
|  |                     self.sub_progress["maximum"] = msg[1] | ||||||
|  |                 elif msg[0] == "progress": | ||||||
|  |                     self.sub_progress["value"] = msg[1] | ||||||
|  |  | ||||||
|  |                 self.top.update_idletasks() | ||||||
|  |             except queue.Empty: | ||||||
|  |                 break | ||||||
|  |  | ||||||
|  |         if self.running: | ||||||
|  |             self.top.after(100, self.process_queue) | ||||||
|  |  | ||||||
|  |     def run_task(self, target_function, *args): | ||||||
|  |         """Execute target function with progress queue if supported""" | ||||||
|  |         try: | ||||||
|  |             sig = inspect.signature(target_function) | ||||||
|  |             kwargs = {} | ||||||
|  |             if "progress_queue" in sig.parameters: | ||||||
|  |                 kwargs["progress_queue"] = self.queue | ||||||
|  |             if "secondary_progress_queue" in sig.parameters: | ||||||
|  |                 kwargs["secondary_progress_queue"] = self.sub_queue | ||||||
|  |             if "cancel_event" in sig.parameters: | ||||||
|  |                 kwargs["cancel_event"] = self.cancel_event | ||||||
|  |             target_function(*args, **kwargs) | ||||||
|  |         finally: | ||||||
|  |             self.close_dialog() | ||||||
|  |  | ||||||
|  |     def close_dialog(self): | ||||||
|  |         """Safely close the dialog""" | ||||||
|  |         if self.running: | ||||||
|  |             self.running = False | ||||||
|  |             self.progress.stop() | ||||||
|  |             self.top.after(0, self.top.destroy) | ||||||
|  |         self.root.after(100, self.thread.join) | ||||||
|  |  | ||||||
|  |     def on_close(self): | ||||||
|  |         """Handle manual window closure""" | ||||||
|  |         self.running = False | ||||||
|  |         self.cancel_event.set()  # Notify target function that cancellation is requested | ||||||
|  |         self.top.destroy() | ||||||
| @@ -1,8 +1,8 @@ | |||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: Kapitanbooru Uploader 0.7.0\n" | "Project-Id-Version: Kapitanbooru Uploader 0.8.0\n" | ||||||
| "Report-Msgid-Bugs-To: kapitan@mlesniak.pl\n" | "Report-Msgid-Bugs-To: kapitan@mlesniak.pl\n" | ||||||
| "POT-Creation-Date: 2025-03-16 01:22+0100\n" | "POT-Creation-Date: 2025-03-27 20:47+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" | ||||||
|  |  | ||||||
| @@ -43,34 +43,26 @@ msgstr "Found auth_token:" | |||||||
| msgid "auth_token not found in the HTML page." | msgid "auth_token not found in the HTML page." | ||||||
| msgstr "auth_token not found in the HTML page." | msgstr "auth_token not found in the HTML page." | ||||||
|  |  | ||||||
| #: ImageBrowser.py:33 | #: ImageBrowser.py:138 | ||||||
| msgid "Processing..." |  | ||||||
| msgstr "Processing..." |  | ||||||
|  |  | ||||||
| #: ImageBrowser.py:37 |  | ||||||
| msgid "Processing, please wait..." |  | ||||||
| msgstr "Processing, please wait..." |  | ||||||
|  |  | ||||||
| #: 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:250 | #: ImageBrowser.py:140 | ||||||
| #, 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:253 | #: ImageBrowser.py:143 | ||||||
| #, 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:260 | #: ImageBrowser.py:150 | ||||||
| msgid "Update Available" | msgid "Update Available" | ||||||
| msgstr "Update Available" | msgstr "Update Available" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:262 | #: ImageBrowser.py:152 | ||||||
| #, 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 +75,241 @@ msgstr "" | |||||||
| "\n" | "\n" | ||||||
| "Update using: {update_command}" | "Update using: {update_command}" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:375 | #: ImageBrowser.py:263 | ||||||
| msgid "Błąd przy otwieraniu pliku" | msgid "Błąd przy otwieraniu pliku" | ||||||
| msgstr "Error opening file" | msgstr "Error opening file" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:417 | #: ImageBrowser.py:305 | ||||||
| msgid "Tagger przetworzył:" | msgid "Tagger przetworzył:" | ||||||
| msgstr "Tagger processed:" | msgstr "Tagger processed:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:420 | #: ImageBrowser.py:308 | ||||||
| msgid "Błąd Taggera dla" | msgid "Błąd Taggera dla" | ||||||
| msgstr "Tagger error for" | msgstr "Tagger error for" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:446 | #: ImageBrowser.py:334 | ||||||
| msgid "Otwórz folder" | msgid "Otwórz folder" | ||||||
| msgstr "Open folder" | msgstr "Open folder" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:449 ImageBrowser.py:738 ImageBrowser.py:954 | #: ImageBrowser.py:337 ImageBrowser.py:626 ImageBrowser.py:853 | ||||||
| #: ImageBrowser.py:962 | #: ImageBrowser.py:861 | ||||||
| msgid "Wyślij" | msgid "Wyślij" | ||||||
| msgstr "Send" | msgstr "Send" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:452 ImageBrowser.py:947 | #: ImageBrowser.py:340 ImageBrowser.py:846 | ||||||
| msgid "Wyślij wszystko" | msgid "Wyślij wszystko" | ||||||
| msgstr "Send all" | msgstr "Send all" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:456 ImageBrowser.py:948 ImageBrowser.py:954 | #: ImageBrowser.py:344 ImageBrowser.py:847 ImageBrowser.py:853 | ||||||
| msgid "Podmień tagi" | msgid "Podmień tagi" | ||||||
| msgstr "Replace tags" | msgstr "Replace tags" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:459 ImageBrowser.py:949 | #: ImageBrowser.py:347 ImageBrowser.py:848 | ||||||
| msgid "Otwórz post" | msgid "Otwórz post" | ||||||
| msgstr "Open post" | msgstr "Open post" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:462 | #: ImageBrowser.py:350 | ||||||
| msgid "Zakończ" | msgid "Zakończ" | ||||||
| msgstr "Finish" | msgstr "Finish" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:464 | #: ImageBrowser.py:352 | ||||||
| msgid "Plik" | msgid "Plik" | ||||||
| msgstr "File" | msgstr "File" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:468 ImageBrowser.py:567 | #: ImageBrowser.py:356 ImageBrowser.py:455 | ||||||
| msgid "Ustawienia" | msgid "Ustawienia" | ||||||
| msgstr "Settings" | msgstr "Settings" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:471 | #: ImageBrowser.py:359 | ||||||
| msgid "Wyczyść cache Taggera" | msgid "Wyczyść cache Taggera" | ||||||
| msgstr "Clear Tagger cache" | msgstr "Clear Tagger cache" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:474 | #: ImageBrowser.py:362 | ||||||
| msgid "Zregeneruj bazę tagów" | msgid "Zregeneruj bazę tagów" | ||||||
| msgstr "Regenerate tag database" | msgstr "Regenerate tag database" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:476 | #: ImageBrowser.py:364 | ||||||
| msgid "Opcje" | msgid "Opcje" | ||||||
| msgstr "Options" | msgstr "Options" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:479 | #: ImageBrowser.py:367 | ||||||
| msgid "About" | msgid "About" | ||||||
| msgstr "About" | msgstr "About" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:480 | #: ImageBrowser.py:368 | ||||||
| msgid "Help" | msgid "Help" | ||||||
| msgstr "Help" | msgstr "Help" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:485 | #: ImageBrowser.py:373 | ||||||
| msgid "About Kapitanbooru Uploader" | msgid "About Kapitanbooru Uploader" | ||||||
| msgstr "About Kapitanbooru Uploader" | msgstr "About Kapitanbooru Uploader" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:502 | #: ImageBrowser.py:390 | ||||||
| #, 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:509 | #: ImageBrowser.py:397 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Current version: {version}" | msgid "Current version: {version}" | ||||||
| msgstr "Current version: {version}" | msgstr "Current version: {version}" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:511 | #: ImageBrowser.py:399 | ||||||
| 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:512 | #: ImageBrowser.py:400 | ||||||
| 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:513 | #: ImageBrowser.py:401 | ||||||
| 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:515 | #: ImageBrowser.py:403 | ||||||
| msgid "Authors:" | msgid "Authors:" | ||||||
| msgstr "Authors:" | msgstr "Authors:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:518 | #: ImageBrowser.py:406 | ||||||
| msgid "License: MIT License" | msgid "License: MIT License" | ||||||
| msgstr "License: MIT License" | msgstr "License: MIT License" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:531 | #: ImageBrowser.py:419 | ||||||
| msgid "Repository:" | msgid "Repository:" | ||||||
| msgstr "Repository:" | msgstr "Repository:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:540 | #: ImageBrowser.py:428 | ||||||
| msgid "Website:" | msgid "Website:" | ||||||
| msgstr "Website:" | msgstr "Website:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:551 | #: ImageBrowser.py:439 | ||||||
| msgid "Close" | msgid "Close" | ||||||
| msgstr "Close" | msgstr "Close" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:559 ImageBrowser.py:562 | #: ImageBrowser.py:447 ImageBrowser.py:450 | ||||||
| msgid "Cache" | msgid "Cache" | ||||||
| msgstr "Cache" | msgstr "Cache" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:559 | #: ImageBrowser.py:447 | ||||||
| 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:562 | #: ImageBrowser.py:450 | ||||||
| msgid "Błąd przy czyszczeniu cache:" | msgid "Błąd przy czyszczeniu cache:" | ||||||
| msgstr "Error clearing cache:" | msgstr "Error clearing cache:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:572 | #: ImageBrowser.py:460 | ||||||
| msgid "Login:" | msgid "Login:" | ||||||
| msgstr "Login:" | msgstr "Login:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:578 | #: ImageBrowser.py:466 | ||||||
| msgid "Hasło:" | msgid "Hasło:" | ||||||
| msgstr "Password:" | msgstr "Password:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:584 | #: ImageBrowser.py:472 | ||||||
| msgid "Base URL:" | msgid "Base URL:" | ||||||
| msgstr "Base URL:" | msgstr "Base URL:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:590 | #: ImageBrowser.py:478 | ||||||
| msgid "Default Tags:" | msgid "Default Tags:" | ||||||
| msgstr "Default Tags:" | msgstr "Default Tags:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:596 | #: ImageBrowser.py:484 | ||||||
| msgid "Browser:" | msgid "Browser:" | ||||||
| msgstr "Browser:" | msgstr "Browser:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:610 | #: ImageBrowser.py:498 | ||||||
| msgid "Language:" | msgid "Language:" | ||||||
| msgstr "Language:" | msgstr "Language:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:642 | #: ImageBrowser.py:530 | ||||||
| msgid "Zapisz" | msgid "Zapisz" | ||||||
| msgstr "Save" | msgstr "Save" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:684 | #: ImageBrowser.py:572 | ||||||
| msgid "PNG Tags" | msgid "PNG Tags" | ||||||
| msgstr "PNG Tags" | msgstr "PNG Tags" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:696 | #: ImageBrowser.py:584 | ||||||
| msgid "Tagger Tags" | msgid "Tagger Tags" | ||||||
| msgstr "Tagger Tags" | msgstr "Tagger Tags" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:710 | #: ImageBrowser.py:598 | ||||||
| msgid "Manual Tags" | msgid "Manual Tags" | ||||||
| msgstr "Manual Tags" | msgstr "Manual Tags" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:718 | #: ImageBrowser.py:606 | ||||||
| msgid "Final Tags" | msgid "Final Tags" | ||||||
| msgstr "Final Tags" | msgstr "Final Tags" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:743 | #: ImageBrowser.py:631 | ||||||
| msgid "Wyświetl" | msgid "Wyświetl" | ||||||
| msgstr "Display" | msgstr "Display" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:760 | #: ImageBrowser.py:648 | ||||||
| msgid "Przetworzono tagi:" | msgid "Przetworzono tagi:" | ||||||
| msgstr "Processed tags:" | msgstr "Processed tags:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:760 ImageBrowser.py:761 ImageBrowser.py:762 | #: ImageBrowser.py:648 ImageBrowser.py:649 ImageBrowser.py:650 | ||||||
| msgid "plików" | msgid "plików" | ||||||
| msgstr "files" | msgstr "files" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:761 | #: ImageBrowser.py:649 | ||||||
| msgid "Zweryfikowano status uploadu:" | msgid "Zweryfikowano status uploadu:" | ||||||
| msgstr "Upload status verified:" | msgstr "Upload status verified:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:762 | #: ImageBrowser.py:650 | ||||||
| msgid "Zuploadowano:" | msgid "Zuploadowano:" | ||||||
| msgstr "Uploaded:" | msgstr "Uploaded:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:790 | #: ImageBrowser.py:679 | ||||||
| msgid "Wybierz folder z obrazkami PNG" | msgid "Wybierz folder z obrazkami PNG, JPEG, WebP, AVIF i GIF" | ||||||
| msgstr "Select folder with PNG images" | msgstr "Select folder with PNG, JPEG, WebP, AVIF, and GIF images" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:823 | #: ImageBrowser.py:721 | ||||||
| msgid "Informacja" | msgid "Informacja" | ||||||
| msgstr "Information" | msgstr "Information" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:823 | #: ImageBrowser.py:722 | ||||||
| msgid "Brak plików PNG w wybranym folderze." | #, fuzzy | ||||||
|  | msgid "Brak plików PNG, JPEG, WebP, AVIF lub GIF w wybranym folderze." | ||||||
| msgstr "No PNG files in the selected folder." | msgstr "No PNG files in the selected folder." | ||||||
|  |  | ||||||
| #: ImageBrowser.py:906 | #: ImageBrowser.py:805 | ||||||
| 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:982 | #: ImageBrowser.py:881 | ||||||
| msgid "Błąd przy obliczaniu MD5:" | #: ImageBrowser.py:881 | ||||||
| msgstr "Error calculating MD5:" | msgid "Error computing MD5:" | ||||||
|  | msgstr "Error computing MD5:" | ||||||
| #: ImageBrowser.py:1038 | #: ImageBrowser.py:940 | ||||||
| msgid "Błąd" | msgid "Błąd" | ||||||
| msgstr "Error" | msgstr "Error" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1038 | #: ImageBrowser.py:940 | ||||||
| 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:1248 ImageBrowser.py:1258 | #: ImageBrowser.py:1150 ImageBrowser.py:1160 | ||||||
| #, 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:1488 | #: ImageBrowser.py:1390 | ||||||
| msgid "Tagger przetwarza..." | msgid "Tagger przetwarza..." | ||||||
| msgstr "Tagger processing..." | msgstr "Tagger processing..." | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1513 | #: ImageBrowser.py:1415 | ||||||
| #, 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:1554 | #: ImageBrowser.py:1456 | ||||||
| msgid "Wysyłanie zakończone powodzeniem!" | msgid "Wysyłanie zakończone powodzeniem!" | ||||||
| msgstr "Upload completed successfully!" | msgstr "Upload completed successfully!" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1558 ImageBrowser.py:1567 | #: ImageBrowser.py:1460 ImageBrowser.py:1469 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "" | msgid "" | ||||||
| "Wysyłanie zakończone błędem.\n" | "Wysyłanie zakończone błędem.\n" | ||||||
| @@ -327,40 +320,40 @@ msgstr "" | |||||||
| "Status: {status_code}\n" | "Status: {status_code}\n" | ||||||
| "Content: {text}" | "Content: {text}" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1573 ImageBrowser.py:1576 | #: ImageBrowser.py:1475 ImageBrowser.py:1478 | ||||||
| msgid "Wysyłanie" | msgid "Wysyłanie" | ||||||
| msgstr "Uploading" | msgstr "Uploading" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1589 | #: ImageBrowser.py:1491 | ||||||
| msgid "Błąd wysyłania" | msgid "Błąd wysyłania" | ||||||
| msgstr "Upload error" | msgstr "Upload error" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1609 | #: ImageBrowser.py:1511 | ||||||
| msgid "Błąd edycji" | msgid "Błąd edycji" | ||||||
| msgstr "Edit error" | msgstr "Edit error" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1609 | #: ImageBrowser.py:1511 | ||||||
| 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:1619 | #: ImageBrowser.py:1521 | ||||||
| #, 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:1629 ImageBrowser.py:1639 ImageBrowser.py:1670 | #: ImageBrowser.py:1531 ImageBrowser.py:1541 ImageBrowser.py:1572 | ||||||
| msgid "Operacja anulowana" | msgid "Operacja anulowana" | ||||||
| msgstr "Operation cancelled" | msgstr "Operation cancelled" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1680 | #: ImageBrowser.py:1582 | ||||||
| msgid "Tagi zostały zaktualizowane!" | msgid "Tagi zostały zaktualizowane!" | ||||||
| msgstr "Tags have been updated!" | msgstr "Tags have been updated!" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1682 | #: ImageBrowser.py:1584 | ||||||
| msgid "Sukces edycji" | msgid "Sukces edycji" | ||||||
| msgstr "Edit successful" | msgstr "Edit successful" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1688 | #: ImageBrowser.py:1590 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "" | msgid "" | ||||||
| "Błąd podczas aktualizacji tagów\n" | "Błąd podczas aktualizacji tagów\n" | ||||||
| @@ -369,19 +362,19 @@ msgstr "" | |||||||
| "Error updating tags\n" | "Error updating tags\n" | ||||||
| "Status: {code}" | "Status: {code}" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1692 | #: ImageBrowser.py:1594 | ||||||
| msgid "Treść:" | msgid "Treść:" | ||||||
| msgstr "Content:" | msgstr "Content:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1696 | #: ImageBrowser.py:1598 | ||||||
| msgid "Krytyczny błąd edycji" | msgid "Krytyczny błąd edycji" | ||||||
| msgstr "Critical edit error" | msgstr "Critical edit error" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1708 | #: ImageBrowser.py:1610 | ||||||
| msgid "Potwierdzenie" | msgid "Potwierdzenie" | ||||||
| msgstr "Confirmation" | msgstr "Confirmation" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1710 | #: ImageBrowser.py:1612 | ||||||
| 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,21 +384,29 @@ 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:1734 | #: ImageBrowser.py:1636 | ||||||
| msgid "Anulowano operację!" | msgid "Anulowano operację!" | ||||||
| msgstr "Operation cancelled!" | msgstr "Operation cancelled!" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1742 | #: ImageBrowser.py:1644 | ||||||
| #, 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:1758 | #: ImageBrowser.py:1660 | ||||||
| msgid "Przesłano pliki!" | msgid "Przesłano pliki!" | ||||||
| msgstr "Files have been uploaded!" | msgstr "Files have been uploaded!" | ||||||
|  |  | ||||||
|  | #: ProcessingDialog.py:15 | ||||||
|  | msgid "Processing..." | ||||||
|  | msgstr "Processing..." | ||||||
|  |  | ||||||
|  | #: ProcessingDialog.py:19 | ||||||
|  | msgid "Processing, please wait..." | ||||||
|  | msgstr "Processing, please wait..." | ||||||
|  |  | ||||||
| #: ProgressFile.py:16 | #: ProgressFile.py:16 | ||||||
| msgid "Upload cancelled by user." | msgid "Upload cancelled by user." | ||||||
| msgstr "Upload cancelled by user." | msgstr "Upload cancelled by user." | ||||||
| @@ -426,15 +427,19 @@ 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:48 | #: tag_processing.py:49 | ||||||
| msgid "Błąd przy pobieraniu tagów artystów:" | msgid "Błąd przy pobieraniu tagów artystów:" | ||||||
| msgstr "Error fetching artist tags:" | msgstr "Error fetching artist tags:" | ||||||
|  |  | ||||||
| #: tag_processing.py:200 | #: tag_processing.py:164 | ||||||
|  | #: tag_processing.py:164 | ||||||
|  | msgid "Nie można sparsować parametrów." | ||||||
|  | msgstr "Unable to parse parameters." | ||||||
|  | #: tag_processing.py:249 | ||||||
| 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:216 | #: tag_processing.py:265 | ||||||
| msgid "Błąd podczas odczytu tags:" | msgid "Błąd podczas odczytu tags:" | ||||||
| msgstr "Error reading tags:" | msgstr "Error reading tags:" | ||||||
|  |  | ||||||
| @@ -490,52 +495,55 @@ msgstr "Tag processing cancelled." | |||||||
| msgid "Pobrano {count} tagów..." | msgid "Pobrano {count} tagów..." | ||||||
| msgstr "Fetched {count} tags..." | msgstr "Fetched {count} tags..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:271 | #: TagsRepo.py:301 | ||||||
| msgid "Anulowano pobieranie aliasów tagów." | msgid "Anulowano pobieranie aliasów tagów." | ||||||
| msgstr "Tag alias fetching cancelled." | msgstr "Tag alias fetching cancelled." | ||||||
|  |  | ||||||
| #: TagsRepo.py:280 | #: TagsRepo.py:310 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Pobieranie aliasów tagów (od ID {last_id})..." | msgid "Pobieranie aliasów tagów (od ID {last_id})..." | ||||||
| msgstr "Fetching tag aliases (from ID {last_id})..." | msgstr "Fetching tag aliases (from ID {last_id})..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:297 | #: TagsRepo.py:327 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Błąd przy pobieraniu aliasów tagów od ID {last_id}: HTTP {code}" | msgid "Błąd przy pobieraniu aliasów tagów od ID {last_id}: HTTP {code}" | ||||||
| msgstr "Error fetching tag aliases from ID {last_id}: HTTP {code}" | msgstr "Error fetching tag aliases from ID {last_id}: HTTP {code}" | ||||||
|  |  | ||||||
| #: TagsRepo.py:312 | #: TagsRepo.py:342 | ||||||
| msgid "Anulowano przetwarzanie aliasów tagów." | msgid "Anulowano przetwarzanie aliasów tagów." | ||||||
| msgstr "Tag alias processing cancelled." | msgstr "Tag alias processing cancelled." | ||||||
|  |  | ||||||
| #: TagsRepo.py:334 | #: TagsRepo.py:364 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Pobrano {count} aliasów tagów..." | msgid "Pobrano {count} aliasów tagów..." | ||||||
| msgstr "Fetched {count} tag aliases..." | msgstr "Fetched {count} tag aliases..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:375 | #: TagsRepo.py:405 | ||||||
| msgid "Anulowano pobieranie implikacji tagów." | msgid "Anulowano pobieranie implikacji tagów." | ||||||
| msgstr "Tag implication fetching cancelled." | msgstr "Tag implication fetching cancelled." | ||||||
|  |  | ||||||
| #: TagsRepo.py:384 | #: TagsRepo.py:414 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Pobieranie implikacji tagów (od ID {last_id})..." | msgid "Pobieranie implikacji tagów (od ID {last_id})..." | ||||||
| msgstr "Fetching tag implications (from ID {last_id})..." | msgstr "Fetching tag implications (from ID {last_id})..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:398 | #: TagsRepo.py:428 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Błąd przy pobieraniu implikacji tagów od ID {last_id}: HTTP {code}" | msgid "Błąd przy pobieraniu implikacji tagów od ID {last_id}: HTTP {code}" | ||||||
| msgstr "Error fetching tag implications from ID {last_id}: HTTP {code}" | msgstr "Error fetching tag implications from ID {last_id}: HTTP {code}" | ||||||
|  |  | ||||||
| #: TagsRepo.py:413 | #: TagsRepo.py:443 | ||||||
| msgid "Anulowano przetwarzanie implikacji tagów." | msgid "Anulowano przetwarzanie implikacji tagów." | ||||||
| msgstr "Tag implication processing cancelled." | msgstr "Tag implication processing cancelled." | ||||||
|  |  | ||||||
| #: TagsRepo.py:460 | #: TagsRepo.py:490 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Pobrano implikacje dla {count} tagów..." | msgid "Pobrano implikacje dla {count} tagów..." | ||||||
| msgstr "Fetched implications for {count} tags..." | msgstr "Fetched implications for {count} tags..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:487 | #: TagsRepo.py:517 | ||||||
| msgid "Regeneracja bazy zakończona." | msgid "Regeneracja bazy zakończona." | ||||||
| msgstr "Database regeneration complete." | msgstr "Database regeneration complete." | ||||||
|  |  | ||||||
|  | #~ msgid "Błąd przy obliczaniu MD5:" | ||||||
|  | #~ msgstr "Error calculating MD5:" | ||||||
| @@ -1,8 +1,8 @@ | |||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: Kapitanbooru Uploader 0.7.0\n" | "Project-Id-Version: Kapitanbooru Uploader 0.8.0\n" | ||||||
| "Report-Msgid-Bugs-To: kapitan@mlesniak.pl\n" | "Report-Msgid-Bugs-To: kapitan@mlesniak.pl\n" | ||||||
| "POT-Creation-Date: 2025-03-16 01:22+0100\n" | "POT-Creation-Date: 2025-03-27 20:47+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" | ||||||
| @@ -45,34 +45,26 @@ msgstr "Znaleziono auth_token:" | |||||||
| msgid "auth_token not found in the HTML page." | msgid "auth_token not found in the HTML page." | ||||||
| msgstr "Nie znaleziono auth_token w stronie HTML." | msgstr "Nie znaleziono auth_token w stronie HTML." | ||||||
|  |  | ||||||
| #: ImageBrowser.py:33 | #: ImageBrowser.py:138 | ||||||
| msgid "Processing..." |  | ||||||
| msgstr "Przetwarzanie..." |  | ||||||
|  |  | ||||||
| #: ImageBrowser.py:37 |  | ||||||
| msgid "Processing, please wait..." |  | ||||||
| msgstr "Przetwarzanie, proszę czekać..." |  | ||||||
|  |  | ||||||
| #: 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:250 | #: ImageBrowser.py:140 | ||||||
| #, 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:253 | #: ImageBrowser.py:143 | ||||||
| #, 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:260 | #: ImageBrowser.py:150 | ||||||
| msgid "Update Available" | msgid "Update Available" | ||||||
| msgstr "Aktualizacja dostępna" | msgstr "Aktualizacja dostępna" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:262 | #: ImageBrowser.py:152 | ||||||
| #, 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 +77,242 @@ msgstr "" | |||||||
| "\n" | "\n" | ||||||
| "Aktualizuj za pomocą: {update_command}" | "Aktualizuj za pomocą: {update_command}" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:375 | #: ImageBrowser.py:263 | ||||||
| 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:417 | #: ImageBrowser.py:305 | ||||||
| msgid "Tagger przetworzył:" | msgid "Tagger przetworzył:" | ||||||
| msgstr "Tagger przetworzył:" | msgstr "Tagger przetworzył:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:420 | #: ImageBrowser.py:308 | ||||||
| msgid "Błąd Taggera dla" | msgid "Błąd Taggera dla" | ||||||
| msgstr "Błąd Taggera dla" | msgstr "Błąd Taggera dla" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:446 | #: ImageBrowser.py:334 | ||||||
| msgid "Otwórz folder" | msgid "Otwórz folder" | ||||||
| msgstr "Otwórz folder" | msgstr "Otwórz folder" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:449 ImageBrowser.py:738 ImageBrowser.py:954 | #: ImageBrowser.py:337 ImageBrowser.py:626 ImageBrowser.py:853 | ||||||
| #: ImageBrowser.py:962 | #: ImageBrowser.py:861 | ||||||
| msgid "Wyślij" | msgid "Wyślij" | ||||||
| msgstr "Wyślij" | msgstr "Wyślij" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:452 ImageBrowser.py:947 | #: ImageBrowser.py:340 ImageBrowser.py:846 | ||||||
| msgid "Wyślij wszystko" | msgid "Wyślij wszystko" | ||||||
| msgstr "Wyślij wszystko" | msgstr "Wyślij wszystko" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:456 ImageBrowser.py:948 ImageBrowser.py:954 | #: ImageBrowser.py:344 ImageBrowser.py:847 ImageBrowser.py:853 | ||||||
| msgid "Podmień tagi" | msgid "Podmień tagi" | ||||||
| msgstr "Podmień tagi" | msgstr "Podmień tagi" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:459 ImageBrowser.py:949 | #: ImageBrowser.py:347 ImageBrowser.py:848 | ||||||
| msgid "Otwórz post" | msgid "Otwórz post" | ||||||
| msgstr "Otwórz post" | msgstr "Otwórz post" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:462 | #: ImageBrowser.py:350 | ||||||
| msgid "Zakończ" | msgid "Zakończ" | ||||||
| msgstr "Zakończ" | msgstr "Zakończ" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:464 | #: ImageBrowser.py:352 | ||||||
| msgid "Plik" | msgid "Plik" | ||||||
| msgstr "Plik" | msgstr "Plik" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:468 ImageBrowser.py:567 | #: ImageBrowser.py:356 ImageBrowser.py:455 | ||||||
| msgid "Ustawienia" | msgid "Ustawienia" | ||||||
| msgstr "Ustawienia" | msgstr "Ustawienia" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:471 | #: ImageBrowser.py:359 | ||||||
| msgid "Wyczyść cache Taggera" | msgid "Wyczyść cache Taggera" | ||||||
| msgstr "Wyczyść cache Taggera" | msgstr "Wyczyść cache Taggera" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:474 | #: ImageBrowser.py:362 | ||||||
| msgid "Zregeneruj bazę tagów" | msgid "Zregeneruj bazę tagów" | ||||||
| msgstr "Zregeneruj bazę tagów" | msgstr "Zregeneruj bazę tagów" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:476 | #: ImageBrowser.py:364 | ||||||
| msgid "Opcje" | msgid "Opcje" | ||||||
| msgstr "Opcje" | msgstr "Opcje" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:479 | #: ImageBrowser.py:367 | ||||||
| msgid "About" | msgid "About" | ||||||
| msgstr "O programie" | msgstr "O programie" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:480 | #: ImageBrowser.py:368 | ||||||
| msgid "Help" | msgid "Help" | ||||||
| msgstr "Pomoc" | msgstr "Pomoc" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:485 | #: ImageBrowser.py:373 | ||||||
| msgid "About Kapitanbooru Uploader" | msgid "About Kapitanbooru Uploader" | ||||||
| msgstr "O programie Kapitanbooru Uploader" | msgstr "O programie Kapitanbooru Uploader" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:502 | #: ImageBrowser.py:390 | ||||||
| #, 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:509 | #: ImageBrowser.py:397 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Current version: {version}" | msgid "Current version: {version}" | ||||||
| msgstr "Obecna wersja: {version}" | msgstr "Obecna wersja: {version}" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:511 | #: ImageBrowser.py:399 | ||||||
| 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:512 | #: ImageBrowser.py:400 | ||||||
| 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:513 | #: ImageBrowser.py:401 | ||||||
| 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:515 | #: ImageBrowser.py:403 | ||||||
| msgid "Authors:" | msgid "Authors:" | ||||||
| msgstr "Autorzy:" | msgstr "Autorzy:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:518 | #: ImageBrowser.py:406 | ||||||
| msgid "License: MIT License" | msgid "License: MIT License" | ||||||
| msgstr "Licencja: MIT License" | msgstr "Licencja: MIT License" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:531 | #: ImageBrowser.py:419 | ||||||
| msgid "Repository:" | msgid "Repository:" | ||||||
| msgstr "Repozytorium:" | msgstr "Repozytorium:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:540 | #: ImageBrowser.py:428 | ||||||
| msgid "Website:" | msgid "Website:" | ||||||
| msgstr "Strona internetowa:" | msgstr "Strona internetowa:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:551 | #: ImageBrowser.py:439 | ||||||
| msgid "Close" | msgid "Close" | ||||||
| msgstr "Zamknij" | msgstr "Zamknij" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:559 ImageBrowser.py:562 | #: ImageBrowser.py:447 ImageBrowser.py:450 | ||||||
| msgid "Cache" | msgid "Cache" | ||||||
| msgstr "Cache" | msgstr "Cache" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:559 | #: ImageBrowser.py:447 | ||||||
| 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:562 | #: ImageBrowser.py:450 | ||||||
| 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:572 | #: ImageBrowser.py:460 | ||||||
| msgid "Login:" | msgid "Login:" | ||||||
| msgstr "Login:" | msgstr "Login:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:578 | #: ImageBrowser.py:466 | ||||||
| msgid "Hasło:" | msgid "Hasło:" | ||||||
| msgstr "Hasło:" | msgstr "Hasło:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:584 | #: ImageBrowser.py:472 | ||||||
| msgid "Base URL:" | msgid "Base URL:" | ||||||
| msgstr "Base URL:" | msgstr "Base URL:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:590 | #: ImageBrowser.py:478 | ||||||
| msgid "Default Tags:" | msgid "Default Tags:" | ||||||
| msgstr "Domyślne tagi:" | msgstr "Domyślne tagi:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:596 | #: ImageBrowser.py:484 | ||||||
| msgid "Browser:" | msgid "Browser:" | ||||||
| msgstr "Przeglądarka:" | msgstr "Przeglądarka:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:610 | #: ImageBrowser.py:498 | ||||||
| msgid "Language:" | msgid "Language:" | ||||||
| msgstr "Język:" | msgstr "Język:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:642 | #: ImageBrowser.py:530 | ||||||
| msgid "Zapisz" | msgid "Zapisz" | ||||||
| msgstr "Zapisz" | msgstr "Zapisz" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:684 | #: ImageBrowser.py:572 | ||||||
| msgid "PNG Tags" | msgid "PNG Tags" | ||||||
| msgstr "Tagi PNG" | msgstr "Tagi PNG" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:696 | #: ImageBrowser.py:584 | ||||||
| msgid "Tagger Tags" | msgid "Tagger Tags" | ||||||
| msgstr "Tagi Taggera" | msgstr "Tagi Taggera" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:710 | #: ImageBrowser.py:598 | ||||||
| msgid "Manual Tags" | msgid "Manual Tags" | ||||||
| msgstr "Tagi ręczne" | msgstr "Tagi ręczne" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:718 | #: ImageBrowser.py:606 | ||||||
| msgid "Final Tags" | msgid "Final Tags" | ||||||
| msgstr "Ostateczne tagi" | msgstr "Ostateczne tagi" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:743 | #: ImageBrowser.py:631 | ||||||
| msgid "Wyświetl" | msgid "Wyświetl" | ||||||
| msgstr "Wyświetl" | msgstr "Wyświetl" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:760 | #: ImageBrowser.py:648 | ||||||
| msgid "Przetworzono tagi:" | msgid "Przetworzono tagi:" | ||||||
| msgstr "Przetworzono tagi:" | msgstr "Przetworzono tagi:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:760 ImageBrowser.py:761 ImageBrowser.py:762 | #: ImageBrowser.py:648 ImageBrowser.py:649 ImageBrowser.py:650 | ||||||
| msgid "plików" | msgid "plików" | ||||||
| msgstr "plików" | msgstr "plików" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:761 | #: ImageBrowser.py:649 | ||||||
| msgid "Zweryfikowano status uploadu:" | msgid "Zweryfikowano status uploadu:" | ||||||
| msgstr "Zweryfikowano status uploadu:" | msgstr "Zweryfikowano status uploadu:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:762 | #: ImageBrowser.py:650 | ||||||
| msgid "Zuploadowano:" | msgid "Zuploadowano:" | ||||||
| msgstr "Zuploadowano:" | msgstr "Zuploadowano:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:790 | #: ImageBrowser.py:679 | ||||||
| msgid "Wybierz folder z obrazkami PNG" | #, fuzzy | ||||||
|  | msgid "Wybierz folder z obrazkami PNG, JPEG, WebP, AVIF i GIF" | ||||||
| msgstr "Wybierz folder z obrazami PNG" | msgstr "Wybierz folder z obrazami PNG" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:823 | #: ImageBrowser.py:721 | ||||||
| msgid "Informacja" | msgid "Informacja" | ||||||
| msgstr "Informacja" | msgstr "Informacja" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:823 | #: ImageBrowser.py:722 | ||||||
| msgid "Brak plików PNG w wybranym folderze." | #, fuzzy | ||||||
|  | msgid "Brak plików PNG, JPEG, WebP, AVIF lub GIF w wybranym folderze." | ||||||
| msgstr "Brak plików PNG w wybranym folderze." | msgstr "Brak plików PNG w wybranym folderze." | ||||||
|  |  | ||||||
| #: ImageBrowser.py:906 | #: ImageBrowser.py:805 | ||||||
| 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:982 | #: ImageBrowser.py:881 | ||||||
| msgid "Błąd przy obliczaniu MD5:" | msgid "Error computing MD5:" | ||||||
| msgstr "Błąd przy obliczaniu MD5:" | msgstr "Błąd przy obliczaniu MD5:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1038 | #: ImageBrowser.py:940 | ||||||
| msgid "Błąd" | msgid "Błąd" | ||||||
| msgstr "Błąd" | msgstr "Błąd" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1038 | #: ImageBrowser.py:940 | ||||||
| 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:1248 ImageBrowser.py:1258 | #: ImageBrowser.py:1150 ImageBrowser.py:1160 | ||||||
| #, 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:1488 | #: ImageBrowser.py:1390 | ||||||
| msgid "Tagger przetwarza..." | msgid "Tagger przetwarza..." | ||||||
| msgstr "Tagger przetwarza..." | msgstr "Tagger przetwarza..." | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1513 | #: ImageBrowser.py:1415 | ||||||
| #, 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:1554 | #: ImageBrowser.py:1456 | ||||||
| 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:1558 ImageBrowser.py:1567 | #: ImageBrowser.py:1460 ImageBrowser.py:1469 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "" | msgid "" | ||||||
| "Wysyłanie zakończone błędem.\n" | "Wysyłanie zakończone błędem.\n" | ||||||
| @@ -329,40 +323,40 @@ msgstr "" | |||||||
| "Status: {status_code}\n" | "Status: {status_code}\n" | ||||||
| "Treść: {text}" | "Treść: {text}" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1573 ImageBrowser.py:1576 | #: ImageBrowser.py:1475 ImageBrowser.py:1478 | ||||||
| msgid "Wysyłanie" | msgid "Wysyłanie" | ||||||
| msgstr "Wysyłanie" | msgstr "Wysyłanie" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1589 | #: ImageBrowser.py:1491 | ||||||
| msgid "Błąd wysyłania" | msgid "Błąd wysyłania" | ||||||
| msgstr "Błąd wysyłania" | msgstr "Błąd wysyłania" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1609 | #: ImageBrowser.py:1511 | ||||||
| msgid "Błąd edycji" | msgid "Błąd edycji" | ||||||
| msgstr "Błąd edycji" | msgstr "Błąd edycji" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1609 | #: ImageBrowser.py:1511 | ||||||
| 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:1619 | #: ImageBrowser.py:1521 | ||||||
| #, 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:1629 ImageBrowser.py:1639 ImageBrowser.py:1670 | #: ImageBrowser.py:1531 ImageBrowser.py:1541 ImageBrowser.py:1572 | ||||||
| msgid "Operacja anulowana" | msgid "Operacja anulowana" | ||||||
| msgstr "Operacja anulowana" | msgstr "Operacja anulowana" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1680 | #: ImageBrowser.py:1582 | ||||||
| msgid "Tagi zostały zaktualizowane!" | msgid "Tagi zostały zaktualizowane!" | ||||||
| msgstr "Tagi zostały zaktualizowane!" | msgstr "Tagi zostały zaktualizowane!" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1682 | #: ImageBrowser.py:1584 | ||||||
| msgid "Sukces edycji" | msgid "Sukces edycji" | ||||||
| msgstr "Sukces edycji" | msgstr "Sukces edycji" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1688 | #: ImageBrowser.py:1590 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "" | msgid "" | ||||||
| "Błąd podczas aktualizacji tagów\n" | "Błąd podczas aktualizacji tagów\n" | ||||||
| @@ -371,19 +365,19 @@ msgstr "" | |||||||
| "Błąd podczas aktualizacji tagów\n" | "Błąd podczas aktualizacji tagów\n" | ||||||
| "Status: {code}" | "Status: {code}" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1692 | #: ImageBrowser.py:1594 | ||||||
| msgid "Treść:" | msgid "Treść:" | ||||||
| msgstr "Treść:" | msgstr "Treść:" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1696 | #: ImageBrowser.py:1598 | ||||||
| msgid "Krytyczny błąd edycji" | msgid "Krytyczny błąd edycji" | ||||||
| msgstr "Krytyczny błąd edycji" | msgstr "Krytyczny błąd edycji" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1708 | #: ImageBrowser.py:1610 | ||||||
| msgid "Potwierdzenie" | msgid "Potwierdzenie" | ||||||
| msgstr "Potwierdzenie" | msgstr "Potwierdzenie" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1710 | #: ImageBrowser.py:1612 | ||||||
| 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,21 +387,29 @@ 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:1734 | #: ImageBrowser.py:1636 | ||||||
| msgid "Anulowano operację!" | msgid "Anulowano operację!" | ||||||
| msgstr "Operacja anulowana!" | msgstr "Operacja anulowana!" | ||||||
|  |  | ||||||
| #: ImageBrowser.py:1742 | #: ImageBrowser.py:1644 | ||||||
| #, 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:1758 | #: ImageBrowser.py:1660 | ||||||
| msgid "Przesłano pliki!" | msgid "Przesłano pliki!" | ||||||
| msgstr "Pliki zostały przesłane!" | msgstr "Pliki zostały przesłane!" | ||||||
|  |  | ||||||
|  | #: ProcessingDialog.py:15 | ||||||
|  | msgid "Processing..." | ||||||
|  | msgstr "Przetwarzanie..." | ||||||
|  |  | ||||||
|  | #: ProcessingDialog.py:19 | ||||||
|  | msgid "Processing, please wait..." | ||||||
|  | msgstr "Przetwarzanie, proszę czekać..." | ||||||
|  |  | ||||||
| #: ProgressFile.py:16 | #: ProgressFile.py:16 | ||||||
| msgid "Upload cancelled by user." | msgid "Upload cancelled by user." | ||||||
| msgstr "Przesyłanie anulowane przez użytkownika." | msgstr "Przesyłanie anulowane przez użytkownika." | ||||||
| @@ -428,15 +430,20 @@ 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:48 | #: tag_processing.py:49 | ||||||
| msgid "Błąd przy pobieraniu tagów artystów:" | msgid "Błąd przy pobieraniu tagów artystów:" | ||||||
| msgstr "Błąd przy pobieraniu tagów artystów:" | msgstr "Błąd przy pobieraniu tagów artystów:" | ||||||
|  |  | ||||||
| #: tag_processing.py:200 | #: tag_processing.py:164 | ||||||
|  | #, fuzzy | ||||||
|  | msgid "Nie można sparsować parametrów." | ||||||
|  | msgstr "Nie można załadować obrazka:" | ||||||
|  |  | ||||||
|  | #: tag_processing.py:249 | ||||||
| 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:216 | #: tag_processing.py:265 | ||||||
| msgid "Błąd podczas odczytu tags:" | msgid "Błąd podczas odczytu tags:" | ||||||
| msgstr "Błąd podczas odczytu tags:" | msgstr "Błąd podczas odczytu tags:" | ||||||
|  |  | ||||||
| @@ -492,52 +499,55 @@ msgstr "Przetwarzanie tagów anulowane." | |||||||
| msgid "Pobrano {count} tagów..." | msgid "Pobrano {count} tagów..." | ||||||
| msgstr "Pobrano {count} tagów..." | msgstr "Pobrano {count} tagów..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:271 | #: TagsRepo.py:301 | ||||||
| msgid "Anulowano pobieranie aliasów tagów." | msgid "Anulowano pobieranie aliasów tagów." | ||||||
| msgstr "Pobieranie aliasów tagów anulowane." | msgstr "Pobieranie aliasów tagów anulowane." | ||||||
|  |  | ||||||
| #: TagsRepo.py:280 | #: TagsRepo.py:310 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Pobieranie aliasów tagów (od ID {last_id})..." | msgid "Pobieranie aliasów tagów (od ID {last_id})..." | ||||||
| msgstr "Pobieranie aliasów tagów (od ID {last_id})..." | msgstr "Pobieranie aliasów tagów (od ID {last_id})..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:297 | #: TagsRepo.py:327 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Błąd przy pobieraniu aliasów tagów od ID {last_id}: HTTP {code}" | msgid "Błąd przy pobieraniu aliasów tagów od ID {last_id}: HTTP {code}" | ||||||
| msgstr "Błąd przy pobieraniu aliasów tagów od ID {last_id}: HTTP {code}" | msgstr "Błąd przy pobieraniu aliasów tagów od ID {last_id}: HTTP {code}" | ||||||
|  |  | ||||||
| #: TagsRepo.py:312 | #: TagsRepo.py:342 | ||||||
| msgid "Anulowano przetwarzanie aliasów tagów." | msgid "Anulowano przetwarzanie aliasów tagów." | ||||||
| msgstr "Przetwarzanie aliasów tagów anulowane." | msgstr "Przetwarzanie aliasów tagów anulowane." | ||||||
|  |  | ||||||
| #: TagsRepo.py:334 | #: TagsRepo.py:364 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Pobrano {count} aliasów tagów..." | msgid "Pobrano {count} aliasów tagów..." | ||||||
| msgstr "Pobrano {count} aliasów tagów..." | msgstr "Pobrano {count} aliasów tagów..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:375 | #: TagsRepo.py:405 | ||||||
| msgid "Anulowano pobieranie implikacji tagów." | msgid "Anulowano pobieranie implikacji tagów." | ||||||
| msgstr "Pobieranie implikacji tagów anulowane." | msgstr "Pobieranie implikacji tagów anulowane." | ||||||
|  |  | ||||||
| #: TagsRepo.py:384 | #: TagsRepo.py:414 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Pobieranie implikacji tagów (od ID {last_id})..." | msgid "Pobieranie implikacji tagów (od ID {last_id})..." | ||||||
| msgstr "Pobieranie implikacji tagów (od ID {last_id})..." | msgstr "Pobieranie implikacji tagów (od ID {last_id})..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:398 | #: TagsRepo.py:428 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Błąd przy pobieraniu implikacji tagów od ID {last_id}: HTTP {code}" | msgid "Błąd przy pobieraniu implikacji tagów od ID {last_id}: HTTP {code}" | ||||||
| msgstr "Błąd przy pobieraniu implikacji tagów od ID {last_id}: HTTP {code}" | msgstr "Błąd przy pobieraniu implikacji tagów od ID {last_id}: HTTP {code}" | ||||||
|  |  | ||||||
| #: TagsRepo.py:413 | #: TagsRepo.py:443 | ||||||
| msgid "Anulowano przetwarzanie implikacji tagów." | msgid "Anulowano przetwarzanie implikacji tagów." | ||||||
| msgstr "Przetwarzanie implikacji tagów anulowane." | msgstr "Przetwarzanie implikacji tagów anulowane." | ||||||
|  |  | ||||||
| #: TagsRepo.py:460 | #: TagsRepo.py:490 | ||||||
| #, python-brace-format | #, python-brace-format | ||||||
| msgid "Pobrano implikacje dla {count} tagów..." | msgid "Pobrano implikacje dla {count} tagów..." | ||||||
| msgstr "Pobrano implikacje dla {count} tagów..." | msgstr "Pobrano implikacje dla {count} tagów..." | ||||||
|  |  | ||||||
| #: TagsRepo.py:487 | #: TagsRepo.py:517 | ||||||
| msgid "Regeneracja bazy zakończona." | msgid "Regeneracja bazy zakończona." | ||||||
| msgstr "Regeneracja bazy zakończona." | msgstr "Regeneracja bazy zakończona." | ||||||
|  |  | ||||||
|  | #~ msgid "Błąd przy obliczaniu MD5:" | ||||||
|  | #~ msgstr "Błąd przy obliczaniu MD5:" | ||||||
| @@ -34,6 +34,7 @@ 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) | @lru_cache(maxsize=1) | ||||||
| def get_artist_tags(tags_repo: TagsRepo): | def get_artist_tags(tags_repo: TagsRepo): | ||||||
|     """Zwraca zbiór nazw tagów z kategorii Artist (kategoria = 1) z bazy tags.sqlite""" |     """Zwraca zbiór nazw tagów z kategorii Artist (kategoria = 1) z bazy tags.sqlite""" | ||||||
| @@ -50,6 +51,10 @@ def get_artist_tags(tags_repo: TagsRepo): | |||||||
|  |  | ||||||
|  |  | ||||||
| # Wzorce i ustawienia związane z tagami | # Wzorce i ustawienia związane z tagami | ||||||
|  | PARAMETERS_PATTERN = re.compile( | ||||||
|  |     r"^(?P<prompt>.*?)\s+(?:Negative prompt:\s+(?P<negative_prompt>.*?)\s+)?Steps:\s+(?P<steps>\d+),\s+Sampler:\s+(?P<sampler>.*?),\s+Schedule type:\s+(?P<schedule_type>.*?),\s+CFG scale:\s+(?P<cfg_scale>.*?),\s+Seed:\s+(?P<seed>.*?),\s+Size:\s+(?P<size>.*?),\s+Model hash:\s+(?P<model_hash>.*?),\s+Model:\s+(?P<model>.*?),\s+(?:Denoising strength:\s+(?P<denoising_strength>.*?),\s+)?(?:Clip skip: (?P<clip_skip>.*?),\s+)?(?:Hires CFG Scale:\s+(?P<hires_cfg_scale>.*?),\s+Hires upscale:\s+(?P<hires_upscale>.*?),\s+Hires steps:\s+(?P<hires_steps>.*?),\s+Hires upscaler:\s+(?P<hires_upscaler>.*?),\s+)?Version:\s+(?P<version>.*?)\s*$", | ||||||
|  |     re.DOTALL, | ||||||
|  | ) | ||||||
| COEFFICIENT_PATTERN = re.compile(r"^.*?(:\d+|\d+\.\d+)$") | COEFFICIENT_PATTERN = re.compile(r"^.*?(:\d+|\d+\.\d+)$") | ||||||
| UNESCAPED_PATTERN = re.compile(r"(?<!\\)[\(\)\[\]]+") | UNESCAPED_PATTERN = re.compile(r"(?<!\\)[\(\)\[\]]+") | ||||||
| SLASH_PATTERN = re.compile(r"\\+(?=[\(\)](?!\^))") | SLASH_PATTERN = re.compile(r"\\+(?=[\(\)](?!\^))") | ||||||
| @@ -107,16 +112,62 @@ MULTI_TAG_FIXES = { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| def parse_parameters(param_str, tags_repo: TagsRepo): | from PIL import Image, PngImagePlugin | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_parameters(img: Image, file_path: str) -> str: | ||||||
|  |     """Funkcja do ekstrakcji parametrów z pliku graficznego. | ||||||
|  |     Obsługuje PNG, JPEG, WebP, AVIF i GIF. | ||||||
|  |     """ | ||||||
|  |     parameters = "" | ||||||
|  |     lower_path = file_path.lower() | ||||||
|  |  | ||||||
|  |     # For PNG: use the custom "parameters" field. | ||||||
|  |     if isinstance(img, PngImagePlugin.PngImageFile): | ||||||
|  |         parameters = img.info.get("parameters", "") | ||||||
|  |  | ||||||
|  |     # For JPEG, WebP, and AVIF: extract EXIF UserComment (EXIF tag 37510). | ||||||
|  |     elif lower_path.endswith((".jpg", ".jpeg", ".webp", ".avif")): | ||||||
|  |         exif_data = img.getexif() | ||||||
|  |         user_comment = exif_data.get(37510) | ||||||
|  |         if user_comment: | ||||||
|  |             # UserComment might be stored as bytes; decode to string. | ||||||
|  |             if isinstance(user_comment, bytes): | ||||||
|  |                 try: | ||||||
|  |                     parameters = user_comment.decode("utf-8", errors="replace") | ||||||
|  |                 except Exception: | ||||||
|  |                     parameters = str(user_comment) | ||||||
|  |             else: | ||||||
|  |                 parameters = str(user_comment) | ||||||
|  |  | ||||||
|  |     # For GIF: extract the GIF comment. | ||||||
|  |     elif lower_path.endswith(".gif"): | ||||||
|  |         comment = img.info.get("comment") | ||||||
|  |         if comment: | ||||||
|  |             if isinstance(comment, bytes): | ||||||
|  |                 try: | ||||||
|  |                     parameters = comment.decode("utf-8", errors="replace") | ||||||
|  |                 except Exception: | ||||||
|  |                     parameters = str(comment) | ||||||
|  |             else: | ||||||
|  |                 parameters = str(comment) | ||||||
|  |  | ||||||
|  |     return parameters | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def parse_parameters(param_str): | ||||||
|     """ |     """ | ||||||
|     Funkcja do parsowania zawartości pola 'parameters' z pliku PNG. |     Funkcja do parsowania zawartości pola 'parameters' z pliku PNG. | ||||||
|     """ |     """ | ||||||
|     tags = ( |     match = PARAMETERS_PATTERN.match(param_str) | ||||||
|         param_str.split("\nNegative", 1)[0] |     if not match: | ||||||
|         .removesuffix(",") |         print(_("Nie można sparsować parametrów.")) | ||||||
|         .replace("\n", " ") |         return "" | ||||||
|         .split(",") |     tags = match.group("prompt").removesuffix(",").replace("\n", " ").split(",") | ||||||
|     ) |      | ||||||
|  |     if "pony" in match.group("model"): | ||||||
|  |         tags = [tag.strip() for tag in tags if not tag.strip().startswith("score_")] | ||||||
|  |         tags = tags[1:] | ||||||
|     tags = set([WHITESPACE_PATTERN.sub("_", param.strip()) for param in tags]) |     tags = set([WHITESPACE_PATTERN.sub("_", param.strip()) for param in tags]) | ||||||
|     tags = set( |     tags = set( | ||||||
|         [ |         [ | ||||||
| @@ -141,9 +192,9 @@ def parse_parameters(param_str, tags_repo: TagsRepo): | |||||||
|     # Usuń tagi tekstowe |     # Usuń tagi tekstowe | ||||||
|     tags = {tag for tag in tags if not tag.startswith("text:")} |     tags = {tag for tag in tags if not tag.startswith("text:")} | ||||||
|     # Pobierz tagi z bazy |     # Pobierz tagi z bazy | ||||||
|     character_tags = get_character_tags(tags_repo) |     character_tags = get_character_tags() | ||||||
|     copyright_tags = get_copyright_tags(tags_repo) |     copyright_tags = get_copyright_tags() | ||||||
|     artist_tags = get_artist_tags(tags_repo) |     artist_tags = get_artist_tags() | ||||||
|  |  | ||||||
|     # 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 | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" | |||||||
|  |  | ||||||
| [project] | [project] | ||||||
| name = "kapitanbooru-uploader" | name = "kapitanbooru-uploader" | ||||||
| version = "0.7.0" | version = "0.8.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 = [ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user