add search support
[stouyapi.git] / bin / import-game-data.php
index 2d0076e13af2f70a0bfde9fb9f5412a6e60d2b1f..0dc492682446f4d08549b2da95d20a32a9f19f7c 100755 (executable)
@@ -98,6 +98,8 @@ foreach ($gameFiles as $gameFile) {
     }
 }
 
+calculateRank($games);
+
 foreach ($developers as $developer) {
     writeJson(
         //index.htm does not need a rewrite rule
@@ -122,6 +124,14 @@ writeJson(
     buildMakeCategory('Tutorials', filterByGenre($games, 'Tutorials'))
 );
 
+$searchLetters = 'abcdefghijklmnopqrstuvwxyz0123456789., ';
+foreach (str_split($searchLetters) as $letter) {
+    $letterGames = filterBySearchWord($games, $letter);
+    writeJson(
+        'api/v1/search-data/' . $letter . '.json',
+        buildSearch($letterGames)
+    );
+}
 
 
 function buildDiscover(array $games)
@@ -212,12 +222,7 @@ function buildDiscoverCategory($name, $games)
         filterBestRated($games, 10)
     );
 
-    usort(
-        $games,
-        function ($gameA, $gameB) {
-            return strcasecmp($gameA->title, $gameB->title);
-        }
-    );
+    $games = sortByTitle($games);
     $chunks = array_chunk($games, 4);
     foreach ($chunks as $chunkGames) {
         addDiscoverRow($data, '', $chunkGames);
@@ -234,12 +239,7 @@ function buildMakeCategory($name, $games)
         'tiles' => [],
     ];
 
-    usort(
-        $games,
-        function ($gameA, $gameB) {
-            return strcasecmp($gameA->title, $gameB->title);
-        }
-    );
+    $games = sortByTitle($games);
     addDiscoverRow($data, '', $games);
 
     return $data;
@@ -521,6 +521,23 @@ function buildPurchases($game)
     return $encryptedTwice;
 }
 
+function buildSearch($games)
+{
+    $games = sortByTitle($games);
+    $results = [];
+    foreach ($games as $game) {
+        $results[] = [
+            'title' => $game->title,
+            'url'   => 'ouya://launcher/details?app=' . $game->packageName,
+            'contentRating' => $game->contentRating,
+        ];
+    }
+    return [
+        'count'   => count($results),
+        'results' => $results,
+    ];
+}
+
 function dummyEncrypt($data)
 {
     return [
@@ -733,6 +750,29 @@ function addMissingGameProperties($game)
     }
 }
 
+/**
+ * Implements a sensible ranking system described in
+ * https://stackoverflow.com/a/1411268/2826013
+ */
+function calculateRank(array $games)
+{
+    $averageRatings = array_map(
+        function ($game) {
+            return $game->rating->average;
+        },
+        $games
+    );
+    $average = array_sum($averageRatings) / count($averageRatings);
+    $C = $average;
+    $m = 500;
+
+    foreach ($games as $game) {
+        $R = $game->rating->average;
+        $v = $game->rating->count;
+        $game->rating->rank = ($R * $v + $C * $m) / ($v + $m);
+    }
+}
+
 function getFirstVideoUrl($media)
 {
     foreach ($media as $medium) {