forked from uup-dump/api
commit
2dbb52dc7f
32
fetchupd.php
32
fetchupd.php
@ -17,6 +17,7 @@ limitations under the License.
|
||||
|
||||
require_once dirname(__FILE__).'/shared/main.php';
|
||||
require_once dirname(__FILE__).'/shared/requests.php';
|
||||
require_once dirname(__FILE__).'/shared/cache.php';
|
||||
require_once dirname(__FILE__).'/listid.php';
|
||||
|
||||
function uupFetchUpd(
|
||||
@ -90,23 +91,10 @@ function uupFetchUpd(
|
||||
$type = 'Production';
|
||||
}
|
||||
|
||||
$cacheHash = hash('sha256', strtolower("api-fetch-$arch-$ring-$flight-$build-$minor-$sku-$type"));
|
||||
$cached = 0;
|
||||
|
||||
if(file_exists('cache/'.$cacheHash.'.json.gz') && $cacheRequests == 1) {
|
||||
$cache = @gzdecode(@file_get_contents('cache/'.$cacheHash.'.json.gz'));
|
||||
$cache = json_decode($cache, 1);
|
||||
|
||||
if(!empty($cache['content']) && ($cache['expires'] > time())) {
|
||||
consoleLogger('Using cached response...');
|
||||
$out = $cache['content'];
|
||||
$cached = 1;
|
||||
} else {
|
||||
$cached = 0;
|
||||
}
|
||||
|
||||
unset($cache);
|
||||
}
|
||||
$res = "api-fetch-$arch-$ring-$flight-$build-$minor-$sku-$type";
|
||||
$cache = new UupDumpCache($res);
|
||||
$out = $cache->get();
|
||||
$cached = ($out !== false);
|
||||
|
||||
if(!$cached) {
|
||||
consoleLogger('Fetching information from the server...');
|
||||
@ -117,15 +105,7 @@ function uupFetchUpd(
|
||||
consoleLogger('Information has been successfully fetched.');
|
||||
|
||||
if($cacheRequests == 1) {
|
||||
$cache = array(
|
||||
'expires' => time()+120,
|
||||
'content' => $out,
|
||||
);
|
||||
|
||||
if(!file_exists('cache')) mkdir('cache');
|
||||
@file_put_contents('cache/'.$cacheHash.'.json.gz', gzencode(json_encode($cache)."\n"));
|
||||
|
||||
unset($cache);
|
||||
$cache->put($out, 120);
|
||||
}
|
||||
}
|
||||
|
||||
|
58
get.php
58
get.php
@ -18,6 +18,7 @@ limitations under the License.
|
||||
require_once dirname(__FILE__).'/shared/main.php';
|
||||
require_once dirname(__FILE__).'/shared/requests.php';
|
||||
require_once dirname(__FILE__).'/shared/packs.php';
|
||||
require_once dirname(__FILE__).'/shared/cache.php';
|
||||
|
||||
/*
|
||||
$updateId = Update Identifier
|
||||
@ -142,6 +143,7 @@ function uupGetFiles(
|
||||
$updateBuild = (isset($info['build'])) ? $info['build'] : 'UNKNOWN';
|
||||
$updateName = (isset($info['title'])) ? $info['title'] : 'Unknown update: '.$updateId;
|
||||
$sha256capable = isset($info['sha256ready']);
|
||||
$hasUpdates = false;
|
||||
|
||||
if(isset($info['releasetype'])) {
|
||||
$type = $info['releasetype'];
|
||||
@ -215,6 +217,7 @@ function uupGetFiles(
|
||||
unset($index, $name, $msu);
|
||||
|
||||
$filesInfoKeys = array_keys($filesInfoList);
|
||||
$updatesRegex = '/Windows(10|11)\.0-KB|SSU-.*?\....$/i';
|
||||
|
||||
switch($fileListSource) {
|
||||
case 'UPDATEONLY':
|
||||
@ -227,8 +230,8 @@ function uupGetFiles(
|
||||
unset($removeFiles);
|
||||
|
||||
foreach($removeMSUs as $val) {
|
||||
if(isset($filesInfoList[$val.'.cab'])) {
|
||||
if(isset($filesInfoList[$val.'.msu'])) unset($filesInfoList[$val.'.msu']);
|
||||
if(isset($filesInfoList[$val.'.cab']) && isset($filesInfoList[$val.'.msu'])) {
|
||||
unset($filesInfoList[$val.'.msu']);
|
||||
}
|
||||
}
|
||||
unset($removeMSUs);
|
||||
@ -236,13 +239,14 @@ function uupGetFiles(
|
||||
$filesInfoKeys = array_keys($filesInfoList);
|
||||
$temp = preg_grep('/.*?AggregatedMetadata.*?\.cab|.*?DesktopDeployment.*?\.cab/i', $filesInfoKeys);
|
||||
|
||||
$filesInfoKeys = preg_grep('/Windows(10|11)\.0-KB|SSU-.*?\....$/i', $filesInfoKeys);
|
||||
$filesInfoKeys = preg_grep($updatesRegex, $filesInfoKeys);
|
||||
if(count($filesInfoKeys) == 0) {
|
||||
return array('error' => 'NOT_CUMULATIVE_UPDATE');
|
||||
}
|
||||
|
||||
if($build > 21380) $filesInfoKeys = array_merge($filesInfoKeys, $temp);
|
||||
unset($temp);
|
||||
$hasUpdates = true;
|
||||
break;
|
||||
|
||||
case 'WUBFILE':
|
||||
@ -257,8 +261,8 @@ function uupGetFiles(
|
||||
|
||||
if($fileListSource == 'GENERATEDPACKS') {
|
||||
foreach($removeMSUs as $val) {
|
||||
if(isset($filesInfoList[$val.'.cab'])) {
|
||||
if(isset($filesInfoList[$val.'.msu'])) unset($filesInfoList[$val.'.msu']);
|
||||
if(isset($filesInfoList[$val.'.cab']) && isset($filesInfoList[$val.'.msu'])) {
|
||||
unset($filesInfoList[$val.'.msu']);
|
||||
}
|
||||
}
|
||||
unset($removeMSUs);
|
||||
@ -270,8 +274,10 @@ function uupGetFiles(
|
||||
} else if($build > 21380) {
|
||||
$temp = preg_grep('/Windows(10|11)\.0-KB|SSU-.*?\....$|.*?AggregatedMetadata.*?\.cab|.*?DesktopDeployment.*?\.cab/i', $temp);
|
||||
} else {
|
||||
$temp = preg_grep('/Windows(10|11)\.0-KB|SSU-.*?\....$/i', $temp);
|
||||
$temp = preg_grep($updatesRegex, $temp);
|
||||
}
|
||||
|
||||
$hasUpdates = !empty(preg_grep($updatesRegex, $temp));
|
||||
$filesPacksList = array_merge($filesPacksList, $temp);
|
||||
|
||||
$newFiles = array();
|
||||
@ -337,31 +343,21 @@ function uupGetFiles(
|
||||
'arch' => $updateArch,
|
||||
'build' => $updateBuild,
|
||||
'sku' => $updateSku,
|
||||
'hasUpdates' => $hasUpdates,
|
||||
'files' => $files,
|
||||
);
|
||||
}
|
||||
|
||||
function uupGetOnlineFiles($updateId, $rev, $info, $cacheRequests, $type) {
|
||||
$cacheHash = hash('sha256', strtolower("api-get-${updateId}_rev.$rev"));
|
||||
$cached = 0;
|
||||
$res = "api-get-${updateId}_rev.$rev";
|
||||
$cache = new UupDumpCache($res);
|
||||
$fromCache = $cache->get();
|
||||
$cached = ($fromCache !== false);
|
||||
|
||||
if(file_exists('cache/'.$cacheHash.'.json.gz') && $cacheRequests == 1) {
|
||||
$cache = @gzdecode(@file_get_contents('cache/'.$cacheHash.'.json.gz'));
|
||||
$cache = json_decode($cache, 1);
|
||||
|
||||
if(!empty($cache['content']) && ($cache['expires'] > time())) {
|
||||
consoleLogger('Using cached response...');
|
||||
$out = $cache['content'];
|
||||
$fetchTime = $cache['fetchTime'];
|
||||
$cached = 1;
|
||||
} else {
|
||||
$cached = 0;
|
||||
}
|
||||
|
||||
unset($cache);
|
||||
}
|
||||
|
||||
if(!$cached) {
|
||||
if($cached) {
|
||||
$out = $fromCache['out'];
|
||||
$fetchTime = $fromCache['fetchTime'];
|
||||
} else {
|
||||
$fetchTime = time();
|
||||
consoleLogger('Fetching information from the server...');
|
||||
$postData = composeFileGetRequest($updateId, uupDevice(), $info, $rev, $type);
|
||||
@ -372,7 +368,7 @@ function uupGetOnlineFiles($updateId, $rev, $info, $cacheRequests, $type) {
|
||||
consoleLogger('Parsing information...');
|
||||
$xmlOut = @simplexml_load_string($out);
|
||||
if($xmlOut === false) {
|
||||
@unlink('cache/'.$cacheHash.'.json.gz');
|
||||
$cache->delete();
|
||||
return array('error' => 'XML_PARSE_ERROR');
|
||||
}
|
||||
|
||||
@ -468,14 +464,12 @@ function uupGetOnlineFiles($updateId, $rev, $info, $cacheRequests, $type) {
|
||||
}
|
||||
|
||||
if($cacheRequests == 1 && $cached == 0) {
|
||||
$cache = array(
|
||||
'expires' => time()+90,
|
||||
'content' => $out,
|
||||
$cacheData = [
|
||||
'out' => $out,
|
||||
'fetchTime' => $fetchTime,
|
||||
);
|
||||
];
|
||||
|
||||
if(!file_exists('cache')) mkdir('cache');
|
||||
@file_put_contents('cache/'.$cacheHash.'.json.gz', gzencode(json_encode($cache)."\n"));
|
||||
$cache->put($cacheData, 90);
|
||||
}
|
||||
|
||||
return $files;
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright 2019 UUP dump API authors
|
||||
Copyright 2022 UUP dump API authors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@ -21,7 +21,7 @@ require_once dirname(__FILE__).'/updateinfo.php';
|
||||
|
||||
function uupListEditions($lang = 'en-us', $updateId = 0) {
|
||||
if($updateId) {
|
||||
$info = uupUpdateInfo($updateId);
|
||||
$info = uupUpdateInfo($updateId, false, true);
|
||||
}
|
||||
|
||||
if(!$lang) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright 2019 UUP dump API authors
|
||||
Copyright 2022 UUP dump API authors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@ -21,7 +21,7 @@ require_once dirname(__FILE__).'/updateinfo.php';
|
||||
|
||||
function uupListLangs($updateId = 0) {
|
||||
if($updateId) {
|
||||
$info = uupUpdateInfo($updateId);
|
||||
$info = uupUpdateInfo($updateId, false, true);
|
||||
}
|
||||
|
||||
if(isset($info['info'])) {
|
||||
|
78
shared/cache.php
Normal file
78
shared/cache.php
Normal file
@ -0,0 +1,78 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright 2022 eraseyourknees
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
class UupDumpCache {
|
||||
private $cacheFile;
|
||||
private $isCompressed;
|
||||
private $newCacheVersion = 1;
|
||||
|
||||
public function __construct($resource, $compressed = true) {
|
||||
$res = $resource."+cache_v".$this->newCacheVersion;
|
||||
$cacheHash = hash('sha256', strtolower($res));
|
||||
$ext = $compressed ? '.json.gz' : '.json';
|
||||
$this->cacheFile = 'cache/'.$cacheHash.$ext;
|
||||
$this->isCompressed = $compressed;
|
||||
}
|
||||
|
||||
public function getFileName() {
|
||||
return $this->cacheFile;
|
||||
}
|
||||
|
||||
public function delete() {
|
||||
@unlink($this->cacheFile);
|
||||
}
|
||||
|
||||
public function get() {
|
||||
$cacheFile = $this->cacheFile;
|
||||
|
||||
if(!file_exists($cacheFile)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$cache = @file_get_contents($cacheFile);
|
||||
if($this->isCompressed) $cache = @gzdecode($cache);
|
||||
|
||||
$cache = json_decode($cache, 1);
|
||||
|
||||
$expires = $cache['expires'];
|
||||
$isExpired = ($expires !== false) && (time() > $expires);
|
||||
|
||||
if(empty($cache['content']) || $isExpired) {
|
||||
$this->delete();
|
||||
return false;
|
||||
}
|
||||
|
||||
return $cache['content'];
|
||||
}
|
||||
|
||||
public function put($content, $validity) {
|
||||
$cacheFile = $this->cacheFile;
|
||||
$expires = $validity ? time() + $validity : false;
|
||||
|
||||
$cache = array(
|
||||
'expires' => $expires,
|
||||
'content' => $content,
|
||||
);
|
||||
|
||||
if(!file_exists('cache')) mkdir('cache');
|
||||
|
||||
$cacheContent = json_encode($cache)."\n";
|
||||
if($this->isCompressed) $cacheContent = @gzencode($cacheContent);
|
||||
|
||||
@file_put_contents($cacheFile, $cacheContent);
|
||||
}
|
||||
}
|
@ -16,7 +16,7 @@ limitations under the License.
|
||||
*/
|
||||
|
||||
function uupApiVersion() {
|
||||
return '1.32.2';
|
||||
return '1.33.0';
|
||||
}
|
||||
|
||||
require_once dirname(__FILE__).'/auths.php';
|
||||
|
163
shared/packs.php
163
shared/packs.php
@ -202,165 +202,12 @@ function uupGetInfoTexts() {
|
||||
}
|
||||
|
||||
function uupGetGenPacks($build = 15063, $arch = null, $updateId = null) {
|
||||
$internalPacks = dirname(__FILE__).'/packs';
|
||||
if(empty($updateId)) return [];
|
||||
if(!file_exists('packs/'.$updateId.'.json.gz')) return [];
|
||||
|
||||
if(!file_exists($internalPacks.'/metadata.json')) {
|
||||
if(!uupCreateInternalPacksMetadata($internalPacks)) {
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
if(!empty($updateId)) {
|
||||
if(file_exists('packs/'.$updateId.'.json.gz')) {
|
||||
$genPack = @gzdecode(@file_get_contents('packs/'.$updateId.'.json.gz'));
|
||||
if(empty($genPack)) return array();
|
||||
|
||||
$genPack = json_decode($genPack, 1);
|
||||
return $genPack;
|
||||
}
|
||||
}
|
||||
|
||||
$metadata = @file_get_contents($internalPacks.'/metadata.json');
|
||||
if(empty($metadata)) {
|
||||
return array();
|
||||
} else {
|
||||
$metadata = json_decode($metadata, 1);
|
||||
}
|
||||
|
||||
$hashDetermined = 0;
|
||||
$useAllHashesForBuild = 0;
|
||||
|
||||
if($updateId) {
|
||||
if(isset($metadata['knownIds'][$updateId])) {
|
||||
$hash = $metadata['knownIds'][$updateId];
|
||||
$hashDetermined = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(!$hashDetermined) {
|
||||
foreach($metadata['knownBuilds'] as $buildNum => $val) {
|
||||
if($build < $buildNum) continue;
|
||||
$useBuild = $buildNum;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!isset($useBuild)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
if(!$arch && !isset($metadata['knownBuilds'][$useBuild][$arch])) {
|
||||
$genPack = array();
|
||||
foreach($metadata['knownBuilds'][$useBuild] as $hash) {
|
||||
$temp = @gzdecode(@file_get_contents($internalPacks.'/'.$hash.'.json.gz'));
|
||||
if(!empty($temp)) {
|
||||
$temp = json_decode($temp, 1);
|
||||
$genPack = array_merge_recursive($genPack, $temp);
|
||||
unset($temp);
|
||||
}
|
||||
}
|
||||
} elseif(!isset($metadata['knownBuilds'][$useBuild][$arch])) {
|
||||
return array();
|
||||
} else {
|
||||
$hash = $metadata['knownBuilds'][$useBuild][$arch];
|
||||
}
|
||||
}
|
||||
|
||||
if(!isset($genPack)) {
|
||||
$genPack = @gzdecode(@file_get_contents($internalPacks.'/'.$hash.'.json.gz'));
|
||||
if(!empty($genPack)) {
|
||||
$genPack = json_decode($genPack, 1);
|
||||
} else {
|
||||
$genPack = array();
|
||||
}
|
||||
}
|
||||
$genPack = @gzdecode(@file_get_contents('packs/'.$updateId.'.json.gz'));
|
||||
if(empty($genPack)) return [];
|
||||
|
||||
$genPack = json_decode($genPack, 1);
|
||||
return $genPack;
|
||||
}
|
||||
|
||||
//Function to regenerate internal packs. Should not be used when not needed.
|
||||
function uupCreateInternalPacksMetadata($internalPacks) {
|
||||
$metadataCreationAllowed = 0;
|
||||
if(!$metadataCreationAllowed) return false;
|
||||
|
||||
$builds = uupListIds();
|
||||
if(isset($ids['error'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$builds = $builds['builds'];
|
||||
|
||||
if(!file_exists('packs')) return false;
|
||||
|
||||
if(!file_exists($internalPacks)) {
|
||||
if(!mkdir($internalPacks)) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
rmdir($internalPacks);
|
||||
mkdir($internalPacks);
|
||||
}
|
||||
|
||||
$files = scandir('packs');
|
||||
$files = preg_grep('/\.json.gz$/', $files);
|
||||
|
||||
$packs = array();
|
||||
foreach($builds as $build) {
|
||||
$uuid = $build['uuid'];
|
||||
$file = $uuid.'.json.gz';
|
||||
|
||||
if(!file_exists('packs/'.$file)) continue;
|
||||
|
||||
$genPack = @gzdecode(@file_get_contents('packs/'.$file));
|
||||
$hash = hash('sha1', $genPack);
|
||||
|
||||
if(!file_exists($internalPacks.'/'.$hash.'.json.gz')) {
|
||||
if(!copy('packs/'.$file, $internalPacks.'/'.$hash.'.json.gz')) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
$packs['knownIds'][$uuid] = $hash;
|
||||
|
||||
$buildNum = explode('.', $build['build']);
|
||||
$buildNum = $buildNum[0];
|
||||
|
||||
$packs['knownBuilds'][$buildNum][$build['arch']] = $hash;
|
||||
}
|
||||
|
||||
file_put_contents($internalPacks.'/metadata.json', json_encode($packs)."\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
//Emulation of legacy packs. Do not use in new scripts due to extremely slow process.
|
||||
function uupGetPacks($build = 15063) {
|
||||
$returnArray = uupGetInfoTexts();
|
||||
$genPack = uupGetGenPacks($build);
|
||||
|
||||
foreach($genPack as $lang => $editions) {
|
||||
$packsForLangs[$lang] = array_keys($editions);
|
||||
$packsForLangs[$lang][] = $lang;
|
||||
|
||||
foreach(array_keys($editions) as $edition) {
|
||||
foreach($editions[$edition] as $name) {
|
||||
$newName = preg_replace('/^cabs_|^metadataesd_|~31bf3856ad364e35/i', '', $name);
|
||||
$newName = preg_replace('/~~\.|~\./', '.', $newName);
|
||||
$newName = preg_replace('/~/', '-', $newName);
|
||||
$newName = strtolower($newName);
|
||||
$packs[$lang][$edition][] = $newName;
|
||||
}
|
||||
|
||||
$editionPacks[$edition] = $edition;
|
||||
$packs[$edition][$edition] = array();
|
||||
$skipNeutral[$edition] = 1;
|
||||
$skipLangPack[$edition] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
$returnArray['packs'] = $packs;
|
||||
$returnArray['packsForLangs'] = $packsForLangs;
|
||||
$returnArray['editionPacks'] = $editionPacks;
|
||||
$returnArray['skipNeutral'] = $skipNeutral;
|
||||
$returnArray['skipLangPack'] = $skipLangPack;
|
||||
|
||||
return $returnArray;
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user