Add periodic version check
All checks were successful
Gitea/kapitanbooru-uploader/pipeline/head This commit looks good

This commit is contained in:
Michał Leśniak 2025-03-11 00:46:39 +01:00
parent b559f965f5
commit 218f0b9b79
5 changed files with 351 additions and 204 deletions

View File

@ -7,11 +7,14 @@ 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
from packaging.version import parse as parse_version
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, PngImagePlugin
import wdtagger as wdt import wdtagger as wdt
import tomli
from .I18N import _ from .I18N import _
from .ProgressFile import ProgressFile from .ProgressFile import ProgressFile
@ -139,7 +142,8 @@ class ImageBrowser(tk.Tk):
super().__init__() super().__init__()
self.title("Kapitanbooru Uploader") self.title("Kapitanbooru Uploader")
self.geometry("900x600") self.geometry("900x600")
self.version = "0.4.4" self.version = "0.5.0"
self.acknowledged_version = parse_version(self.version)
self.settings = Settings() self.settings = Settings()
self.tags_repo = TagsRepo(self.settings) self.tags_repo = TagsRepo(self.settings)
@ -204,6 +208,66 @@ class ImageBrowser(tk.Tk):
self.create_widgets() self.create_widgets()
self.bind_events() 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): def reload_ui(self):
"""Reload UI components with new language""" """Reload UI components with new language"""
# Destroy current widgets # Destroy current widgets
@ -417,31 +481,43 @@ class ImageBrowser(tk.Tk):
frame = ttk.Frame(about, padding=10) frame = ttk.Frame(about, padding=10)
frame.pack(fill="both", expand=True) frame.pack(fill="both", expand=True)
row_counter = itertools.count(0)
ttk.Label( ttk.Label(
frame, text="Kapitanbooru Uploader", font=("TkDefaultFont", 16, "bold") 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 = [ content = [
(f"Version {self.version}", 1), _("Current version: {version}").format(version=self.version),
("", 2), "",
(_("A GUI application for uploading images to KapitanBooru."), 3), _("A GUI application for uploading images to KapitanBooru."),
(_("Features include image upload, tag management, automatic"), 4), _("Features include image upload, tag management, automatic"),
(_("tagging with wdtagger, and cache management."), 5), _("tagging with wdtagger, and cache management."),
("", 6), "",
(_("Authors:"), 7), _("Authors:"),
("Michał Leśniak", 8), "Michał Leśniak",
("", 9), "",
(_("License: MIT License"), 10), _("License: MIT License"),
(f"Copyright © 2025 Michał Leśniak", 11), f"Copyright © 2025 Michał Leśniak",
("", 12), "",
] ]
for text, row in content: for text in content:
ttk.Label(frame, text=text).grid(row=row, column=0, sticky=tk.W) ttk.Label(frame, text=text).grid(row=next(row_counter), column=0, sticky=tk.W)
# Repository link # Repository link
repo_frame = ttk.Frame(frame) repo_frame = ttk.Frame(frame)
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) ttk.Label(repo_frame, text=_("Repository:")).pack(side=tk.LEFT)
repo_url = "https://git.mlesniak.pl/kapitan/kapitanbooru-uploader" repo_url = "https://git.mlesniak.pl/kapitan/kapitanbooru-uploader"
repo = ttk.Label(repo_frame, text=repo_url, cursor="hand2", foreground="blue") repo = ttk.Label(repo_frame, text=repo_url, cursor="hand2", foreground="blue")
@ -450,7 +526,7 @@ class ImageBrowser(tk.Tk):
# Website link # Website link
website_frame = ttk.Frame(frame) 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) ttk.Label(website_frame, text=_("Website:")).pack(side=tk.LEFT)
website_url = "https://booru.mlesniak.pl" website_url = "https://booru.mlesniak.pl"
website = ttk.Label( website = ttk.Label(

View File

@ -1,8 +1,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Kapitanbooru Uploader 0.4.4\n" "Project-Id-Version: Kapitanbooru Uploader 0.5.0\n"
"Report-Msgid-Bugs-To: \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-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@ -43,300 +43,345 @@ 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:30 #: ImageBrowser.py:33
msgid "Processing..." msgid "Processing..."
msgstr "Processing..." msgstr "Processing..."
#: ImageBrowser.py:34 #: ImageBrowser.py:37
msgid "Processing, please wait..." msgid "Processing, please wait..."
msgstr "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" msgid "Błąd przy otwieraniu pliku"
msgstr "Error opening file" msgstr "Error opening file"
#: ImageBrowser.py:305 #: ImageBrowser.py:409
msgid "Tagger przetworzył:" msgid "Tagger przetworzył:"
msgstr "Tagger processed:" msgstr "Tagger processed:"
#: ImageBrowser.py:308 #: ImageBrowser.py:412
msgid "Błąd Taggera dla" msgid "Błąd Taggera dla"
msgstr "Tagger error for" msgstr "Tagger error for"
#: ImageBrowser.py:334 #: ImageBrowser.py:438
msgid "Otwórz folder" msgid "Otwórz folder"
msgstr "Open folder" msgstr "Open folder"
#: ImageBrowser.py:337 ImageBrowser.py:600 ImageBrowser.py:814 #: ImageBrowser.py:441 ImageBrowser.py:728 ImageBrowser.py:944
#: ImageBrowser.py:822 #: ImageBrowser.py:952
msgid "Wyślij" msgid "Wyślij"
msgstr "Send" msgstr "Send"
#: ImageBrowser.py:340 ImageBrowser.py:807 #: ImageBrowser.py:444 ImageBrowser.py:937
msgid "Wyślij wszystko" msgid "Wyślij wszystko"
msgstr "Send all" msgstr "Send all"
#: ImageBrowser.py:344 ImageBrowser.py:808 ImageBrowser.py:814 #: ImageBrowser.py:448 ImageBrowser.py:938 ImageBrowser.py:944
msgid "Podmień tagi" msgid "Podmień tagi"
msgstr "Replace tags" msgstr "Replace tags"
#: ImageBrowser.py:347 ImageBrowser.py:809 #: ImageBrowser.py:451 ImageBrowser.py:939
msgid "Otwórz post" msgid "Otwórz post"
msgstr "Open post" msgstr "Open post"
#: ImageBrowser.py:350 #: ImageBrowser.py:454
msgid "Zakończ" msgid "Zakończ"
msgstr "Finish" msgstr "Finish"
#: ImageBrowser.py:352 #: ImageBrowser.py:456
msgid "Plik" msgid "Plik"
msgstr "File" msgstr "File"
#: ImageBrowser.py:356 ImageBrowser.py:430 #: ImageBrowser.py:460 ImageBrowser.py:557
msgid "Ustawienia" msgid "Ustawienia"
msgstr "Settings" msgstr "Settings"
#: ImageBrowser.py:359 #: ImageBrowser.py:463
msgid "Wyczyść cache Taggera" msgid "Wyczyść cache Taggera"
msgstr "Clear Tagger cache" msgstr "Clear Tagger cache"
#: ImageBrowser.py:362 #: ImageBrowser.py:466
msgid "Zregeneruj bazę tagów" msgid "Zregeneruj bazę tagów"
msgstr "Regenerate tag database" msgstr "Regenerate tag database"
#: ImageBrowser.py:364 #: ImageBrowser.py:468
msgid "Opcje" msgid "Opcje"
msgstr "Options" msgstr "Options"
#: ImageBrowser.py:367 #: ImageBrowser.py:471
msgid "About" msgid "About"
msgstr "About" msgstr "About"
#: ImageBrowser.py:368 #: ImageBrowser.py:472
msgid "Help" msgid "Help"
msgstr "Help" msgstr "Help"
#: ImageBrowser.py:373 #: ImageBrowser.py:477
msgid "About Kapitanbooru Uploader" msgid "About Kapitanbooru Uploader"
msgstr "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." 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:387 #: ImageBrowser.py:504
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:388 #: ImageBrowser.py:505
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:390 #: ImageBrowser.py:507
msgid "Authors:" msgid "Authors:"
msgstr "Authors:" msgstr "Authors:"
#: ImageBrowser.py:393 #: ImageBrowser.py:510
msgid "License: MIT License" msgid "License: MIT License"
msgstr "License: MIT License" msgstr "License: MIT License"
#: ImageBrowser.py:396 #: ImageBrowser.py:521
msgid "Repository:" msgid "Repository:"
msgstr "Repository:" msgstr "Repository:"
#: ImageBrowser.py:397 #: ImageBrowser.py:530
msgid "Website:" msgid "Website:"
msgstr "Website:" msgstr "Website:"
#: ImageBrowser.py:414 #: ImageBrowser.py:541
msgid "Close" msgid "Close"
msgstr "Close" msgstr "Close"
#: ImageBrowser.py:422 ImageBrowser.py:425 #: ImageBrowser.py:549 ImageBrowser.py:552
msgid "Cache" msgid "Cache"
msgstr "Cache" msgstr "Cache"
#: ImageBrowser.py:422 #: ImageBrowser.py:549
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:425 #: ImageBrowser.py:552
msgid "Błąd przy czyszczeniu cache:" msgid "Błąd przy czyszczeniu cache:"
msgstr "Error clearing cache:" msgstr "Error clearing cache:"
#: ImageBrowser.py:434 #: ImageBrowser.py:562
msgid "Login:" msgid "Login:"
msgstr "Login:" msgstr "Login:"
#: ImageBrowser.py:440 #: ImageBrowser.py:568
msgid "Hasło:" msgid "Hasło:"
msgstr "Password:" msgstr "Password:"
#: ImageBrowser.py:446 #: ImageBrowser.py:574
msgid "Base URL:" msgid "Base URL:"
msgstr "Base URL:" msgstr "Base URL:"
#: ImageBrowser.py:452 #: ImageBrowser.py:580
msgid "Default Tags:" msgid "Default Tags:"
msgstr "Default Tags:" msgstr "Default Tags:"
#: ImageBrowser.py:458 #: ImageBrowser.py:586
msgid "Browser:" msgid "Browser:"
msgstr "Browser:" msgstr "Browser:"
#: ImageBrowser.py:472 #: ImageBrowser.py:600
msgid "Language:" msgid "Language:"
msgstr "Language:" msgstr "Language:"
#: ImageBrowser.py:504 #: ImageBrowser.py:632
msgid "Zapisz" msgid "Zapisz"
msgstr "Save" msgstr "Save"
#: ImageBrowser.py:546 #: ImageBrowser.py:674
msgid "PNG Tags" msgid "PNG Tags"
msgstr "PNG Tags" msgstr "PNG Tags"
#: ImageBrowser.py:558 #: ImageBrowser.py:686
msgid "Tagger Tags" msgid "Tagger Tags"
msgstr "Tagger Tags" msgstr "Tagger Tags"
#: ImageBrowser.py:572 #: ImageBrowser.py:700
msgid "Manual Tags" msgid "Manual Tags"
msgstr "Manual Tags" msgstr "Manual Tags"
#: ImageBrowser.py:580 #: ImageBrowser.py:708
msgid "Final Tags" msgid "Final Tags"
msgstr "Final Tags" msgstr "Final Tags"
#: ImageBrowser.py:605 #: ImageBrowser.py:733
msgid "Wyświetl" msgid "Wyświetl"
msgstr "Display" msgstr "Display"
#: ImageBrowser.py:622 #: ImageBrowser.py:750
msgid "Przetworzono tagi:" msgid "Przetworzono tagi:"
msgstr "Processed tags:" msgstr "Processed tags:"
#: ImageBrowser.py:622 ImageBrowser.py:623 ImageBrowser.py:624 #: ImageBrowser.py:750 ImageBrowser.py:751 ImageBrowser.py:752
msgid "plików" msgid "plików"
msgstr "files" msgstr "files"
#: ImageBrowser.py:623 #: ImageBrowser.py:751
msgid "Zweryfikowano status uploadu:" msgid "Zweryfikowano status uploadu:"
msgstr "Upload status verified:" msgstr "Upload status verified:"
#: ImageBrowser.py:624 #: ImageBrowser.py:752
msgid "Zuploadowano:" msgid "Zuploadowano:"
msgstr "Uploaded:" msgstr "Uploaded:"
#: ImageBrowser.py:652 #: ImageBrowser.py:780
msgid "Wybierz folder z obrazkami PNG" msgid "Wybierz folder z obrazkami PNG"
msgstr "Select folder with PNG images" msgstr "Select folder with PNG images"
#: ImageBrowser.py:683 #: ImageBrowser.py:813
msgid "Informacja" msgid "Informacja"
msgstr "Information" msgstr "Information"
#: ImageBrowser.py:683 #: ImageBrowser.py:813
msgid "Brak plików PNG w wybranym folderze." msgid "Brak plików PNG w wybranym folderze."
msgstr "No PNG files in the selected folder." msgstr "No PNG files in the selected folder."
#: ImageBrowser.py:766 #: ImageBrowser.py:896
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:842 #: ImageBrowser.py:972
msgid "Błąd przy obliczaniu MD5:" msgid "Błąd przy obliczaniu MD5:"
msgstr "Error calculating MD5:" msgstr "Error calculating MD5:"
#: ImageBrowser.py:898 #: ImageBrowser.py:1028
msgid "Błąd" msgid "Błąd"
msgstr "Error" msgstr "Error"
#: ImageBrowser.py:898 #: ImageBrowser.py:1028
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:1108 ImageBrowser.py:1118 #: ImageBrowser.py:1238 ImageBrowser.py:1248
#, 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:1348 #: ImageBrowser.py:1478
msgid "Tagger przetwarza..." msgid "Tagger przetwarza..."
msgstr "Tagger processing..." msgstr "Tagger processing..."
#: ImageBrowser.py:1373 #: ImageBrowser.py:1503
#, 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:1414 #: ImageBrowser.py:1544
msgid "Wysyłanie zakończone powodzeniem!" msgid "Wysyłanie zakończone powodzeniem!"
msgstr "Upload completed successfully!" msgstr "Upload completed successfully!"
#: ImageBrowser.py:1418 ImageBrowser.py:1427 #: ImageBrowser.py:1548 ImageBrowser.py:1557
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Wysyłanie zakończone błędem.\n" "Wysyłanie zakończone błędem.\n"
"Status: {status_code}\n" "Status: {status_code}\n"
"Treść: {text}" "Treść: {text}"
msgstr "" 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" msgid "Wysyłanie"
msgstr "Uploading" msgstr "Uploading"
#: ImageBrowser.py:1449 #: ImageBrowser.py:1579
msgid "Błąd wysyłania" msgid "Błąd wysyłania"
msgstr "Upload error" msgstr "Upload error"
#: ImageBrowser.py:1469 #: ImageBrowser.py:1599
msgid "Błąd edycji" msgid "Błąd edycji"
msgstr "Edit error" msgstr "Edit error"
#: ImageBrowser.py:1469 #: ImageBrowser.py:1599
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:1479 #: ImageBrowser.py:1609
#, 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:1489 ImageBrowser.py:1499 ImageBrowser.py:1530 #: ImageBrowser.py:1619 ImageBrowser.py:1629 ImageBrowser.py:1660
msgid "Operacja anulowana" msgid "Operacja anulowana"
msgstr "Operation cancelled" msgstr "Operation cancelled"
#: ImageBrowser.py:1540 #: ImageBrowser.py:1670
msgid "Tagi zostały zaktualizowane!" msgid "Tagi zostały zaktualizowane!"
msgstr "Tags have been updated!" msgstr "Tags have been updated!"
#: ImageBrowser.py:1542 #: ImageBrowser.py:1672
msgid "Sukces edycji" msgid "Sukces edycji"
msgstr "Edit successful" msgstr "Edit successful"
#: ImageBrowser.py:1548 #: ImageBrowser.py:1678
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Błąd podczas aktualizacji tagów\n" "Błąd podczas aktualizacji tagów\n"
"Status: {code}" "Status: {code}"
msgstr "" msgstr ""
"Error updating tags\nStatus: {code}" "Error updating tags\n"
"Status: {code}"
#: ImageBrowser.py:1552 #: ImageBrowser.py:1682
msgid "Treść:" msgid "Treść:"
msgstr "Content:" msgstr "Content:"
#: ImageBrowser.py:1556 #: ImageBrowser.py:1686
msgid "Krytyczny błąd edycji" msgid "Krytyczny błąd edycji"
msgstr "Critical edit error" msgstr "Critical edit error"
#: ImageBrowser.py:1568 #: ImageBrowser.py:1698
msgid "Potwierdzenie" msgid "Potwierdzenie"
msgstr "Confirmation" msgstr "Confirmation"
#: ImageBrowser.py:1570 #: ImageBrowser.py:1700
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"
@ -346,17 +391,18 @@ msgstr ""
"Each will be tagged with 'meta:auto_upload'.\n" "Each will be tagged with 'meta:auto_upload'.\n"
"Make sure the tags are correct!" "Make sure the tags are correct!"
#: ImageBrowser.py:1589 #: ImageBrowser.py:1724
msgid "Anulowano operację!" msgid "Anulowano operację!"
msgstr "Operation cancelled!" msgstr "Operation cancelled!"
#: ImageBrowser.py:1597 #: ImageBrowser.py:1732
#, 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 "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!" msgid "Przesłano pliki!"
msgstr "Files have been uploaded!" msgstr "Files have been uploaded!"

View File

@ -1,8 +1,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Kapitanbooru Uploader 0.4.4\n" "Project-Id-Version: Kapitanbooru Uploader 0.5.0\n"
"Report-Msgid-Bugs-To: \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" "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"
@ -17,8 +17,7 @@ msgstr "Błąd przy otwieraniu przeglądarki:"
#: common.py:72 #: common.py:72
msgid "Login succeeded, but expected cookies were not set." msgid "Login succeeded, but expected cookies were not set."
msgstr "" msgstr "Logowanie powiodło się, ale oczekiwane ciasteczka nie zostały ustawione."
"Logowanie powiodło się, ale oczekiwane ciasteczka nie zostały ustawione."
#: common.py:74 #: common.py:74
msgid "Login successful. Cookies stored in session." msgid "Login successful. Cookies stored in session."
@ -45,284 +44,324 @@ 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:30 #: ImageBrowser.py:33
msgid "Processing..." msgid "Processing..."
msgstr "Przetwarzanie..." msgstr "Przetwarzanie..."
#: ImageBrowser.py:34 #: ImageBrowser.py:37
msgid "Processing, please wait..." msgid "Processing, please wait..."
msgstr "Przetwarzanie, proszę czekać..." 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" msgid "Błąd przy otwieraniu pliku"
msgstr "Błąd przy otwieraniu pliku" msgstr "Błąd przy otwieraniu pliku"
#: ImageBrowser.py:305 #: ImageBrowser.py:409
msgid "Tagger przetworzył:" msgid "Tagger przetworzył:"
msgstr "Tagger przetworzył:" msgstr "Tagger przetworzył:"
#: ImageBrowser.py:308 #: ImageBrowser.py:412
msgid "Błąd Taggera dla" msgid "Błąd Taggera dla"
msgstr "Błąd Taggera dla" msgstr "Błąd Taggera dla"
#: ImageBrowser.py:334 #: ImageBrowser.py:438
msgid "Otwórz folder" msgid "Otwórz folder"
msgstr "Otwórz folder" msgstr "Otwórz folder"
#: ImageBrowser.py:337 ImageBrowser.py:600 ImageBrowser.py:814 #: ImageBrowser.py:441 ImageBrowser.py:728 ImageBrowser.py:944
#: ImageBrowser.py:822 #: ImageBrowser.py:952
msgid "Wyślij" msgid "Wyślij"
msgstr "Wyślij" msgstr "Wyślij"
#: ImageBrowser.py:340 ImageBrowser.py:807 #: ImageBrowser.py:444 ImageBrowser.py:937
msgid "Wyślij wszystko" msgid "Wyślij wszystko"
msgstr "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" msgid "Podmień tagi"
msgstr "Podmień tagi" msgstr "Podmień tagi"
#: ImageBrowser.py:347 ImageBrowser.py:809 #: ImageBrowser.py:451 ImageBrowser.py:939
msgid "Otwórz post" msgid "Otwórz post"
msgstr "Otwórz post" msgstr "Otwórz post"
#: ImageBrowser.py:350 #: ImageBrowser.py:454
msgid "Zakończ" msgid "Zakończ"
msgstr "Zakończ" msgstr "Zakończ"
#: ImageBrowser.py:352 #: ImageBrowser.py:456
msgid "Plik" msgid "Plik"
msgstr "Plik" msgstr "Plik"
#: ImageBrowser.py:356 ImageBrowser.py:430 #: ImageBrowser.py:460 ImageBrowser.py:557
msgid "Ustawienia" msgid "Ustawienia"
msgstr "Ustawienia" msgstr "Ustawienia"
#: ImageBrowser.py:359 #: ImageBrowser.py:463
msgid "Wyczyść cache Taggera" msgid "Wyczyść cache Taggera"
msgstr "Wyczyść cache Taggera" msgstr "Wyczyść cache Taggera"
#: ImageBrowser.py:362 #: ImageBrowser.py:466
msgid "Zregeneruj bazę tagów" msgid "Zregeneruj bazę tagów"
msgstr "Zregeneruj bazę tagów" msgstr "Zregeneruj bazę tagów"
#: ImageBrowser.py:364 #: ImageBrowser.py:468
msgid "Opcje" msgid "Opcje"
msgstr "Opcje" msgstr "Opcje"
#: ImageBrowser.py:367 #: ImageBrowser.py:471
msgid "About" msgid "About"
msgstr "O programie" msgstr "O programie"
#: ImageBrowser.py:368 #: ImageBrowser.py:472
msgid "Help" msgid "Help"
msgstr "Pomoc" msgstr "Pomoc"
#: ImageBrowser.py:373 #: ImageBrowser.py:477
msgid "About Kapitanbooru Uploader" msgid "About Kapitanbooru Uploader"
msgstr "O programie 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." 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:387 #: ImageBrowser.py:504
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:388 #: ImageBrowser.py:505
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:390 #: ImageBrowser.py:507
msgid "Authors:" msgid "Authors:"
msgstr "Autorzy:" msgstr "Autorzy:"
#: ImageBrowser.py:393 #: ImageBrowser.py:510
msgid "License: MIT License" msgid "License: MIT License"
msgstr "Licencja: MIT License" msgstr "Licencja: MIT License"
#: ImageBrowser.py:396 #: ImageBrowser.py:521
msgid "Repository:" msgid "Repository:"
msgstr "Repozytorium:" msgstr "Repozytorium:"
#: ImageBrowser.py:397 #: ImageBrowser.py:530
msgid "Website:" msgid "Website:"
msgstr "Strona internetowa:" msgstr "Strona internetowa:"
#: ImageBrowser.py:414 #: ImageBrowser.py:541
msgid "Close" msgid "Close"
msgstr "Zamknij" msgstr "Zamknij"
#: ImageBrowser.py:422 ImageBrowser.py:425 #: ImageBrowser.py:549 ImageBrowser.py:552
msgid "Cache" msgid "Cache"
msgstr "Cache" msgstr "Cache"
#: ImageBrowser.py:422 #: ImageBrowser.py:549
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:425 #: ImageBrowser.py:552
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:434 #: ImageBrowser.py:562
msgid "Login:" msgid "Login:"
msgstr "Login:" msgstr "Login:"
#: ImageBrowser.py:440 #: ImageBrowser.py:568
msgid "Hasło:" msgid "Hasło:"
msgstr "Hasło:" msgstr "Hasło:"
#: ImageBrowser.py:446 #: ImageBrowser.py:574
msgid "Base URL:" msgid "Base URL:"
msgstr "Base URL:" msgstr "Base URL:"
#: ImageBrowser.py:452 #: ImageBrowser.py:580
msgid "Default Tags:" msgid "Default Tags:"
msgstr "Domyślne tagi:" msgstr "Domyślne tagi:"
#: ImageBrowser.py:458 #: ImageBrowser.py:586
msgid "Browser:" msgid "Browser:"
msgstr "Przeglądarka:" msgstr "Przeglądarka:"
#: ImageBrowser.py:472 #: ImageBrowser.py:600
msgid "Language:" msgid "Language:"
msgstr "Język:" msgstr "Język:"
#: ImageBrowser.py:504 #: ImageBrowser.py:632
msgid "Zapisz" msgid "Zapisz"
msgstr "Zapisz" msgstr "Zapisz"
#: ImageBrowser.py:546 #: ImageBrowser.py:674
msgid "PNG Tags" msgid "PNG Tags"
msgstr "Tagi PNG" msgstr "Tagi PNG"
#: ImageBrowser.py:558 #: ImageBrowser.py:686
msgid "Tagger Tags" msgid "Tagger Tags"
msgstr "Tagi Taggera" msgstr "Tagi Taggera"
#: ImageBrowser.py:572 #: ImageBrowser.py:700
msgid "Manual Tags" msgid "Manual Tags"
msgstr "Tagi ręczne" msgstr "Tagi ręczne"
#: ImageBrowser.py:580 #: ImageBrowser.py:708
msgid "Final Tags" msgid "Final Tags"
msgstr "Ostateczne tagi" msgstr "Ostateczne tagi"
#: ImageBrowser.py:605 #: ImageBrowser.py:733
msgid "Wyświetl" msgid "Wyświetl"
msgstr "Wyświetl" msgstr "Wyświetl"
#: ImageBrowser.py:622 #: ImageBrowser.py:750
msgid "Przetworzono tagi:" msgid "Przetworzono tagi:"
msgstr "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" msgid "plików"
msgstr "plików" msgstr "plików"
#: ImageBrowser.py:623 #: ImageBrowser.py:751
msgid "Zweryfikowano status uploadu:" msgid "Zweryfikowano status uploadu:"
msgstr "Zweryfikowano status uploadu:" msgstr "Zweryfikowano status uploadu:"
#: ImageBrowser.py:624 #: ImageBrowser.py:752
msgid "Zuploadowano:" msgid "Zuploadowano:"
msgstr "Zuploadowano:" msgstr "Zuploadowano:"
#: ImageBrowser.py:652 #: ImageBrowser.py:780
msgid "Wybierz folder z obrazkami PNG" msgid "Wybierz folder z obrazkami PNG"
msgstr "Wybierz folder z obrazami PNG" msgstr "Wybierz folder z obrazami PNG"
#: ImageBrowser.py:683 #: ImageBrowser.py:813
msgid "Informacja" msgid "Informacja"
msgstr "Informacja" msgstr "Informacja"
#: ImageBrowser.py:683 #: ImageBrowser.py:813
msgid "Brak plików PNG w wybranym folderze." msgid "Brak plików PNG w wybranym folderze."
msgstr "Brak plików PNG w wybranym folderze." msgstr "Brak plików PNG w wybranym folderze."
#: ImageBrowser.py:766 #: ImageBrowser.py:896
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:842 #: ImageBrowser.py:972
msgid "Błąd przy obliczaniu MD5:" msgid "Błąd przy obliczaniu MD5:"
msgstr "Błąd przy obliczaniu MD5:" msgstr "Błąd przy obliczaniu MD5:"
#: ImageBrowser.py:898 #: ImageBrowser.py:1028
msgid "Błąd" msgid "Błąd"
msgstr "Błąd" msgstr "Błąd"
#: ImageBrowser.py:898 #: ImageBrowser.py:1028
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:1108 ImageBrowser.py:1118 #: ImageBrowser.py:1238 ImageBrowser.py:1248
#, 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:1348 #: ImageBrowser.py:1478
msgid "Tagger przetwarza..." msgid "Tagger przetwarza..."
msgstr "Tagger przetwarza..." msgstr "Tagger przetwarza..."
#: ImageBrowser.py:1373 #: ImageBrowser.py:1503
#, 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:1414 #: ImageBrowser.py:1544
#, fuzzy
msgid "Wysyłanie zakończone powodzeniem!" msgid "Wysyłanie zakończone powodzeniem!"
msgstr "Upload zakończony powodzeniem!" msgstr "Wysyłanie zakończone powodzeniem!"
#: ImageBrowser.py:1418 ImageBrowser.py:1427 #: ImageBrowser.py:1548 ImageBrowser.py:1557
#, fuzzy, python-brace-format #, python-brace-format
msgid "" msgid ""
"Wysyłanie zakończone błędem.\n" "Wysyłanie zakończone błędem.\n"
"Status: {status_code}\n" "Status: {status_code}\n"
"Treść: {text}" "Treść: {text}"
msgstr "" msgstr ""
"Upload zakończony błędem.\n" "Wysyłanie zakończone błędem.\n"
"Status: {status_code}\n" "Status: {status_code}\n"
"Treść: {text}" "Treść: {text}"
#: ImageBrowser.py:1433 ImageBrowser.py:1436 #: ImageBrowser.py:1563
msgid "Wysyłanie" msgid "Wysyłanie"
msgstr "" msgstr "Wysyłanie"
#: ImageBrowser.py:1449 #: ImageBrowser.py:1579
#, fuzzy
msgid "Błąd wysyłania" msgid "Błąd wysyłania"
msgstr "Błąd edycji" msgstr "Błąd wysyłania"
#: ImageBrowser.py:1469 #: ImageBrowser.py:1599
msgid "Błąd edycji" msgid "Błąd edycji"
msgstr "Błąd edycji" msgstr "Błąd edycji"
#: ImageBrowser.py:1469 #: ImageBrowser.py:1599
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:1479 #: ImageBrowser.py:1609
#, 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:1489 ImageBrowser.py:1499 ImageBrowser.py:1530 #: ImageBrowser.py:1619 ImageBrowser.py:1629 ImageBrowser.py:1660
msgid "Operacja anulowana" msgid "Operacja anulowana"
msgstr "Operacja anulowana" msgstr "Operacja anulowana"
#: ImageBrowser.py:1540 #: ImageBrowser.py:1670
msgid "Tagi zostały zaktualizowane!" msgid "Tagi zostały zaktualizowane!"
msgstr "Tagi zostały zaktualizowane!" msgstr "Tagi zostały zaktualizowane!"
#: ImageBrowser.py:1542 #: ImageBrowser.py:1672
msgid "Sukces edycji" msgid "Sukces edycji"
msgstr "Sukces edycji" msgstr "Sukces edycji"
#: ImageBrowser.py:1548 #: ImageBrowser.py:1678
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Błąd podczas aktualizacji tagów\n" "Błąd podczas aktualizacji tagów\n"
@ -331,19 +370,19 @@ msgstr ""
"Błąd podczas aktualizacji tagów\n" "Błąd podczas aktualizacji tagów\n"
"Status: {code}" "Status: {code}"
#: ImageBrowser.py:1552 #: ImageBrowser.py:1682
msgid "Treść:" msgid "Treść:"
msgstr "Treść:" msgstr "Treść:"
#: ImageBrowser.py:1556 #: ImageBrowser.py:1686
msgid "Krytyczny błąd edycji" msgid "Krytyczny błąd edycji"
msgstr "Krytyczny błąd edycji" msgstr "Krytyczny błąd edycji"
#: ImageBrowser.py:1568 #: ImageBrowser.py:1698
msgid "Potwierdzenie" msgid "Potwierdzenie"
msgstr "Potwierdzenie" msgstr "Potwierdzenie"
#: ImageBrowser.py:1570 #: ImageBrowser.py:1700
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"
@ -353,18 +392,18 @@ msgstr ""
"Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n" "Każdy z nich zostanie oznaczony tagiem 'meta:auto_upload'.\n"
"Upewnij się, że tagi są poprawne!" "Upewnij się, że tagi są poprawne!"
#: ImageBrowser.py:1589 #: ImageBrowser.py:1724
msgid "Anulowano operację!" msgid "Anulowano operację!"
msgstr "Operacja anulowana!" msgstr "Operacja anulowana!"
#: ImageBrowser.py:1597 #: ImageBrowser.py:1732
#, fuzzy, 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:1608 #: ImageBrowser.py:1748
msgid "Przesłano pliki!" msgid "Przesłano pliki!"
msgstr "Pliki zostały przesłane!" msgstr "Pliki zostały przesłane!"
@ -497,19 +536,3 @@ msgstr "Błąd podczas odczytu tag_aliases:"
#: tag_processing.py:181 #: tag_processing.py:181
msgid "Błąd podczas odczytu tags:" msgid "Błąd podczas odczytu tags:"
msgstr "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"

View File

@ -4,3 +4,4 @@ pywin32==308
Requests==2.32.3 Requests==2.32.3
wdtagger==0.13.2 wdtagger==0.13.2
bs4==0.0.2 bs4==0.0.2
tomli==2.2.1

View File

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "kapitanbooru-uploader" name = "kapitanbooru-uploader"
version = "0.4.4" version = "0.5.0"
description = "A GUI application for uploading images to KapitanBooru" description = "A GUI application for uploading images to KapitanBooru"
authors = [ authors = [
{name = "Michał Leśniak", email = "kapitan@mlesniak.pl"} {name = "Michał Leśniak", email = "kapitan@mlesniak.pl"}
@ -15,7 +15,8 @@ dependencies = [
"pywin32==308", "pywin32==308",
"requests==2.32.3", "requests==2.32.3",
"wdtagger==0.13.2", "wdtagger==0.13.2",
"bs4==0.0.2" "bs4==0.0.2",
"tomli==2.2.1"
] ]
requires-python = ">=3.13" requires-python = ">=3.13"
readme = "README.md" readme = "README.md"