Script to validate game files
[ouya-game-data.git] / game-metadata.html
index 28003d4e9af23c72a56f77caac0dcfc8302216da..9edd9281c9da208296111a263341f09a006c3bde 100644 (file)
@@ -20,7 +20,8 @@
      <th>Datum</th>
      <th>Game data field</th>
      <th><a href="http://cweiske.de/ouya-store-api-docs.htm#get-https-devs-ouya-tv-api-v1-discover">Discover field</a></th>
-     <th><a href="http://cweiske.de/ouya-store-api-docs.htm#get-https-devs-ouya-tv-api-v1-apps-xxx">App details field</a></th>
+     <th><a href="http://cweiske.de/ouya-store-api-docs.htm#get-https-devs-ouya-tv-api-v1-apps-xxx">App field</a></th>
+     <th><a href="http://cweiske.de/ouya-store-api-docs.htm#get-https-devs-ouya-tv-api-v1-details">Details field</a></th>
      <th><a href="https://gitlab.com/devirich/BrewyaOnOuya/blob/master/store/models.py">BrewyaOnOuya field</a></th>
      <th>Example</th>
      <th>Description</th>
    </thead>
    <tbody>
 
-    <tr>
-     <td>app</td>
-     <td>Game UUID</td>
-     <td>uuid</td>
-     <td>uuid</td>
-     <td>uuid</td>
-     <td>App.uuid</td>
-     <td>780688a9-95ee-429a-8755-69a8d0c88fe0</td>
-     <td></td>
-    </tr>
     <tr>
      <td>app</td>
      <td>Game title</td>
      <td>title</td>
      <td>title</td>
      <td>title</td>
+     <td>title</td>
      <td>App.title</td>
      <td>Bloo Kid 2</td>
      <td></td>
@@ -54,6 +46,7 @@
      <td>overview (optional)</td>
      <td></td>
      <td>overview</td>
+     <td>-</td>
      <td>App.overview</td>
      <td>Released in October 2015 by winterworks GmbH.</td>
      <td></td>
@@ -64,6 +57,7 @@
      <td>description</td>
      <td></td>
      <td>description</td>
+     <td>description</td>
      <td>App.description</td>
      <td>Bloo Kid 2 is a classic 2D retro-style platformer experience with lovely designed pixel-graphics and a full chiptune soundtrack. Run, jump and swim your way through FIVE huge worlds with TWELVE levels each. Master brutal bossfights and discover lots of secrets in the world of Bloo Kid 2.\r\n\r\nBloo Kid 2 features:\r\n- five worlds with twelve levels each\r\n- handcrafted, colorful pixel-graphics\r\n- a full chiptune soundtrack\r\n- epic boss battles\r\n- tons of secrets\r\n- achievements</td>
      <td></td>
@@ -74,6 +68,7 @@
      <td>players</td>
      <td>gamerNumbers</td>
      <td>gamerNumbers</td>
+     <td>gamerNumbers</td>
      <td>App.playerNumbers</td>
      <td>[1]</td>
      <td>Any combination of 1-4</td>
@@ -84,6 +79,7 @@
      <td>genres</td>
      <td>genres</td>
      <td>genres</td>
+     <td>genres</td>
      <td>App.genres</td>
      <td>[Platformer, Retro]</td>
      <td>
     <tr>
      <td>app</td>
      <td>Package name</td>
-     <td>package</td>
+     <td>packageName</td>
      <td>package</td>
      <td></td>
+     <td>apk.package</td>
      <td>App.packageName</td>
      <td>evil.corptron.DuckGame</td>
      <td>Run "aapt dump badging file.apk", field "package: name"</td>
      <td>url</td>
      <td></td>
      <td>-</td>
+     <td>-</td>
      <td>ouya://launcher/details?app=evil.corptron.DuckGame</td>
      <td></td>
     </tr>
     <tr>
      <td>app</td>
      <td>Game website</td>
-     <td>website</td>
+     <td>website (optional)</td>
      <td></td>
      <td>website</td>
+     <td>-</td>
      <td>App.website</td>
      <td>http://www.winterworks.de</td>
      <td></td>
      <td>contentRating (optional)</td>
      <td>contentRating</td>
      <td>contentRating</td>
+     <td>suggestedAge</td>
      <td>App.contentRating</td>
      <td>Everyone</td>
      <td>
      <td>premium (optional)</td>
      <td>premium</td>
      <td>premium</td>
+     <td>premium</td>
      <td>App.premium</td>
      <td>false</td>
      <td></td>
      <td>firstPublishedAt (optional)</td>
      <td></td>
      <td>firstPublishedAt</td>
