@YungJabo

Почему не получается передать видео на фронтенд с сервера на Express?

Читал документации, смотрел ролики (таких немного) и все равно не понимаю, почему у них это работает, а у меня нет. Скорее всего я как-то некорректно передаю чанки. В общем делаю запрос с клиента на сервер, он добавляет видео по magnet ссылке, затем начинает постепенно подгружаться. Но подгружается он неправильно и почти сразу уходит в ошибку.

Express.js:
import express from "express";
import WebTorrent from "./index.js";
import cors from "cors";
const app = express();
app.use(cors());
console.log(WebTorrent);
const client = new WebTorrent();
const torrentId =
  "magnet:?xt=urn:btih:db2c6f6b39ef67f78e9a56847f201a69a4c15cdb&tr=udp%3A%2F%2Fopentor.net%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopentracker.i2p.rocks%3A6969%2Fannounce&tr=udp%3A%2F%2Fatrack.pow7.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fpow7.com%3A6969%2Fannounce&tr=http%3A%2F%2Fsecure.pow7.com%2Fannounce&tr=http%3A%2F%2Ft1.pow7.com%2Fannounce&tr=udp%3A%2F%2Ft2.pow7.com%3A6969%2Fannounce&tr=http%3A%2F%2Ftracker.bittor.pw%3A1337%2Fannounce&tr=http%3A%2F%2Ftracker.dler.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.zer0day.to%3A1337%2Fannounce&tr=http%3A%2F%2Fbt2.t-ru.org%2Fann%3Fmagnet";
app.get("/upload", (req, res) => {
  client.add(torrentId, (torrent) => {
    console.log("ok");
    res.send("ok");
  });
});

app.get("/video", (req, res) => {
  const range = req.headers.range;
  const file = client.get(torrentId).files[0];
  const startParsed = range.replace(/bytes=/, "").split("-");
  const start = parseInt(startParsed);
  const end = file.length;
  const chunksize = end - start + 1;
  console.log(start, end);
  const head = {
    "Content-Range": `bytes ${start}-${end}/${file.length}`,
    "Accept-Ranges": "bytes",
    "Content-Length": chunksize,
    "Content-Type": "video/mkv",
  };
  res.writeHead(206, head);
  const stream = file.createReadStream({
    start: start,
    end: end,
  });
  stream.pipe(res);
  stream.on("error", (err) => {
    console.error("Error in stream:", err);
  });
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});


React.js:
import { useEffect, useState } from "react";
import reactLogo from "./assets/react.svg";
import viteLogo from "/vite.svg";
import axios from "axios";
import Player from "./PLayer";
import "./App.css";

function App() {
  const uploadVideo = async (e) => {
    e.preventDefault();
    await axios.get("http://localhost:3000/upload");
    setVideoUrl("http://localhost:3000/video");
  };

  const [videoUrl, setVideoUrl] = useState(null);
  return (
    <>
      <video controls width="500">
        {videoUrl ? <source src={videoUrl} /> : ""}
        Ваш браузер не поддерживает воспроизведение видео.
      </video>
      <button onClick={(e) => uploadVideo(e)}>Начать загрузку</button>
    </>
  );
}

export default App;


Вывод express.js в консоль:
PS D:\WEB\cinema\test> node app.js
[class WebTorrent extends EventEmitter] {
  WEBRTC_SUPPORT: false,
  UTP_SUPPORT: true,
  VERSION: '1.9.7'
}
Server is running on port 3000
ok
0 2331638375
Error in stream: Error: Writable stream closed prematurely
    at Pipeline.done (D:\WEB\cinema\test\node_modules\streamx\index.js:434:43)
    at ServerResponse.emit (node:events:514:28)
    at emitCloseNT (node:_http_server:1023:10)
    at Socket.onServerResponseClose (node:_http_server:278:5)
    at Socket.emit (node:events:526:35)
    at TCP.<anonymous> (node:net:337:12)


Скрин "Network" из браузера:
658371091ff6f848728378.png

Уже пытался меня размер chankSize и end, все равно не получается...
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы