dariusiii/tv-maze-php-api
dariusiii/tv-maze-php-api is a lightweight PHP client for TVmaze, providing easy access to TV show schedules, episode guides, cast and crew details, and search endpoints. Designed for Laravel and plain PHP projects, it wraps API requests in a simple, readable interface.
Architecture fit. dariusiii/tv-maze-php-api is a thin, unopinionated PHP wrapper around the public TVMaze REST API (show metadata, episodes, cast, schedules). Despite being evaluated in a "Laravel/PHP" context, it should be treated as a plain PHP HTTP client, not a framework-native package. There is no evidence of a Laravel service provider, facade, config file, or publishable assets. Architecture fit is therefore conditional: it works well as an infrastructure adapter underneath our own domain layer (a ShowCatalogClient interface), but it should not leak into controllers or jobs. TVMaze itself is a free, unauthenticated, read-only API for essentially static catalog data—this is a low-complexity integration by nature. Release 2.0.6 does not change this assessment in any way: it is a one-line internal cleanup, not a feature or structural change.
Integration feasibility. High. Composer install, instantiate the client, call a method, map the response into our own DTOs. The realistic effort is measured in hours, not days, and most of that effort is mapping and caching rather than the wrapper itself. The genuine question is not "can we integrate it" but "why not call the API directly"—the answer is convenience, and that convenience must be weighed against taking a dependency on a single-maintainer package. 2.0.6 is a patch release with no API surface change, so it introduces no migration work.
Technical risk. The dominant risk remains supply chain, not technology. Zero stars, zero dependents, and a single maintainer mean effectively no community verification, no peer review, and no realistic expectation of prompt security patches or API-drift fixes. 2.0.6 is a marginal positive signal on the abandonment axis: the maintainer merged an external contributor's PR (the first evidence we have of anyone other than the author touching the code) and did so promptly enough to address a PHP-level deprecation. That is a data point, not a track record—it does not upgrade the package to "supported," and it does not retire the fork-or-replace contingency.
More usefully, 2.0.6 resolves one of our open technical questions: removing curl_close() confirms the transport is hand-rolled cURL, not Guzzle and not PSR-18/PSR-17. Consequences:
Http::retry(...).Http facade gives us event hooks and request logging for free; cURL calls inside the package are opaque unless the package exposes hooks. Assume we get none and instrument at the adapter boundary instead.Secondary risks unchanged: absence of a documented rate-limiting/backoff strategy (TVMaze enforces roughly 20 requests per 10 seconds and returns HTTP 429), and no stated caching story—significant because TVMaze data changes slowly and cache misses are the main cost driver. The upside of a thin wrapper is low lock-in: replacing it with Guzzle or Laravel's Http facade is a contained refactor, and the cURL discovery slightly strengthens the case for ultimately doing so.
Key questions.
shows/:id, shows/:id/episodes, schedule), or only a subset?composer.json constraints still need verifying.composer audit, and does it pin third-party dependencies?Stack fit. Treat the package as an outbound adapter in a hexagonal layout. Define our own interface (CatalogProvider) in the domain, implement it with a TvMazeCatalogProvider that internally uses this wrapper, and bind it in a Laravel service provider we author ourselves. This inverts the dependency: we own the contract, the package is replaceable, and the rest of the application never imports a DariusIII\... class. The confirmed cURL transport makes this boundary more important, not less—it is the only place we can add retry, throttling, and logging.
Migration path. Because the wrapper is thin and TVMaze is a simple JSON-over-HTTP API, migration away from it is cheap—and now demonstrably cheaper than we assumed, since there is no PSR-18 abstraction to preserve. A pragmatic default: prototype with the wrapper behind our interface, and if the wrapper adds friction (untyped responses, no retry, non-configurable timeouts), implement the same interface directly with Http::retry(...) and drop the dependency. Either way, the interface is the durable artifact. Note that 2.0.6 is a drop-in patch: if anyone has already pinned 2.0.5 in a spike branch, bumping is a no-op with no code changes required.
Compatibility. Verify PHP version alignment with our runtime before committing. 2.0.6 removes a call that is deprecated in PHP 8.5 (and has been a no-op since 8.0), which tells us the maintainer is tracking current PHP—a mild compatibility positive—but we should not infer a declared support matrix from a single PR. Wrap all responses in our own DTOs and validation so that upstream field changes surface as mapped errors rather than silent nulls. Do not serialize package objects into cache or queues—cache our DTOs instead, or the package's internal shape becomes a de facto schema.
Sequencing.
CatalogProvider interface and DTOs; implement adapter over the wrapper.Http-level or cache-level middleware. Because transport is cURL, assume retry/throttle lives in our adapter unless the spike proves otherwise.composer audit and pin the version explicitly in composer.json—pin to 2.0.6 or a ^2.0 constraint, and adopt patch releases deliberately rather than floating.Maintenance. Low ongoing cost if the interface boundary is respected, because replacing one small adapter is trivial. The real cost is ownership ambiguity: with zero dependents, we are almost certainly the only production consumer, meaning we are de facto maintainers of our integration and cannot expect upstream fixes. Budget a small recurring allowance for dependency review and a fork-or-replace decision at each major PHP or Laravel upgrade. 2.0.6 is a good template for what upstream maintenance looks like in practice—small, contributor-driven, deprecation-driven cleanups with no roadmap—and it is a reminder that our own dependency-review cadence, not theirs, is what keeps this healthy.
Support. No community, no issue-tracker track record, no vendor. Support falls entirely to our team. This is acceptable for a non-critical, read-only catalog integration and unacceptable anywhere near revenue or auth paths. Document the internal owner and the replacement plan in the service's README. The appearance of one external contributor in 2.0.6 is not a support channel and should not be treated as one.
Scaling. TVMaze is a third-party free API with no SLA; our scaling is bounded by their rate limits, not ours. The mitigation is aggressive caching plus request coalescing: catalog reads should hit cache, not the network. Introduce a queue/throttle if bulk ingestion is needed, and treat the upstream as a derived source—persist what we need locally rather than serving user traffic through live calls. Latency and availability of the feature are then a function of our data store, not TVMaze's uptime. The cURL transport confirmed in 2.0.6 means we cannot lean on a shared connection pool from a framework client, so connection-level efficiency is another reason to keep the network path cold.
Failure modes.
null into the UI. Mitigate with DTO validation and alerting on mapping failures.Ramp-up. Very low for an engineer familiar with HTTP clients: the TVMaze API is well documented and the wrapper is small enough to read end to end in under an hour—and now slightly smaller than the 2.0.5 we reviewed. The learning investment belongs in the interface and DTO layer we author, not the package. Write a short internal integration note covering rate limits, cache TTLs, the cURL transport constraint (no PSR-18 injection), and the replace-the-adapter runbook so that ramp-up survives maintainer turnover. Overall recommendation unchanged: adopt conditionally—behind an internal interface, with caching and throttling, on non-critical paths only, and with a documented exit plan. 2.0.6 requires no action beyond pinning to it; it is a minor positive signal on maintenance hygiene and a clarifying one on transport coupling, neither of which moves the recommendation.
How can I help you explore Laravel packages today?