+     <td>firstPublishedAt (unix timestamp)</td>
      <td>App.firstPublishedAt</td>
      <td>2015-10-09T07:53:25Z</td>
      <td></td>
      <td>inAppPurchases (optional)</td>
      <td>inAppPurchases</td>
      <td></td>
+     <td>inAppPurchases</td>
      <td>-</td>
      <td>true</td>
      <td></td>
      <td>-</td>
      <td>type</td>
      <td></td>
+     <td>type</td>
      <td>-</td>
      <td>app</td>
-     <td>"app", "discover" or "details_page" (for bundles)</td>
+     <td>
+      discover: "app", "discover" or "details_page" (for bundles)<br/>
+      details: "Game", FIXME
+     </td>
     </tr>
     <tr>
      <td>app</td>
      <td>-</td>
      <td>updated_at</td>
      <td></td>
+     <td>-</td>
      <td>AppVersion.releaseTime</td>
      <td>1417731390</td>
      <td></td>
      <td>releases.*.date (when "latest")</td>
      <td>updatedAt</td>
      <td></td>
+     <td>-</td>
      <td>AppVersion.releaseTime</td>
      <td>2014-12-04T22:16:30Z</td>
      <td></td>
     </tr>
 
+    <tr>
+     <td>?</td>
+     <td>Metadata about the file</td>
+     <td>-</td>
+     <td>-</td>
+     <td></td>
+     <td>metaData</td>
+     <td>-</td>
+     <td>["key:rating.average", "key:developer.name", "key:suggestedAge", "45.29 MiB"]</td>
+     <td>Always those 4 values and in the same order (at least for apps)</td>
+    </tr>
+
     <tr>
      <td>rating</td>
      <td>Number of likes?</td>
-     <td>rating.likeCount</td>
+     <td>rating.likeCount (optional)</td>
      <td></td>
      <td>likeCount</td>
+     <td>-</td>
      <td>Rating.likeCount</td>
      <td>0</td>
      <td></td>
     <tr>
      <td>rating</td>
      <td>Average rating</td>
-     <td>rating.average</td>
+     <td>rating.average (optional)</td>
      <td>rating.average</td>
      <td>ratingAverage</td>
+     <td>rating.average</td>
      <td>Rating.rating</td>
      <td>4.1</td>
      <td></td>
     <tr>
      <td>rating</td>
      <td>Number of ratings</td>
-     <td>rating.count</td>
+     <td>rating.count (optional)</td>
      <td>rating.count</td>
      <td>ratingCount</td>
+     <td>rating.count</td>
      <td>Rating.reviewCount</td>
      <td>355</td>
      <td></td>
      <td>products.* (when "promoted=true")</td>
      <td>promotedProduct</td>
      <td>promotedProduct</td>
+     <td>promotedProduct</td>
      <td>App.promotedProduct</td>
      <td>null</td>
      <td>May be "null" if none, otherwise object</td>
      <td>products.*.identifier</td>
      <td>promotedProduct.identifier</td>
      <td>promotedProduct.identifier</td>
+     <td>promotedProduct.identifier</td>
      <td>Product.identifier</td>
      <td>unlock_rockets</td>
      <td></td>
      <td>products.*.name</td>
      <td>promotedProduct.name</td>
      <td>promotedProduct.name</td>
+     <td>promotedProduct.name</td>
      <td>Product.name</td>
      <td>Unlock Full Game</td>
      <td></td>
      <td>products.*.currency</td>
      <td>promotedProduct.currency</td>
      <td>promotedProduct.currency</td>
+     <td>promotedProduct.currency</td>
      <td>-</td>
      <td>EUR</td>
      <td></td>
      <td>products.*.description</td>
      <td>promotedProduct.description</td>
      <td>promotedProduct.description</td>
+     <td>promotedProduct.description</td>
      <td>Product.description</td>
      <td>Remove the 9 satellites limitation. Infinite satellites!</td>
      <td></td>
      <td>-</td>
      <td>promotedProduct.percentOff</td>
      <td>promotedProduct.percentOff</td>
+     <td>promotedProduct.percentOff</td>
      <td>-</td>
      <td>0</td>
      <td></td>
      <td>products.*.localPrice</td>
      <td>promotedProduct.localPrice</td>
      <td>promotedProduct.localPrice</td>
+     <td>promotedProduct.localPrice</td>
      <td>-</td>
      <td>1.99</td>
      <td></td>
      <td>products.*.originalPrice</td>
      <td>promotedProduct.originalPrice</td>
      <td>promotedProduct.originalPrice</td>
+     <td>promotedProduct.originalPrice</td>
      <td>Product.originalPrice</td>
      <td>1.99</td>
      <td></td>
     </tr>
