/**
  * @param ReplayInterface $replay
  * @param int             $keyframeId
  *
  * @return bool
  */
 private function downloadKeyframe(ReplayInterface $replay, $keyframeId)
 {
     $keyframe = $this->client->downloadKeyframe($replay->getRegion(), $replay->getGameId(), $keyframeId);
     if (false === $keyframe) {
         try {
             if ($keyframeId > $this->findKeyframeByChunkId($replay->getMetas(), $this->findFirstChunkId($replay->getMetas())) && isset($replay->getMetas()['pendingAvailableKeyFrameInfo'][0])) {
                 $replay->addDownloadRetry();
                 if ($this->options['replay.download.retry'] == $replay->getDownloadRetry()) {
                     return false;
                 } else {
                     sleep(1);
                     return $this->downloadChunk($replay, $keyframeId);
                 }
             }
         } catch (\RuntimeException $e) {
             // No first chunk id was created, so it's the first download : we do nothing
         }
         // Clear retries
         $replay->resetDownloadRetry();
         return false;
     }
     $pathFolder = $this->getReplayDirPath($replay->getRegion(), $replay->getGameId()) . '/keyframes';
     file_put_contents($pathFolder . '/' . $keyframeId, $keyframe);
     // Update metas
     $metas = $replay->getMetas();
     $metas['pendingAvailableKeyFrameInfo'][] = array('id' => $keyframeId, 'receivedTime' => date('M n, Y g:i:s A'), 'nextChunkId' => ($keyframeId - 1) * 2 + $metas['startGameChunkId']);
     $replay->setMetas($metas);
     if ($this->options['replay.decoder.enable']) {
         $crypt = new ReplayCrypt($replay);
         if (!$this->onReplayFileDecrypted($replay, self::FILETYPE_KEYFRAME, $keyframeId, $crypt->getBinary($replay, $pathFolder, $keyframeId, $this->options['replay.decoder.save_files']))) {
             return false;
         }
     }
     return true;
 }