|
3 | 3 | using System.Web; |
4 | 4 | using UniGetUI.Core.Classes; |
5 | 5 | using UniGetUI.Core.Data; |
| 6 | +using UniGetUI.Core.Logging; |
6 | 7 | using UniGetUI.Core.Tools; |
7 | 8 | using UniGetUI.PackageEngine.Enums; |
8 | 9 | using UniGetUI.PackageEngine.Interfaces; |
@@ -112,30 +113,75 @@ protected sealed override IReadOnlyList<Package> GetAvailableUpdates_UnSafe() |
112 | 113 | var logger = TaskLogger.CreateNew(LoggableTaskType.ListUpdates); |
113 | 114 |
|
114 | 115 | var installedPackages = TaskRecycler<IReadOnlyList<IPackage>>.RunOrAttach(GetInstalledPackages); |
| 116 | + var Packages = new List<Package>(); |
115 | 117 |
|
116 | | - var packageIds = new StringBuilder(); |
117 | | - var packageVers = new StringBuilder(); |
118 | | - foreach(var package in installedPackages) |
| 118 | + Dictionary<IManagerSource, List<IPackage>> sourceMapping = new(); |
| 119 | + |
| 120 | + foreach (var package in installedPackages) |
119 | 121 | { |
120 | | - packageIds.Append(package.Id + "|"); |
121 | | - packageVers.Append(package.VersionString + "|"); |
| 122 | + var uri = package.Source; |
| 123 | + if (!sourceMapping.ContainsKey(uri)) sourceMapping[uri] = new(); |
| 124 | + sourceMapping[uri].Add(package); |
122 | 125 | } |
123 | 126 |
|
124 | | - var SearchUrl = $"https://www.powershellgallery.com/api/v2/GetUpdates()?" + |
125 | | - $"?packageIds='{HttpUtility.UrlEncode(packageIds.ToString())}'" + |
126 | | - $"&versions='{HttpUtility.UrlEncode(packageVers.ToString())}'" + |
127 | | - $"&includePrerelease=0&includeAllVersions=0"; |
| 127 | + foreach (var pair in sourceMapping) |
| 128 | + { |
| 129 | + var packageIds = new StringBuilder(); |
| 130 | + var packageVers = new StringBuilder(); |
| 131 | + foreach (var package in pair.Value) |
| 132 | + { |
| 133 | + packageIds.Append(package.Id + "|"); |
| 134 | + packageVers.Append(package.VersionString + "|"); |
| 135 | + } |
128 | 136 |
|
129 | | - using HttpClient client = new(CoreData.GenericHttpClientParameters); |
130 | | - client.DefaultRequestHeaders.UserAgent.ParseAdd(CoreData.UserAgentString); |
131 | | - HttpResponseMessage response = client.GetAsync(SearchUrl).GetAwaiter().GetResult(); |
| 137 | + var SearchUrl = $"{pair.Key.Url.ToString().Trim('/')}/GetUpdates()" + |
| 138 | + $"?packageIds=%27{HttpUtility.UrlEncode(packageIds.ToString())}%27" + |
| 139 | + $"&versions=%27{HttpUtility.UrlEncode(packageVers.ToString())}%27" + |
| 140 | + $"&includePrerelease=0&includeAllVersions=0"; |
132 | 141 |
|
133 | | - if (!response.IsSuccessStatusCode) |
134 | | - { |
135 | | - logger.Error($"Failed to fetch api at Url={SearchUrl} with status code {response.StatusCode}"); |
| 142 | + using HttpClient client = new(CoreData.GenericHttpClientParameters); |
| 143 | + client.DefaultRequestHeaders.UserAgent.ParseAdd(CoreData.UserAgentString); |
| 144 | + HttpResponseMessage response = client.GetAsync(SearchUrl).GetAwaiter().GetResult(); |
| 145 | + |
| 146 | + if (!response.IsSuccessStatusCode) |
| 147 | + { |
| 148 | + logger.Error($"Failed to fetch api at Url={SearchUrl} with status code {response.StatusCode}"); |
| 149 | + } |
| 150 | + else |
| 151 | + { |
| 152 | + string SearchResults = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); |
| 153 | + MatchCollection matches = Regex.Matches(SearchResults, "<entry>([\\s\\S]*?)<\\/entry>"); |
| 154 | + |
| 155 | + Dictionary<string, SearchResult> AlreadyProcessedPackages = []; |
| 156 | + |
| 157 | + foreach (Match match in matches) |
| 158 | + { |
| 159 | + if (!match.Success) |
| 160 | + { |
| 161 | + continue; |
| 162 | + } |
| 163 | + |
| 164 | + string id = Regex.Match(match.Value, "<d:Id>'([^</']+)</'").Groups[1].Value; |
| 165 | + string version = Regex.Match(match.Value, "<d:Version>'([^</']+)</'").Groups[1].Value; |
| 166 | + var float_version = CoreTools.VersionStringToStruct(version); |
| 167 | + // Match title = Regex.Match(match.Value, "<title[ \\\"\\=A-Za-z0-9]+>([^<>]+)<\\/title>"); |
| 168 | + |
| 169 | + if (AlreadyProcessedPackages.TryGetValue(id, out var value) && value.version_float >= float_version) |
| 170 | + { |
| 171 | + continue; |
| 172 | + } |
| 173 | + |
| 174 | + AlreadyProcessedPackages[id] = new SearchResult { id = id, version = version, version_float = float_version }; |
| 175 | + } |
| 176 | + foreach (SearchResult package in AlreadyProcessedPackages.Values) |
| 177 | + { |
| 178 | + logger.Log($"Found package {package.id} version {package.version} on source {pair.Key.Name}"); |
| 179 | + Packages.Add(new Package(CoreTools.FormatAsName(package.id), package.id, package.version, package.version, pair.Key, this)); |
| 180 | + } |
| 181 | + } |
136 | 182 | } |
137 | 183 |
|
138 | | - return installedPackages; |
| 184 | + return Packages; |
139 | 185 | } |
140 | 186 | } |
141 | 187 |
|
|
0 commit comments