Vimeo API: загрузка видеофайлов с использованием возобновляемого подхода (javascript) - PullRequest
2 голосов
/ 21 февраля 2020

Нужна помощь.

Я использую протокол TUS для загрузки видео в VIMEO.

Я разделяю видеофайлы на куски (размер: 300 000 байт каждый).

После первый кусок я вижу, что его размер составляет 300 000 байт;

...

var buf = new Int8Array (evt.target.result); var chunkSizeReal = buf.byteLength; // 300.000 байт
...

После первого PATCH я вызываю HEAD для проверки UploadOffset и получаю:

UploadLength: 68077489

UploadOffset : 2609448

Я не понимаю, почему смещение равно 2.609.448, если отправка фрагмента имеет размер 300.000 байт.

    function uploadingVideo(file, uploadLink){

                        //debugger;
                        $("#loader").show();
                        startTimer();

                        var fileSize   = (file.size - 1);
                        //var chunkSize  = 128000000; // 64 * 1024; // bytes
                        var chunkSize  = 300000; //30000000; //20 MB //2048 * 2048; //64 * 1024; // 64 * 1024; // bytes
                        var chunkOffset = 0;

                        var readEventHandler = function(evt) {

                            console.log("readEventHandler called");

                            if (evt.target.error === null) {
                                // offset += evt.target.result.length;
                                // console.log("Offset: " + offset);
                                // callback(evt.target.result); // callback for handling read chunk

                                console.log(evt.target);
                                //console.log(evt.target.result);

                                //var buf = new Uint32Array(evt.target.result);
                                var buf = new Int8Array(evt.target.result);

                                //chunkSize = parseInt(evt.target.result.length);
                                var chunkSizeReal = buf.byteLength;
                                console.log("ChunkSize: " + chunkSizeReal);

                                $.ajax({
                                    'url': uploadLink,
                                    'type': 'HEAD',
                                    'headers': {
                                        'Tus-Resumable': '1.0.0',
                                        'Accept': 'application/vnd.vimeo.*+json;version=3.4'
                                    },
                                    'success': function (data, text, jqXHR) {

                                        var uploadLength = jqXHR.getResponseHeader('Upload-Length');
                                        var uploadOffset = jqXHR.getResponseHeader('Upload-Offset');

                                        if(uploadLength === null && uploadOffset === null){
                                            uploadLength = 0;
                                            uploadOffset = 0;
                                        }

                                        console.log("UploadLength: " + uploadLength);
                                        console.log("UploadOffset: " + uploadOffset);

                                        var uplOffset = parseInt(uploadOffset);
                                        var uplLength = parseInt(uploadLength);

                                        if(uplOffset < uplLength) {

                                            if((uplOffset + chunkSizeReal) > uplLength){
                                                chunkSizeReal = uplLength - uplOffset;
                                                console.log("Last chunkSize: " + chunkSizeReal);
                                            }

                                            // console.log(evt.target.result);

                                            // console.log(typeof evt.target.result);
                                            // console.log(typeof file);

                                            console.log(evt.target.result);
                                            console.log(evt.target.result.length);

                                            $.ajax({
                                                'url': uploadLink,
                                                'type': 'PATCH',
                                                'headers': {
                                                    'Tus-Resumable': '1.0.0',
                                                    'Upload-Offset': uplOffset,
                                                    'Accept': 'application/vnd.vimeo.*+json;version=3.4',
                                                    'Content-Type': 'application/offset+octet-stream'
                                                },
                                                //'data': evt.target.result,
                                                'data': buf, //buf, // new Blob([buf])
                                                'success': function (result) {

                                                    console.log("Uploaded------------\n");
                                                    console.log("Offset + chunkSize: " + uplOffset + " - " + (uplOffset + chunkSizeReal));

                                                    // console.log(result);

                                                    //uplOffset += chunkSize;

                                                    //console.log("off + chunkS: " + uplOffset);

                                                    var uplOffsetX = uplOffset + chunkSizeReal;
                                                    var x = (uplOffsetX * 100 / fileSize).toFixed(0);

                                                    console.log(x + "%");
                                                    $("#percent").text(x + "%");

                                                    $("#UploadedSize").text(formatBytes(uplOffset + chunkSizeReal, 1)); 

                                                    $("#progress-bar").css("width", x + "%");
                                                    $("#progress-bar").data("aria-valuenow", x);


                                                    // Of to the next chunk
                                                    chunkReaderBlock(chunkOffset, chunkSize, file);

                                                },
                                                error: function (XMLHttpRequest, textStatus, errorThrown) {

                                                    if (textStatus == 'Unauthorized') {
                                                        //alert('custom message. Error: ' + errorThrown);
                                                        console.log('custom message. Error: ' + errorThrown);
                                                    } else {
                                                        //alert('custom message. Error: ' + errorThrown);
                                                        console.log('custom message. Error: ' + errorThrown);
                                                    }

                                                    clearInterval(timer);
                                                }
                                            });
                                        } else {
                                            console.log("Done reading file");
                                            return;
                                        }   

                                    }
                                });



                            } else {
                                console.log("Read error: " + evt.target.error);
                                return;
                            }
//                          if (offset >= fileSize) {
//                              console.log("Done reading file");
//                              return;
//                          }
                        }

                        chunkReaderBlock = function(_offset, chunkLength, _file) {
                            var r = new FileReader();

                            chunkOffset = _offset + chunkLength;

                            var blob = _file.slice(_offset, _offset + chunkLength);
                            r.onload = readEventHandler;
                            r.readAsArrayBuffer(blob);
                        }

                        // now let's start the read with the first block
                        chunkReaderBlock(chunkOffset, chunkSize, file);

1 Ответ

0 голосов
/ 22 февраля 2020

UploadOffset сообщает, сколько получил сервер. Установка размера чанка не гарантирует, что каждый кусочек получен «чисто» для каждой итерации.

...