Retrofit FFmpeg profile API from verb-in-path routes to idiomatic REST routes under /api/ffmpeg/profiles[/{id}].
Add stable create/update request DTOs and return read-model bodies for create/update.
Use ApiResults/ProblemDetails error mapping for FFmpeg profile 404/422, including handler-level NotFoundError classification.
Apply API-key write protection to FFmpeg profiles and legacy mutating library/maintenance API endpoints; API-key failures now return ProblemDetails 401 bodies.
Regenerate OpenAPI and update REST API docs with CORS/sweep results and deferred legacy route reshaping.
Review Follow-up
Adversarial review found two issues before PR creation:
Legacy mutating /api/libraries/* and /api/maintenance/* endpoints were not covered by ApiKeyAuthorizationFilter; fixed with controller filters and regression tests.
FFmpeg profile mutation 401 responses were not documented; fixed runtime 401 to return ProblemDetails, added metadata/static OpenAPI tests, and regenerated OpenAPI.
Verification
LSP diagnostics on changed C# files: no diagnostics.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
/api/ffmpeg/profiles[/{id}].ApiResults/ProblemDetailserror mapping for FFmpeg profile 404/422, including handler-levelNotFoundErrorclassification.ProblemDetails401 bodies.Review Follow-up
Adversarial review found two issues before PR creation:
/api/libraries/*and/api/maintenance/*endpoints were not covered byApiKeyAuthorizationFilter; fixed with controller filters and regression tests.ProblemDetails, added metadata/static OpenAPI tests, and regenerated OpenAPI.Verification
scripts/update-openapi.sh: succeeded.dotnet build ErsatzTV.sln: succeeded, 0 warnings, 0 errors.TZ=UTC dotnet test ErsatzTV.sln -v normal: succeeded, 263 passed, 0 failed.Refs #38