Added self-update functionality and changelog viewer

This commit is contained in:
frarol96 2023-10-01 13:10:23 +00:00
parent 22167cb1d3
commit 172d3afd8d

View File

@ -2,17 +2,24 @@ import cv2
import os import os
import numpy as np import numpy as np
import tkinter as tk import tkinter as tk
import tkdnd
from tkinterdnd2 import DND_FILES, TkinterDnD from tkinterdnd2 import DND_FILES, TkinterDnD
from tkinter import filedialog, simpledialog, messagebox from tkinter import filedialog, simpledialog, messagebox, scrolledtext
from datetime import datetime from datetime import datetime
import sys import sys
import webbrowser import webbrowser
import screeninfo import screeninfo
import feedparser
import subprocess
import platform
import urllib.request
import re
from bs4 import BeautifulSoup
print(f"New start\n")
# Constants # Constants
v2cversion1 = 1 v2cversion1 = 1
v2cversion2 = 0 v2cversion2 = 1
v2cversion3 = 0 v2cversion3 = 0
v2cversion = f"{v2cversion1}.{v2cversion2}.{v2cversion3}" v2cversion = f"{v2cversion1}.{v2cversion2}.{v2cversion3}"
frame_step = 100 frame_step = 100
@ -21,9 +28,168 @@ SAVE = True
SHOW = True SHOW = True
processing = False processing = False
# Define the RSS feed URL
rss_feed_url = "https://git.rolfsvaag.no/frarol96/Video2Crops/releases.rss"
# Create the root window # Create the root window
root = TkinterDnD.Tk() root = TkinterDnD.Tk()
root.title("Video2Crops") root.title("Video2Crops")
root.geometry("300x450")
def open_changelog_window():
changelog_window = tk.Toplevel(root)
changelog_window.title("Video2Crops Changelog")
try:
# Parse the RSS feed
feed = feedparser.parse(rss_feed_url)
if not feed.entries:
scrolled_text = scrolledtext.ScrolledText(changelog_window, wrap=tk.WORD)
scrolled_text.pack(fill=tk.BOTH, expand=True)
scrolled_text.insert(tk.END, "No updates available.")
return
# Create a single scrolled text widget to display all changelog entries
scrolled_text = scrolledtext.ScrolledText(changelog_window, wrap=tk.WORD)
scrolled_text.pack(fill=tk.BOTH, expand=True)
entry_num = 0
for entry in feed.entries:
entry_num += 1
version_str = extract_version(entry.link)
changelog_md = extract_changelog(entry.content[0].value)
if version_str is not None and changelog_md is not None:
version_info = f"# v{version_str}"
print(version_str)
if str(version_str) == str(v2cversion) and entry_num == 1:
version_info += "(up to date)"
elif str(version_str) == str(v2cversion):
version_info += "(current)"
elif entry_num == 1:
version_info += "(latest)"
version_info += "\n"
date_pattern = r'(\w{3}, \d{2} \w{3} \d{4})'
pub_date = re.search(date_pattern, entry.published)
if pub_date:
rel_date = pub_date.group(1)
version_info += f"\n{rel_date}\n\n"
# Append the version information and changelog entry to the scrolled text widget
changelog_text = version_info + changelog_md + f"\n--------------------\n"
scrolled_text.insert(tk.END, changelog_text)
except Exception as e:
scrolled_text = scrolledtext.ScrolledText(changelog_window, wrap=tk.WORD)
scrolled_text.pack(fill=tk.BOTH, expand=True)
scrolled_text.insert(tk.END, f"An error occurred: {str(e)}")
def extract_version(title):
# Use regular expressions to extract the version number from the title
match = re.search(r'(\d+\.\d+\.\d+)', title)
if match:
return match.group(1)
return None
def extract_changelog(description):
# Parse the HTML content using BeautifulSoup
soup = BeautifulSoup(description, 'html.parser')
# Find all changelog sections
changelog_sections = soup.find_all('h3', id='user-content-changelog')
changelogs = []
for changelog_section in changelog_sections:
# Extract the changelog text as plain text
changelog_text = changelog_section.find_next('ul').get_text()
changelogs.append(changelog_text.strip())
# Join the changelogs into a single string
changelog_str = '\n'.join(changelogs)
return changelog_str if changelog_str else None
# Function for updating Video2Crops
def check_for_updates():
try:
# Parse the RSS feed
feed = feedparser.parse(rss_feed_url)
if not feed.entries:
response = tk.messagebox.showinfo(
"No updates found",
f"Latest version: ({v2cversion})\n"
f"Current version: ({v2cversion})\n"
)
return
# Get the latest release
latest_release = feed.entries[0]
latest_version_str = extract_version(latest_release.link)
if latest_version_str is None:
tk.messagebox.showinfo(
"No update Available",
f"Latest version: ({v2cversion})\n"
f"Current version: ({v2cversion})\n"
)
return
print(f"RSS Version: {latest_version_str}")
# Extract version numbers from the latest release title
latest_version = tuple(map(int, latest_version_str.split('.')))
# Compare the versions
if latest_version > (v2cversion1, v2cversion2, v2cversion3):
# Prompt the user for an update
response = tk.messagebox.askyesno(
"Update Available",
f"A newer version ({latest_version_str}) is available.\n"
f"Current version: ({v2cversion})\n"
"Do you want to update?"
)
if response:
# Determine the platform
current_platform = platform.system().lower()
if current_platform == "windows":
# On Windows, download and run the installer
installer_url = "https://git.rolfsvaag.no/frarol96/Video2Crops/releases/download/v{}/Video2Crops-windows-installer.exe".format(latest_version_str)
try:
urllib.request.urlretrieve(installer_url, "Video2Crops-windows-installer.exe")
subprocess.Popen("Video2Crops-windows-installer.exe", shell=True)
root.quit()
except:
tk.messagebox.showinfo(
"Installer not found",
f"The installer file was not found.\nPlease check your antivirus and network connectivity"
)
elif current_platform == "linux":
# On Linux, download and run the executable
executable_url = "https://git.rolfsvaag.no/frarol96/Video2Crops/releases/download/v{}/Video2Crops-linux".format(latest_version_str)
try:
urllib.request.urlretrieve(executable_url, "Video2Crops-linux")
os.chmod("Video2Crops-linux", 0o755)
subprocess.Popen("./Video2Crops-linux", shell=True)
root.quit()
except:
tk.messagebox.showinfo(
"Executable not found",
f"The executable file was not found.\nPlease check your antivirus and network connectivity"
)
else:
tk.messagebox.showinfo(
"No update Available",
f"Latest version: ({v2cversion})\n"
f"Current version: ({v2cversion})\n"
)
except Exception as e:
tk.messagebox.showerror("Error", f"An error occurred: {str(e)}")
# Function to create the output directory and return its path # Function to create the output directory and return its path
def create_output_directory(video_filename): def create_output_directory(video_filename):
@ -352,8 +518,10 @@ info_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="Info", menu=info_menu) menu.add_cascade(label="Info", menu=info_menu)
info_menu.add_command(label="Project Folder", command=lambda: webbrowser.open(os.getcwd())) info_menu.add_command(label="Project Folder", command=lambda: webbrowser.open(os.getcwd()))
info_menu.add_separator() info_menu.add_separator()
info_menu.add_command(label="About", command=lambda: webbrowser.open("about.md")) info_menu.add_command(label="About", command=lambda: webbrowser.open("https://git.rolfsvaag.no/frarol96/Video2Crops/wiki"))
info_menu.add_command(label=f"Version: {str(v2cversion)}") info_menu.add_command(label=f"Version: {str(v2cversion)}")
info_menu.add_command(label=f"Check for updates", command=check_for_updates)
info_menu.add_command(label=f"View Changelog", command=open_changelog_window)
# Create a label for selected files # Create a label for selected files
label = tk.Label(root, text="Selected Files:") label = tk.Label(root, text="Selected Files:")