• Как хранить данные для кастомного блока code?

    @risejs
    pre
    Ответ написан
    Комментировать
  • Как изменять сайт на питоне, аналогично javascript коду сайта?

    @risejs
    Как мне использовать питон код в javascript коде сайта

    Также как и используют TypeScript, который тоже не один браузер не поддерживает, но на котором тем не менее много кто пишет клиент - транспилировать в JavaScript.
    Ответ написан
    1 комментарий
  • Изменение меню sublime text?

    @risejs
    Preferences > Select Theme > Adaptive
    Ответ написан
  • Как отследить запросы?

    @risejs
    if (response.status == 200) {
       // ...
    } else {
       // ...
    }
    Ответ написан
    Комментировать
  • Где хранится экземпляр swiper?

    @risejs
    В swiper-свойстве swiper-html-элемента - Initialize Swiper, Access To Swiper Instance.
    Ответ написан
    Комментировать
  • Как решить эту проблему в sublime text Не удалось найти указанный файл?

    @risejs
    Добавьте в переменную среды Path папку C:\Users\user\AppData\Local\Programs\Python\Launcher\, именно там находится py, который запускается через cmd судя по тексту ошибки.

    В поиске Windows введите "среды", выберите "Изменение переменных среды текущего пользователя", выберите переменную Path, нажмите Изменить, добавьте папку.
    Ответ написан
  • Где в «Tampermonkey» настраиваются отступы (с 4 на 2)?

    @risejs
    Настройки > Режим конфигурации > Опытный > Редактор
    Ответ написан
    Комментировать
  • Node.js - Как устанавливать npm пакеты в проект, если?

    @risejs
    В поиске Windows введите "среды", выберите "Изменение переменных среды текущего пользователя", выберите переменную Path, нажмите Изменить, добавьте папку c Node.js.
    Ответ написан
    Комментировать
  • Как решить долгий запрос blob?

    @risejs
    У тебя видео скачивается полностью. Если хочешь по частям, то надо сделать подобие потока. Blob для этого не подходит, то что в ссылке написано blob: не значит что URL.createObjectURL() принимает только Blob, там еще есть MediaSource.

    Потоковые медиа в браузерах работают через Media Source API. Видео для него должно соответствовать определенным требованиям, например фрагментированный mp4. Видео по твоей ссылке таким не является. Можно проверить здесь mp4info.

    Если для транспорта используется fetch или XMLHttpRequest, то есть парочка относительно простых способов это реализовать:

    1. Через тип ответа ArrayBuffer и заголовок запроса Range. В fetch поддерживается через response.arrayBuffer(), в XMLHttpRequest через responseType='arraybuffer'.
    Например.

    2. Через тип ответа ReadableStream (Streams API). В fetch поддерживается через response.body, в axios и других xmlhttprequest-основанных библиотеках не поддерживается. Также для Streams API требуется протокол HTTP/2+.
    Например 1, 2, 3, 4.

    Краткие примеры:
    const rangeVideo = async (player, mimeCodec, resource) => {
        const mediaSource = new MediaSource;
        player.src = URL.createObjectURL(mediaSource);
        await new Promise(resolve => mediaSource.onsourceopen = resolve);
        URL.revokeObjectURL(player.src);
        const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
    
        const response = await fetch(resource, { method: 'HEAD' });
        const contentLength = response.headers.get('Content-Length');
        const segmentLength = 1 * 1024 * 1024;
        let fetchedLength = -1;
    
        while (true) {
            if (fetchedLength >= contentLength) break;
            const response = await fetch(resource, {
              headers:{'Range':`bytes=${fetchedLength+1}-${fetchedLength+=segmentLength}`}
            });
            const value = await response.arrayBuffer();
            sourceBuffer.appendBuffer(value);
            await new Promise(resolve => sourceBuffer.onupdateend = resolve);
            //console.count();
            //await delay(2000);
        }
    };
    
    const streamVideo = async (player, mimeCodec, resource) => {
        const mediaSource = new MediaSource;
        player.src = URL.createObjectURL(mediaSource);
        await new Promise(resolve => mediaSource.onsourceopen = resolve);
        URL.revokeObjectURL(player.src);
        const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
    
        const response = await fetch(resource);
        const readableStream = response.body;
        const reader = readableStream.getReader();
    
        while (true) {
            const { value, done } = await reader.read();
            if (done) break;
            sourceBuffer.appendBuffer(value);
            await new Promise(resolve => sourceBuffer.onupdateend = resolve);
            //console.count();
        }
    };
    
    //const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
    
    const data = [
        document.querySelector('video'),
        'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
        'https://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4',
    ];
    
    //rangeVideo(...data);
    //streamVideo(...data);
    Ответ написан
    Комментировать
  • Нужно ли снова устанавливать Node.js для каждого нового проекта?

    @risejs
    Нет, а модули да, у каждого проекта свои, находятся в папке node_modules.
    Ответ написан
    Комментировать
  • Как написать атрибут 'name' в данном случае?

    @risejs
    <form>
        <input name="image[0][url]">
        <input name="image[0][id]">
    
        <input name="image[1][url]">
        <input name="image[1][id]">
    
        <input name="image[2][url]">
        <input name="image[2][id]">
    </form>
    Ответ написан
    Комментировать
  • Как по клику на кнопку отнимать 7 дней?

    @risejs
    $('.click')
    .on('click', function () {
        let $this = $(this);
        let date = $this.data('date');
        let step = $this.data('step');
        let timestamp = date.setTime(date.getTime() + step);
        console.log(date);
    })
    .data('date', new Date)
    .data('step', -7 * 24 * 60 * 60 * 1000) // 7 дней назад
    //.data('step', 14 * 24 * 60 * 60 * 1000) // 14 дней вперед
    //.data('step', -12 * 60 * 60 * 1000) // 12 часов назад
    //.data('step', 30 * 60 * 1000) // 30 минут вперед
    Ответ написан
    Комментировать
  • Как скачать все shorts с канала?

    @risejs
    Ответ написан
    Комментировать
  • Как запустить скрипт через хоткей в определённом сайте?

    @risejs
    Сделать закладку c URL:
    javascript:(()=>{ скрипт })()
    Ответ написан
    3 комментария
  • Почему ADB не запускается и как это исправить?

    @risejs
    Потому что это консольное приложение (не имеет графического интерфейса).

    Откройте Командную строку (консоль) и в ней запускайте:
    > path/to/folder/adb.exe
    Ответ написан
    2 комментария
  • Как обойти на чужом сайте onselectstart="return false"?

    @risejs
    Закладка (выделение текста, контекстное меню) URL:
    javascript:((d,p)=>{d.body.onselectstart=d.body.oncut=d.body.oncopy=d.oncontextmenu=null,d.body.style[p]=d.body.style['-ms-'+p]=d.body.style['-moz-'+p]=d.body.style['-webkit-'+p]='auto'})(document,'user-select')
    Ответ написан
    Комментировать
  • Как запросить разрешение на отправку push-уведомлений?

    @risejs
    В Chrome, если пользователь пару раз отклонит запрос на уведомления, причем не важно в пределах какого сайта, то браузер автоматически блокирует запросы на уведомления с любого сайта на некоторое время.

    И в консоли пишет:
    Notifications permission has been blocked as the user has ignored the permission prompt several times. This can be reset in Page Info which can be accessed by clicking the lock icon next to the URL. See https://www.chromestatus.com/feature/6443143280984064 for more information.


    https://mdn.github.io/dom-examples/to-do-notifications/
    Ответ написан
    Комментировать
  • Что делать, если ни один язык программирования в GODOT не отображается?

    @risejs
    Какие языки там всего один - GDScript. А чтобы был C# надо качать отдельный инсталлятор с припиской .NET (в стим версия без .NET, качайте с офсайта). Остальные из коробки не идут, надо повозиться с GDExtension.
    Ответ написан
    1 комментарий
  • Как youtube уведомляет браузер о новом сообщении в live chat?

    @risejs
    В последней версии Chrome на Youtube используется протокол HTTP/3. Возможно в этом дело, что вы не можете найти WebSocket, который не поддерживается данным протоколом (и будет ли?), в связи с чем уже замену приготовили - WebTransport.
    Ответ написан
    Комментировать
  • Как сформировать AJAX запрос для базы данных?

    @risejs
    Да, нужно сделать запрос. AJAX это вообще общее понятие (устаревшее) для всех сетевых запросов из скрипта. В JS для этого есть три класса - XMLHttpRequest, WebSocket, EventSource, и один метод - fetch, плюс куча библиотек и фреймворков на их основе. WebSocket и EventSource нужны для приложений реального времени, XMLHttpRequest и fetch - для остального. Вам подойдет XMLHttpRequest или fetch. Различия в том, что первый использует сallback-и, второй - promise-ы, но главное отличие первого это события прогресса, причем в обе стороны:
    // В порядке выполнения:
     
    xhr.onloadstart // 1
     
    xhr.upload.onloadstart // 2
    xhr.upload.onprogress // 3
    xhr.upload.onload // 4
    xhr.upload.onerror // 4
    xhr.upload.onabort // 4
    xhr.upload.ontimeout // 4
    xhr.upload.onloadend // 5
     
    // download
    xhr.onprogress // 6
    xhr.onload // 7
    xhr.onerror // 7
    xhr.onabort // 7
    xhr.ontimeout // 7
    xhr.onloadend  // 8
     
    xhr.onreadystatechange // 6-8


    Вы можете использовать этот паттерн XMLHttpRequest (в интернете много неактуальных примеров, либо старые для IE, либо без обработки ошибок):

    function request(options) {
        let requestJson = options.data;
        let requestBody = JSON.stringify(requestJson);
        let xhr = new XMLHttpRequest();
        xhr.open('POST', options.url);
        xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
        xhr.responseType = 'json';
        xhr.onload = function () {
            if (xhr.status == 200) {
                if (xhr.response == null) {
                    options.error.call(xhr, 'FORMAT_ERROR');
                } else {
                    options.success.call(xhr, xhr.response);
                }
            } else {
                options.error.call(xhr, 'SERVER_ERROR');
            }
        };
        xhr.onerror = function () {
            options.error.call(xhr, 'NETWORK_ERROR');
        };
        xhr.send(requestBody);
    }
    
    function click() {
        // ...FORM STUFF...
    
        let requestData = { 'name1': 'value1', 'name2': 'value2' };
    
        request({
            url: 'json.php',
            data: requestData,
            success: function (response) {
                console.log('XHR:', response);
    
                // response['key1'], response['key2']
    
                // ...TABLE STUFF...
            },
            error: function (message) {
                console.error('XHR:', message);
            },
        });
    }

    <?php
    
    // json.php
    
    header('Content-Type: application/json; charset=utf-8');
    
    $requestBody = file_get_contents('php://input');
    $requestJson = json_decode($requestBody, true);
    
    // $requestJson['name1'], $requestJson['name2']
    
    // ...DATABASE STUFF...
    
    $responseJson = [ 'key1' => 'value1', 'key2' => 'value2' ];
    $responseBody = json_encode($responseJson);
    
    echo $responseBody;
    Ответ написан
    3 комментария