Scripts/ObsidianUpdateChecker/main.py

67 lines
2.2 KiB
Python

# Import json parsing and urllib
import json
import urllib.request
# Import subprocess for running dpkg
import subprocess
# Endpoint for the latest release
API_URL = "https://api.github.com/repos/obsidianmd/obsidian-releases/releases/latest"
# DEB file name, will be filled in later
DEB_NAME = ""
# URL for the latest deb file, will be filled in later
DEB_URL = ""
# Version number, will be filled in later
DEB_VERSION = ""
# Installed version number, will be filled in later
INSTALLED_VERSION = ""
# Get the latest release from the API
with urllib.request.urlopen(API_URL) as url:
data = json.loads(url.read().decode())
assets = data["assets"]
for asset in assets:
if asset["name"].endswith(".deb"):
DEB_NAME = asset["name"]
DEB_URL = asset["browser_download_url"]
# Parse the version number from the deb file name
# Example: obsidian_0.12.15_amd64.deb -> 0.12.15
DEB_VERSION = DEB_NAME.split("_")[1]
print("Latest version: " + DEB_VERSION)
# Get the installed version number by parsing the output of dpkg -s obsidian
output = subprocess.run(["dpkg", "-s", "obsidian"], capture_output=True)
# Parse the output for the version number
# Example: Version: 0.12.15
for line in output.stdout.decode().split("\n"):
if line.startswith("Version:"):
INSTALLED_VERSION = line.split(" ")[1]
print("Installed version: " + INSTALLED_VERSION)
def semver_check_new(old, new):
# Split the version numbers into arrays of numbers
old_split = old.split(".")
new_split = new.split(".")
# Loop through the numbers
for i in range(len(old_split)):
# If the new version is higher, return true
if int(new_split[i]) > int(old_split[i]):
return True
# If the new version is the same or lower, return false
return False
# Check if the new version is higher than the installed version
if semver_check_new(INSTALLED_VERSION, DEB_VERSION):
print("New version available!")
# Download the deb file
urllib.request.urlretrieve(DEB_URL, DEB_NAME)
# Install the deb file
subprocess.run(["pkexec", "apt", "install", f"./{DEB_NAME}"])
# Remove the deb file
subprocess.run(["rm", DEB_NAME])
else:
print("No new version available")