You are here

public function ProviderRepositoryDecorator::getAll in oEmbed Providers 2.x

Same name and namespace in other branches
  1. 1.0.x src/OEmbed/ProviderRepositoryDecorator.php \Drupal\oembed_providers\OEmbed\ProviderRepositoryDecorator::getAll()
  2. 1.1.x src/OEmbed/ProviderRepositoryDecorator.php \Drupal\oembed_providers\OEmbed\ProviderRepositoryDecorator::getAll()

Returns information on all available oEmbed providers.

Return value

\Drupal\media\OEmbed\Provider[] Returns an array of provider value objects, keyed by provider name.

Throws

\Drupal\media\OEmbed\ProviderException If the oEmbed provider information cannot be retrieved.

Overrides ProviderRepositoryInterface::getAll

1 call to ProviderRepositoryDecorator::getAll()
ProviderRepositoryDecorator::get in src/OEmbed/ProviderRepositoryDecorator.php
Returns information for a specific oEmbed provider.

File

src/OEmbed/ProviderRepositoryDecorator.php, line 132

Class

ProviderRepositoryDecorator
Decorates the oEmbed ProviderRepository provided by core Media module.

Namespace

Drupal\oembed_providers\OEmbed

Code

public function getAll() {
  $current_time = $this->time
    ->getCurrentTime();
  $stored = $this->keyValue
    ->get('oembed_providers');

  // If we have stored data that hasn't yet expired, return that. We need to
  // store the data in a key-value store because, if the remote provider
  // database is unavailable, we'd rather return stale data than throw an
  // exception. This means we cannot use a normal cache backend or expirable
  // key-value store, since those could delete the stale data at any time.
  if ($stored && $stored['expires'] > $current_time) {
    return $stored['data'];
  }
  $custom_providers = $this
    ->getCustomProviders();
  if ($this->externalFetch) {
    try {
      $response = $this->httpClient
        ->request('GET', $this->providersUrl);
    } catch (TransferException $e) {
      if (isset($stored['data'])) {

        // Use the stale data to fall back gracefully, but warn site
        // administrators that we used stale data.
        $this->logger
          ->warning('Remote oEmbed providers could not be retrieved due to error: @error. Using previously stored data. This may contain out of date information.', [
          '@error' => $e
            ->getMessage(),
        ]);
        return $stored['data'];
      }

      // We have no previous data and the request failed.
      throw new ProviderException("Could not retrieve the oEmbed provider database from {$this->providersUrl}", NULL, $e);
    }
    $providers = Json::decode((string) $response
      ->getBody());
    if (!is_array($providers) || empty($providers)) {
      if (isset($stored['data'])) {

        // Use the stale data to fall back gracefully, but as above, warn site
        // administrators that we used stale data.
        $this->logger
          ->warning('Remote oEmbed providers database returned invalid or empty list. Using previously stored data. This may contain out of date information.');
        return $stored['data'];
      }

      // We have no previous data and the current data is corrupt.
      throw new ProviderException('Remote oEmbed providers database returned invalid or empty list.');
    }

    // Providers defined by provider database cannot be modified by
    // custom oEmbed provider definitions.
    $providers = array_merge($custom_providers, $providers);
  }
  else {
    $providers = $custom_providers;
  }
  usort($providers, function ($a, $b) {
    return strcasecmp($a['provider_name'], $b['provider_name']);
  });
  $this->moduleHandler
    ->alter('oembed_providers', $providers);
  $keyed_providers = [];
  foreach ($providers as $provider) {
    try {
      $name = (string) $provider['provider_name'];
      $keyed_providers[$name] = new Provider($provider['provider_name'], $provider['provider_url'], $provider['endpoints']);
    } catch (ProviderException $e) {

      // Just skip all the invalid providers.
      // @todo Log the exception message to help with debugging.
    }
  }
  $this->keyValue
    ->set('oembed_providers', [
    'data' => $keyed_providers,
    'expires' => $current_time + $this->maxAge,
  ]);
  return $keyed_providers;
}