Skip to content

[API] Course Videos #39060

Open

Description

@FuaadZam

Functional Area: Course Videos

Endpoints under this functional area:

Module API Version Resource / Endpoint HTTP Method Description
Video Uploads v0 /contentstore/v0/videos/uploads/{course_id} POST Upload one or multiple video files for a course. Returns info about uploaded files.
Video Uploads v0 /contentstore/v0/videos/uploads/{course_id}/{edx_video_id} GET Fetch details of uploaded video assets for a specific video ID.
Video Uploads v0 /contentstore/v0/videos/uploads/{course_id}/{edx_video_id} DELETE Deletes a video asset from a course. Returns HTTP 204.

Activity

  1. added theissue type on Sep 2, 2026
  2. Abdul-Muqadim-Arbisoft commented on Sep 27, 2026

    @Abdul-Muqadim-Arbisoft
    Contributor

    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

    • 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions