X-Git-Url: https://git.cweiske.de/ouya-game-data.git/blobdiff_plain/ef5020152268a7503a1aa83b56b3fd0181067290..c4403dee80f58563a6cf8c8d1aff4f7a030bf51e:/bin/convert-original.php diff --git a/bin/convert-original.php b/bin/convert-original.php index 762e1ce..d940d6f 100755 --- a/bin/convert-original.php +++ b/bin/convert-original.php @@ -7,20 +7,25 @@ */ if (isset($argv[1]) && in_array($argv[1], ['-h', '--help'])) { error( - 'Usage: convert-original.php ouya-game-details.json ouya-game-download.json' + 'Usage: convert-original.php game-details.json game-apps.json game-apps-download.json' ); } //cli arguments if (!isset($argv[1])) { - error('details json file parameter missing'); + error('details json file parameter missing (api/v1/details?app=...'); } $detailsFile = $argv[1]; if (!isset($argv[2])) { - error('download json file parameter missing'); + error('apps json file parameter missing (api/v1/apps/xxx'); } -$downloadFile = $argv[2]; +$appsFile = $argv[2]; + +if (!isset($argv[3])) { + error('apps download json file parameter missing (api/v1/apps/xxx/download'); +} +$downloadFile = $argv[3]; //file loading @@ -33,143 +38,144 @@ if ($detailsData === null) { error('Details JSON cannot de loaded'); } -$downloadJson = file_get_contents($downloadFile); -if ($downloadJson === false || trim($downloadJson) === '') { - error('Download file is empty'); +$appsJson = file_get_contents($appsFile); +if ($appsJson === false || trim($appsJson) === '') { + error('Apps file is empty'); } -$downloadData = json_decode($downloadJson); -if ($downloadData === null) { - error('Download JSON cannot de loaded'); +$appsData = json_decode($appsJson); +if ($appsData === null) { + error('App JSON cannot de loaded'); } $package = basename($detailsFile, '.json'); + +if (file_exists($downloadFile)) { + $downloadJson = file_get_contents($downloadFile); + if ($downloadJson === false || trim($downloadJson) === '') { + error('Download file is empty'); + } + $downloadData = json_decode($downloadJson); + if ($downloadData === null) { + error('Download JSON cannot de loaded'); + } + $downloadUrl = $downloadData->app->downloadLink; +} else { + $downloadData = null; + $downloadUrl = null; + //fetch download URL from internet archive files + $version = $appsData->app->versionNumber; + $iaJsonFile = __DIR__ . '/../old-data/ia-data/' + . 'ouya_' . $package . '_' . $version . '.json'; + if (!file_exists($iaJsonFile)) { + error('No download file given, and no internet archive version found'); + } + $iaData = json_decode(file_get_contents($iaJsonFile)); + foreach ($iaData->files as $iaFile) { + if ($iaFile->format == 'Android Package Archive') { + $iaSlug = basename($iaJsonFile, '.json'); + $downloadUrl = 'https://archive.org/download/' . $iaSlug . '/' . $iaFile->name; + } + } + if ($downloadUrl === null) { + error('No .apk download URL found in internet archive json file'); + } +} + + //data building + +$developerUuid = null; +if (isset($detailsData->developer->url)) { + parse_str(parse_url($detailsData->developer->url, PHP_URL_QUERY), $devParams); + $developerUuid = $devParams['developer']; +} + $gameData = [ - 'uuid' => $detailsData->app->uuid, - 'package' => $package, - 'title' => $detailsData->app->title, - 'description' => $detailsData->app->description, - 'players' => $detailsData->app->gamerNumbers, - 'genres' => $detailsData->app->genres, + 'packageName' => $package, + 'title' => $appsData->app->title, + 'description' => $appsData->app->description, + 'players' => $appsData->app->gamerNumbers, + 'genres' => $appsData->app->genres, 'releases' => [ [ - 'name' => $detailsData->app->versionNumber, - 'uuid' => $detailsData->app->latestVersion, - 'date' => $detailsData->app->publishedAt, - 'url' => $downloadData->app->downloadLink, - 'size' => $downloadData->app->fileSize, - 'md5sum' => $detailsData->app->md5sum, - 'publicSize' => $detailsData->app->publicSize, - 'nativeSize' => $detailsData->app->nativeSize, + 'name' => $appsData->app->versionNumber, + 'versionCode' => (int) $detailsData->apk->versionCode, + 'uuid' => $appsData->app->latestVersion, + 'date' => $appsData->app->publishedAt, + 'url' => $downloadUrl, + 'size' => isset($downloadData->app->fileSize) + ? intval($downloadData->app->fileSize) + : intval($appsData->app->apkFileSize), + 'md5sum' => $appsData->app->md5sum, + 'publicSize' => $appsData->app->publicSize, + 'nativeSize' => $appsData->app->nativeSize, ] ], 'media' => [ 'discover' => 'http://ouya.cweiske.de/game-images/' . strtolower($package) . '/discover', - 'large' => newImage($detailsData->app->mainImageFullUrl), - 'video' => $detailsData->app->videoUrl, - 'screenshots' => newImages($detailsData->app->filepickerScreenshots), + 'large' => $appsData->app->mainImageFullUrl, + 'video' => $appsData->app->videoUrl, + 'screenshots' => $appsData->app->filepickerScreenshots, + 'details' => details($detailsData->mediaTiles), ], 'developer' => [ - 'name' => $detailsData->app->developer, - 'supportEmail' => $detailsData->app->supportEmailAddress, - 'supportPhone' => $detailsData->app->supportPhone, - 'founder' => $detailsData->app->founder, + 'uuid' => $developerUuid, + 'name' => $appsData->app->developer, + 'supportEmail' => $appsData->app->supportEmailAddress != '' + ? $appsData->app->supportEmailAddress : null, + 'supportPhone' => $appsData->app->supportPhone, + 'founder' => $appsData->app->founder, ], - 'contentRating' => $detailsData->app->contentRating, - 'website' => $detailsData->app->website, - 'firstPublishedAt' => $detailsData->app->firstPublishedAt, - 'inAppPurchases' => false,//FIXME: we would need discover data here - 'overview' => $detailsData->app->overview, - 'premium' => $detailsData->app->premium, + 'contentRating' => $appsData->app->contentRating, + 'website' => $appsData->app->website, + 'firstPublishedAt' => $appsData->app->firstPublishedAt, + 'inAppPurchases' => $detailsData->inAppPurchases, + 'overview' => $appsData->app->overview, + 'premium' => $appsData->app->premium, 'rating' => [ - 'likeCount' => $detailsData->app->likeCount, - 'average' => $detailsData->app->ratingAverage, - 'count' => $detailsData->app->ratingCount, + 'likeCount' => $appsData->app->likeCount, + 'average' => $appsData->app->ratingAverage, + 'count' => $appsData->app->ratingCount, ], ]; -if (isset($detailsData->app->promotedProduct)) { +if (isset($appsData->app->promotedProduct)) { $gameData['products'][] = [ 'promoted' => true, - 'identifier' => $detailsData->app->promotedProduct->identifier, - 'name' => $detailsData->app->promotedProduct->name, - 'description' => $detailsData->app->promotedProduct->description, - 'localPrice' => $detailsData->app->promotedProduct->localPrice, - 'originalPrice' => $detailsData->app->promotedProduct->originalPrice, - 'currency' => $detailsData->app->promotedProduct->currency, + 'identifier' => $appsData->app->promotedProduct->identifier, + 'name' => $appsData->app->promotedProduct->name, + 'description' => $appsData->app->promotedProduct->description, + 'localPrice' => $appsData->app->promotedProduct->localPrice, + 'originalPrice' => $appsData->app->promotedProduct->originalPrice, + 'currency' => $appsData->app->promotedProduct->currency, ]; } -$iaDataFiles = glob(__DIR__ . '/../old-data/ia-data/ouya_' . $package . '_*.json'); -if (count($iaDataFiles)) { - $iaPkg = []; - foreach ($iaDataFiles as $iaJsonFile) { - $iaData = json_decode(file_get_contents($iaJsonFile)); - foreach ($iaData->files as $iaFile) { - if ($iaFile->format == 'Android Package Archive') { - $iaSlug = basename($iaJsonFile, '.json'); - $iaFile->url = 'https://archive.org/download/' . $iaSlug . '/' . $iaFile->name; - $versionName = explode('_', $iaSlug)[2]; - $iaPkg[$versionName] = $iaFile; - } - } - } - - //update existing release - $exVersion = $gameData['releases'][0]['name']; - if (isset($iaPkg[$exVersion])) { - $gameData['releases'][0]['url'] = $iaPkg[$exVersion]->url; - unset($iaPkg[$exVersion]); - } - foreach ($iaPkg as $iaVersion => $iaApk) { - $gameData['releases'][] = [ - 'name' => $iaVersion, - 'uuid' => null, - 'date' => '2010-01-01T00:00:00Z',//gmdate('c', $iaApk->mtime), - 'url' => $iaApk->url, - 'size' => $iaApk->size, - 'md5sum' => $iaApk->md5, - 'publicSize' => 0,//FIXME - 'nativeSize' => 0,//FIXME - ]; - } - var_dump($iaPkg, $gameData);die(); -} - - echo json_encode($gameData, JSON_PRETTY_PRINT) . "\n"; -function newImage($imageUrl) +function details($mediaTiles) { - return $imageUrl; - static $mapping; - if ($mapping === null) { - $hdl = fopen(__DIR__ . '/../old-data/map-game-images.csv', 'r'); - if (!$hdl) { - error('Cannot load image url map file'); + $details = []; + foreach ($mediaTiles as $tile) { + if ($tile->type == 'video') { + $details[] = [ + 'type' => 'video', + 'url' => $tile->url, + ]; + } else { + $details[] = [ + 'type' => 'image', + 'url' => $tile->urls->full, + 'thumb' => $tile->urls->thumbnail, + ]; } - $mapping = []; - while ($data = fgetcsv($hdl, 4096, ',')) { - if (count($data) == 2) { - $mapping[$data[0]] = $data[1]; - } - } - } - return $mapping[$imageUrl] ?? $imageUrl; -} - -function newImages($urls) -{ - $new = []; - foreach ($urls as $url) { - $new[] = newImage($url); } - return $new; + return $details; } function error($msg)