You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PR:#39102 — feat: standardize Course Videos API into authoring v1 State: open
What this does
Standardizes the Course Videos API (#39060, umbrella #38137) onto a conforming, versioned surface, and leaves the existing /api/contentstore/v0/videos/uploads/… endpoints working exactly as they are today.
New addresses
GET | POST /api/authoring/v1/courses/{course_key}/videos/
GET | DELETE /api/authoring/v1/courses/{course_key}/videos/{edx_video_id}/
ADRs applied
13 of 16 decisions applied on this pass; every one left open carries its reason.
0025 serializers
0026 permissions
0027 schema / docs
0028 viewsets
0029 errors
0030 GET idempotence
0032 pagination
0033 filtering
0034 authentication
0036 nested JSON
0037 versioning
0038 URL structure
OEP-69 conventions
0031 merged endpoints — nothing merged: the three methods are CRUD on one resource, which is ADR 0028's instrument, not 0031's. POST /generate_video_upload_link/{course_key}is a genuine action-URL sibling hitting the same handler, but it is outside this issue's endpoint table and needs its own deprecation — recorded as a follow-up
0035 MFE config — n/a: no endpoint in this area returns front-end or site configuration. The legacy GET's 302 to COURSE_AUTHORING_MICROFRONTEND_URL is a redirect to a screen, not a configuration payload, and is not carried forward
OEP-66 queryset scoping — out of scope as a mechanism, applied as a layering: ScopedQuerysetMixin wraps a view-level get_queryset(), and this ViewSet has none — the only real QuerySet is built inside edxval. The three visibility layers are enumerated below
The evidence for each tick is the compliance matrix in the PR body; nothing is ticked without a named test or gate line.
Backward compatibility
versions gate PASS with no allowlist — no pre-existing version directory is modified. The v0 view module is byte-identical to the base.
The published v0 operations are unchanged except for one flag: their descriptions are identical to the base, and deprecated: true is added to exactly those three operations — nothing else in the document is marked deprecated or x-internal (checked on the generated document).
urls gate PASS (0 FAIL, 0 WARN) — every base address still resolves to the same view: both v0 upload routes, the four sibling v0/videos/* routes, the three /api/contentstore/v1/videos/… routes, and all seven unversioned Studio routes.
108 legacy tests untouched and green (contentstore/views/tests/test_videos.py + rest_api/v1/views/tests/test_videos.py).
194 new tests green.
Zero known consumers. No reverse() caller and no path literal in-repo; frontend-app-authoring@master calls the legacy Studio /videos/{courseId} route and /api/contentstore/v1/videos/…, never videos/uploads. openedx/openedx-platform-sdk does not exist.
Deprecations
The three /api/contentstore/v0/videos/uploads/… operations are superseded by the addresses above and marked deprecated: true in the published schema. The superseded views are unchanged: no response header, and no deprecation notes in code.
Tracked on the FC-0118 umbrella DEPR ticket, #39128, which removes them one named release after the release this ships in. This area's entry is posted there for its owner to add.
ADR 0037 also asks for a marker in the endpoint's docstring. It is deliberately omitted, on the direction of review on this PR and on #39100; if one is wanted later, it is the single OEP-21 line Deprecated https://github.com/openedx/openedx-platform/issues/39128.
The unversioned Studio routes (/videos/{course_key}, /generate_video_upload_link/{course_key}) are not deprecated here: they are what the MFE actually calls, and two of their operations have no conforming successor yet.
Follow-ups
edx-drf-extensions: catalog the four request-level errors. A malformed body, 405, 406 and 415 are classified internal / "Internal Server Error" while keeping their 4xx status. This PR does not fix that locally: the library's registry is process-wide, so registering them here would change the error type of every standardized Studio API — v1 xblock, v3 home, course_details, authoring_grading, v4 home — in place. The fix belongs in the library's built-in catalog.
edx-drf-extensions: add get_paginated_response_schema to DefaultPagination — every Open edX list endpoint publishes a 4-key envelope schema for a 7-key body. This PR's subclass deletes itself when that lands.
edx-drf-extensions: make flatten_detail stop stringifying the detail dict into the envelope's detail member.
POST /generate_video_upload_link/{course_key} is a genuine ADR 0031 / 0038 r10 candidate hitting the same handler; outside this issue's table, it needs its own successor and deprecation.
[API] Video Management #39071's videos-page payload needs its own screen-shaped address: this PR claims courses/{course_key}/videos/ for the video resource.
The stuck-upload reconciliation has no conforming successor operation; it must be a prerequisite for retiring the legacy Studio route.
SDK regeneration: the four new operations carry tags=["openedx-platform-sdk"].
An address under the mount that is not a video address (e.g. /api/authoring/v1/no/such/thing/) still gets Studio's HTML 404, as on every other API mount: a conforming route cannot claim it without shadowing the other resources that share this URLconf.
Review on the PR, please — this issue stays open until it merges.
Activity
feat: standardize Course Videos API into authoring v1
docs: mark the v0 video upload endpoints deprecated
Abdul-Muqadim-Arbisoft commentedon Sep 27, 2026
Standardization PR open: #39102
PR: #39102 — feat: standardize Course Videos API into authoring v1
State: open
What this does
Standardizes the Course Videos API (#39060, umbrella #38137) onto a conforming, versioned surface, and leaves the existing
/api/contentstore/v0/videos/uploads/…endpoints working exactly as they are today.New addresses
/api/authoring/v1/courses/{course_key}/videos//api/authoring/v1/courses/{course_key}/videos/{edx_video_id}/ADRs applied
13 of 16 decisions applied on this pass; every one left open carries its reason.
POST /generate_video_upload_link/{course_key}is a genuine action-URL sibling hitting the same handler, but it is outside this issue's endpoint table and needs its own deprecation — recorded as a follow-upCOURSE_AUTHORING_MICROFRONTEND_URLis a redirect to a screen, not a configuration payload, and is not carried forwardScopedQuerysetMixinwraps a view-levelget_queryset(), and this ViewSet has none — the only realQuerySetis built insideedxval. The three visibility layers are enumerated belowThe evidence for each tick is the compliance matrix in the PR body; nothing is ticked without a named test or gate line.
Backward compatibility
deprecated: trueis added to exactly those three operations — nothing else in the document is marked deprecated orx-internal(checked on the generated document).v0/videos/*routes, the three/api/contentstore/v1/videos/…routes, and all seven unversioned Studio routes.contentstore/views/tests/test_videos.py+rest_api/v1/views/tests/test_videos.py).reverse()caller and no path literal in-repo;frontend-app-authoring@mastercalls the legacy Studio/videos/{courseId}route and/api/contentstore/v1/videos/…, nevervideos/uploads.openedx/openedx-platform-sdkdoes not exist.Deprecations
The three
/api/contentstore/v0/videos/uploads/…operations are superseded by the addresses above and markeddeprecated: truein the published schema. The superseded views are unchanged: no response header, and no deprecation notes in code.Tracked on the FC-0118 umbrella DEPR ticket, #39128, which removes them one named release after the release this ships in. This area's entry is posted there for its owner to add.
ADR 0037 also asks for a marker in the endpoint's docstring. It is deliberately omitted, on the direction of review on this PR and on #39100; if one is wanted later, it is the single OEP-21 line
Deprecated https://github.com/openedx/openedx-platform/issues/39128.The unversioned Studio routes (
/videos/{course_key},/generate_video_upload_link/{course_key}) are not deprecated here: they are what the MFE actually calls, and two of their operations have no conforming successor yet.Follow-ups
edx-drf-extensions: catalog the four request-level errors. A malformed body, 405, 406 and 415 are classifiedinternal/ "Internal Server Error" while keeping their 4xx status. This PR does not fix that locally: the library's registry is process-wide, so registering them here would change the errortypeof every standardized Studio API — v1 xblock, v3 home, course_details, authoring_grading, v4 home — in place. The fix belongs in the library's built-in catalog.edx-drf-extensions: addget_paginated_response_schematoDefaultPagination— every Open edX list endpoint publishes a 4-key envelope schema for a 7-key body. This PR's subclass deletes itself when that lands.edx-drf-extensions: makeflatten_detailstop stringifying the detail dict into the envelope'sdetailmember.POST /generate_video_upload_link/{course_key}is a genuine ADR 0031 / 0038 r10 candidate hitting the same handler; outside this issue's table, it needs its own successor and deprecation.courses/{course_key}/videos/for the video resource.tags=["openedx-platform-sdk"]./api/authoring/v1/no/such/thing/) still gets Studio's HTML 404, as on every other API mount: a conforming route cannot claim it without shadowing the other resources that share this URLconf.Review on the PR, please — this issue stays open until it merges.