+    <tr>
+     <td>product</td>
+     <td>FIXME</td>
+     <td>?</td>
+     <td>?</td>
+     <td>?</td>
+     <td>promotedProduct.type</td>
+     <td>?</td>
+     <td>"entitlement" (502x), null (758x)</td>
+     <td></td>
+    </tr>
 
     <tr>
      <td>apk</td>
      <td>releases.*.name</td>
      <td>latestVersion.versionNumber</td>
      <td>versionNumber</td>
+     <td>version.number</td>
      <td>Apk.versionName</td>
      <td>1.6</td>
      <td>Run "aapt dump badging file.apk", field "versionName"</td>
      <td>apk</td>
      <td>UUID of latest apk version</td>
      <td>releases.*.uuid</td>
-     <td>latestVersion.uuid</td>
-     <td>latestVersion</td>
-     <td>-</td>
+     <td>
+      uuid<br/>
+      latestVersion.uuid
+     </td>
+     <td>
+      uuid<br/>
+      latestVersion
+     </td>
+     <td>version.uuid</td>
+     <td>App.uuid</td>
      <td>780688a9-95ee-429a-8755-69a8d0c88fe0</td>
-     <td></td>
+     <td>The OUYA API does not have app UUIDs, only release/apk uuids. </td>
+    </tr>
+    <tr>
+     <td>apk</td>
+     <td>Internal version</td>
+     <td>releases.*.versionCode</td>
+     <td>-</td>
+     <td>-</td>
+     <td>apk.versionCode</td>
+     <td>Apk.versionCode</td>
+     <td>null, 120401, 11, 1001004</td>
+     <td>Run "aapt dump badging file.apk", field "versionCode"</td>
     </tr>
     <tr>
      <td>apk</td>
      <td>FIXME</td>
-     <td>releases.*.publicSize</td>
+     <td>releases.*.publicSize (optional)</td>
      <td></td>
      <td>publicSize</td>
+     <td>apk.publicSize</td>
      <td>Apk.publicSize</td>
      <td>27275</td>
      <td></td>
     <tr>
      <td>apk</td>
      <td>FIXME</td>
-     <td>releases.*.nativeSize</td>
+     <td>releases.*.nativeSize (optional)</td>
      <td></td>
      <td>nativeSize</td>
+     <td>apk.nativeSize</td>
      <td>Apk.nativeSize</td>
      <td>20292</td>
      <td></td>
      <td>releases.*.md5sum</td>
      <td>latestVersion.apk.md5sum</td>
      <td>md5sum</td>
+     <td>apk.md5sum</td>
      <td>Apk.md5sum</td>
      <td>a5b0f82d54df5f551a64295e43771a10</td>
      <td></td>
      <td>releases.*.size</td>
      <td></td>
      <td>apkFileSize</td>
+     <td>apk.fileSize</td>
      <td>Apk.size</td>
      <td>25507828</td>
      <td></td>
      <td>releases.*.date</td>
      <td></td>
      <td>publishedAt</td>
+     <td>version.publishedAt (unix timestamp)</td>
      <td>AppVersion.releaseTime</td>
      <td>2015-10-23T09:58:19Z</td>
      <td></td>
      <td>releases.*.url</td>
      <td></td>
      <td></td>
+     <td>apk.filename</td>
      <td>Apk.location</td>
-     <td>https://devs-ouya-tv-prod.s3.amazonaws.com/apps/5a3fbb4d-852b-4af4-becc-324dce6a3b42/de.eiswuxe.blookid2/780688a9-95ee-429a-8755-69a8d0c88fe0/lFzMjcZyQauvWX5k8HvH_blookid2.apk</td>
-     <td>Also in download.json</td>
+     <td>
+      url: https://devs-ouya-tv-prod.s3.amazonaws.com/apps/5a3fbb4d-852b-4af4-becc-324dce6a3b42/de.eiswuxe.blookid2/780688a9-95ee-429a-8755-69a8d0c88fe0/lFzMjcZyQauvWX5k8HvH_blookid2.apk<br/>
+      details: 1zbYKRSS1elKIYI9eseH_BombSquad-ouya-release.apk
+     </td>
+     <td>
+      Also in download.json<br/>
+      Details field: only a file name, no path/domain. Always set.
+     </td>
+    </tr>
+    <tr>
+     <td>apk</td>
+     <td>state</td>
+     <td>-</td>
+     <td>?</td>
+     <td>?</td>
+     <td>apk.state</td>
+     <td>?</td>
+     <td>
+      "complete"
+     </td>
+     <td></td>
     </tr>
 
     <tr>
      <td>media.discover</td>
      <td>image</td>
      <td></td>
+     <td>tileImage</td>
      <td>Media</td>
      <td>https://www.filepicker.io/api/file/05y2T8cKTY6cUfX7RYFR</td>
      <td></td>
      <td>media.large</td>
      <td></td>
      <td>mainImageFullUrl</td>
