Skip to content
This repository was archived by the owner on Jan 29, 2026. It is now read-only.

Commit 60dd280

Browse files
committed
feat(auto-update): enhance logging and version handling for updates; support prerelease and nightly checks
1 parent 80458f0 commit 60dd280

File tree

5 files changed

+131
-45
lines changed

5 files changed

+131
-45
lines changed

utils/auto_update.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ def update_schedule(self, process_name, config, key, instance_name):
3232
self.scheduled_update_check, process_name, config, key, instance_name
3333
)
3434
Update._jobs[process_name] = True
35-
self.logger.debug(f"Scheduled automatic update check for {process_name}")
35+
self.logger.debug(
36+
f"Scheduled automatic update check for {process_name}, w/ key: {key}, and job ID: {id(self.scheduler.jobs[-1])}"
37+
)
3638

3739
while not self.process_handler.shutting_down:
3840
self.scheduler.run_pending()
@@ -74,32 +76,46 @@ def auto_update(self, process_name, enable_update):
7476

7577
def initial_update_check(self, process_name, config, key, instance_name):
7678
with self.updating:
79+
self.logger.info(f"Performing initial update check for {process_name}")
7780
success, error = self.update_check(process_name, config, key, instance_name)
7881
if not success:
7982
if "No updates available" in error:
8083
self.logger.info(error)
84+
from utils.setup import setup_project
85+
86+
success, error = setup_project(self.process_handler, process_name)
87+
if not success:
88+
return False, f"Failed to set up {process_name}: {error}"
89+
8190
self.start_process(process_name, config, key, instance_name)
8291
else:
8392
raise RuntimeError(error)
8493

8594
def scheduled_update_check(self, process_name, config, key, instance_name):
8695
with self.updating:
96+
self.logger.info(f"Performing scheduled update check for {process_name}")
8797
success, error = self.update_check(process_name, config, key, instance_name)
8898
if not success:
8999
if "No updates available" in error:
90100
self.logger.info(error)
91-
self.start_process(process_name, config, key, instance_name)
101+
# self.start_process(process_name, config, key, instance_name)
92102
else:
93103
raise RuntimeError(error)
94104

95105
def update_check(self, process_name, config, key, instance_name):
96-
if (
97-
not key == "plex_debrid"
98-
and config.get("release_version").lower() == "nightly"
99-
):
106+
if "nightly" in config["release_version"].lower():
100107
nightly = True
108+
prerelease = False
109+
self.logger.info(f"Checking for nightly updates for {process_name}.")
110+
elif config.get("release_version").lower() == "prerelease":
111+
nightly = False
112+
prerelease = True
113+
self.logger.info(f"Checking for prerelease updates for {process_name}.")
101114
else:
102115
nightly = False
116+
prerelease = False
117+
self.logger.info(f"Checking for stable updates for {process_name}.")
118+
103119
versions = Versions()
104120
try:
105121
repo_owner = config["repo_owner"]
@@ -111,6 +127,7 @@ def update_check(self, process_name, config, key, instance_name):
111127
instance_name,
112128
key,
113129
nightly=nightly,
130+
prerelease=prerelease,
114131
)
115132

116133
if not update_needed:

