app/models/api/nightly.php (49 lines of code) (raw):

<?php declare(strict_types=1); use Cache\Cache; use ReleaseInsights\{Json, URL, Utils}; $date = Utils::getDate(); $options = [ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: application/json\r\n" . "User-Agent: WhatTrainIsItNow/1.0\r\n" . "Referer: https://whattrainisitnow.com", 'content' => '{ "_source": ["build.id", "source.revision", "target.version"], "query": { "bool": { "must": [ { "match": { "source.product": "firefox" }}, { "match": { "target.locale": "en-US" }}, { "match": { "target.channel": "nightly" }}, { "regexp": { "build.id": "' . $date . '.*" }} ] } } }', ], ]; // The date in the string varies so we create a unique file name in cache $cache_id = $options['http']['content']; // If we can't retrieve cached data, we create and cache it. // We cache because we want to avoid http request latency if (! $data = Cache::getKey($cache_id, 900)) { $data = file_get_contents( URL::BuildHub->value, false, stream_context_create($options) ); $data = Json::toArray($data); $data = array_column($data['hits']['hits'], '_source'); // No data returned, bug or incorrect date, don't cache. if (empty($data)) { return []; } // Build a [buildid => [revision, version]] array $filtered = []; foreach ($data as $value) { $filtered[$value['build']['id']] = ['revision' => $value['source']['revision'], 'version' => $value['target']['version']]; } // We sort the array by key because we want the builds to be in chronological order ksort($filtered); $data = $filtered; // We don't cache today because we may miss the second nightly build if ($date !== date('Ymd')) { Cache::setKey($cache_id, $data); } } return $data;