diff --git a/source/vimeo/amd/build/file_upload.min.js b/source/vimeo/amd/build/file_upload.min.js index a99941c..600e74f 100644 --- a/source/vimeo/amd/build/file_upload.min.js +++ b/source/vimeo/amd/build/file_upload.min.js @@ -1,3 +1,3 @@ -define("mediatimesrc_vimeo/file_upload",["exports","core/ajax","core/config","core/log","core/notification"],(function(_exports,_ajax,_config,_log,_notification){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_ajax=_interopRequireDefault(_ajax),_config=_interopRequireDefault(_config),_log=_interopRequireDefault(_log),_notification=_interopRequireDefault(_notification);const upload=async resource=>{const file=document.querySelector('input[name="videofile"]').files[0],url=new URL(_config.default.wwwroot+"/admin/tool/mediatime/index.php");let response;url.searchParams.set("id",resource.id);do{const request=new Request(resource.uploadurl,{body:file,headers:{"Tus-Resumable":"1.0.0","Upload-Offset":String(0),"Content-Type":"application/offset+octet-stream"},method:"PATCH"});response=await fetch(request),document.querySelector(".progress").style.width=response.headers.get("Upload-Offset")/file.size*100+"%",_log.default.debug(response.headers.get("Upload-Offset"))}while(response.headers.get("Upload-Offset"){const file=document.querySelector('input[name="videofile"]').files[0],url=new URL(_config.default.wwwroot+"/admin/tool/mediatime/index.php");let offset=0;url.searchParams.set("id",resource.id);do{const request=new Request(resource.uploadurl,{body:file.slice(Number(offset),Number(offset)+8388608),headers:{"Tus-Resumable":"1.0.0","Upload-Offset":String(offset),"Content-Type":"application/offset+octet-stream"},method:"PATCH"}),response=await fetch(request).catch((e=>(_log.default.debug(e),new Promise((resolve=>setTimeout(resolve,1e3))))));response&&response.ok&&(offset=response.headers.get("Upload-Offset")),document.querySelector(".progress").style.width=offset/file.size*100+"%",_log.default.debug(offset)}while(offset {\n const file = document.querySelector('input[name=\"videofile\"]').files[0];\n const url = new URL(Config.wwwroot + '/admin/tool/mediatime/index.php');\n let offset = 0;\n let response;\n\n url.searchParams.set('id', resource.id);\n\n do {\n const request = new Request(resource.uploadurl, {\n body: file,\n headers: {\n 'Tus-Resumable': '1.0.0',\n 'Upload-Offset': String(offset),\n 'Content-Type': 'application/offset+octet-stream'\n },\n method: 'PATCH'\n });\n response = await fetch(request);\n document.querySelector('.progress').style.width = (response.headers.get('Upload-Offset') / file.size * 100) + '%';\n Log.debug(response.headers.get('Upload-Offset'));\n } while (response.headers.get('Upload-Offset') < file.size);\n window.location.href = url;\n};\n\nexport default {\n init: function() {\n document.body.removeEventListener('click', this.handleClick);\n document.body.addEventListener('click', this.handleClick);\n },\n\n handleClick: function(e) {\n const button = e.target.closest('button[name=\"upload\"]');\n if (button) {\n const file = document.querySelector('input[name=\"videofile\"]').files[0];\n e.preventDefault();\n Ajax.call([{\n args: {\n filesize: Number(file.size),\n description: document.querySelector('input[name=\"description\"]').value,\n name: document.querySelector('input[name=\"name\"]').value,\n tags: document.querySelector('input[name=\"tags\"]').value,\n title: document.querySelector('input[name=\"title\"]').value\n },\n contextid: 1,\n done: upload,\n fail: Notification.exception,\n methodname: 'mediatimesrc_vimeo_create_token'\n }]);\n Log.debug(file.size);\n }\n }\n};\n"],"names":["upload","async","file","document","querySelector","files","url","URL","Config","wwwroot","response","searchParams","set","resource","id","request","Request","uploadurl","body","headers","String","method","fetch","style","width","get","size","debug","window","location","href","init","removeEventListener","this","handleClick","addEventListener","e","target","closest","preventDefault","call","args","filesize","Number","description","value","name","tags","title","contextid","done","fail","Notification","exception","methodname"],"mappings":"4eAKMA,OAASC,MAAAA,iBACLC,KAAOC,SAASC,cAAc,2BAA2BC,MAAM,GAC/DC,IAAM,IAAIC,IAAIC,gBAAOC,QAAU,uCAEjCC,SAEJJ,IAAIK,aAAaC,IAAI,KAAMC,SAASC,MAEjC,OACOC,QAAU,IAAIC,QAAQH,SAASI,UAAW,CAC5CC,KAAMhB,KACNiB,QAAS,iBACY,wBACAC,OAVhB,kBAWe,mCAEpBC,OAAQ,UAEZX,eAAiBY,MAAMP,SACvBZ,SAASC,cAAc,aAAamB,MAAMC,MAASd,SAASS,QAAQM,IAAI,iBAAmBvB,KAAKwB,KAAO,IAAO,iBAC1GC,MAAMjB,SAASS,QAAQM,IAAI,wBAC1Bf,SAASS,QAAQM,IAAI,iBAAmBvB,KAAKwB,MACtDE,OAAOC,SAASC,KAAOxB,kBAGZ,CACXyB,KAAM,WACF5B,SAASe,KAAKc,oBAAoB,QAASC,KAAKC,aAChD/B,SAASe,KAAKiB,iBAAiB,QAASF,KAAKC,cAGjDA,YAAa,SAASE,MACHA,EAAEC,OAAOC,QAAQ,yBACpB,OACFpC,KAAOC,SAASC,cAAc,2BAA2BC,MAAM,GACrE+B,EAAEG,+BACGC,KAAK,CAAC,CACPC,KAAM,CACFC,SAAUC,OAAOzC,KAAKwB,MACtBkB,YAAazC,SAASC,cAAc,6BAA6ByC,MACjEC,KAAM3C,SAASC,cAAc,sBAAsByC,MACnDE,KAAM5C,SAASC,cAAc,sBAAsByC,MACnDG,MAAO7C,SAASC,cAAc,uBAAuByC,OAEzDI,UAAW,EACXC,KAAMlD,OACNmD,KAAMC,sBAAaC,UACnBC,WAAY,kDAEZ3B,MAAMzB,KAAKwB"} \ No newline at end of file +{"version":3,"file":"file_upload.min.js","sources":["../src/file_upload.js"],"sourcesContent":["import Ajax from 'core/ajax';\nimport Config from 'core/config';\nimport Log from 'core/log';\nimport Notification from 'core/notification';\n\nconst upload = async(resource) => {\n const file = document.querySelector('input[name=\"videofile\"]').files[0];\n const url = new URL(Config.wwwroot + '/admin/tool/mediatime/index.php');\n let offset = 0;\n\n url.searchParams.set('id', resource.id);\n\n do {\n const request = new Request(resource.uploadurl, {\n body: file.slice(Number(offset), Number(offset) + 8388608),\n headers: {\n 'Tus-Resumable': '1.0.0',\n 'Upload-Offset': String(offset),\n 'Content-Type': 'application/offset+octet-stream'\n },\n method: 'PATCH'\n });\n const response = await fetch(request).catch(e => {\n Log.debug(e);\n return new Promise(resolve => setTimeout(resolve, 1000));\n });\n if (response && response.ok) {\n offset = response.headers.get('Upload-Offset');\n }\n document.querySelector('.progress').style.width = ( offset / file.size * 100) + '%';\n Log.debug(offset);\n } while (offset < file.size);\n window.location.href = url;\n};\n\nexport default {\n init: function() {\n document.body.removeEventListener('click', this.handleClick);\n document.body.addEventListener('click', this.handleClick);\n },\n\n handleClick: function(e) {\n const button = e.target.closest('button[name=\"upload\"]');\n if (button) {\n const file = document.querySelector('input[name=\"videofile\"]').files[0];\n e.preventDefault();\n Ajax.call([{\n args: {\n filesize: Number(file.size),\n description: document.querySelector('input[name=\"description\"]').value,\n name: document.querySelector('input[name=\"name\"]').value,\n tags: document.querySelector('input[name=\"tags\"]').value,\n title: document.querySelector('input[name=\"title\"]').value\n },\n contextid: 1,\n done: upload,\n fail: Notification.exception,\n methodname: 'mediatimesrc_vimeo_create_token'\n }]);\n Log.debug(file.size);\n }\n }\n};\n"],"names":["upload","async","file","document","querySelector","files","url","URL","Config","wwwroot","offset","searchParams","set","resource","id","request","Request","uploadurl","body","slice","Number","headers","String","method","response","fetch","catch","e","debug","Promise","resolve","setTimeout","ok","get","style","width","size","window","location","href","init","removeEventListener","this","handleClick","addEventListener","target","closest","preventDefault","call","args","filesize","description","value","name","tags","title","contextid","done","fail","Notification","exception","methodname"],"mappings":"4eAKMA,OAASC,MAAAA,iBACLC,KAAOC,SAASC,cAAc,2BAA2BC,MAAM,GAC/DC,IAAM,IAAIC,IAAIC,gBAAOC,QAAU,uCACjCC,OAAS,EAEbJ,IAAIK,aAAaC,IAAI,KAAMC,SAASC,MAEjC,OACOC,QAAU,IAAIC,QAAQH,SAASI,UAAW,CAC5CC,KAAMhB,KAAKiB,MAAMC,OAAOV,QAASU,OAAOV,QAAU,SAClDW,QAAS,iBACY,wBACAC,OAAOZ,uBACR,mCAEpBa,OAAQ,UAENC,eAAiBC,MAAMV,SAASW,OAAMC,iBACpCC,MAAMD,GACH,IAAIE,SAAQC,SAAWC,WAAWD,QAAS,UAElDN,UAAYA,SAASQ,KACrBtB,OAASc,SAASH,QAAQY,IAAI,kBAElC9B,SAASC,cAAc,aAAa8B,MAAMC,MAAUzB,OAASR,KAAKkC,KAAO,IAAO,iBAC5ER,MAAMlB,cACLA,OAASR,KAAKkC,MACvBC,OAAOC,SAASC,KAAOjC,kBAGZ,CACXkC,KAAM,WACFrC,SAASe,KAAKuB,oBAAoB,QAASC,KAAKC,aAChDxC,SAASe,KAAK0B,iBAAiB,QAASF,KAAKC,cAGjDA,YAAa,SAAShB,MACHA,EAAEkB,OAAOC,QAAQ,yBACpB,OACF5C,KAAOC,SAASC,cAAc,2BAA2BC,MAAM,GACrEsB,EAAEoB,+BACGC,KAAK,CAAC,CACPC,KAAM,CACFC,SAAU9B,OAAOlB,KAAKkC,MACtBe,YAAahD,SAASC,cAAc,6BAA6BgD,MACjEC,KAAMlD,SAASC,cAAc,sBAAsBgD,MACnDE,KAAMnD,SAASC,cAAc,sBAAsBgD,MACnDG,MAAOpD,SAASC,cAAc,uBAAuBgD,OAEzDI,UAAW,EACXC,KAAMzD,OACN0D,KAAMC,sBAAaC,UACnBC,WAAY,kDAEZjC,MAAM1B,KAAKkC"} \ No newline at end of file diff --git a/source/vimeo/amd/src/file_upload.js b/source/vimeo/amd/src/file_upload.js index 9eb2e55..684ef06 100644 --- a/source/vimeo/amd/src/file_upload.js +++ b/source/vimeo/amd/src/file_upload.js @@ -3,17 +3,21 @@ import Config from 'core/config'; import Log from 'core/log'; import Notification from 'core/notification'; -const upload = async(resource) => { +/** + * Handle uploading + * + * @param Vimeo token request response + */ +const upload = async (resource) => { const file = document.querySelector('input[name="videofile"]').files[0]; const url = new URL(Config.wwwroot + '/admin/tool/mediatime/index.php'); let offset = 0; - let response; url.searchParams.set('id', resource.id); do { const request = new Request(resource.uploadurl, { - body: file, + body: file.slice(Number(offset), Number(offset) + 128*2**20), headers: { 'Tus-Resumable': '1.0.0', 'Upload-Offset': String(offset), @@ -21,19 +25,32 @@ const upload = async(resource) => { }, method: 'PATCH' }); - response = await fetch(request); - document.querySelector('.progress').style.width = (response.headers.get('Upload-Offset') / file.size * 100) + '%'; - Log.debug(response.headers.get('Upload-Offset')); - } while (response.headers.get('Upload-Offset') < file.size); + const response = await fetch(request).catch(e => { + Log.debug(e); + return new Promise(resolve => setTimeout(resolve, 1000)); + }); + if (response && response.ok) { + offset = response.headers.get('Upload-Offset'); + } + document.querySelector('.progress').style.width = ( offset / file.size * 100) + '%'; + } while (offset < file.size); window.location.href = url; }; export default { + /** + * Init event listeners + */ init: function() { document.body.removeEventListener('click', this.handleClick); document.body.addEventListener('click', this.handleClick); }, + /** + * Handle button click + * + * Event e + */ handleClick: function(e) { const button = e.target.closest('button[name="upload"]'); if (button) { @@ -52,7 +69,6 @@ export default { fail: Notification.exception, methodname: 'mediatimesrc_vimeo_create_token' }]); - Log.debug(file.size); } } }; diff --git a/source/vimeo/classes/external/create_token.php b/source/vimeo/classes/external/create_token.php index 2043e4c..b75f38d 100644 --- a/source/vimeo/classes/external/create_token.php +++ b/source/vimeo/classes/external/create_token.php @@ -88,14 +88,14 @@ public static function execute($description, $filesize, $name, $tags, $title): a 'size' => $params['filesize'], ], ]); - $video = $api->request($video['uri'], [ - 'name' => $params['title'], + $updatedvideo = $api->request($video['uri'], [ + 'name' => $params['title'] ?: $params['name'], 'description' => $params['description'], ], 'PATCH')['body']; $id = $DB->insert_record('tool_mediatime', [ 'name' => $params['name'], 'source' => 'vimeo', - 'content' => json_encode($video), + 'content' => json_encode($updatedvideo), 'timecreated' => time(), 'timemodified' => time(), 'usermodified' => $USER->id, diff --git a/source/vimeo/classes/form/delete_resource.php b/source/vimeo/classes/form/delete_resource.php index 02b7f50..77a5dc6 100644 --- a/source/vimeo/classes/form/delete_resource.php +++ b/source/vimeo/classes/form/delete_resource.php @@ -58,7 +58,7 @@ public function definition() { ]; $mform->addGroup($action, 'vimeofileaction', get_string('vimeofileaction', 'mediatimesrc_vimeo'), [' '], false); $mform->setType('action', PARAM_INT); - $mform->setDefault('action', 2); + $mform->setDefault('action', 1); $mform->addHelpButton('vimeofileaction', 'vimeofileaction', 'mediatimesrc_vimeo'); $this->add_action_buttons(true, get_string('delete')); diff --git a/source/vimeo/classes/form/edit_resource.php b/source/vimeo/classes/form/edit_resource.php index 61f4296..1b2c29c 100644 --- a/source/vimeo/classes/form/edit_resource.php +++ b/source/vimeo/classes/form/edit_resource.php @@ -53,6 +53,7 @@ public function definition() { $mform->addElement('text', 'name', get_string('resourcename', 'tool_mediatime')); $mform->setType('name', PARAM_TEXT); $mform->addHelpButton('name', 'resourcename', 'tool_mediatime'); + $mform->addRule('name', get_string('required'), 'required', null, 'client'); $mform->addElement('text', 'title', get_string('title', 'tool_mediatime')); $mform->setType('title', PARAM_TEXT); diff --git a/source/vimeo/classes/manager.php b/source/vimeo/classes/manager.php index a82add3..ffc5033 100644 --- a/source/vimeo/classes/manager.php +++ b/source/vimeo/classes/manager.php @@ -99,7 +99,17 @@ public function __construct($record = null) { $this->content->tags = core_tag_tag::get_item_tags_array('tool_mediatime', 'tool_mediatime', $edit); - $data += ['name' => $this->record->name, 'title' => $this->content->name] + (array)$this->content; + // Check for updated values at Vimeo. + if (!$this->form->is_submitted()) { + $video = $this->api->request($this->content->uri)['body']; + $data = [ + 'description' => $video['description'], + 'title' => $video['name'], + 'name' => $this->record->name, + ] + $data; + } else { + $data += ['name' => $this->record->name, 'title' => $this->content->name] + (array)$this->content; + } } $this->form->set_data($data); if ($this->form->is_cancelled()) { @@ -123,6 +133,9 @@ public function __construct($record = null) { foreach ($fs->get_area_files(context_user::instance($USER->id)->id, 'user', 'draft', $data->videofile) as $file) { if (!$file->is_directory()) { $data->edit = $DB->insert_record('tool_mediatime', $data); + if (empty($data->title)) { + $data->title = $data->name; + } file_save_draft_area_files( $data->videofile, diff --git a/source/vimeo/lang/en/mediatimesrc_vimeo.php b/source/vimeo/lang/en/mediatimesrc_vimeo.php index 26eb625..85baebb 100644 --- a/source/vimeo/lang/en/mediatimesrc_vimeo.php +++ b/source/vimeo/lang/en/mediatimesrc_vimeo.php @@ -36,6 +36,8 @@ $string['uploadnewfile'] = 'Upload new file'; $string['videofile'] = 'Video file'; $string['videofile_help'] = 'Choose to upload a new video, or choose to use an existing one that you select'; +$string['videoupload'] = 'Vimeo video upload'; +$string['videoupload_help'] = 'Add video file and click \'upload\'. The file will be uploaded from your computer to Vimeo with the information you entered on the previous form. The video will be viewable after Vimeo receives the file and has had time to process it.'; $string['vimeo:upload'] = 'Upload files to Vimeo'; $string['vimeo:viewall'] = 'View all files available'; $string['vimeofileaction'] = 'Vimeo file action'; diff --git a/source/vimeo/templates/file_upload.mustache b/source/vimeo/templates/file_upload.mustache index 0835233..2c1e801 100644 --- a/source/vimeo/templates/file_upload.mustache +++ b/source/vimeo/templates/file_upload.mustache @@ -33,6 +33,8 @@ }}
+

{{# str }} videoupload, mediatimesrc_vimeo {{/ str }}

+

{{# str }} videoupload_help, mediatimesrc_vimeo {{/ str }}