Merge pull request #13 from faroukbmiled/refactored

From bs4 to API for item updater
This commit is contained in:
Ryuk 2023-09-29 09:24:51 -07:00 committed by GitHub
commit fc5cf39325
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 140 additions and 106 deletions

34
boiiiwd_package/info.json Normal file
View File

@ -0,0 +1,34 @@
{
"response": {
"result": 1,
"resultcount": 1,
"publishedfiledetails": [
{
"publishedfileid": "770675911",
"result": 1,
"creator": "76561198294963547",
"creator_app_id": 455130,
"consumer_app_id": 311210,
"filename": "",
"file_size": 0,
"file_url": "",
"hcontent_file": "3845203201590843337",
"preview_url": "https://steamuserimages-a.akamaihd.net/ugc/262722490466018040/361198F0A8D4F1479CD8F75E7A4A78354592EAF3/",
"hcontent_preview": "262722490466018040",
"title": "Zombies Life Timer",
"description": "On-screen text that tells you how long you've been alive in Zombies. Only works in user-created maps.",
"time_created": 1474934901,
"time_updated": 1474934901,
"visibility": 0,
"banned": 0,
"ban_reason": "",
"subscriptions": 4900,
"favorited": 33,
"lifetime_subscriptions": 10835,
"lifetime_favorited": 46,
"views": 9038,
"tags": []
}
]
}
}

View File

