getName() exactly (case-insensitive compare is done downstream). * - Chains are derived exclusively from the Free runtime provider catalogue. * - Never add a provider here before it is evaluated in PROVIDERS_MATRIX.md. */ final class ProviderRoutingTable { /** @var array */ private array $table; public function __construct() { $this->table = [ // ── Books ──────────────────────────────────────────────────────── // Free: GoogleBooks, OpenLibrary, InternetArchive. MediaType::BOOK => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::BOOK)), // ── Movies / Series ────────────────────────────────────────────── // Free: Wikidata without API credentials. MediaType::MOVIE => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::MOVIE), true), // ── Music ──────────────────────────────────────────────────────── // Free: MusicBrainz. MediaType::MUSIC => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::MUSIC), true), // ── Games ──────────────────────────────────────────────────────── // No game provider is shipped in the first Free RC. MediaType::GAME => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::GAME)), // ── Food / Generic EAN ─────────────────────────────────────────── // Free: OpenFoodFacts. MediaType::FOOD => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::FOOD)), // ── Beauty ─────────────────────────────────────────────────────── MediaType::BEAUTY => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::BEAUTY)), // ── Pharmaceuticals ───────────────────────────────────────────── // No medicine provider is shipped in the first Free RC. MediaType::MEDICINE => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::MEDICINE)), // ── Jewelry / Watches ──────────────────────────────────────────── // No jewelry provider is shipped in the first Free RC. MediaType::JEWELRY => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::JEWELRY)), // ── Generic (GTIN-14, UPC-A without music hint) ────────────────── // No generic commerce provider is shipped in the first Free RC. MediaType::GENERIC => new ProviderChain(RuntimeProviderCatalog::forDomain(MediaType::GENERIC)), ]; } /** * Return the ProviderChain for $domain, or an empty chain if unknown. */ public function getChain(string $domain): ProviderChain { return $this->table[$domain] ?? new ProviderChain([]); } /** * Return all registered domains. * @return string[] */ public function getDomains(): array { return array_keys($this->table); } public function hasChain(string $domain): bool { return isset($this->table[$domain]); } }