+     <td>-</td>
      <td>App.titleImage</td>
      <td>https://d3e4aumcqn8cw3.cloudfront.net/api/file/MASaiOBlTEO7GKYXsIns</td>
      <td></td>
     </tr>
+    <tr>
+     <td>media</td>
+     <td>FIXME</td>
+     <td>-</td>
+     <td>-</td>
+     <td>-</td>
+     <td>heroImage.url</td>
+     <td>?</td>
+     <td>
+      https://s3.amazonaws.com/ouya-screenshots/3d819f4e-2195-433c-81ea-c766a6f3144f/ouya-image20170118-3-i56ad1<br/>
+      null
+     </td>
+     <td>
+      Most games, had "null" here, only 14 had one set.
+      When this was set, mobileAppIcon was also set.
+     </td>
+    </tr>
     <tr>
      <td>media</td>
      <td>Video</td>
-     <td>media.video</td>
+     <td>media.video (optional)</td>
      <td></td>
      <td>videoUrl</td>
+     <td></td>
      <td>Media</td>
      <td>https://vimeo.com/141878938</td>
      <td></td>
     <tr>
      <td>media</td>
      <td>Game screenshots</td>
-     <td>media.screenshots</td>
+     <td>media.screenshots (optional)</td>
      <td></td>
      <td>filepickerScreenshots</td>
+     <td>-</td>
      <td>Media</td>
      <td>[urls]</td>
      <td></td>
     </tr>
+    <tr>
+     <td>media</td>
+     <td>Details images+videos</td>
+     <td>media.details (optional)</td>
+     <td></td>
+     <td></td>
+     <td>mediaTiles</td>
+     <td>?</td>
+     <td>
+      <pre>[
+  {
+    "type: "image",
+    "urls": [
+      "full": "http://...",
+      "thumb": "http://...",
+    ],
+    "fp_url": "http://...."
+  },
+  {
+    "type": "video",
+    "url": "https://vimeo.com/141878938"
+  }
+]</pre>
+     </td>
+     <td>
+      Allows free ordering of images and videos on the details page.<br/>
+      "fp" is probably "FilePicker".<br/>
+      fp_url is not used in OUYA's launcher.
+      The launcher loads the thumbnail at first, immediately after the full image.
+      If no mediaTile is available, the app's mainImageFullUrl
+      is used. When offline, the apk image is used.<br/>
+      <br/>
+      Game data information:
+      If details is not given or an emtpy array,
+      "mediaTile" array should automatically be created by combining
+      "media.large", "media.video" and "media.screenshots" into the
+      mediaTiles format.
+     </td>
+    </tr>
     <tr>
      <td>media</td>
      <td>FIXME</td>
      <td>-</td>
      <td></td>
      <td>mobileAppIcon</td>
+     <td>mobileAppIcon</td>
      <td>App.iconImage</td>
-     <td>null</td>
-     <td></td>
+     <td>
+      null<br/>
+      https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/ouya-image20170911-3-v6tjz1
+     </td>
+     <td>
+      1246x null, rest had its own URL.
+      Set when heroImage was filled.
+     </td>
     </tr>
 
     <tr>
      <td>developer.name</td>
      <td></td>
      <td>developer</td>
+     <td>developer.name</td>
      <td>Developer.name</td>
      <td>winterworks GmbH</td>
      <td></td>
     <tr>
      <td>developer</td>
      <td>Developer support mail</td>
-     <td>developer.supportEmail</td>
+     <td>developer.supportEmail (optional)</td>
      <td></td>
      <td>supportEmailAddress</td>
+     <td>-</td>
      <td>Developer.supportEmail</td>
      <td>null</td>
      <td></td>
     <tr>
      <td>developer</td>
      <td>Support phone number</td>
-     <td>developer.supportPhone</td>
+     <td>developer.supportPhone (optional)</td>
      <td></td>
      <td>supportPhone</td>
+     <td>-</td>
      <td>Developer.supportPhone</td>
      <td>null</td>
      <td></td>
     <tr>
      <td>developer</td>
      <td>Developer is a founder</td>
-     <td>developer.founder</td>
+     <td>developer.founder (optional)</td>
      <td></td>
      <td>founder</td>
+     <td>developer.founder</td>
      <td>Developer.founder</td>
      <td>false</td>
      <td></td>
     </tr>
+    <tr>
+     <td>developer</td>
+     <td>Developer UUID</td>
+     <td>developer.uuid (optional)</td>
+     <td>-</td>
+     <td>-</td>
+     <td>developer.url (part of)</td>
+     <td>Developer.uuid</td>
+     <td>ouya://launcher/details?developer=5b015434-8a78-4274-aa5d-0cb2e330e50e</td>
+     <td></td>
+    </tr>
 
    </tbody>
   </table>