utils/dmb_config_schema.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@
119119
"type": "boolean"
120120
},
121121
"auto_update_interval": {
122-
"type": "integer"
122+
"type": "number"
123123
},
124124
"clear_on_update": {
125125
"type": "boolean"
@@ -228,7 +228,7 @@
228228
"type": "boolean"
229229
},
230230
"auto_update_interval": {
231-
"type": "integer"
231+
"type": "number"
232232
},
233233
"clear_on_update": {
234234
"type": "boolean"
@@ -385,7 +385,7 @@
385385
"type": "boolean"
386386
},
387387
"auto_update_interval": {
388-
"type": "integer"
388+
"type": "number"
389389
},
390390
"clear_on_update": {
391391
"type": "boolean"
@@ -468,7 +468,7 @@
468468
"type": "boolean"
469469
},
470470
"auto_update_interval": {
471-
"type": "integer"
471+
"type": "number"
472472
},
473473
"clear_on_update": {
474474
"type": "boolean"
@@ -791,7 +791,7 @@
791791
"type": "boolean"
792792
},
793793
"auto_update_interval": {
794-
"type": "integer"
794+
"type": "number"
795795
},
796796
"symlink_library_path": {
797797
"type": "string"
@@ -915,7 +915,7 @@
915915
"type": "boolean"
916916
},
917917
"auto_update_interval": {
918-
"type": "integer"
918+
"type": "number"
919919
},
920920
"clear_on_update": {
921921
"type": "boolean"
@@ -1011,7 +1011,7 @@
10111011
"type": "boolean"
10121012
},
10131013
"auto_update_interval": {
1014-
"type": "integer"
1014+
"type": "number"
10151015
},
10161016
"clear_on_update": {
10171017
"type": "boolean"
@@ -1165,7 +1165,7 @@
11651165
"type": "boolean"
11661166
},
11671167
"auto_update_interval": {
1168-
"type": "integer"
1168+
"type": "number"
11691169
},
11701170
"clear_on_update": {
11711171
"type": "boolean"

utils/download.py

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,24 @@ def download_release_version(
8585
if CONFIG_MANAGER.get("dmb").get("github_token"):
8686
logger.debug("Using GitHub token for downloading zurg.")
8787
# repo_name = "zurg"
88-
if release_version == "nightly":
88+
if "nightly" in release_version:
8989
release_version, error = self.get_latest_release(
9090
repo_owner, repo_name, nightly=True
9191
)
9292
if error:
9393
logger.error(error)
9494
return False, error
9595

96+
elif key == "cli_debrid":
97+
architecture = None
98+
if release_version == "prerelease":
99+
release_version, error = self.get_latest_release(
100+
repo_owner, repo_name, nightly=False, prerelease=True
101+
)
102+
if error:
103+
logger.error(error)
104+
return False, error
105+
96106
elif key == "plex_debrid":
97107
branch = "main"
98108
branch_url, zip_folder_name = self.get_branch(
@@ -154,15 +164,15 @@ def download_release_version(
154164
f"Failed to download the {release_version} for {process_name}: {error}"
155165
)
156166
return False, error
157-
logger.info(
158-
f"Successfully downloaded the {release_version} for {process_name}"
159-
)
167+
logger.info(f"Successfully downloaded {release_version} for {process_name}")
160168
return True, None
161169
except Exception as e:
162170
logger.error(f"Error in download release version: {e}")
163171
return False, str(e)
164172

165-
def get_latest_release(self, repo_owner, repo_name, nightly=False):
173+
def get_latest_release(
174+
self, repo_owner, repo_name, nightly=False, prerelease=False
175+
):
166176
self.logger.debug(f"Fetching latest {repo_name} release.")
167177
headers = self.get_headers()
168178
if repo_name == "plex_debrid":
@@ -185,7 +195,7 @@ def get_latest_release(self, repo_owner, repo_name, nightly=False):
185195
)
186196
except Exception as e:
187197
return None, f"Exception while fetching version for {repo_name}: {e}"
188-
if nightly:
198+
if nightly or prerelease:
189199
api_url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/releases"
190200
else:
191201
api_url = (
@@ -203,6 +213,17 @@ def get_latest_release(self, repo_owner, repo_name, nightly=False):
203213
return latest_nightly["tag_name"], None
204214
return None, "No nightly releases found."
205215

216+
elif prerelease:
217+
prerelease_releases = [
218+
release for release in releases if release["prerelease"]
219+
]
220+
if prerelease_releases:
221+
latest_prerelease = max(
222+
prerelease_releases, key=lambda x: x["tag_name"]
223+
)
224+
return latest_prerelease["tag_name"], None
225+
return None, "No prerelease versions found."
226+
206227
else:
207228
latest_release = response.json()
208229
version_tag = latest_release["tag_name"]
@@ -241,23 +262,24 @@ def fetch_github_release_info(
241262

242263
def find_asset_download_url(self, release_info, architecture=None):
243264
assets = release_info.get("assets", [])
244-
for asset in assets:
245-
if architecture and architecture in asset["name"]:
246-
self.logger.debug(
247-
f"Assets ID found: {asset['id']} for architecture: {architecture}"
248-
)
249-
self.logger.debug(
250-
f"Browser Download URL: {asset['browser_download_url']}"
251-
)
252-
return asset["browser_download_url"], asset["id"]
265+
if architecture:
266+
for asset in assets:
267+
if architecture and architecture in asset["name"]:
268+
self.logger.debug(
269+
f"Assets ID found: {asset['id']} for architecture: {architecture}"
270+
)
271+
self.logger.debug(
272+
f"Browser Download URL: {asset['browser_download_url']}"
273+
)
274+
return asset["browser_download_url"], asset["id"]
253275

254-
if assets:
255-
self.logger.warning(
256-
"No matching asset found for architecture: %s. Falling back to the first available asset.",
257-
architecture,
258-
)
259-
self.logger.debug(f"Download URL: {asset['browser_download_url']}")
260-
return assets[0]["browser_download_url"], assets[0]["id"]
276+
if assets:
277+
self.logger.warning(
278+
"No matching asset found for architecture: %s. Falling back to the first available asset.",
279+
architecture,
280+
)
281+
self.logger.debug(f"Download URL: {asset['browser_download_url']}")
282+
return assets[0]["browser_download_url"], assets[0]["id"]
261283

262284
zipball_url = release_info.get("zipball_url")
263285
tarball_url = release_info.get("tarball_url")

utils/setup.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,34 @@ def setup_project(process_handler, process_name):
161161

162162
logger.info(f"Setting up {process_name}...")
163163
try:
164-
if config.get("release_version_enabled"):
165-
success, error = setup_release_version(
166-
process_handler, config, process_name, key
164+
if config.get("release_version_enabled") and not config.get("auto_update"):
165+
repo_owner = config.get("repo_owner")
166+
repo_name = config.get("repo_name")
167+
nightly = "nightly" in config["release_version"].lower()
168+
prerelease = config.get("release_version").lower() == "prerelease"
169+
update_needed, update_info = versions.compare_versions(
170+
process_name,
171+
repo_owner,
172+
repo_name,
173+
instance_name,
174+
key,
175+
nightly=nightly,
176+
prerelease=prerelease,
167177
)
168-
if not success:
169-
return False, error
178+
179+
if update_needed:
180+
logger.info(
181+
f"Update needed for {process_name}: {update_info['latest_version']}, but using the requested version: {config['release_version']}"
182+
)
183+
success, error = setup_release_version(
184+
process_handler, config, process_name, key
185+
)
186+
if not success:
187+
return False, error
188+
else:
189+
logger.info(
190+
f"No update needed for {process_name}: current version is {update_info['current_version']}, and requested version is: {config['release_version']}"
191+
)
170192

171193
elif config.get("branch_enabled"):
172194
success, error = setup_branch_version(
@@ -525,12 +547,16 @@ def setup_zurg_instance(instance, key_type):
525547
)
526548

527549
if not os.path.exists(instance_zurg_binaries):
550+
if instance.get("release_version_enabled"):
551+
release_version = instance.get("release_version")
552+
else:
553+
release_version = "latest"
528554
success, error = downloader.download_release_version(
529555
process_name=instance["process_name"],
530556
key="zurg",
531557
repo_owner=instance["repo_owner"],
532558
repo_name=instance["repo_name"],
533-
release_version="latest",
559+
release_version=release_version,
534560
target_dir=instance_config_dir,
535561
zip_folder_name=None,
536562
exclude_dirs=instance.get("exclude_dirs", []),

utils/versions.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ def version_check(
124124
)
125125
match = re.search(r"v?\d+(\.\d+)*", version_raw)
126126
version = match.group(0) if match else ""
127+
if key == "riven_backend":
128+
version = f"v{version}"
127129
break
128130
else:
129131
version = None
@@ -199,11 +201,18 @@ def version_write(self, process_name, key=None, version_path=None, version=None)
199201
return False, str(e)
200202

201203
def compare_versions(
202-
self, process_name, repo_owner, repo_name, instance_name, key, nightly=False
204+
self,
205+
process_name,
206+
repo_owner,
207+
repo_name,
208+
instance_name,
209+
key,
210+
nightly=False,
211+
prerelease=False,
203212
):
204213
try:
205214
latest_release_version, error = self.downloader.get_latest_release(
206-
repo_owner, repo_name, nightly=nightly
215+
repo_owner, repo_name, nightly=nightly, prerelease=prerelease
207216
)
208217
if not latest_release_version:
209218
self.logger.error(
@@ -217,7 +226,19 @@ def compare_versions(
217226
self.logger.error(
218227
f"Failed to get the current version for {process_name}: {error}"
219228
)
220-
raise Exception(error)
229+
current_version = "0.0.0"
230+
self.logger.error(
231+
f"Setting current version to 0.0.0 for {process_name}"
232+
)
233+
# raise Exception(error)
234+
if nightly:
235+
current_date = ".".join(current_version.split(".")[0:3])
236+
latest_date = ".".join(latest_release_version.split(".")[0:3])
237+
if current_date == latest_date:
238+
return False, {
239+
"message": "No updates available (same nightly date)",
240+
"current_version": current_version,
241+
}
221242
if current_version == latest_release_version:
222243
return False, {
223244
"message": "No updates available",

0 commit comments

Comments
 (0)