Compare commits

...

337 commits
1.4 ... main

Author SHA1 Message Date
amd64fox
aa537c63d9
Remove scheduled cron job from ms-spotify.yml
Removed scheduled cron job for the Spotify MS workflow.
2026-03-30 10:39:54 +03:00
amd64fox
3f6cba6bdd Temporarily disabled automatic sync trigger 2026-03-19 06:39:16 +03:00
GitHub Action
65dcb761bd Added version 1.2.85.519.g549a528b 2026-03-12 05:46:36 +00:00
GitHub Action
df4be06104 Added version 1.2.85.513.g45f09625 2026-03-10 06:44:25 +00:00
GitHub Actions
a6c9716521 Added deb version 1.2.84.476.ga1ff6607 2026-03-09 16:51:25 +00:00
GitHub Action
86ea359ab0 Added version 1.2.85.507.g795fff93 2026-03-07 06:44:37 +00:00
GitHub Action
2f207d2667 Added version 1.2.85.504.gbcffb495 2026-03-06 21:44:38 +00:00
GitHub Action
d26ef77ead Added version 1.2.85.436.g80477277 2026-03-05 08:58:00 +00:00
GitHub Action
a174eda2e0 Added version 1.2.85.376.g54b36020 2026-03-04 08:54:32 +00:00
GitHub Action
cc256be6ac Added version 1.2.85.339.g3ff2369a 2026-03-03 08:56:28 +00:00
GitHub Action
2892713442 Added version 1.2.85.304.gfdc80894 2026-03-02 08:57:41 +00:00
GitHub Action
acab906723 Added version 1.2.85.301.g1a6ed5dd 2026-03-01 08:42:48 +00:00
amd64fox
7728100b3b fix: use full version string (with hash) in deb commit message 2026-02-28 11:55:22 +03:00
amd64fox
6ccbafbb47 refactor: optimize async messaging, progress tracking, and task lifecycle
- Replace `std::sync::mpsc` with unbounded `crossbeam-channel` for improved async task messaging.
- Switch from Mutex-based processed counters to `AtomicU64` for lock-free, accurate progress tracking.
- Refactor `search_installers` to use a new `SearchOptions` struct.
- Improve task lifecycle handling, including better pause and cancel mechanisms.
- Adjust URL and path generation to return owned `String`s.
- Add `OnceLock` to cache compiled regular expressions.
- Implement explicit logging for HTTP 429 (Too Many Requests) and network errors.
- Simplify Start/Pause button logic in the UI.
- Update `.gitignore` to exclude crate targets.
2026-02-28 11:50:50 +03:00
GitHub Action
162fa66840 Added version 1.2.85.293.gb38c1e46 2026-02-28 08:41:24 +00:00
dependabot[bot]
7d8b10ba7d
Bump actions/download-artifact from 7 to 8 (#18)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 16:33:27 +03:00
dependabot[bot]
fcc8e2b822
Bump actions/upload-artifact from 6 to 7 (#19)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 16:33:25 +03:00
GitHub Action
fe889d1026 Added version 1.2.85.240.g6c6690ee 2026-02-27 08:58:42 +00:00
GitHub Action
8728576c0c Added version 1.2.84.476.ga1ff6607 2026-02-26 11:44:35 +00:00
GitHub Action
3a6a75235c Added version 1.2.84.477.gcfdf84e8 2026-02-26 05:44:18 +00:00
GitHub Action
c197397e58 Added version 1.2.84.474.g9f006f58 2026-02-25 05:44:31 +00:00
GitHub Action
9c21bf44bf Added version 1.2.84.472.g6eba3a1b 2026-02-24 06:45:12 +00:00
GitHub Action
f8fc5f57a0 Added version 1.2.84.465.gf71dea39 2026-02-21 06:44:34 +00:00
GitHub Action
3b72261622 Added version 1.2.84.461.g21733ba7 2026-02-20 06:45:36 +00:00
amd64fox
61c8175e2a
Change buildType from 'Release' to 'Master' 2026-02-20 06:17:55 +03:00
GitHub Action
5002fadff1 Added version 1.2.84.354.gc8499b61 2026-02-18 08:59:58 +00:00
GitHub Action
45bc01e8bd Added version 1.2.84.283.g28ba6b94 2026-02-17 09:00:17 +00:00
GitHub Action
5618c88aaf Added version 1.2.84.236.g47fd8e6c 2026-02-16 09:00:53 +00:00
GitHub Action
72054c2fec Added version 1.2.84.232.g0b0c686f 2026-02-15 08:44:34 +00:00
GitHub Action
c73b6f8c90 Added version 1.2.84.227.ge1d1fbbf 2026-02-14 08:45:07 +00:00
GitHub Action
02c04bbbda Added version 1.2.84.194.g162bfeda 2026-02-13 09:00:15 +00:00
GitHub Action
a5b9f1ff60 Added version 1.2.83.461.g4d9c3dae 2026-02-12 05:44:34 +00:00
GitHub Action
d683626a49 Added version 1.2.83.460.gb5356552 2026-02-11 05:44:28 +00:00
GitHub Action
9b82042f98 Added version 1.2.83.456.g111afea6 2026-02-10 06:44:23 +00:00
GitHub Actions
0618b8d452 Added deb version 1.2.82.428 2026-02-09 11:42:10 +00:00
GitHub Action
ad30f8389b Added version 1.2.83.453.g1fae877b 2026-02-07 06:46:04 +00:00
GitHub Action
d10399826f Added version 1.2.82.428.g0ac8be2b 2026-01-27 05:44:45 +00:00
GitHub Action
90c98c0eb8 Added version 1.2.82.423.ga54eef9e 2026-01-24 06:44:18 +00:00
GitHub Action
12e0093856 Added version 1.2.82.409.g64a0a3c3 2026-01-23 08:43:19 +00:00
GitHub Action
80e6947c87 Added version 1.2.82.344.g681cb6a8 2026-01-22 08:45:05 +00:00
GitHub Action
88e997b6dd Added version 1.2.82.286.g8d25d435 2026-01-21 08:45:52 +00:00
GitHub Action
ca7de1e166 Added version 1.2.82.158.g070b7ef8 2026-01-16 08:45:14 +00:00
GitHub Action
7e70f4f339 Added version 1.2.81.264.gb4ad4efa 2026-01-13 05:44:27 +00:00
GitHub Actions
41d837b5b0 Added deb version 1.2.79.427 2026-01-12 11:15:43 +00:00
GitHub Action
f399b5cdd6 Added version 1.2.81.259.g857fba73 2026-01-12 06:44:17 +00:00
GitHub Action
7c071de816 Added version 1.2.81.258.g6cf93e85 2026-01-10 06:45:24 +00:00
GitHub Action
be781c007e Added version 1.2.81.241.g2943f0b9 2026-01-09 06:46:22 +00:00
GitHub Action
43e10f7e0a Added version 1.2.81.198.g3726460d 2026-01-08 08:43:23 +00:00
GitHub Action
392a0235f8 Added version 1.2.81.159.g5fbc5508 2026-01-07 08:42:37 +00:00
GitHub Action
b25f0cf848 Added version 1.2.81.131.gcbfb0261 2026-01-06 08:42:41 +00:00
GitHub Action
7c537a68a0 Added version 1.2.81.107.g22b83685 2026-01-05 08:46:19 +00:00
GitHub Action
3fd9169c15 Added version 1.2.81.104.g225ec0e6 2026-01-04 08:38:57 +00:00
GitHub Action
3bb8caf576 Added version 1.2.81.102.g3fe6da12 2026-01-03 08:38:46 +00:00
GitHub Action
fda738dde1 Added version 1.2.81.88.g9670c97c 2026-01-02 08:42:46 +00:00
GitHub Action
c255e9eab8 Added version 1.2.80.358.g74e46c21 2025-12-30 06:44:28 +00:00
GitHub Action
4e61673309 Added version 1.2.80.354.gc3785978 2025-12-27 06:44:56 +00:00
GitHub Action
e179da8e48 Added version 1.2.80.349.g2efc88b5 2025-12-26 06:44:11 +00:00
GitHub Action
9e079d0968 Added version 1.2.80.334.gb3f9fc96 2025-12-25 08:39:29 +00:00
GitHub Action
5fba045c3a Added version 1.2.80.315.g30b9cfbe 2025-12-24 08:41:17 +00:00
GitHub Action
41a318e417 Added version 1.2.80.290.gabebb6aa 2025-12-23 08:41:11 +00:00
GitHub Action
80bb785d07 Added version 1.2.80.247.g4c104b06 2025-12-22 08:41:46 +00:00
GitHub Action
319354b1ac Added version 1.2.80.236.gb661a706 2025-12-21 08:36:09 +00:00
GitHub Action
501a8c9877 Added version 1.2.80.232.gcd5eb6df 2025-12-20 08:37:27 +00:00
GitHub Action
88e67df823 Added version 1.2.80.191.g39184aea 2025-12-19 08:44:22 +00:00
GitHub Action
2cdf95f4ad Added version 1.2.79.427.g80eb4a07 2025-12-19 06:44:47 +00:00
GitHub Actions
84854e9bf3 Added deb version 1.2.79.425 2025-12-17 09:22:54 +00:00
GitHub Action
59e6d4f47b Added version 1.2.79.425.g1d0fcf61 2025-12-16 06:44:13 +00:00
GitHub Action
6a1219a76e Added version 1.2.79.418.g617d91ef 2025-12-15 06:45:22 +00:00
GitHub Action
5f3103d908 Added version 1.2.79.417.g0e9f05fc 2025-12-13 06:46:39 +00:00
dependabot[bot]
18e8130d04
Bump actions/cache from 4 to 5 (#15)
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-13 04:00:08 +03:00
dependabot[bot]
0874d7f305
Bump actions/download-artifact from 6 to 7 (#16)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-13 03:59:59 +03:00
dependabot[bot]
8d610ceaad
Bump actions/upload-artifact from 5 to 6 (#17)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-13 03:59:49 +03:00
GitHub Action
29b9b1e37e Added version 1.2.79.411.g33e8b03a 2025-12-12 06:45:08 +00:00
GitHub Action
18774fa88b Added version 1.2.79.378.gf06ca97d 2025-12-11 08:43:57 +00:00
GitHub Action
f450ca818c Added version 1.2.79.250.g72d95fb3 2025-12-07 08:34:52 +00:00
GitHub Action
97fff96bd7 Added version 1.2.79.246.g768eb550 2025-12-06 08:37:00 +00:00
GitHub Action
225d47e09e Added version 1.2.79.206.g6a84c90c 2025-12-05 08:43:48 +00:00
GitHub Action
1caa61daa7 Added version 1.2.78.418.gaeeb5ebd 2025-12-03 10:44:25 +00:00
GitHub Action
8b3fce1ec2 Added version 1.2.78.410.g8ed2b60a 2025-12-01 12:45:22 +00:00
GitHub Action
e060b29562 Added version 1.2.78.409.g6aead1f8 2025-11-29 06:44:19 +00:00
GitHub Action
47258b2b26 Added version 1.2.78.397.gc2b9a506 2025-11-28 06:44:15 +00:00
GitHub Action
ed8fbaf286 Added version 1.2.78.354.gcbda56e3 2025-11-27 13:02:43 +00:00
GitHub Actions
43ce7f9302 Added deb version 1.2.77.358 2025-11-25 11:14:16 +00:00
GitHub Action
27ecd89f27 Added version 1.2.78.174.g0ea26501 2025-11-22 08:33:46 +00:00
GitHub Action
f4200c56a6 Added version 1.2.78.145.g47f556f3 2025-11-21 08:42:07 +00:00
dependabot[bot]
ee2288360e
Bump actions/checkout from 5 to 6 (#14)
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-20 22:52:55 +03:00
GitHub Action
27d16425b7 Added version 1.2.77.358.g4339a634 2025-11-19 05:44:32 +00:00
amd64fox
f7bc952f82 Reapply "Merge branch 'main' of https://github.com/LoaderSpot/LoaderSpot"
This reverts commit 07cf7fea90.
2025-11-19 02:13:21 +03:00
amd64fox
07cf7fea90 Revert "Merge branch 'main' of https://github.com/LoaderSpot/LoaderSpot"
This reverts commit e5cd965530, reversing
changes made to c77736ccc5.
2025-11-19 02:10:36 +03:00
amd64fox
e5cd965530 Merge branch 'main' of https://github.com/LoaderSpot/LoaderSpot 2025-11-19 02:09:26 +03:00
GitHub Action
43271f0004 Added version 1.2.56.259.g35fc40b3 2025-11-18 06:46:50 +00:00
GitHub Action
8d94b700f1 Added version 1.2.53.257.g47fa6c39 2025-11-18 06:44:53 +00:00
GitHub Action
ee6cc93a0b Added version 1.2.77.357.g6a28e474 2025-11-18 05:44:59 +00:00
GitHub Action
b89472d397 Added version 1.2.52.402.g4f67b282 2025-11-18 05:44:10 +00:00
GitHub Action
a505191e0e Added version 1.2.58.318.gc4769917 2025-11-18 04:46:26 +00:00
GitHub Action
387b329651 Added version 1.2.53.259.gecba76ba 2025-11-18 04:45:05 +00:00
GitHub Action
ca9b8c328b Added version 1.2.52.337.g72641da6 2025-11-18 04:44:09 +00:00
GitHub Action
9a887ca2d0 Added version 1.2.58.354.ga9e5d5dd 2025-11-18 03:46:58 +00:00
GitHub Action
947986fd6c Added version 1.2.57.301.gb804e5ce 2025-11-18 03:45:54 +00:00
GitHub Action
d6fb0f0483 Added version 1.2.52.297.g9ad95283 2025-11-18 03:45:05 +00:00
GitHub Action
1fb610a32e Added version 1.2.62.398.g54159197 2025-11-18 03:23:10 +00:00
GitHub Action
6e8aeba93d Added version 1.2.51.292.g9ae239fb 2025-11-18 03:22:03 +00:00
amd64fox
ff58033e51
Update update_version.py 2025-11-18 06:09:40 +03:00
amd64fox
1c69604346
Update version-check.yml 2025-11-18 06:08:50 +03:00
amd64fox
660715dd7b
Update version-check.yml 2025-11-18 06:07:29 +03:00
amd64fox
06ba92fc54
Update update_versions.yml 2025-11-18 06:06:50 +03:00
amd64fox
5717fb178c
Update version-check.yml 2025-11-18 06:01:23 +03:00
amd64fox
c77736ccc5 Revert "Update concurrency group for version check"
This reverts commit 1e1fbb6fcb.
2025-11-18 05:57:06 +03:00
amd64fox
549117406c
Increase MAX_RETRIES and update JSON handling 2025-11-18 05:51:09 +03:00
amd64fox
820937d353
Refactor update_version to accept JSON input directly 2025-11-18 05:50:24 +03:00
amd64fox
7af18cd8b2
Refactor JSON handling in update_versions.yml 2025-11-18 05:43:00 +03:00
amd64fox
815d92cd48
Refactor update_version to read JSON from file 2025-11-18 05:41:31 +03:00
amd64fox
4a0a7bb0de
Change JSON data passing method in workflow 2025-11-18 05:39:35 +03:00
amd64fox
d4981cf75c Revert "Added version 1.2.52.402.g4f67b282"
This reverts commit 871ebfb35f.
2025-11-18 05:32:31 +03:00
amd64fox
e61063df56 Revert "Added version 1.2.52.297.g9ad95283"
This reverts commit fff751fbcc.
2025-11-18 05:32:23 +03:00
amd64fox
a9433d2f73 Revert "Added version 1.2.57.301.gb804e5ce"
This reverts commit 39b110ff83.
2025-11-18 05:32:17 +03:00
amd64fox
5f4ac6a10c Revert "Added version 1.2.58.354.ga9e5d5dd"
This reverts commit e6b410b837.
2025-11-18 05:32:12 +03:00
amd64fox
8e49fe7dd7 Revert "Added version 1.2.51.292.g9ae239fb"
This reverts commit 259f31a1d3.
2025-11-18 05:32:02 +03:00
amd64fox
9046d7d8c2 Revert "Added version 1.2.56.259.g35fc40b3"
This reverts commit 4847fa31bd.
2025-11-18 05:31:50 +03:00
amd64fox
fe1af720e3 Revert "Added version 1.2.62.398.g54159197"
This reverts commit 0d00cac03f.
2025-11-18 05:31:37 +03:00
amd64fox
f3d0d53e20
Add retry logic for version update in workflow 2025-11-18 05:31:10 +03:00
amd64fox
0d00cac03f Added version 1.2.62.398.g54159197 2025-11-18 02:23:44 +00:00
amd64fox
4847fa31bd Added version 1.2.56.259.g35fc40b3 2025-11-18 02:23:20 +00:00
amd64fox
259f31a1d3 Added version 1.2.51.292.g9ae239fb 2025-11-18 02:22:59 +00:00
amd64fox
a2fd6913cc
Add push options to update_versions workflow 2025-11-18 05:20:30 +03:00
amd64fox
e6b410b837 Added version 1.2.58.354.ga9e5d5dd 2025-11-18 02:15:40 +00:00
amd64fox
39b110ff83 Added version 1.2.57.301.gb804e5ce 2025-11-18 02:15:21 +00:00
amd64fox
fff751fbcc Added version 1.2.52.297.g9ad95283 2025-11-18 02:15:03 +00:00
amd64fox
871ebfb35f Added version 1.2.52.402.g4f67b282 2025-11-18 02:14:45 +00:00
amd64fox
b8c01ad340
Refactor version update workflow to use auto-commit action 2025-11-18 05:11:59 +03:00
GitHub Action
dee58698c7 Added version 1.2.57.248.g99e4f91e 2025-11-18 01:57:56 +00:00
GitHub Action
f4b24453ac Added version 1.2.56.440.gb68df5d6 2025-11-18 01:57:35 +00:00
GitHub Action
d699d2ac8c Added version 1.2.52.290.gabcab511 2025-11-18 01:57:13 +00:00
GitHub Action
3f952f65bc Added version 1.2.51.251.g3824e6a9 2025-11-18 01:56:44 +00:00
amd64fox
1e1fbb6fcb
Update concurrency group for version check 2025-11-18 04:52:57 +03:00
GitHub Action
8dd85ffcfd Added version 1.2.63.212.g5da2018e 2025-11-18 01:48:09 +00:00
GitHub Action
2a7d1845eb Added version 1.2.61.199.g23513eeb 2025-11-18 01:46:41 +00:00
GitHub Action
172b066e95 Added version 1.2.51.210.ge411d4f7 2025-11-18 01:45:10 +00:00
GitHub Action
2c5e18b40c Added version 1.2.66.242.g7de5ae85 2025-11-18 01:01:49 +00:00
GitHub Action
f7ebdc8915 Added version 1.2.63.214.gb21d7c0d 2025-11-18 01:00:04 +00:00
GitHub Action
e7f647aa3c Added version 1.2.51.175.gfc0f5b10 2025-11-18 00:58:38 +00:00
amd64fox
4b936d86a4 add buildType 2025-11-16 14:54:10 +03:00
GitHub Action
26344b96b4 Added version 1.2.77.352.g26264c50 2025-11-16 06:44:44 +00:00
amd64fox
5b24d6d776 refactor search results to support multiple versions 2025-11-16 02:45:24 +03:00
GitHub Action
6cbe6ccdaf Added version 1.2.77.351.geb47b01f 2025-11-15 06:44:09 +00:00
amd64fox
6507e63825 fix buildType property assignment in version check script 2025-11-14 19:09:55 +03:00
amd64fox
d8e2291f0f refactor GAS submission logic in build version script 2025-11-14 19:00:24 +03:00
GitHub Action
3268102583 Added version 1.2.65.120.g1371365b 2025-11-14 04:15:48 +00:00
amd64fox
902b6f1223 Add buildType support to version update workflow 2025-11-14 07:01:40 +03:00
amd64fox
e6d3f0c76e remove redundant Write-Host debug messages 2025-11-14 05:40:41 +03:00
amd64fox
336fe44b5b replace Write-Output with Write-Host for messages 2025-11-14 05:33:05 +03:00
amd64fox
187fc4d439 refactor build info extraction to new script 2025-11-14 05:24:03 +03:00
amd64fox
5eee2572e2 remove debug output and minor message tweak 2025-11-14 02:19:30 +03:00
amd64fox
0eebb89e76 Combine build type detection and GAS sending steps 2025-11-14 02:15:12 +03:00
amd64fox
d15b5fbc32 update curl command to handle redirects in workflow 2025-11-14 02:04:00 +03:00
amd64fox
0398cb6ea1 Improve debug output for GAS POST request 2025-11-14 01:56:46 +03:00
amd64fox
d61a2e58db Improve GAS response handling in version-check workflow 2025-11-14 01:51:43 +03:00
amd64fox
e0cf1f94fc improve error handling for GAS response in workflow 2025-11-14 01:38:24 +03:00
amd64fox
430d5d40fc replace deprecated set-output with GITHUB_OUTPUT 2025-11-14 01:07:28 +03:00
amd64fox
ab8896961f refactor parameter handling in get-build-info.ps1 2025-11-14 00:43:49 +03:00
amd64fox
ba0af93cdc update version check output 2025-11-14 00:34:46 +03:00
amd64fox
86d02dde3c added build type processing 2025-11-14 00:17:15 +03:00
dependabot[bot]
31eeb1d86d
Bump actions/setup-python from 5 to 6 (#11)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-13 14:01:24 +03:00
dependabot[bot]
cb81917067
Bump actions/download-artifact from 4 to 6 (#12)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-13 14:01:01 +03:00
dependabot[bot]
4aeb2f150f
Bump actions/checkout from 4 to 5 (#13)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-13 14:00:44 +03:00
GitHub Action
817cefb17e Added version 1.2.77.288.g30addd9f 2025-11-13 10:32:33 +00:00
GitHub Action
90bc45dc0f Added version 1.2.77.250.g2d195c71 2025-11-12 17:49:09 +00:00
GitHub Action
51ff38d16f Added version 1.2.77.162.ga10209d6 2025-11-11 19:43:42 +00:00
GitHub Action
ade13834f9 Added version 1.2.76.298.g2316a870 2025-11-11 05:43:50 +00:00
GitHub Action
c1c0c715d1 Added version 1.2.70.253.g75b5048f 2025-11-10 12:11:45 +00:00
amd64fox
4e0009ce26 Improve error handling in update_version.py script 2025-11-10 15:10:22 +03:00
amd64fox
bffdc39cca refactor version update script and workflow 2025-11-10 15:03:30 +03:00
amd64fox
2d561118b9 refactor data input for version update workflow 2025-11-10 14:54:39 +03:00
amd64fox
70f3ac3249 fix DATA_JSON environment variable assignment 2025-11-10 14:51:50 +03:00
amd64fox
8806f679a9 fix DATA_JSON environment variable formatting 2025-11-10 14:48:00 +03:00
amd64fox
ea015c7280 read datajson input from environment variable 2025-11-10 14:43:40 +03:00
amd64fox
0b7ae2e90a Merge branch 'main' of https://github.com/LoaderSpot/LoaderSpot 2025-11-10 12:41:40 +03:00
amd64fox
e35724cf7f fix: increased web request timeout for gas 2025-11-10 12:41:38 +03:00
GitHub Action
6c882d93c6 Added version 1.2.77.159.gd5928880 2025-11-10 08:35:11 +00:00
amd64fox
4911d56f18 fix name 2025-11-08 15:17:41 +03:00
amd64fox
6a235cd0f5 take the compiled cli 2025-11-08 14:19:39 +03:00
amd64fox
9070044b8a updated name to loaderspot_ui 2025-11-08 11:43:38 +03:00
amd64fox
923b4b8d78 Update build-to-release.yml 2025-11-08 11:29:56 +03:00
amd64fox
4367d89cbe
Update build-to-release.yml 2025-11-08 11:21:35 +03:00
amd64fox
9053695b6b remove arm for Linux 2025-11-08 10:47:49 +03:00
amd64fox
467b7301ec added OpenSSL dependencies (arm64) 2025-11-08 10:42:38 +03:00
amd64fox
432ad0301e added OpenSSL dependencies 2025-11-08 10:36:21 +03:00
amd64fox
b4d199ea7a cli assembly added 2025-11-08 10:29:09 +03:00
GitHub Action
0eb2d0af45 Added version 1.2.77.158.g41a657be 2025-11-08 06:14:14 +00:00
GitHub Action
d894e361dd Added version 1.2.77.144.gb6198f81 2025-11-07 12:48:58 +00:00
GitHub Action
a9e9a984fd Added version 1.2.70.254.gc8d9cbb8 2025-11-05 22:30:32 +00:00
amd64fox
d508cb5e40 remove unused urlencoding dependency 2025-11-06 00:03:33 +03:00
amd64fox
8b44677f43 refactor GAS request 2025-11-05 23:49:42 +03:00
amd64fox
1e0a1f09ac fix url formatting in send_to_gas function 2025-11-05 22:55:15 +03:00
amd64fox
65e1f39299
Delete upd.py 2025-11-05 22:45:20 +03:00
amd64fox
f0d0a70f98 Merge branch 'main' of https://github.com/LoaderSpot/LoaderSpot 2025-11-05 22:44:43 +03:00
amd64fox
d24b63e43a added LoaderSpot_CLI 2025-11-05 22:44:41 +03:00
GitHub Action
8f67fb3aff Added version 1.2.76.297.ga70a30a3 2025-11-05 09:45:25 +00:00
GitHub Action
8aa7ad5534 Added version 1.2.76.286.g733f9d86 2025-11-01 16:46:48 +00:00
GitHub Action
cfbf7b4d69 Added version 1.2.71.363.g02160d4a 2025-10-30 10:18:41 +00:00
amd64fox
3ed340b20f
update cron schedule for Spotify MS workflow 2025-10-29 18:02:16 +03:00
GitHub Action
dc7df6292f Added version 1.2.76.274.g749ee04a 2025-10-29 09:26:04 +00:00
amd64fox
eeea3304d8
Fix URL encoding in send_request function
Updated URL construction to use urllib.parse.quote for proper encoding.
2025-10-28 17:01:58 +03:00
GitHub Action
9bfacab976 Added version 1.2.76.268.g83d1f263 2025-10-28 12:17:40 +00:00
amd64fox
91d87ed7ef
Delete LoaderSpot.py 2025-10-27 21:16:35 +03:00
amd64fox
a660738738
Refactor Rust toolchain installation and artifact handling
Updated the build workflow to install Rust toolchain using commands instead of an action. Changed artifact handling to copy the executable directly instead of archiving it.
2025-10-27 21:12:02 +03:00
amd64fox
4df6648885 Rename Main.rs to src/main.rs
Moved Main.rs to the src directory and renamed it to main.rs to follow Rust project conventions.
2025-10-27 20:58:00 +03:00
amd64fox
3185f44d21
Change Rust edition from 2025 to 2021 2025-10-27 20:54:30 +03:00
amd64fox
8cc9141369
Change build runner to use windows-latest 2025-10-27 20:54:01 +03:00
amd64fox
7ff5e1f0ee
Update GitHub Actions to use stable Rust and Windows 2022 2025-10-27 20:47:54 +03:00
amd64fox
d78141cc92
Change Rust toolchain from stable to nightly 2025-10-27 20:39:14 +03:00
amd64fox
d02d1be468
indentation correction 2025-10-27 20:26:41 +03:00
amd64fox
b434d93a7d update build-to-release.yml for rust 2025-10-27 20:20:12 +03:00
amd64fox
e67831bc47 added loaderspot ui in rust 2025-10-27 19:53:58 +03:00
GitHub Action
0d58298f6e Added version 1.2.76.256.g12350e86 2025-10-26 10:41:42 +00:00
dependabot[bot]
036f7c81cf
Bump actions/upload-artifact from 4 to 5 (#10)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-25 02:37:15 +03:00
GitHub Action
4039246aca Added version 1.2.75.510.g8f748905 2025-10-22 05:47:09 +00:00
GitHub Action
e6dd76fa72 Added version 1.2.75.508.g2079da61 2025-10-21 06:47:40 +00:00
GitHub Actions
2dbac74551 Added deb version 1.2.74.477 2025-10-20 10:16:26 +00:00
GitHub Action
5688c02e92 Added version 1.2.75.507.gee6e6c93 2025-10-20 06:47:06 +00:00
GitHub Action
3aa3fb4921 Added version 1.2.75.506.g38295b74 2025-10-18 06:46:36 +00:00
GitHub Action
33d9b0ddac Added version 1.2.75.499.g0c61121f 2025-10-17 06:45:36 +00:00
GitHub Action
8529cfc34b Added version 1.2.75.391.g6c85102e 2025-10-15 19:08:16 +00:00
GitHub Action
9cdc08b322 Added version 1.2.75.280.gb8d7ae93 2025-10-13 06:35:12 +00:00
GitHub Action
c068487050 Added version 1.2.74.477.g3be53afe 2025-10-07 05:45:46 +00:00
GitHub Action
3d47c833eb Added version 1.2.74.471.g95134d25 2025-10-04 06:45:38 +00:00
GitHub Action
63899de3d6 Added version 1.2.74.462.g16b80659 2025-10-03 06:45:29 +00:00
GitHub Action
b317b8168f Added version 1.2.73.474.g7b30bb2b 2025-09-23 06:46:02 +00:00
GitHub Action
d603039c00 Added version 1.2.73.468.ga3576127 2025-09-22 06:45:44 +00:00
GitHub Action
868972a47e Added version 1.2.73.466.gd9dcf250 2025-09-21 06:45:49 +00:00
GitHub Action
9326f6bfd3 Added version 1.2.73.465.g421365a8 2025-09-20 06:45:37 +00:00
GitHub Action
16356e1543 Added version 1.2.73.451.g3cd20529 2025-09-19 06:45:38 +00:00
GitHub Action
ff9382d4ea Added version 1.2.72.438.g8c88c31c 2025-09-09 05:45:32 +00:00
GitHub Action
8a53dc3c18 Added version 1.2.72.437.gaf82ef12 2025-09-06 06:45:32 +00:00
GitHub Action
1f48146372 Added version 1.2.72.435.ge33795c7 2025-09-05 06:45:34 +00:00
dependabot[bot]
87b943bc48
Bump actions/github-script from 7 to 8 (#9)
Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 8.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-05 00:59:10 +03:00
dependabot[bot]
750b857544
Bump actions/setup-python from 5 to 6 (#8)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-05 00:57:57 +03:00
GitHub Action
7e64bacd03 Added version 1.2.71.421.g794ff5e5 2025-08-23 06:45:37 +00:00
amd64fox
faf0558dde
search for version in Spotify.dll 2025-08-14 21:30:32 +03:00
dependabot[bot]
d9146507b9
Bump actions/checkout from 4 to 5 (#7)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-14 21:19:49 +03:00
GitHub Action
057009caf3 Added version 1.2.70.409.gd4fa4141 2025-08-13 05:45:59 +00:00
GitHub Action
1b359e22e4 Added version 1.2.70.407.g122a4669 2025-08-11 05:45:21 +00:00
GitHub Action
7e736a646e Added version 1.2.70.406.g090b09ce 2025-08-09 06:45:26 +00:00
GitHub Action
9f7390a779 Added version 1.2.70.404.g35f790a1 2025-08-08 06:45:28 +00:00
amd64fox
396f0697b3
revert 2025-08-03 13:47:59 +03:00
amd64fox
b482d719ed
Update ms-spotify.yml
test windows server 2025
2025-08-03 13:41:56 +03:00
amd64fox
50604a491e
host fixed 2025-07-29 20:41:09 +03:00
GitHub Action
bb9e86176f Added version 1.2.69.449.gfda8591a 2025-07-26 06:45:06 +00:00
GitHub Action
c91456058b Added version 1.2.69.448.ge76b8882 2025-07-25 17:45:33 +00:00
GitHub Action
7cedf1ac49 Added version 1.2.68.528.g50f97d42 2025-07-12 06:45:34 +00:00
GitHub Action
8e0464d47f Added version 1.2.68.525.g48fbf8fd 2025-07-11 06:45:34 +00:00
GitHub Action
986a582902 Added version 1.2.67.560.g46a15f6b 2025-07-02 05:45:22 +00:00
GitHub Action
1b80fb3367 Added version 1.2.67.557.g2d9c92d2 2025-07-01 06:45:33 +00:00
GitHub Action
df15ae250c Added version 1.2.67.556.g7023c791 2025-06-30 06:45:45 +00:00
GitHub Action
f164dba453 Added version 1.2.67.555.gaf416c8c 2025-06-28 06:45:08 +00:00
GitHub Action
d026e42c1f Added version 1.2.67.553.gf85dc202 2025-06-27 06:45:59 +00:00
GitHub Action
2af6b7f87c Added version 1.2.66.447.g4e37e896 2025-06-17 05:45:28 +00:00
GitHub Action
6f6542d717 Added version 1.2.66.445.ge795b717 2025-06-14 06:45:27 +00:00
GitHub Action
d41ec2ac5a Added version 1.2.66.444.gf7d4ad52 2025-06-13 06:45:30 +00:00
GitHub Action
8ffbd3dd53 Added version 1.2.65.255.g85e641b4 2025-05-31 06:45:37 +00:00
GitHub Actions
5622bc72ca Added deb version 1.2.63.394 2025-05-19 14:14:57 +00:00
GitHub Action
e3c69f7781 Added version 1.2.64.408.g0a9b557c 2025-05-17 06:45:20 +00:00
GitHub Action
00024a87c3 Added version 1.2.64.407.g14ea11a6 2025-05-16 09:45:48 +00:00
GitHub Action
af0e8147f1 Added version 1.2.63.394.g126b0d89 2025-05-09 05:45:15 +00:00
GitHub Action
619108c571 Added version 1.2.63.392.g7bc0a62b 2025-05-06 05:45:40 +00:00
GitHub Action
69dd050d4a Added version 1.2.63.390.g633c71cd 2025-05-05 06:45:02 +00:00
amd64fox
f0e4936a4b
Delete test 2025-05-02 13:46:13 +03:00
amd64fox
ab157bd4b6
Create test 2025-05-02 13:24:03 +03:00
GitHub Action
00aa0f57e2 Added version 1.2.63.380.g54ef49eb 2025-05-02 06:45:21 +00:00
GitHub Action
b7433c2dbf Added version 1.2.62.580.gb27ad23e 2025-04-23 13:45:46 +00:00
GitHub Action
5f6989deb4 Added version 1.2.62.578.g7b42a3bb 2025-04-19 06:45:18 +00:00
GitHub Action
959cc1927a Added version 1.2.62.575.ge8b4160e 2025-04-18 06:37:48 +00:00
GitHub Action
85a31493d6 Added version 1.2.61.443.gc51c574b 2025-04-10 05:45:29 +00:00
GitHub Actions
2f3fb1f893 Added deb version 1.2.60.564 2025-04-07 09:16:04 +00:00
GitHub Action
bca898a0a1 Added version 1.2.61.431.g05f88175 2025-04-06 06:45:41 +00:00
GitHub Action
b6af069283 Added version 1.2.61.430.gbef83518 2025-04-05 06:45:17 +00:00
GitHub Action
b38f7ca469 Added version 1.2.61.427.g5b75eb06 2025-04-04 06:45:16 +00:00
amd64fox
b3f627d1c7 Update LoaderSpot.py
- using head requests and shared session
- added conditional filtering for Win-x86 platform
- allowed user configuration of connection limits
- improved progress bar feedback
- minor changes and corrections
2025-03-31 00:01:44 +03:00
GitHub Action
e05e9b7b7c Added version 1.2.60.564.gcc6305cb 2025-03-22 06:30:06 +00:00
amd64fox
58d07c5029
response gas test 2025-03-21 14:04:35 +03:00
GitHub Action
f5867e41f9 Added version 1.2.59.518.g42b3652d 2025-03-18 06:45:13 +00:00
GitHub Action
a24607c368 Added version 1.2.59.517.g16b54919 2025-03-15 06:45:37 +00:00
GitHub Action
3d578b8565 Added version 1.2.59.515.g1e7f93a9 2025-03-14 06:45:09 +00:00
GitHub Actions
09f0f59b2e Added deb version 1.2.59.514 2025-03-13 08:18:48 +00:00
GitHub Action
b4a7f1a595 Added version 1.2.59.514.g834e17d4 2025-03-13 05:45:21 +00:00
amd64fox
5893e42c70 added search in test package 2025-03-13 00:02:04 +03:00
GitHub Actions
e9034dd202 Added version 1.2.59.513 2025-03-12 17:12:31 +00:00
GitHub Action
b76d0b7cbd Added version 1.2.59.513.g9e00425b 2025-03-11 05:45:29 +00:00
GitHub Action
4289b220c1 Added version 1.2.59.510.gb8e30f45 2025-03-08 06:28:33 +00:00
amd64fox
9ecfee6004 added use of personal token 2025-03-07 13:36:57 +03:00
amd64fox
446cc5327b
Update sync-files.yml
add workflow_dispatch
2025-03-07 09:58:53 +03:00
GitHub Action
eecc8af715 Added version 1.2.59.508.gba71e9f7 2025-03-07 06:43:37 +00:00
amd64fox
2fc035a8ee
changing the table link 2025-03-01 17:55:38 +03:00
amd64fox
4034d310c1
Update versions_deb.json 2025-02-28 20:27:20 +03:00
amd64fox
28c04bebeb
Update versions_deb.json 2025-02-28 20:24:44 +03:00
amd64fox
a5ea5f01ae
Update versions.json 2025-02-28 20:23:16 +03:00
amd64fox
9a54376530
Update versions.json 2025-02-28 20:21:34 +03:00
amd64fox
bd8d49c80e
Create sync-files.yml 2025-02-28 20:19:14 +03:00
amd64fox
4ef145a9e3
Create check-deb-versions.yml 2025-02-28 12:36:49 +03:00
amd64fox
321b1d2858
Create check_deb_versions.py 2025-02-28 12:36:42 +03:00
amd64fox
1432956c49
Update versions_deb.json 2025-02-27 06:37:53 +03:00
amd64fox
a1fddeb973
Delete table directory 2025-02-27 06:37:16 +03:00
amd64fox
90c227d1ba
Add files via upload 2025-02-27 02:35:22 +03:00
amd64fox
b35667cf69
Add files via upload 2025-02-27 02:34:38 +03:00
amd64fox
822cdaa3eb
Update index.html 2025-02-27 02:11:40 +03:00
amd64fox
97abe7aa40
Add files via upload 2025-02-27 02:09:04 +03:00
amd64fox
8d56b0d775
Update index.html
- added search
- added filters
- added download counters
2025-02-26 21:12:33 +03:00
GitHub Action
fb47f6d480 Added version 1.2.58.498.g6afe77b7 2025-02-25 05:44:11 +00:00
amd64fox
9df55c5494
Create index.html 2025-02-23 21:20:14 +03:00
amd64fox
7d9aa0c7eb
Delete docs directory 2025-02-23 21:18:51 +03:00
amd64fox
7112698513
added search by versions 2025-02-23 18:14:47 +03:00
amd64fox
72b7d6b5dd
typo 2025-02-23 16:03:12 +03:00
amd64fox
6624bc5020
selecting os via url param 2025-02-23 15:56:16 +03:00
amd64fox
f52dd7c1fa
typo 2025-02-23 07:34:46 +03:00
amd64fox
82fbeacf5a
added analytics from goatcounter 2025-02-23 07:33:31 +03:00
amd64fox
6526d71161
typo 2025-02-23 06:01:56 +03:00
amd64fox
8adc107785
Create index.html 2025-02-23 05:15:10 +03:00
amd64fox
59be936f6d
Delete table directory 2025-02-23 05:14:11 +03:00
amd64fox
88b31c9130
Create Index.html 2025-02-23 05:09:10 +03:00
GitHub Action
8d231decf4 Added version 1.2.58.496.g82a757a5 2025-02-22 09:23:10 +00:00
amd64fox
72d5ff7480
Update upd.py
- x86 search exceptions for new versions
- attempt to fix a bug where links were found but not added to the shared array
2025-02-22 12:18:03 +03:00
GitHub Action
de365aa8a7 Added version 1.2.58.492.g5e7cd836 2025-02-21 11:02:20 +00:00
amd64fox
09601cdb73
Delete requirements.txt 2025-02-14 13:27:17 +03:00
amd64fox
2cad3be3d8
Update and rename main.yml to version-check.yml
- a wait has been added in case of multiple runs
- dependency handling directly in the workflow
2025-02-14 13:23:54 +03:00
GitHub Action
13d2d94011 Added version 1.2.57.463.g4f748c64 2025-02-08 07:03:43 +00:00
GitHub Action
f12d3342ee Added version 1.2.57.460.gf31c26a7 2025-02-08 07:01:34 +00:00
GitHub Action
9c6804ffb5 Added version 1.2.54.304.gcc3c7f45 2025-02-08 06:58:51 +00:00
GitHub Action
933d268ef3 Added version 1.2.56.502.ga68d2d4f 2025-01-29 11:45:00 +00:00
GitHub Action
fc17cc1e63 Added version 1.2.56.497.g3da60fab 2025-01-24 17:45:52 +00:00
GitHub Action
6f702f7258 Added version 1.2.55.235.g5eaa0904 2025-01-15 10:45:56 +00:00
amd64fox
5a8f446821
x86 => x64 2025-01-11 16:02:26 +03:00
GitHub Action
ce1b0d89e8 Added version 1.2.53.440.g7b2f582a 2025-01-02 18:46:32 +00:00
GitHub Action
3d03b9591c Added version 1.2.53.438.g246d60c9 2024-12-19 10:44:14 +00:00
GitHub Action
e931f71eff Added version 1.2.53.437.gd3a938d4 2024-12-17 09:44:20 +00:00
GitHub Action
8c74f13626 Added version 1.2.52.442.g01893f92 2024-12-03 10:09:58 +00:00
GitHub Action
fb79b33669 Added version 1.2.51.345.gcc39d911 2024-11-19 11:44:11 +00:00
GitHub Action
0b7d8c06c8 Added version 1.2.50.335.g5e2860a8 2024-11-12 21:44:23 +00:00
24 changed files with 12386 additions and 493 deletions

View file

@ -1,64 +1,195 @@
name: Build Windows LoaderSpot name: Build LoaderSpot
on: on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
build: build_windows:
runs-on: windows-latest runs-on: windows-latest
strategy: strategy:
matrix: matrix:
architecture: [x86, x64] include:
- arch: x86
rust_target: i686-pc-windows-msvc
- arch: x64
rust_target: x86_64-pc-windows-msvc
- arch: arm64
rust_target: aarch64-pc-windows-msvc
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v6
- name: Set up Python - name: Install Rust toolchain
uses: actions/setup-python@v5 uses: dtolnay/rust-toolchain@stable
with: with:
python-version: '3.13' targets: ${{ matrix.rust_target }}
architecture: ${{ matrix.architecture }}
- name: Install dependencies - name: Cache cargo dependencies
run: | uses: actions/cache@v5
python -m pip install --upgrade pip
pip install aiohttp
pip install tqdm
pip install pyinstaller
- name: Build executable
run: |
pyinstaller --onefile --clean --name LoaderSpot_${{ matrix.architecture }} LoaderSpot.py
- name: Upload artifact
uses: actions/upload-artifact@v4
with: with:
name: LoaderSpot_${{ matrix.architecture }} path: |
path: dist/LoaderSpot_${{ matrix.architecture }}.exe ~/.cargo/registry
~/.cargo/git
LoaderSpot_UI/target
LoaderSpot_CLI/target
key: ${{ runner.os }}-cargo-${{ matrix.rust_target }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-${{ matrix.rust_target }}-
- name: Build release binaries
env:
RUST_TARGET: ${{ matrix.rust_target }}
ARCH: ${{ matrix.arch }}
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$out = "artifacts"
if (Test-Path $out) { Remove-Item $out -Recurse -Force }
New-Item -ItemType Directory -Path $out | Out-Null
Write-Host "Building UI for $env:RUST_TARGET"
cargo build --manifest-path LoaderSpot_UI/Cargo.toml --release --target $env:RUST_TARGET
$exeUI = Get-ChildItem "LoaderSpot_UI/target/$env:RUST_TARGET/release/*.exe" | Select-Object -First 1
Copy-Item $exeUI.FullName "$out\loaderspot-ui-win-$env:ARCH.exe"
Write-Host "UI executable ready: loaderspot-ui-win-$env:ARCH.exe"
Write-Host "Building CLI for $env:RUST_TARGET"
cargo build --manifest-path LoaderSpot_CLI/Cargo.toml --release --target $env:RUST_TARGET
$exeCLI = Get-ChildItem "LoaderSpot_CLI/target/$env:RUST_TARGET/release/*.exe" | Select-Object -First 1
Copy-Item $exeCLI.FullName "$out\loaderspot-cli-win-$env:ARCH.exe"
Write-Host "CLI executable ready: loaderspot-cli-win-$env:ARCH.exe"
- name: Upload Windows artifacts
uses: actions/upload-artifact@v7
with:
name: windows-artifacts-${{ matrix.arch }}
path: artifacts/*
build_linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-gnu
- name: Cache cargo dependencies
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
LoaderSpot_UI/target
LoaderSpot_CLI/target
key: ${{ runner.os }}-cargo-x86_64-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-x86_64-
- name: Install build dependencies
run: |
sudo apt-get update
sudo apt-get install -y pkg-config libssl-dev
- name: Build release binaries
run: |
mkdir -p artifacts
# Build UI for Linux
echo "Building UI for x86_64-unknown-linux-gnu"
cargo build --manifest-path LoaderSpot_UI/Cargo.toml --release --target x86_64-unknown-linux-gnu
cp "LoaderSpot_UI/target/x86_64-unknown-linux-gnu/release/loaderspot_ui" "artifacts/loaderspot-ui-linux-x64"
echo "UI executable ready: loaderspot-ui-linux-x64"
# Build CLI for Linux
echo "Building CLI for x86_64-unknown-linux-gnu"
cargo build --manifest-path LoaderSpot_CLI/Cargo.toml --release --target x86_64-unknown-linux-gnu
cp "LoaderSpot_CLI/target/x86_64-unknown-linux-gnu/release/loaderspot_cli" "artifacts/loaderspot-cli-linux-x64"
echo "CLI executable ready: loaderspot-cli-linux-x64"
- name: Upload Linux artifacts
uses: actions/upload-artifact@v7
with:
name: linux-artifacts-x64
path: artifacts/*
release:
needs: [build_windows, build_linux]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download all artifacts
uses: actions/download-artifact@v8
with:
path: artifacts
- name: Get latest release - name: Get latest release
id: latest_release id: latest_release
uses: actions/github-script@v7 uses: actions/github-script@v8
with: with:
script: | script: |
const releases = await github.rest.repos.listReleases({ try {
const release = await github.rest.repos.getLatestRelease({
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo repo: context.repo.repo
}); });
return releases.data[0].id; return release.data.id;
result-encoding: string } catch (error) {
core.setFailed(`No releases found: ${error.message}`);
}
- name: Upload to Release - name: Upload assets to Release
uses: actions/github-script@v7 uses: actions/github-script@v8
with: with:
script: | script: |
const fs = require('fs'); const fs = require('fs');
const releaseId = ${{ steps.latest_release.outputs.result }}; const path = require('path');
const releaseId = parseInt('${{ steps.latest_release.outputs.result }}', 10);
async function uploadAsset(filePath) {
const fileName = path.basename(filePath);
console.log(`Processing ${fileName}`);
const assets = await github.rest.repos.listReleaseAssets({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId
});
const existingAsset = assets.data.find(a => a.name === fileName);
if (existingAsset) {
console.log(`Deleting existing asset: ${fileName}`);
await github.rest.repos.deleteReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: existingAsset.id
});
}
console.log(`Uploading: ${fileName}`);
await github.rest.repos.uploadReleaseAsset({ await github.rest.repos.uploadReleaseAsset({
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
release_id: releaseId, release_id: releaseId,
name: `LoaderSpot_${{ matrix.architecture }}.exe`, name: fileName,
data: fs.readFileSync(`dist/LoaderSpot_${{ matrix.architecture }}.exe`) data: fs.readFileSync(filePath)
}); });
}
const files = [];
const artifactDirs = fs.readdirSync('artifacts');
for (const dir of artifactDirs) {
const dirPath = path.join('artifacts', dir);
const dirFiles = fs.readdirSync(dirPath);
for (const file of dirFiles) {
files.push(path.join(dirPath, file));
}
}
for (let i = 0; i < files.length; i += 3) {
const batch = files.slice(i, i + 3);
await Promise.all(batch.map(uploadAsset));
}

View file

@ -0,0 +1,34 @@
name: Checking deb versions
on:
schedule:
- cron: '0 * * * *'
workflow_dispatch:
jobs:
check-and-update:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
token: ${{ secrets.PERSONAL_TOKEN }}
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: 3.12.2
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests packaging
- name: Run version checker
env:
PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
run: python check_deb_versions.py

View file

@ -1,23 +0,0 @@
name: Version Check
on:
repository_dispatch:
types: [webhook-event]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: 3.12.2
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run Python script
run: python ${{ github.workspace }}/upd.py -v ${{ github.event.client_payload.v }} -s "${{ github.event.client_payload.s }}" -u "${{ secrets.GOOGLE_APPS_URL }}"

View file

@ -1,8 +1,6 @@
name: check Spotify MS name: check Spotify MS
on: on:
schedule:
- cron: '25 * * * *'
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -11,7 +9,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v6
- name: run ms-spotify-check.ps1 - name: run ms-spotify-check.ps1
shell: pwsh shell: pwsh

51
.github/workflows/sync-files.yml vendored Normal file
View file

@ -0,0 +1,51 @@
name: Sync files to table
on:
# Temporarily disabled automatic sync trigger.
# Uncomment this block to restore automatic runs on push to main.
# push:
# branches:
# - main
# paths:
# - 'versions.json'
# - 'versions_deb.json'
workflow_dispatch:
jobs:
sync-files:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout source repo
uses: actions/checkout@v6
- name: Checkout target repo
uses: actions/checkout@v6
with:
repository: LoaderSpot/table
path: table
token: ${{ secrets.PERSONAL_TOKEN }}
- name: Copy files
run: |
mkdir -p table/table
cp versions.json table/table/
cp versions_deb.json table/table/
- name: Commit and push changes
env:
TARGET_REPO: "https://${{ secrets.PERSONAL_TOKEN }}@github.com/LoaderSpot/table.git"
run: |
cd table
git config --global user.name "GitHub Actions"
git config --global user.email "actions@github.com"
if ! git diff --exit-code; then
git add table/
git commit -m "Auto-sync from LoaderSpot"
git push "$TARGET_REPO" main
else
echo "No changes to commit"
fi

View file

@ -9,23 +9,32 @@ on:
version: version:
description: 'Another version parameter' description: 'Another version parameter'
required: true required: true
buildType:
description: 'Build type (e.g., Master, Release)'
required: false
default: 'false'
jobs: jobs:
update-version: update-version:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
contents: write
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v6
with:
token: ${{ secrets.PERSONAL_TOKEN }}
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v5 uses: actions/setup-python@v6
with: with:
python-version: 3.12.2 python-version: 3.12.2
- name: Update version in versions.json - name: Update version in versions.json
run: | run: |
data="${{ github.event.inputs.datajson }}" data="${{ github.event.inputs.datajson }}"
python3 -c "import json, re; data=json.loads('$data'); file_data=json.load(open('versions.json')); file_data[list(data.keys())[0]] = data[list(data.keys())[0]]; file_data = dict(sorted(file_data.items(), key=lambda x: [int(part) if part.isdigit() else part for part in re.split(r'(\d+)', x[0])], reverse=True)); json.dump(file_data, open('versions.json', 'w'), indent=2)" build_type="${{ github.event.inputs.buildType }}"
python3 update_version.py "$data" "$build_type"
- name: Commit changes - name: Commit changes
run: | run: |
@ -33,4 +42,4 @@ jobs:
git config --local user.name "GitHub Action" git config --local user.name "GitHub Action"
git add versions.json git add versions.json
git commit -m "Added version ${{ github.event.inputs.version }}" git commit -m "Added version ${{ github.event.inputs.version }}"
git push git push "https://${{ secrets.PERSONAL_TOKEN }}@github.com/${{ github.repository }}.git" HEAD:main

54
.github/workflows/version-check.yml vendored Normal file
View file

@ -0,0 +1,54 @@
name: Version Check
on:
repository_dispatch:
types: [webhook-event]
concurrency:
group: delayed-version-check
cancel-in-progress: false
jobs:
version-search:
runs-on: ubuntu-latest
outputs:
versions: ${{ steps.search.outputs.versions }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Download latest loaderspot_cli_linux_x64
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release download --repo ${{ github.repository }} --pattern "loaderspot-cli-linux-x64" --output loaderspot_cli
chmod +x loaderspot_cli
- name: Version search
id: search
if: github.event.client_payload.v && github.event.client_payload.s
env:
v: ${{ github.event.client_payload.v }}
s: ${{ github.event.client_payload.s }}
run: |
{
echo 'versions<<EOF'
./loaderspot_cli --version "$v" --connections 300 --ladder-search
echo 'EOF'
} >> "$GITHUB_OUTPUT"
get-build-and-send:
runs-on: windows-latest
needs: version-search
if: success() && needs.version-search.outputs.versions
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Get build info and send to GAS
shell: pwsh
env:
GOOGLE_APPS_URL: ${{ secrets.GOOGLE_APPS_URL }}
VERSIONS: ${{ needs.version-search.outputs.versions }}
SOURCE: ${{ github.event.client_payload.s }}
run: |
./check-build-version.ps1 -versions "$env:VERSIONS" -source "$env:SOURCE" -googleAppsUrl "$env:GOOGLE_APPS_URL"

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/LoaderSpot_CLI/target
/LoaderSpot_UI/target

View file

@ -1,242 +0,0 @@
import re
import json
import aiohttp
import asyncio
from tqdm import tqdm
from typing import Optional, Tuple, List, Dict
from dataclasses import dataclass
from enum import Enum
import threading
class Platform(Enum):
WIN_X86 = "Win-x86"
WIN_X64 = "Win-x64"
WIN_ARM64 = "Win-arm64"
MACOS_INTEL = "macOS-intel"
MACOS_ARM64 = "macOS-arm64"
@dataclass
class SpotifyVersion:
version: str
start_number: int
end_number: int
class UrlGenerator:
BASE_URL = "https://upgrade.scdn.co/upgrade/client/"
PLATFORM_PATHS = {
Platform.WIN_X86: "win32-x86/spotify_installer-{version}-{number}.exe",
Platform.WIN_X64: "win32-x86_64/spotify_installer-{version}-{number}.exe",
Platform.WIN_ARM64: "win32-arm64/spotify_installer-{version}-{number}.exe",
Platform.MACOS_INTEL: "osx-x86_64/spotify-autoupdate-{version}-{number}.tbz",
Platform.MACOS_ARM64: "osx-arm64/spotify-autoupdate-{version}-{number}.tbz",
}
@staticmethod
def generate_url(platform: Platform, version: str, number: int) -> str:
return f"{UrlGenerator.BASE_URL}{UrlGenerator.PLATFORM_PATHS[platform].format(version=version, number=number)}"
async def check_url(
session: aiohttp.ClientSession, url: str, platform: Platform
) -> Optional[Tuple[str, Platform]]:
try:
async with session.get(url) as response:
if response.status == 200:
return str(response.url), platform
except aiohttp.ClientError:
pass
return None
async def fetch_versions_json() -> dict:
async with aiohttp.ClientSession() as session:
async with session.get(
"https://raw.githubusercontent.com/amd64fox/LoaderSpot/refs/heads/main/versions.json"
) as response:
if response.status == 200:
try:
return json.loads(await response.text())
except json.JSONDecodeError:
return {}
return {}
async def submit_to_google_form(version: str, comment: str = "from LoaderSpot") -> None:
form_url = "https://docs.google.com/forms/u/0/d/e/1FAIpQLSdqIxSjqt2PcjBlQzhvwqc4QckfWuq5qqWsrdpoTidQHsPGpw/formResponse"
data = {"entry.1104502920": version, "entry.1319854718": comment}
async with aiohttp.ClientSession() as session:
try:
await session.post(form_url, data=data)
except Exception:
pass
async def check_version_and_submit(version: str) -> None:
try:
versions_json = await fetch_versions_json()
version_exists = any(
ver_data.get("fullversion") == version
for ver_data in versions_json.values()
)
if not version_exists:
await submit_to_google_form(version)
except Exception:
pass
def validate_version(version: str) -> bool:
return bool(re.match(r"^\d+\.\d+\.\d+\.\d+\.g[0-9a-f]{8}$", version))
def validate_number(number: str, min_val: int, max_val: int) -> bool:
return number.isdigit() and min_val <= int(number) <= max_val
def get_valid_input(prompt: str, validator: callable, error_message: str) -> str:
while True:
value = input(prompt)
if validator(value):
return value
print(error_message)
def get_version_input() -> str:
while True:
version = input("Spotify version, for example 1.1.68.632.g2b11de83: ")
if validate_version(version):
return version
print("Invalid version format")
def calculate_total_urls(
start_number: int, end_number: int, selected_platforms: List[Platform]
) -> int:
return (end_number - start_number + 1) * len(selected_platforms)
async def search_installers(
version_info: SpotifyVersion, selected_platforms: List[Platform]
) -> Dict[Platform, List[str]]:
async with aiohttp.ClientSession() as session:
tasks = []
total_urls = calculate_total_urls(
version_info.start_number, version_info.end_number, selected_platforms
)
for platform in selected_platforms:
for number in range(version_info.start_number, version_info.end_number + 1):
url = UrlGenerator.generate_url(platform, version_info.version, number)
tasks.append(check_url(session, url, platform))
results: Dict[Platform, List[str]] = {platform: [] for platform in Platform}
with tqdm(total=total_urls) as pbar:
for task in asyncio.as_completed(tasks):
if result := await task:
url, platform = result
results[platform].append(url)
pbar.update(1)
return results
def display_results(results: Dict[Platform, List[str]]) -> None:
found_any = False
for platform in Platform:
if urls := results[platform]:
found_any = True
print(f"\n{platform.value}:")
for url in urls:
print(url)
if not found_any:
print("\nNothing found, consider increasing the search range")
def get_platform_choices() -> List[Platform]:
print("\nSelect the link type for the search:")
for i, platform in enumerate(Platform, 1):
print(f"[{i}] {platform.value}")
print("[6] All platforms")
while True:
choices = input("Enter the number(s): ").strip().split(",")
if not all(choice.strip() in "123456" for choice in choices):
print("Invalid input. Please enter numbers between 1 and 6")
continue
if "6" in choices:
return list(Platform)
selected = []
for choice in choices:
platform_index = int(choice.strip()) - 1
if 0 <= platform_index < len(Platform):
selected.append(list(Platform)[platform_index])
if selected:
return selected
print("Please select at least one valid platform")
async def main(version_spoti: str = "") -> None:
if not version_spoti:
version_spoti = get_version_input()
version_check_thread = threading.Thread(
target=lambda: asyncio.run(check_version_and_submit(version_spoti)), daemon=True
)
version_check_thread.start()
start_number = int(
get_valid_input(
"Start search from: ",
lambda x: validate_number(x, 0, 20000),
"Number should be between 0 and 20000",
)
)
end_number = int(
get_valid_input(
"End search at: ",
lambda x: validate_number(x, start_number, 20000),
f"Number should be between {start_number} and 20000",
)
)
version_info = SpotifyVersion(version_spoti, start_number, end_number)
selected_platforms = get_platform_choices()
print("\nSearching...\n")
results = await search_installers(version_info, selected_platforms)
display_results(results)
print("\nChoose an option:")
print("[1] Perform the search with a new version")
print("[2] Perform the search again with the same version")
print("[3] Exit")
choice = input("Enter the number: ")
if choice == "1":
print("\n")
await main()
elif choice == "2":
print("\n")
print(f"Search version: {version_spoti}")
await main(version_spoti)
elif choice == "3":
return
else:
print("Invalid choice. Exiting the program.")
if __name__ == "__main__":
asyncio.run(main())

2118
LoaderSpot_CLI/Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

14
LoaderSpot_CLI/Cargo.toml Normal file
View file

@ -0,0 +1,14 @@
[package]
name = "loaderspot_cli"
version = "0.1.0"
edition = "2021"
[dependencies]
tokio = { version = "1", features = ["full"] }
reqwest = { version = "0.11", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
clap = { version = "4.0", features = ["derive"] }
indicatif = "0.17.7"
regex = "1"
scraper = "0.19.0"

341
LoaderSpot_CLI/src/main.rs Normal file
View file

@ -0,0 +1,341 @@
use clap::Parser;
use indicatif::{ProgressBar, ProgressStyle};
use reqwest::Client;
use serde::Serialize;
use std::collections::HashMap;
use std::sync::Arc;
use std::time::Duration;
use tokio::sync::Semaphore;
use regex::Regex;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
enum PlatformArch {
WinX86,
WinX64,
WinArm64,
MacOsIntel,
MacOsArm64,
}
impl PlatformArch {
fn path_template(&self) -> &str {
match self {
PlatformArch::WinX86 => "win32-x86/spotify_installer-{version}-{number}.exe",
PlatformArch::WinX64 => "win32-x86_64/spotify_installer-{version}-{number}.exe",
PlatformArch::WinArm64 => "win32-arm64/spotify_installer-{version}-{number}.exe",
PlatformArch::MacOsIntel => "osx-x86_64/spotify-autoupdate-{version}-{number}.tbz",
PlatformArch::MacOsArm64 => "osx-arm64/spotify-autoupdate-{version}-{number}.tbz",
}
}
fn to_string(&self) -> &str {
match self {
PlatformArch::WinX86 => "WIN32",
PlatformArch::WinX64 => "WIN64",
PlatformArch::WinArm64 => "WIN-ARM64",
PlatformArch::MacOsIntel => "OSX",
PlatformArch::MacOsArm64 => "OSX-ARM64",
}
}
}
struct UrlGenerator;
impl UrlGenerator {
const BASE_URL: &'static str = "https://upgrade.scdn.co/upgrade/client/";
fn generate_url(platform: PlatformArch, version: &str, number: i32) -> String {
let path = platform
.path_template()
.replace("{version}", version)
.replace("{number}", &number.to_string());
format!("{}{}", Self::BASE_URL, path)
}
}
fn extract_base_version(version: &str) -> String {
let parts: Vec<&str> = version.split('.').collect();
if parts.len() >= 3 {
format!("{}.{}.{}", parts[0], parts[1], parts[2])
} else {
version.to_string()
}
}
fn should_use_win_x86(version: &str) -> bool {
let base_version = extract_base_version(version);
let parts: Vec<&str> = base_version.split('.').collect();
if parts.len() >= 3 {
if let (Ok(major), Ok(minor), Ok(patch)) = (
parts[0].parse::<u32>(),
parts[1].parse::<u32>(),
parts[2].parse::<u32>(),
) {
return (major, minor, patch) <= (1, 2, 53);
}
}
true
}
async fn check_url(client: &Client, url: String, platform: PlatformArch) -> Option<(String, PlatformArch)> {
match client.head(&url).send().await {
Ok(response) if response.status().is_success() => Some((url, platform)),
_ => None,
}
}
async fn search_installers(
client: &Client,
version: &str,
start: i32,
end: i32,
platform: PlatformArch,
max_connections: usize,
) -> Vec<(String, PlatformArch)> {
let semaphore = Arc::new(Semaphore::new(max_connections));
let mut tasks = Vec::new();
let found_urls = Arc::new(tokio::sync::Mutex::new(Vec::new()));
for number in start..=end {
let url = UrlGenerator::generate_url(platform, version, number);
let client = client.clone();
let permit = semaphore.clone().acquire_owned().await.unwrap();
let found_urls_clone = found_urls.clone();
let task = tokio::spawn(async move {
let result = check_url(&client, url, platform).await;
drop(permit);
if let Some(found_data) = result {
let mut guard = found_urls_clone.lock().await;
guard.push(found_data);
}
});
tasks.push(task);
}
for task in tasks {
let _ = task.await;
}
let guard = found_urls.lock().await;
guard.clone()
}
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None, disable_version_flag = true)]
struct Cli {
/// Spotify version(s) to search for
#[clap(long, required = true, use_value_delimiter = true, value_delimiter = ',')]
version: Vec<String>,
/// Range of build numbers to check (e.g., 0-5000)
#[clap(long, default_value = "0-5000")]
range: String,
/// Architecture(s)
#[clap(long, use_value_delimiter = true, value_delimiter = ',', value_parser = ["x86", "x64", "arm64", "intel", "all"], default_value = "all")]
arch: Vec<String>,
/// Platform(s)
#[clap(long, name = "os", use_value_delimiter = true, value_delimiter = ',', value_parser = ["win", "mac", "all"], default_value = "all")]
platform: Vec<String>,
/// Number of concurrent connections
#[clap(long, default_value_t = 100)]
connections: usize,
/// Use ladder search algorithm
#[clap(long)]
ladder_search: bool,
}
fn parse_range(range_str: &str) -> (i32, i32) {
let parts: Vec<&str> = range_str.split('-').collect();
if parts.len() == 2 {
let start = parts[0].parse().unwrap_or(0);
let end = parts[1].parse().unwrap_or(5000);
(start, end)
} else {
(0, 5000)
}
}
#[tokio::main]
async fn main() {
let cli = Cli::parse();
let platforms = if cli.platform.contains(&"all".to_string()) {
vec!["win", "mac"]
} else {
cli.platform.iter().map(|s| s.as_str()).collect()
};
let arches = if cli.arch.contains(&"all".to_string()) {
if platforms.contains(&"win") && platforms.contains(&"mac") {
vec!["x86", "x64", "arm64", "intel", "arm64"]
} else if platforms.contains(&"win") {
vec!["x86", "x64", "arm64"]
} else if platforms.contains(&"mac") {
vec!["intel", "arm64"]
} else {
vec![]
}
} else {
cli.arch.iter().map(|s| s.as_str()).collect()
};
let mut platform_arches = Vec::new();
for platform in &platforms {
for arch in &arches {
let platform_arch = match (*platform, *arch) {
("win", "x86") => Some(PlatformArch::WinX86),
("win", "x64") => Some(PlatformArch::WinX64),
("win", "arm64") => Some(PlatformArch::WinArm64),
("mac", "intel") => Some(PlatformArch::MacOsIntel),
("mac", "arm64") => Some(PlatformArch::MacOsArm64),
_ => None,
};
if let Some(pa) = platform_arch {
if !platform_arches.contains(&pa) {
platform_arches.push(pa);
}
}
}
}
if platform_arches.is_empty() {
eprintln!("Error: No valid platform and architecture combinations provided.");
std::process::exit(1);
}
let connections = cli.connections.clamp(50, 300);
let range = cli.range.clone();
let client = Client::builder()
.timeout(std::time::Duration::from_secs(30))
.build()
.unwrap();
let spinner_style = ProgressStyle::with_template("{spinner}")
.unwrap()
.tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"); // A classic rotating spinner
let pb = ProgressBar::new_spinner();
pb.set_style(spinner_style);
pb.enable_steady_tick(Duration::from_millis(80));
let versions = cli.version.clone();
let client_clone = client.clone();
let ladder_search = cli.ladder_search;
let versions_clone_for_task = versions.clone();
let search_task = tokio::spawn(async move {
let mut results = Vec::new();
for version in &versions_clone_for_task {
let mut all_found_urls_for_version = Vec::new();
let mut arches_to_search = platform_arches.clone();
if !should_use_win_x86(version) && arches_to_search.contains(&PlatformArch::WinX86) {
if versions_clone_for_task.len() == 1 && arches_to_search.len() == 1 {
eprintln!("Warning: x86 architecture for Windows is no longer supported for versions newer than 1.2.53.");
continue;
}
arches_to_search.retain(|&p| p != PlatformArch::WinX86);
}
if ladder_search {
let mut start_number = 0;
let mut before_enter = 1000;
let additional_searches = 15;
let increment = 1000;
for &platform_arch in &arches_to_search {
let found = search_installers(&client_clone, version, start_number, before_enter, platform_arch, connections).await;
all_found_urls_for_version.extend(found);
}
for _ in 0..additional_searches {
let latest_urls = get_latest_urls(&all_found_urls_for_version);
let target_len = arches_to_search.iter().filter(|&&p| p != PlatformArch::WinX86 || should_use_win_x86(version)).count();
if latest_urls.len() >= target_len {
break;
}
start_number = before_enter + 1;
before_enter += increment;
let mut missing_arches = Vec::new();
for &platform_arch in &arches_to_search {
if !latest_urls.contains_key(platform_arch.to_string()) {
missing_arches.push(platform_arch);
}
}
for &platform_arch in &missing_arches {
let found = search_installers(&client_clone, version, start_number, before_enter, platform_arch, connections).await;
all_found_urls_for_version.extend(found);
}
}
} else {
let (start, end) = parse_range(&range);
for &platform_arch in &arches_to_search {
let found = search_installers(&client_clone, version, start, end, platform_arch, connections).await;
all_found_urls_for_version.extend(found);
}
}
let mut latest_urls = get_latest_urls(&all_found_urls_for_version);
latest_urls.insert("version".to_string(), version.clone());
results.push(latest_urls);
}
results
});
let results = search_task.await.unwrap();
pb.finish_and_clear();
if versions.len() == 1 {
let json_output = serde_json::to_string_pretty(&results[0]).unwrap();
println!("{}", json_output);
} else {
let json_output = serde_json::to_string_pretty(&results).unwrap();
println!("{}", json_output);
}
}
fn get_latest_urls(found_urls: &[(String, PlatformArch)]) -> HashMap<String, String> {
let mut platform_urls = HashMap::new();
let version_pattern = Regex::new(r"-(\d+)\.(exe|tbz)$").unwrap();
for (url, platform) in found_urls {
if let Some(captures) = version_pattern.captures(url) {
if let Some(version_number_match) = captures.get(1) {
let version_number = version_number_match.as_str().parse::<u32>().unwrap();
let platform_key = platform.to_string().to_string();
let entry = platform_urls.entry(platform_key).or_insert_with(|| (url.clone(), version_number));
if version_number > entry.1 {
*entry = (url.clone(), version_number);
}
}
}
}
let latest_urls: HashMap<String, String> = platform_urls
.into_iter()
.map(|(k, (v, _))| (k, v))
.collect();
if latest_urls.is_empty() {
let mut empty_map = HashMap::new();
empty_map.insert("unknown".to_string(), "unknown".to_string());
return empty_map;
}
latest_urls
}

4803
LoaderSpot_UI/Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

17
LoaderSpot_UI/Cargo.toml Normal file
View file

@ -0,0 +1,17 @@
[package]
name = "loaderspot_ui"
version = "0.1.0"
edition = "2021"
[dependencies]
eframe = "0.29"
egui = "0.29"
tokio = { version = "1", features = ["full"] }
reqwest = { version = "0.12", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
regex = "1.10"
crossbeam-channel = "0.5"
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winuser"] }

1088
LoaderSpot_UI/src/main.rs Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,11 +1,9 @@
<p align="center"> <p align="center">
<a href="https://loadspot.pages.dev"><img src="https://img.shields.io/badge/Excel%20table--brightgreen.svg?style=flat&logo=microsoftexcel&label=Table"></a>
<a href="https://t.me/OfficialSpotifyUpdates"><img src="https://img.shields.io/badge/Telegram- -blue?logo=telegram" alt="Telegram"></a> <a href="https://t.me/OfficialSpotifyUpdates"><img src="https://img.shields.io/badge/Telegram- -blue?logo=telegram" alt="Telegram"></a>
<a href="https://docs.google.com/spreadsheets/d/1wztO1L4zvNykBRw7X4jxP8pvo11oQjT0O5DvZ_-S4Ok/edit#gid=0"><img src="https://img.shields.io/badge/Excel%20table--brightgreen.svg?style=flat&logo=microsoftexcel&label=Excel table"></a>
</p> </p>
<h1 align="center">LoaderSpot</h1> <h1 align="center">LoaderSpot</h1>
<h2 align="center">Tool for finding full Spotify installers.</h2> <h2 align="center">This tool finds full Spotify installers and also collects them</h2>
<p align="center">
<h3 align="center">I also created an updatable document, with all the links I found. You can see it <a href="https://docs.google.com/spreadsheets/d/1wztO1L4zvNykBRw7X4jxP8pvo11oQjT0O5DvZ_-S4Ok/edit#gid=0">here</a></h3>
</p>
<p align="center">Thanks for the idea <a href="https://github.com/nick-botticelli/SpotifyUpgradeFinder">nick-botticelli</a></p> <p align="center">Thanks for the idea <a href="https://github.com/nick-botticelli/SpotifyUpgradeFinder">nick-botticelli</a></p>

125
check-build-version.ps1 Normal file
View file

@ -0,0 +1,125 @@
param (
[string]$versions,
[string]$source,
[string]$googleAppsUrl
)
function Find-BuildInfo {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)]
[string]$Path
)
process {
try {
$fileContent = Get-Content -Path $Path -ErrorAction Stop
$found = $false
$regex = '(Master|Release|PR|Local) Build.+(?:cef_)?(\d+\.\d+\.\d+\+g[0-9a-f]+\+chromium-\d+\.\d+\.\d+\.\d+)'
foreach ($line in $fileContent) {
$match = [regex]::Match($line, $regex)
if ($match.Success) {
$buildType = $match.Groups[1].Value
Write-Host "build type: $buildType"
return $buildType
}
}
if (-not $found) {
Write-Host "Билд не найден"
return $false
}
}
catch {
Write-Error "Ошибка при чтении файла: $_"
return $false
}
}
}
function Get-BuildTypeFromUrl {
[CmdletBinding()]
param(
[string]$Url
)
$tempPath = Join-Path ([System.IO.Path]::GetTempPath()) "spotify"
$destinationPath = Join-Path $tempPath "unpacked"
$exePath = Join-Path $tempPath "SpotifySetup.exe"
if (-not (Test-Path -Path $tempPath)) {
New-Item -ItemType Directory -Path $tempPath | Out-Null
}
if (-not (Test-Path -Path $destinationPath)) {
New-Item -ItemType Directory -Path $destinationPath | Out-Null
}
try {
Write-Host "Скачивание файла из $Url..."
Invoke-WebRequest -Uri $Url -OutFile $exePath
Write-Host "Файл сохранен в $exePath"
Write-Host "Распаковка файла в $destinationPath"
Start-Process -Wait -FilePath $exePath -ArgumentList "/extract `"$destinationPath`""
$dllPath = Join-Path $destinationPath "Spotify.dll"
$exePathForAnalysis = Join-Path $destinationPath "Spotify.exe"
if (Test-Path $dllPath) {
return Find-BuildInfo -Path $dllPath
} elseif (Test-Path $exePathForAnalysis) {
return Find-BuildInfo -Path $exePathForAnalysis
}
else {
Write-Error "Файлы Spotify.dll и Spotify.exe не найдены в $destinationPath"
return $false
}
}
catch {
Write-Error "Произошла ошибка при скачивании или распаковке: $_"
return $false
}
}
if ([string]::IsNullOrEmpty($versions) -or [string]::IsNullOrEmpty($source) -or [string]::IsNullOrEmpty($googleAppsUrl)) {
Write-Error "Один или несколько обязательных параметров (versions, source, googleAppsUrl) не предоставлены."
exit 1
}
$versionsObj = $versions | ConvertFrom-Json
$win64Url = $versionsObj.WIN64
$buildType = $false
if ($win64Url) {
$buildType = Get-BuildTypeFromUrl -Url $win64Url
}
if ($buildType -eq $false) {
$versionsObj | Add-Member -NotePropertyName "buildType" -NotePropertyValue $false -Force
} else {
$versionsObj | Add-Member -NotePropertyName "buildType" -NotePropertyValue $buildType -Force
}
$versionsObj | Add-Member -NotePropertyName "source" -NotePropertyValue $source -Force
$finalJson = $versionsObj | ConvertTo-Json -Compress
Write-Host "Отправка данных на GAS..."
try {
$response = Invoke-WebRequest -Uri $googleAppsUrl `
-Method POST `
-ContentType "application/json" `
-Body $finalJson `
-UseBasicParsing -ErrorAction Stop
if ($response.StatusCode -eq 200) {
Write-Host "Ответ от GAS: $($response.Content)"
} else {
Write-Error "Ошибка при отправке в GAS. Статус: $($response.StatusCode). Ответ: $($response.Content)"
}
} catch {
Write-Error "Критическая ошибка при отправке в GAS: $_"
}

282
check_deb_versions.py Normal file
View file

@ -0,0 +1,282 @@
import re
import json
import requests
from packaging import version
import sys
from datetime import datetime
import os
import subprocess
import tempfile
from requests.exceptions import RequestException
import time
VERSIONS_JSON_FILE = "versions_deb.json"
SPOTIFY_REPO_URL = (
"https://repository-origin.spotify.com/pool/non-free/s/spotify-client/"
)
REPO_UPLOAD = "LoaderSpot/deb-builds"
def get_spotify_versions_from_repo():
urls = [
"https://repository.spotify.com/dists/testing/non-free/binary-amd64/Packages",
SPOTIFY_REPO_URL,
]
version_pattern = r"(\d+\.\d+\.\d+\.\d+\.g[0-9a-f]{8})"
versions = set()
for url in urls:
try:
response = requests.get(url)
response.raise_for_status()
found_versions = re.findall(version_pattern, response.text)
versions.update(found_versions)
except requests.exceptions.RequestException as e:
print(f"Ошибка при запросе {url}: {e}")
min_version = version.parse("1.1.58")
return [
v for v in versions if version.parse(".".join(v.split(".")[:3])) > min_version
]
def get_existing_versions():
try:
with open(VERSIONS_JSON_FILE, "r", encoding="utf-8") as f:
return json.load(f)
except (FileNotFoundError, json.JSONDecodeError) as e:
print(f"Ошибка при чтении файла {VERSIONS_JSON_FILE}: {e}")
return {}
def parse_version_key(full_version):
match = re.match(r"(\d+\.\d+\.\d+\.\d+)\..*", full_version)
return match.group(1) if match else None
def find_new_versions(repo_versions, existing_data):
new_versions = []
for full_version in repo_versions:
version_key = parse_version_key(full_version)
if version_key and version_key not in existing_data:
new_versions.append((version_key, full_version))
return new_versions
def get_file_info(full_version):
url = f"{SPOTIFY_REPO_URL}spotify-client_{full_version}_amd64.deb"
try:
response = requests.head(url, timeout=10)
if response.status_code == 200:
size = response.headers.get("Content-Length", "0")
last_modified = response.headers.get("Last-Modified", "")
if last_modified:
date_obj = datetime.strptime(last_modified, "%a, %d %b %Y %H:%M:%S %Z")
formatted_date = date_obj.strftime("%d.%m.%Y")
else:
formatted_date = ""
return {"size": size, "data": formatted_date}
else:
print(f"Ошибка HEAD запроса к {url}: {response.status_code}")
except Exception as e:
print(f"Ошибка при запросе информации о файле: {e}")
return {"size": "0", "data": ""}
def sort_versions(versions_dict):
def version_key(item):
return tuple(map(int, item[0].split(".")))
return dict(sorted(versions_dict.items(), key=version_key, reverse=True))
def update_json_file(sorted_data):
try:
with open(VERSIONS_JSON_FILE, "w", encoding="utf-8") as f:
json.dump(sorted_data, f, indent=2)
print(f"Файл {VERSIONS_JSON_FILE} успешно обновлен")
return True
except Exception as e:
print(f"Ошибка при обновлении файла {VERSIONS_JSON_FILE}: {e}")
return False
def commit_changes(new_versions):
try:
github_actions = os.environ.get("GITHUB_ACTIONS") == "true"
if github_actions:
subprocess.run(["git", "config", "--global", "user.name", "GitHub Actions"])
subprocess.run(
["git", "config", "--global", "user.email", "actions@github.com"]
)
subprocess.run(["git", "add", VERSIONS_JSON_FILE])
# Формируем сообщение коммита в зависимости от количества новых версий
if new_versions:
commit_message = (
f"Added deb version {new_versions[0][1]}"
if len(new_versions) == 1
else f"Added deb versions: {', '.join(v[1] for v in new_versions)}"
)
else:
commit_message = "Update Spotify versions"
# Создаем коммит
subprocess.run(["git", "commit", "-m", commit_message])
if github_actions:
token = get_github_token()
if token:
repo_url = f"https://{token}@github.com/{os.environ.get('GITHUB_REPOSITORY')}.git"
subprocess.run(["git", "push", repo_url, "HEAD:main"])
else:
subprocess.run(["git", "push"])
else:
subprocess.run(["git", "push"])
print("Изменения успешно отправлены в репозиторий")
return True
except Exception as e:
print(f"Ошибка при отправке изменений в репозиторий: {e}")
return False
def download_deb_file(full_version):
url = f"{SPOTIFY_REPO_URL}spotify-client_{full_version}_amd64.deb"
filename = f"spotify-client_{full_version}_amd64.deb"
try:
print(f"Скачивание {filename}...")
with tempfile.NamedTemporaryFile(delete=False, suffix=".deb") as temp_file:
response = requests.get(url, stream=True, timeout=60)
response.raise_for_status()
for chunk in response.iter_content(chunk_size=8192):
if chunk:
temp_file.write(chunk)
return temp_file.name, filename
except RequestException as e:
print(f"Ошибка при скачивании файла: {e}")
return None, None
def get_github_token():
token = os.environ.get("PERSONAL_TOKEN")
if not token:
print("ОШИБКА: Не найден PERSONAL_TOKEN в переменных окружения")
return token
def get_latest_release(token):
headers = {
"Authorization": f"token {token}",
"Accept": "application/vnd.github.v3+json",
}
url = f"https://api.github.com/repos/{REPO_UPLOAD}/releases/latest"
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.json()
except RequestException as e:
print(f"Ошибка при получении последнего релиза: {e}")
return None
def upload_file_to_release(token, release_id, file_path, file_name):
headers = {
"Authorization": f"token {token}",
"Accept": "application/vnd.github.v3+json",
"Content-Type": "application/octet-stream",
}
url = f"https://uploads.github.com/repos/{REPO_UPLOAD}/releases/{release_id}/assets?name={file_name}"
try:
with open(file_path, "rb") as file:
print(f"Загрузка {file_name} в релиз...")
response = requests.post(url, headers=headers, data=file)
response.raise_for_status()
print(f"Файл {file_name} успешно загружен в релиз")
return True
except RequestException as e:
print(f"Ошибка при загрузке файла в релиз: {e}")
return False
finally:
# Удаляем временный файл
try:
os.remove(file_path)
except Exception as e:
print(f"Не удалось удалить временный файл {file_path}: {e}")
def main():
# Получаем версии из репозитория Spotify
spotify_versions = get_spotify_versions_from_repo()
# Получаем существующие версии из JSON
existing_data = get_existing_versions()
# Находим новые версии
new_versions = find_new_versions(spotify_versions, existing_data)
if not new_versions:
print("Новых версий не найдено")
return False
print(f"Найдено новых версий: {len(new_versions)}")
# Если есть новые версии, получаем токен GitHub и загружаем файлы
github_token = get_github_token()
if github_token:
latest_release = get_latest_release(github_token)
if latest_release:
release_id = latest_release["id"]
# Скачиваем и загружаем каждую новую версию
for version_key, full_version in new_versions:
temp_file_path, file_name = download_deb_file(full_version)
if temp_file_path:
time.sleep(2)
upload_file_to_release(
github_token, release_id, temp_file_path, file_name
)
# Добавляем новые версии в существующие данные
for version_key, full_version in new_versions:
file_info = get_file_info(full_version)
existing_data[version_key] = {
"fullversion": full_version,
"size": file_info["size"],
"data": file_info["data"],
"links": {
"amd64": f"https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_{full_version}_amd64.deb"
},
}
# Сортируем и обновляем данные
sorted_data = sort_versions(existing_data)
if update_json_file(sorted_data):
# Если мы находимся в GitHub Actions, выполняем коммит
if os.environ.get("GITHUB_ACTIONS") == "true":
commit_changes(new_versions)
print("Обновление выполнено успешно")
return True
if __name__ == "__main__":
main()
sys.exit(0)

View file

@ -46,19 +46,19 @@ function Get-LatestSpotifyVersion {
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36" $session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
$url = "https://store.rg-adguard.net/api/GetFiles" $url = "https://ru.store.rg-adguard.net/api/GetFiles"
$body = "type=url&url=https://apps.microsoft.com/detail/9ncbcszsjrsb&gl=US&ring=RP&lang=en" $body = "type=url&url=https://apps.microsoft.com/detail/9ncbcszsjrsb&gl=US&ring=RP&lang=en"
$headers = @{ $headers = @{
"authority" = "store.rg-adguard.net" "authority" = "ru.store.rg-adguard.net"
"method" = "POST" "method" = "POST"
"path" = "/api/GetFiles" "path" = "/api/GetFiles"
"scheme" = "https" "scheme" = "https"
"accept" = "*/*" "accept" = "*/*"
"accept-language" = "ru,ru-RU;q=0.9,en;q=0.8" "accept-language" = "ru,ru-RU;q=0.9,en;q=0.8"
"dnt" = "1" "dnt" = "1"
"origin" = "https://store.rg-adguard.net" "origin" = "https://ru.store.rg-adguard.net"
"priority" = "u=1, i" "priority" = "u=1, i"
"referer" = "https://store.rg-adguard.net/" "referer" = "https://ru.store.rg-adguard.net/"
"sec-ch-ua" = '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' "sec-ch-ua" = '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"'
"sec-ch-ua-mobile" = "?0" "sec-ch-ua-mobile" = "?0"
"sec-ch-ua-platform" = '"Windows"' "sec-ch-ua-platform" = '"Windows"'
@ -94,7 +94,7 @@ function Get-LatestSpotifyVersion {
Url = $url Url = $url
} }
} }
$filteredResults = $results | Where-Object { $_.FileName -match 'SpotifyAB\.SpotifyMusic_.+x86.+\.appx' } $filteredResults = $results | Where-Object { $_.FileName -match 'SpotifyAB\.SpotifyMusic_.+x64.+\.appx' }
$latestFile = $filteredResults | Sort-Object -Property DateTime -Descending | Select-Object -First 1 $latestFile = $filteredResults | Sort-Object -Property DateTime -Descending | Select-Object -First 1
if (-not $latestFile) { if (-not $latestFile) {
@ -158,14 +158,13 @@ function Extract-SpotifyAppx {
function Get-SpotifyExeVersion { function Get-SpotifyExeVersion {
param ($spotifyExePath) param ($spotifyExePath)
Write-Log "Getting version from file $([System.IO.Path]::GetFileName($spotifyExePath))..." Write-Log "Getting version from $([System.IO.Path]::GetFileName($spotifyExePath))..."
$exeContent = Get-Content -Path $spotifyExePath -Raw $exeContent = Get-Content -Path $spotifyExePath -Raw
$regex = '(?<![\w\-])(\d+)\.(\d+)\.(\d+)\.(\d+)(\.g[0-9a-f]{8})(?![\w\-])' $regex = '(?<![\w\-])(\d+)\.(\d+)\.(\d+)\.(\d+)(\.g[0-9a-f]{8})(?![\w\-])'
if ($exeContent -match $regex) { if ($exeContent -match $regex) {
Write-Log "Version received successfully: $($matches[0])" Write-Log "Version received successfully: $($matches[0])"
return $matches[0] return $matches[0]
} }
Write-Log "Version not found in file $([System.IO.Path]::GetFileName($spotifyExePath))"
return $null return $null
} }
@ -244,7 +243,7 @@ function Main {
return return
} }
$spotifyExePath = Get-ChildItem -Path $spotifyTempDir -Filter "Spotify.exe" -Recurse | Select-Object -First 1 $spotifyExePath = Get-ChildItem -Path $spotifyTempDir -Filter "Spotify.dll" -Recurse | Select-Object -First 1
if (-not $spotifyExePath) { if (-not $spotifyExePath) {
Write-Log "Spotify.exe not found" Write-Log "Spotify.exe not found"
return return

View file

@ -1,4 +0,0 @@
aiohttp
asyncio
beautifulsoup4
argparse

151
upd.py
View file

@ -1,151 +0,0 @@
import aiohttp
import asyncio
import json
import re
import argparse
from bs4 import BeautifulSoup
parser = argparse.ArgumentParser()
parser.add_argument("-v", required=True)
parser.add_argument("-s", required=True)
parser.add_argument("-u", required=True)
args = parser.parse_args()
version = args.v
source = args.s
u = args.u
async def send_request(json_data):
url = u + json_data
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
data = await response.text()
soup = BeautifulSoup(data, "html.parser")
system_response = soup.find(
"div",
style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px",
).text
print(f"Ответ от GAS: {system_response}")
async def check_url(session, url, platform_name):
try:
async with session.get(url) as response:
if response.status == 200:
if platform_name:
return response.url, platform_name
else:
return response.url
except aiohttp.ClientError:
pass
return None
async def pre_version(latest_urls):
message = f'Версия {version} {"отправлена" if latest_urls else "не найдена"}'
print(message)
if not latest_urls:
latest_urls = {"unknown": "unknown", "version": version}
latest_urls["version"] = version
latest_urls["source"] = source
req_ver = json.dumps(latest_urls, ensure_ascii=False, indent=2)
await send_request(req_ver)
def get_urls(find_url):
platform_urls = {}
version_pattern = re.compile(r"-([0-9]+)\.(exe|tbz)")
for url, platform in find_url:
match = version_pattern.search(str(url))
if match:
version_number = int(match.group(1))
if platform in platform_urls:
# Если найдено больше одного url для платформы, то выбираем с самой большой ревизией
current_version = int(
version_pattern.search(platform_urls[platform]).group(1)
)
if version_number > current_version:
platform_urls[platform] = str(url)
else:
platform_urls[platform] = str(url)
return platform_urls
async def main():
start_number = 0
before_enter = 1000
additional_searches = 10 # Максимальное кол-во шагов для дополнительного поиска
increment = 1000 # Размер шага
numbers = start_number
find_url = []
root_url = "https://upgrade.scdn.co/upgrade/client/"
platform_templates = {
"WIN32": "win32-x86/spotify_installer-{version}-{numbers}.exe",
"WIN64": "win32-x86_64/spotify_installer-{version}-{numbers}.exe",
"WIN-ARM64": "win32-arm64/spotify_installer-{version}-{numbers}.exe",
"OSX": "osx-x86_64/spotify-autoupdate-{version}-{numbers}.tbz",
"OSX-ARM64": "osx-arm64/spotify-autoupdate-{version}-{numbers}.tbz",
}
async with aiohttp.ClientSession() as session:
tasks = []
platform_names = list(platform_templates.keys())
for platform_name in platform_names:
numbers = start_number
while numbers <= before_enter:
url = root_url + platform_templates[platform_name].format(
version=version, numbers=numbers
)
tasks.append(check_url(session, url, platform_name))
numbers += 1
results = []
for task in asyncio.as_completed(tasks):
result = await task
if result is not None:
find_url.append(result)
# Дополнительный поиск
for i in range(additional_searches):
if len(get_urls(find_url)) < len(
platform_names
): # Если не найдены все платформы
start_number = before_enter + 1
before_enter += increment
tasks = []
for platform_name in platform_names:
numbers = start_number
while numbers <= before_enter:
url = root_url + platform_templates[platform_name].format(
version=version, numbers=numbers
)
tasks.append(check_url(session, url, platform_name))
numbers += 1
for task in asyncio.as_completed(tasks):
result = await task
if result is not None:
find_url.append(result)
latest_urls = get_urls(find_url)
if len(latest_urls) == len(platform_names):
await pre_version(latest_urls)
return
if find_url:
latest_urls = get_urls(find_url)
await pre_version(latest_urls)
else:
await pre_version(False)
asyncio.run(main())

63
update_version.py Normal file
View file

@ -0,0 +1,63 @@
#!/usr/bin/env python3
import json
import re
import sys
def update_version(data_json: str, build_type: str = None, version_file: str = "versions.json") -> bool:
try:
data = json.loads(data_json)
version_key = list(data.keys())[0]
version_data = data[version_key]
if build_type and build_type.lower() != 'false':
version_data = {'buildType': build_type, **version_data}
with open(version_file, 'r', encoding='utf-8') as f:
file_data = json.load(f)
file_data[version_key] = version_data
sorted_data = dict(
sorted(
file_data.items(),
key=lambda x: [
int(part) if part.isdigit() else part
for part in re.split(r'(\d+)', x[0])
],
reverse=True
)
)
with open(version_file, 'w', encoding='utf-8') as f:
json.dump(sorted_data, f, indent=2)
print(f"Version {version_key} added to {version_file}")
return True
except json.JSONDecodeError as e:
print(f"JSON parse error: {e}", file=sys.stderr)
return False
except FileNotFoundError:
print(f"File {version_file} not found", file=sys.stderr)
return False
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
return False
def main():
if len(sys.argv) < 2:
print("Usage: python update_version.py '<json_data>' [build_type] [version_file]", file=sys.stderr)
sys.exit(1)
data_json = sys.argv[1]
build_type = sys.argv[2] if len(sys.argv) > 2 else None
version_file = sys.argv[3] if len(sys.argv) > 3 else "versions.json"
success = update_version(data_json, build_type, version_file)
sys.exit(0 if success else 1)
if __name__ == "__main__":
main()

File diff suppressed because it is too large Load diff

274
versions_deb.json Normal file
View file

@ -0,0 +1,274 @@
{
"1.2.84.476": {
"fullversion": "1.2.84.476.ga1ff6607",
"size": "157643240",
"data": "09.03.2026",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.84.476.ga1ff6607_amd64.deb"
}
},
"1.2.82.428": {
"fullversion": "1.2.82.428.g0ac8be2b",
"size": "156375346",
"data": "09.02.2026",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.82.428.g0ac8be2b_amd64.deb"
}
},
"1.2.79.427": {
"fullversion": "1.2.79.427.g80eb4a07",
"size": "155456648",
"data": "12.01.2026",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.79.427.g80eb4a07_amd64.deb"
}
},
"1.2.79.425": {
"fullversion": "1.2.79.425.g1d0fcf61",
"size": "155381166",
"data": "17.12.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.79.425.g1d0fcf61_amd64.deb"
}
},
"1.2.77.358": {
"fullversion": "1.2.77.358.g4339a634",
"size": "155510286",
"data": "25.11.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.77.358.g4339a634_amd64.deb"
}
},
"1.2.74.477": {
"fullversion": "1.2.74.477.g3be53afe",
"size": "154653044",
"data": "20.10.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.74.477.g3be53afe_amd64.deb"
}
},
"1.2.63.394": {
"fullversion": "1.2.63.394.g126b0d89",
"size": "147984434",
"data": "19.05.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.63.394.g126b0d89_amd64.deb"
}
},
"1.2.60.564": {
"fullversion": "1.2.60.564.gcc6305cb",
"size": "144421884",
"data": "07.04.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.60.564.gcc6305cb_amd64.deb"
}
},
"1.2.59.514": {
"fullversion": "1.2.59.514.g834e17d4",
"size": "143491584",
"data": "13.03.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.59.514.g834e17d4_amd64.deb"
}
},
"1.2.59.513": {
"fullversion": "1.2.59.513.g9e00425b",
"size": "143470202",
"data": "12.03.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.59.513.g9e00425b_amd64.deb"
}
},
"1.2.56.502": {
"fullversion": "1.2.56.502.ga68d2d4f",
"size": "142990750",
"data": "28.01.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.56.502.ga68d2d4f_amd64.deb"
}
},
"1.2.53.440": {
"fullversion": "1.2.53.440.g7b2f582a",
"size": "143507202",
"data": "02.01.2025",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.53.440.g7b2f582a_amd64.deb"
}
},
"1.2.52.442": {
"fullversion": "1.2.52.442.g01893f92",
"size": "143523470",
"data": "02.12.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.52.442.g01893f92_amd64.deb"
}
},
"1.2.50.335": {
"fullversion": "1.2.50.335.g5e2860a8",
"size": "143617148",
"data": "11.11.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.50.335.g5e2860a8_amd64.deb"
}
},
"1.2.48.405": {
"fullversion": "1.2.48.405.gf2c48e6f",
"size": "143394450",
"data": "08.10.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.48.405.gf2c48e6f_amd64.deb"
}
},
"1.2.47.364": {
"fullversion": "1.2.47.364.gf06e5cee",
"size": "109100472",
"data": "20.09.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.47.364.gf06e5cee_amd64.deb"
}
},
"1.2.45.454": {
"fullversion": "1.2.45.454.gc16ec9f6",
"size": "141143192",
"data": "26.08.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.45.454.gc16ec9f6_amd64.deb"
}
},
"1.2.42.290": {
"fullversion": "1.2.42.290.g242057a2",
"size": "140926882",
"data": "12.07.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.42.290.g242057a2_amd64.deb"
}
},
"1.2.40.599": {
"fullversion": "1.2.40.599.g606b7f29",
"size": "140956866",
"data": "17.06.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.40.599.g606b7f29_amd64.deb"
}
},
"1.2.37.701": {
"fullversion": "1.2.37.701.ge66eb7bc",
"size": "137805232",
"data": "03.05.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.37.701.ge66eb7bc_amd64.deb"
}
},
"1.2.31.1205": {
"fullversion": "1.2.31.1205.g4d59ad7c",
"size": "135223836",
"data": "09.02.2024",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.31.1205.g4d59ad7c_amd64.deb"
}
},
"1.2.26.1187": {
"fullversion": "1.2.26.1187.g36b715a1",
"size": "133729904",
"data": "04.12.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.26.1187.g36b715a1_amd64.deb"
}
},
"1.2.25.1011": {
"fullversion": "1.2.25.1011.g0348b2ea",
"size": "132587766",
"data": "20.11.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.25.1011.g0348b2ea_amd64.deb"
}
},
"1.2.25.1009": {
"fullversion": "1.2.25.1009.g075ce884",
"size": "132533054",
"data": "17.11.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.25.1009.g075ce884_amd64.deb"
}
},
"1.2.22.982": {
"fullversion": "1.2.22.982.g794acc0a",
"size": "124729466",
"data": "06.10.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.22.982.g794acc0a_amd64.deb"
}
},
"1.2.20.1210": {
"fullversion": "1.2.20.1210.g2a8a8a57",
"size": "124183006",
"data": "08.09.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.20.1210.g2a8a8a57_amd64.deb"
}
},
"1.2.18.999": {
"fullversion": "1.2.18.999.g9b38fc27",
"size": "122391766",
"data": "14.08.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.18.999.g9b38fc27_amd64.deb"
}
},
"1.2.13.661": {
"fullversion": "1.2.13.661.ga588f749",
"size": "121793588",
"data": "05.06.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.13.661.ga588f749_amd64.deb"
}
},
"1.2.11.916": {
"fullversion": "1.2.11.916.geb595a67",
"size": "121053308",
"data": "11.05.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.11.916.geb595a67_amd64.deb"
}
},
"1.2.8.923": {
"fullversion": "1.2.8.923.g4f94bf0d",
"size": "119841576",
"data": "27.03.2023",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.2.8.923.g4f94bf0d_amd64.deb"
}
},
"1.1.84.716": {
"fullversion": "1.1.84.716.gc5f8b819",
"size": "119770140",
"data": "22.04.2022",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.1.84.716.gc5f8b819_amd64.deb"
}
},
"1.1.72.439": {
"fullversion": "1.1.72.439.gc253025e",
"size": "117803268",
"data": "10.11.2021",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.1.72.439.gc253025e_amd64.deb"
}
},
"1.1.68.632": {
"fullversion": "1.1.68.632.g2b11de83",
"size": "112586002",
"data": "20.09.2021",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.1.68.632.g2b11de83_amd64.deb"
}
},
"1.1.67.586": {
"fullversion": "1.1.67.586.gbb5ef64e",
"size": "118938508",
"data": "31.08.2021",
"links": {
"amd64": "https://github.com/LoaderSpot/deb-builds/releases/download/builds/spotify-client_1.1.67.586.gbb5ef64e_amd64.deb"
}
}
}