@ -25,8 +25,8 @@ def save_config(name, value):
config.write(config_file) config.write(config_file)
def check_custom_theme(theme_name): def check_custom_theme(theme_name):
if os.path.exists(os.path.join(application_path, theme_name)): if os.path.exists(os.path.join(APPLICATION_PATH, theme_name)):
return os.path.join(application_path, theme_name) return os.path.join(APPLICATION_PATH, theme_name)
else: else:
try: return os.path.join(RESOURCES_DIR, theme_name) try: return os.path.join(RESOURCES_DIR, theme_name)
except: return os.path.join(RESOURCES_DIR, "boiiiwd_theme.json") except: return os.path.join(RESOURCES_DIR, "boiiiwd_theme.json")
@ -171,20 +171,10 @@ def initialize_steam(master):
@if_internet_available @if_internet_available
def valid_id(workshop_id): def valid_id(workshop_id):
url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" data = item_steam_api(workshop_id)
response = requests.get(url) if "consumer_app_id" in data['response']['publishedfiledetails'][0]:
response.raise_for_status()
content = response.text
soup = BeautifulSoup(content, "html.parser")
try:
soup.find("div", class_="rightDetailsBlock").text.strip()
soup.find("div", class_="workshopItemTitle").text.strip()
soup.find("div", class_="detailsStatRight").text.strip()
stars_div = soup.find("div", class_="fileRatingDetails")
stars_div.find("img")["src"]
return True return True
except: else:
return False return False
def convert_speed(speed_bytes): def convert_speed(speed_bytes):
@ -200,7 +190,7 @@ def convert_speed(speed_bytes):
def create_default_config(): def create_default_config():
config = configparser.ConfigParser() config = configparser.ConfigParser()
config["Settings"] = { config["Settings"] = {
"SteamCMDPath": application_path, "SteamCMDPath": APPLICATION_PATH,
"DestinationFolder": "", "DestinationFolder": "",
"checkforupdtes": "on", "checkforupdtes": "on",
"console": "off" "console": "off"
@ -211,7 +201,7 @@ def create_default_config():
def get_steamcmd_path(): def get_steamcmd_path():
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read(CONFIG_FILE_PATH) config.read(CONFIG_FILE_PATH)
return config.get("Settings", "SteamCMDPath", fallback=application_path) return config.get("Settings", "SteamCMDPath", fallback=APPLICATION_PATH)
def extract_json_data(json_path, key): def extract_json_data(json_path, key):
with open(json_path, 'r') as json_file: with open(json_path, 'r') as json_file:
@ -227,26 +217,13 @@ def convert_bytes_to_readable(size_in_bytes, no_symb=None):
size_in_bytes /= 1024.0 size_in_bytes /= 1024.0
def get_workshop_file_size(workshop_id, raw=None): def get_workshop_file_size(workshop_id, raw=None):
url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}&searchtext=" data = item_steam_api(workshop_id)
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
file_size_element = soup.find("div", class_="detailsStatRight")
try: try:
file_size_in_bytes = data['response']['publishedfiledetails'][0]['file_size']
if raw: if raw:
file_size_text = file_size_element.get_text(strip=True)
file_size_text = file_size_text.replace(",", "")
file_size_in_mb = float(file_size_text.replace(" MB", ""))
file_size_in_bytes = int(file_size_in_mb * 1024 * 1024)
return convert_bytes_to_readable(file_size_in_bytes) return convert_bytes_to_readable(file_size_in_bytes)
else:
if file_size_element:
file_size_text = file_size_element.get_text(strip=True)
file_size_text = file_size_text.replace(",", "")
file_size_in_mb = float(file_size_text.replace(" MB", ""))
file_size_in_bytes = int(file_size_in_mb * 1024 * 1024)
return file_size_in_bytes return file_size_in_bytes
return None
except: except:
return None return None
@ -351,16 +328,9 @@ def reset_steamcmd(no_warn=None):
def get_item_name(id): def get_item_name(id):
try: try:
url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={id}" data = item_steam_api(id)
response = requests.get(url)
response.raise_for_status()
content = response.text
soup = BeautifulSoup(content, "html.parser")
try: try:
map_name = soup.find("div", class_="workshopItemTitle").text.strip() name = data['response']['publishedfiledetails'][0]['title']
name = map_name[:32] + "..." if len(map_name) > 32 else map_name
return name return name
except: except:
return True return True
@ -381,14 +351,9 @@ def check_item_date(down_date, date_updated):
except ValueError: except ValueError:
download_datetime = datetime.strptime(down_date + f", {current_year}", date_format_with_added_year) download_datetime = datetime.strptime(down_date + f", {current_year}", date_format_with_added_year)
try: if date_updated >= download_datetime:
upload_datetime = datetime.strptime(date_updated, date_format_with_year)
except ValueError:
upload_datetime = datetime.strptime(date_updated + f", {current_year}", date_format_with_added_year)
if upload_datetime >= download_datetime:
return True return True
elif upload_datetime < download_datetime: elif date_updated < download_datetime:
return False return False
except: except:
return False return False
@ -414,4 +379,39 @@ def save_window_size_to_registry(width, height, x, y):
except Exception as e: except Exception as e:
print(f"Error saving to registry: {e}") print(f"Error saving to registry: {e}")
def item_steam_api(id):
try:
url = ITEM_INFO_API
data = {
"itemcount": 1,
"publishedfileids[0]": int(id),
}
info = requests.post(url, data=data)
return info.json()
except Exception as e:
print(e)
return False
def get_item_dates(ids):
try:
data = {
"itemcount": len(ids),
}
for i, id in enumerate(ids):
data[f"publishedfileids[{i}]"] = int(id)
info = requests.post(ITEM_INFO_API, data=data)
response_data = info.json()
if "response" in response_data:
item_details = response_data["response"]["publishedfiledetails"]
return {item["publishedfileid"]: item["time_updated"] for item in item_details}
return {}
except Exception as e:
print(e)
return {}
# End helper functions # End helper functions

View File

@ -1,6 +1,5 @@
import configparser import configparser
import io import io
import json
import math import math
import os import os
import re import re
@ -11,15 +10,18 @@ import threading
import time import time
import webbrowser import webbrowser
import zipfile import zipfile
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
from tkinter import END, Event, Menu from tkinter import END, Event, Menu
import customtkinter as ctk import customtkinter as ctk
import ujson as json
import psutil import psutil
import requests import requests
import winreg import winreg
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from CTkMessagebox import CTkMessagebox from CTkMessagebox import CTkMessagebox
from PIL import Image from PIL import Image
@ -32,15 +34,16 @@ if getattr(sys, 'frozen', False):
# If the application is run as a bundle, the PyInstaller bootloader # If the application is run as a bundle, the PyInstaller bootloader
# extends the sys module by a flag frozen=True and sets the app # extends the sys module by a flag frozen=True and sets the app
# path into variable _MEIPASS'. # path into variable _MEIPASS'.
application_path = os.path.dirname(sys.executable) APPLICATION_PATH = os.path.dirname(sys.executable)
else: else:
application_path = os.path.dirname(os.path.abspath(__file__)) APPLICATION_PATH = os.path.dirname(os.path.abspath(__file__))
CONFIG_FILE_PATH = "config.ini" CONFIG_FILE_PATH = "config.ini"
GITHUB_REPO = "faroukbmiled/BOIIIWD" GITHUB_REPO = "faroukbmiled/BOIIIWD"
ITEM_INFO_API = "https://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1/"
LATEST_RELEASE_URL = "https://github.com/faroukbmiled/BOIIIWD/releases/latest/download/Release.zip" LATEST_RELEASE_URL = "https://github.com/faroukbmiled/BOIIIWD/releases/latest/download/Release.zip"
LIBRARY_FILE = "boiiiwd_library.json" LIBRARY_FILE = "boiiiwd_library.json"
RESOURCES_DIR = os.path.join(os.path.dirname(__file__), '..', 'resources') RESOURCES_DIR = os.path.join(os.path.dirname(__file__), '..', 'resources')
UPDATER_FOLDER = "update" UPDATER_FOLDER = "update"
REGISTRY_KEY_PATH = r"Software\BOIIIWD" REGISTRY_KEY_PATH = r"Software\BOIIIWD"
VERSION = "v0.3.1" VERSION = "v0.3.2"

View File

@ -256,7 +256,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
folders_to_process = [mods_folder, maps_folder] folders_to_process = [mods_folder, maps_folder]
ui_items_to_add = [] ui_items_to_add = []
items_file = os.path.join(application_path, LIBRARY_FILE) items_file = os.path.join(APPLICATION_PATH, LIBRARY_FILE)
if not self.is_valid_json_format(items_file): if not self.is_valid_json_format(items_file):
try: self.rename_invalid_json_file(items_file) try: self.rename_invalid_json_file(items_file)
except: pass except: pass
@ -409,7 +409,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
creation_timestamp = zone_path.stat().st_mtime creation_timestamp = zone_path.stat().st_mtime
date_added = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p") date_added = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p")
items_file = os.path.join(application_path, LIBRARY_FILE) items_file = os.path.join(APPLICATION_PATH, LIBRARY_FILE)
item_info = { item_info = {
"id": workshop_id, "id": workshop_id,
@ -425,7 +425,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
show_message("Error updating json file", f"Error while updating library json file\n{e}") show_message("Error updating json file", f"Error while updating library json file\n{e}")
def remove_item(self, item, folder, id): def remove_item(self, item, folder, id):
items_file = os.path.join(application_path, LIBRARY_FILE) items_file = os.path.join(APPLICATION_PATH, LIBRARY_FILE)
for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list): for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list):
if item == label.cget("text"): if item == label.cget("text"):
self.added_folders.remove(os.path.basename(folder)) self.added_folders.remove(os.path.basename(folder))
@ -622,7 +622,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
url, workshop_id, invalid_warn, folder, description ,online,offline_date=None): url, workshop_id, invalid_warn, folder, description ,online,offline_date=None):
def main_thread(): def main_thread():
try: try:
items_file = os.path.join(application_path, LIBRARY_FILE) items_file = os.path.join(APPLICATION_PATH, LIBRARY_FILE)
top = ctk.CTkToplevel(self) top = ctk.CTkToplevel(self)
if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")):
top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico")))
@ -849,51 +849,40 @@ class LibraryTab(ctk.CTkScrollableFrame):
# Needed to refresh item that needs updates # Needed to refresh item that needs updates
self.to_update.clear() self.to_update.clear()
def if_id_needs_update(item_id, item_date, text): def if_ids_need_update(item_ids, item_dates, texts):
try: try:
headers = {'Cache-Control': 'no-cache'} item_data = get_item_dates(item_ids)
url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={item_id}"
response = requests.get(url, headers=headers)
response.raise_for_status()
content = response.text
soup = BeautifulSoup(content, "html.parser")
details_stats_container = soup.find("div", class_="detailsStatsContainerRight")
details_stat_elements = details_stats_container.find_all("div", class_="detailsStatRight")
try:
date_updated = details_stat_elements[2].text.strip()
except:
try:
date_updated = details_stat_elements[1].text.strip()
except:
return False
if check_item_date(item_date, date_updated): for item_id, date_updated in item_data.items():
self.to_update.add(text + f" | Updated: {date_updated}") item_date = item_dates[item_id]
return True date_updated = datetime.fromtimestamp(date_updated)
else:
return False if check_item_date(item_date, date_updated):
date_updated = date_updated.strftime("%d %b @ %I:%M%p, %Y")
self.to_update.add(texts[item_id] + f" | Updated: {date_updated}")
except Exception as e: except Exception as e:
show_message("Error", f"Error occured\n{e}", icon="cancel") show_message("Error", f"Error occurred\n{e}", icon="cancel")
return
def check_for_update(): def check_for_update():
try: try:
lib_data = None lib_data = None
if not os.path.exists(os.path.join(application_path, LIBRARY_FILE)): if not os.path.exists(os.path.join(APPLICATION_PATH, LIBRARY_FILE)):
show_message("Error checking for item updates! -> Setting is on", "Please visit library tab at least once with the correct boiii path!, you also need to have at lease 1 item!") show_message("Error checking for item updates! -> Setting is on", "Please visit library tab at least once with the correct boiii path!, you also need to have at least 1 item!")
return return
with open(LIBRARY_FILE, 'r') as file: with open(os.path.join(APPLICATION_PATH, LIBRARY_FILE), 'r') as file:
lib_data = json.load(file) lib_data = json.load(file)
for item in lib_data: item_ids = [item["id"] for item in lib_data]
item_id = item["id"] item_dates = {item["id"]: item["date"] for item in lib_data}
item_date = item["date"] texts = {item["id"]: item["text"] for item in lib_data}
if_id_needs_update(item_id, item_date, item["text"])
if_ids_need_update(item_ids, item_dates, texts)
except: except:
show_message("Error checking for item updates!", "Please visit library tab at least once with the correct boiii path!, you also need to have at lease 1 item!") show_message("Error checking for item updates!", "Please visit the library tab at least once with the correct boiii path!, you also need to have at least 1 item!")
return return
check_for_update() check_for_update()
@ -916,7 +905,8 @@ class LibraryTab(ctk.CTkScrollableFrame):
top.title("Item updater - List of Items with Updates - Click to select 1 or more") top.title("Item updater - List of Items with Updates - Click to select 1 or more")
longest_text_length = max(len(text) for text in self.to_update) longest_text_length = max(len(text) for text in self.to_update)
window_width = longest_text_length * 6 + 5 window_width = longest_text_length * 6 + 5
top.geometry(f"{window_width}x450") _, _, x, y = get_window_size_from_registry()
top.geometry(f"{window_width}x450+{x}+{y}")
top.attributes('-topmost', 'true') top.attributes('-topmost', 'true')
top.resizable(True, True) top.resizable(True, True)
selected_id_list = [] selected_id_list = []

