feat: Video editor supports transcripts [FC-0076] (#36058)
* Add error handler on save video to avoid creating sjson * Support transcripts without edx_video_id in definition_to_xml * When copying a video from a library to a course: Create a new edx_video_id * Save transcripts as static assets in a video in a library when adding a new transcript. * Delete transcripts as static assets in a video in a library when deleting transcripts. * Support download transcript in a video in a library. * Support replace transcript in a video in a library. * Support updating transcripts in video in a library. * Refactor the code of downloading YouTube transcripts to enable this feature in libraries. * Support copy from a library to a course and a course to a library.
This commit is contained in:
@@ -88,6 +88,7 @@ from openedx.core.lib.api.view_utils import (
|
||||
DeveloperErrorViewMixin,
|
||||
view_auth_classes,
|
||||
)
|
||||
from xmodule.video_block.transcripts_utils import clear_transcripts
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from xmodule.modulestore.exceptions import ItemNotFoundError
|
||||
|
||||
@@ -224,6 +225,9 @@ class SyncFromUpstreamView(DeveloperErrorViewMixin, APIView):
|
||||
"""
|
||||
downstream = _load_accessible_block(request.user, usage_key_string, require_write_access=True)
|
||||
try:
|
||||
if downstream.usage_key.block_type == "video":
|
||||
# Delete all transcripts so we can copy new ones from upstream
|
||||
clear_transcripts(downstream)
|
||||
upstream = sync_from_upstream(downstream, request.user)
|
||||
static_file_notices = import_static_assets_for_library_sync(downstream, upstream, request)
|
||||
except UpstreamLinkException as exc:
|
||||
|
||||
@@ -264,7 +264,8 @@ class PostDownstreamSyncViewTest(_DownstreamSyncViewTestMixin, SharedModuleStore
|
||||
@patch.object(UpstreamLink, "get_for_block", _get_upstream_link_good_and_syncable)
|
||||
@patch.object(downstreams_views, "sync_from_upstream")
|
||||
@patch.object(downstreams_views, "import_static_assets_for_library_sync", return_value=StaticFileNotices())
|
||||
def test_200(self, mock_sync_from_upstream, mock_import_staged_content):
|
||||
@patch.object(downstreams_views, "clear_transcripts")
|
||||
def test_200(self, mock_sync_from_upstream, mock_import_staged_content, mock_clear_transcripts):
|
||||
"""
|
||||
Does the happy path work?
|
||||
"""
|
||||
@@ -273,6 +274,7 @@ class PostDownstreamSyncViewTest(_DownstreamSyncViewTestMixin, SharedModuleStore
|
||||
assert response.status_code == 200
|
||||
assert mock_sync_from_upstream.call_count == 1
|
||||
assert mock_import_staged_content.call_count == 1
|
||||
assert mock_clear_transcripts.call_count == 1
|
||||
|
||||
|
||||
class DeleteDownstreamSyncViewtest(_DownstreamSyncViewTestMixin, SharedModuleStoreTestCase):
|
||||
|
||||
Reference in New Issue
Block a user