View File

@ -430,7 +430,7 @@ class BOIIIWD(ctk.CTk):
def load_configs(self): def load_configs(self):
if os.path.exists(CONFIG_FILE_PATH): if os.path.exists(CONFIG_FILE_PATH):
destination_folder = check_config("DestinationFolder", "") destination_folder = check_config("DestinationFolder", "")
steamcmd_path = check_config("SteamCMDPath", application_path) steamcmd_path = check_config("SteamCMDPath", APPLICATION_PATH)
new_appearance_mode = check_config("appearance", "Dark") new_appearance_mode = check_config("appearance", "Dark")
new_scaling = check_config("scaling", 1.0) new_scaling = check_config("scaling", 1.0)
self.edit_destination_folder.delete(0, "end") self.edit_destination_folder.delete(0, "end")
@ -453,7 +453,7 @@ class BOIIIWD(ctk.CTk):
scaling_int = math.trunc(scaling_float) scaling_int = math.trunc(scaling_float)
self.settings_tab.scaling_optionemenu.set(f"{scaling_int}%") self.settings_tab.scaling_optionemenu.set(f"{scaling_int}%")
self.edit_steamcmd_path.delete(0, "end") self.edit_steamcmd_path.delete(0, "end")
self.edit_steamcmd_path.insert(0, application_path) self.edit_steamcmd_path.insert(0, APPLICATION_PATH)
create_default_config() create_default_config()
def help_queue_text_func(self, event=None): def help_queue_text_func(self, event=None):
@ -522,11 +522,11 @@ class BOIIIWD(ctk.CTk):
@if_internet_available @if_internet_available
def download_steamcmd(self): def download_steamcmd(self):
self.edit_steamcmd_path.delete(0, "end") self.edit_steamcmd_path.delete(0, "end")
self.edit_steamcmd_path.insert(0, application_path) self.edit_steamcmd_path.insert(0, APPLICATION_PATH)
save_config("DestinationFolder" ,self.edit_destination_folder.get()) save_config("DestinationFolder" ,self.edit_destination_folder.get())
save_config("SteamCMDPath" ,self.edit_steamcmd_path.get()) save_config("SteamCMDPath" ,self.edit_steamcmd_path.get())
steamcmd_url = "https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip" steamcmd_url = "https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip"
steamcmd_zip_path = os.path.join(application_path, "steamcmd.zip") steamcmd_zip_path = os.path.join(APPLICATION_PATH, "steamcmd.zip")
try: try:
response = requests.get(steamcmd_url) response = requests.get(steamcmd_url)
@ -536,7 +536,7 @@ class BOIIIWD(ctk.CTk):
zip_file.write(response.content) zip_file.write(response.content)
with zipfile.ZipFile(steamcmd_zip_path, "r") as zip_ref: with zipfile.ZipFile(steamcmd_zip_path, "r") as zip_ref:
zip_ref.extractall(application_path) zip_ref.extractall(APPLICATION_PATH)
if check_steamcmd(): if check_steamcmd():
os.remove(fr"{steamcmd_zip_path}") os.remove(fr"{steamcmd_zip_path}")
@ -1286,7 +1286,7 @@ class BOIIIWD(ctk.CTk):
if os.path.exists(json_file_path): if os.path.exists(json_file_path):
self.label_speed.configure(text="Installing...") self.label_speed.configure(text="Installing...")
mod_type = extract_json_data(json_file_path, "Type") mod_type = extract_json_data(json_file_path, "Type")
items_file = os.path.join(application_path, LIBRARY_FILE) items_file = os.path.join(APPLICATION_PATH, LIBRARY_FILE)
item_exists,_ = self.library_tab.item_exists_in_file(items_file, workshop_id) item_exists,_ = self.library_tab.item_exists_in_file(items_file, workshop_id)
if item_exists: if item_exists:
@ -1552,7 +1552,7 @@ class BOIIIWD(ctk.CTk):
if os.path.exists(json_file_path): if os.path.exists(json_file_path):
self.label_speed.configure(text="Installing...") self.label_speed.configure(text="Installing...")
mod_type = extract_json_data(json_file_path, "Type") mod_type = extract_json_data(json_file_path, "Type")
items_file = os.path.join(application_path, LIBRARY_FILE) items_file = os.path.join(APPLICATION_PATH, LIBRARY_FILE)
item_exists,_ = self.library_tab.item_exists_in_file(items_file, workshop_id) item_exists,_ = self.library_tab.item_exists_in_file(items_file, workshop_id)
if item_exists: if item_exists:

View File

@ -174,7 +174,7 @@ class SettingsTab(ctk.CTkFrame):
if response == "No": if response == "No":
return return
elif response == "Ok": elif response == "Ok":
os.system(f"notepad {os.path.join(application_path, 'config.ini')}") os.system(f"notepad {os.path.join(APPLICATION_PATH, 'config.ini')}")
else: else:
return return
self.after(0, callback) self.after(0, callback)
@ -363,7 +363,7 @@ class SettingsTab(ctk.CTkFrame):
if setting == "theme": if setting == "theme":
theme_config = check_config("theme", "boiiiwd_theme.json") theme_config = check_config("theme", "boiiiwd_theme.json")
if os.path.exists(os.path.join(application_path, theme_config)): if os.path.exists(os.path.join(APPLICATION_PATH, theme_config)):
return "Custom" return "Custom"
if theme_config == "boiiiwd_theme.json": if theme_config == "boiiiwd_theme.json":
@ -377,11 +377,11 @@ class SettingsTab(ctk.CTkFrame):
return 1 if check_config(setting, fallback) == "on" else 0 return 1 if check_config(setting, fallback) == "on" else 0
def boiiiwd_custom_theme(self, disable_only=None): def boiiiwd_custom_theme(self, disable_only=None):
file_to_rename = os.path.join(application_path, "boiiiwd_theme.json") file_to_rename = os.path.join(APPLICATION_PATH, "boiiiwd_theme.json")
if os.path.exists(file_to_rename): if os.path.exists(file_to_rename):
timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
new_name = f"boiiiwd_theme_{timestamp}.json" new_name = f"boiiiwd_theme_{timestamp}.json"
os.rename(file_to_rename, os.path.join(application_path, new_name)) os.rename(file_to_rename, os.path.join(APPLICATION_PATH, new_name))
if not disable_only: if not disable_only:
show_message("Preset file renamed", "Custom preset disabled, file has been renmaed\n* Restart the app to take effect", icon="info") show_message("Preset file renamed", "Custom preset disabled, file has been renmaed\n* Restart the app to take effect", icon="info")
@ -389,14 +389,15 @@ class SettingsTab(ctk.CTkFrame):
if disable_only: if disable_only:
return return
try: try:
shutil.copy(os.path.join(RESOURCES_DIR, check_config("theme", "boiiiwd_theme.json")), os.path.join(application_path, "boiiiwd_theme.json")) shutil.copy(os.path.join(RESOURCES_DIR, check_config("theme", "boiiiwd_theme.json")), os.path.join(APPLICATION_PATH, "boiiiwd_theme.json"))
except: except:
shutil.copy(os.path.join(RESOURCES_DIR, "boiiiwd_theme.json"), os.path.join(application_path, "boiiiwd_theme.json")) shutil.copy(os.path.join(RESOURCES_DIR, "boiiiwd_theme.json"), os.path.join(APPLICATION_PATH, "boiiiwd_theme.json"))
show_message("Preset file created", "You can now edit boiiiwd_theme.json in the current directory to your liking\n* Edits will apply next time you open boiiiwd\n* Program will always take boiiiwd_theme.json as the first theme option if found\n* Click on this button again to disable your custom theme or just rename boiiiwd_theme.json", icon="info") show_message("Preset file created", "You can now edit boiiiwd_theme.json in the current directory to your liking\n* Edits will apply next time you open boiiiwd\n* Program will always take boiiiwd_theme.json as the first theme option if found\n* Click on this button again to disable your custom theme or just rename boiiiwd_theme.json", icon="info")
def settings_check_for_updates(self): def settings_check_for_updates(self):
check_for_updates_func(self, ignore_up_todate=False) check_for_updates_func(self, ignore_up_todate=False)
# make this rename to {id}_duplicate as a fallback
def rename_all_folders(self, option): def rename_all_folders(self, option):
boiiiFolder = main_app.app.edit_destination_folder.get() boiiiFolder = main_app.app.edit_destination_folder.get()
maps_folder = os.path.join(boiiiFolder, "mods") maps_folder = os.path.join(boiiiFolder, "mods")
@ -436,14 +437,20 @@ class SettingsTab(ctk.CTkFrame):
folder_to_rename = os.path.join(folder_path, folder_name) folder_to_rename = os.path.join(folder_path, folder_name)
new_folder_name = new_name new_folder_name = new_name
while new_folder_name in processed_names: while new_folder_name in processed_names:
new_folder_name += f"_{publisher_id}" if option == "PublisherID":
new_folder_name += f"_duplicated"
else:
new_folder_name += f"_{publisher_id}"
if folder_name == new_folder_name: if folder_name == new_folder_name:
rename_flag = False rename_flag = False
break break
new_path = os.path.join(folder_path, new_folder_name) new_path = os.path.join(folder_path, new_folder_name)
while os.path.exists(new_path): while os.path.exists(new_path):
new_folder_name += f"_{publisher_id}" if option == "PublishedID":
new_folder_name += f"_duplicated"
else:
new_folder_name += f"_{publisher_id}"
if folder_name == new_folder_name: if folder_name == new_folder_name:
rename_flag = False rename_flag = False
break break
@ -618,7 +625,7 @@ class SettingsTab(ctk.CTkFrame):
if os.path.exists(json_file_path): if os.path.exists(json_file_path):
workshop_id = extract_json_data(json_file_path, "PublisherID") workshop_id = extract_json_data(json_file_path, "PublisherID")
mod_type = extract_json_data(json_file_path, "Type") mod_type = extract_json_data(json_file_path, "Type")
items_file = os.path.join(application_path, LIBRARY_FILE) items_file = os.path.join(APPLICATION_PATH, LIBRARY_FILE)
item_exists,_ = main_app.app.library_tab.item_exists_in_file(items_file, workshop_id) item_exists,_ = main_app.app.library_tab.item_exists_in_file(items_file, workshop_id)
if item_exists: if item_exists:

View File

@ -81,7 +81,7 @@ class UpdateWindow(ctk.CTkToplevel):
def update_progress_bar(self): def update_progress_bar(self):
try: try:
update_dir = os.path.join(application_path, UPDATER_FOLDER) update_dir = os.path.join(APPLICATION_PATH, UPDATER_FOLDER)
response = requests.get(LATEST_RELEASE_URL, stream=True) response = requests.get(LATEST_RELEASE_URL, stream=True)
response.raise_for_status() response.raise_for_status()
current_exe = sys.argv[0] current_exe = sys.argv[0]