mirror of
https://github.com/anatolykopyl/movieroom-core.git
synced 2026-03-26 21:04:54 +00:00
Moved routes into own file
This commit is contained in:
106
src/index.ts
106
src/index.ts
@@ -1,117 +1,21 @@
|
|||||||
import Koa from 'koa';
|
|
||||||
import Router from 'koa-router';
|
|
||||||
require('dotenv').config();
|
require('dotenv').config();
|
||||||
|
import Koa from 'koa';
|
||||||
import json from 'koa-json';
|
import json from 'koa-json';
|
||||||
import bodyParser from 'koa-bodyparser';
|
import bodyParser from 'koa-bodyparser';
|
||||||
import cors from '@koa/cors';
|
import cors from '@koa/cors';
|
||||||
|
import { connect } from 'mongoose';
|
||||||
|
|
||||||
import { model, connect } from 'mongoose';
|
import routes from './routes';
|
||||||
import short from 'short-uuid';
|
|
||||||
import WebTorrent from 'webtorrent';
|
|
||||||
|
|
||||||
import { errorResponse } from './utils';
|
|
||||||
import processDownloaded from './processDownloaded';
|
|
||||||
import { Room, roomSchema } from './interfaces';
|
|
||||||
|
|
||||||
const RoomModel = model<Room>('Room', roomSchema);
|
|
||||||
|
|
||||||
const tCli = new WebTorrent();
|
|
||||||
|
|
||||||
const app = new Koa();
|
const app = new Koa();
|
||||||
const router = new Router({ prefix: '/api' });
|
|
||||||
|
|
||||||
router.post('/room', async (ctx) => {
|
|
||||||
if (ctx.request.body.magnet) {
|
|
||||||
return new Promise(function (resolve) {
|
|
||||||
tCli.add(ctx.request.body.magnet, { path: process.env.TEMP_FILES }, async function (torrent) {
|
|
||||||
const room = {
|
|
||||||
id: (short()).new(),
|
|
||||||
magnet: ctx.request.body.magnet,
|
|
||||||
createdAt: new Date(),
|
|
||||||
movie: torrent.name,
|
|
||||||
position: 0,
|
|
||||||
syncedAt: new Date(),
|
|
||||||
};
|
|
||||||
const doc = new RoomModel(room);
|
|
||||||
|
|
||||||
async function setDownloadProg() {
|
|
||||||
await RoomModel.updateOne({ id: room.id }, {
|
|
||||||
downloadedProg: torrent.progress,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
torrent
|
|
||||||
.on('download', async () => {
|
|
||||||
setDownloadProg();
|
|
||||||
})
|
|
||||||
.on('done', async () => {
|
|
||||||
setDownloadProg();
|
|
||||||
torrent.destroy();
|
|
||||||
processDownloaded(torrent, room.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
await doc.save();
|
|
||||||
ctx.body = room;
|
|
||||||
resolve(null);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
({ status: ctx.status, body: ctx.body } = errorResponse('room-01', 'Invalid magnet link'));
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get('/room', async (ctx) => {
|
|
||||||
const room = await RoomModel.findOne({ id: ctx.request.query.id }).exec();
|
|
||||||
if (room) {
|
|
||||||
ctx.body = room;
|
|
||||||
} else {
|
|
||||||
({ status: ctx.status, body: ctx.body } = errorResponse('room-00', 'Room not found'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
router.post('/position', async (ctx) => {
|
|
||||||
await RoomModel.updateOne({ id: ctx.request.body.id }, {
|
|
||||||
position: Number(ctx.request.body.position),
|
|
||||||
syncedAt: new Date(),
|
|
||||||
});
|
|
||||||
ctx.body = 'success';
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get('/position', async (ctx) => {
|
|
||||||
const room = await RoomModel.findOne({ id: ctx.request.query.id }).exec();
|
|
||||||
if (room) {
|
|
||||||
const elapsedTime = new Date().getTime() - new Date(room.syncedAt).getTime();
|
|
||||||
ctx.body = {
|
|
||||||
position: room.position + elapsedTime / 1000,
|
|
||||||
syncedAt: room.syncedAt,
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
({ status: ctx.status, body: ctx.body } = errorResponse('room-00', 'Room not found'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Лучше спрятать в вебсокет?
|
|
||||||
router.get('/status', async (ctx) => {
|
|
||||||
const room = await RoomModel.findOne({ id: ctx.request.query.id }).exec();
|
|
||||||
|
|
||||||
if (room) {
|
|
||||||
ctx.body = {
|
|
||||||
downloadedProg: room.downloadedProg,
|
|
||||||
reencodedProg: room.reencodedProg,
|
|
||||||
downloaded: room.downloaded,
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
({ status: ctx.status, body: ctx.body } = errorResponse('status-01', 'No room found'));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
app.use(json());
|
app.use(json());
|
||||||
app.use(bodyParser());
|
app.use(bodyParser());
|
||||||
app.use(cors({
|
app.use(cors({
|
||||||
credentials: true,
|
credentials: true,
|
||||||
}));
|
}));
|
||||||
app.use(router.routes());
|
app.use(routes.routes());
|
||||||
app.use(router.allowedMethods());
|
app.use(routes.allowedMethods());
|
||||||
|
|
||||||
connect(process.env.DB).then(() => {
|
connect(process.env.DB).then(() => {
|
||||||
app.listen(process.env.PORT);
|
app.listen(process.env.PORT);
|
||||||
|
|||||||
99
src/routes.ts
Normal file
99
src/routes.ts
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
import Router from 'koa-router';
|
||||||
|
import short from 'short-uuid';
|
||||||
|
import WebTorrent from 'webtorrent';
|
||||||
|
import { model } from 'mongoose';
|
||||||
|
|
||||||
|
import { errorResponse } from './utils';
|
||||||
|
import processDownloaded from './processDownloaded';
|
||||||
|
import { Room, roomSchema } from './interfaces';
|
||||||
|
|
||||||
|
const RoomModel = model<Room>('Room', roomSchema);
|
||||||
|
const tCli = new WebTorrent();
|
||||||
|
|
||||||
|
const router = new Router({ prefix: '/api' });
|
||||||
|
|
||||||
|
router.post('/room', async (ctx) => {
|
||||||
|
if (ctx.request.body.magnet) {
|
||||||
|
return new Promise(function (resolve) {
|
||||||
|
tCli.add(ctx.request.body.magnet, { path: process.env.TEMP_FILES }, async function (torrent) {
|
||||||
|
const room = {
|
||||||
|
id: (short()).new(),
|
||||||
|
magnet: ctx.request.body.magnet,
|
||||||
|
createdAt: new Date(),
|
||||||
|
movie: torrent.name,
|
||||||
|
position: 0,
|
||||||
|
syncedAt: new Date(),
|
||||||
|
};
|
||||||
|
const doc = new RoomModel(room);
|
||||||
|
|
||||||
|
async function setDownloadProg() {
|
||||||
|
await RoomModel.updateOne({ id: room.id }, {
|
||||||
|
downloadedProg: torrent.progress,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
torrent
|
||||||
|
.on('download', async () => {
|
||||||
|
setDownloadProg();
|
||||||
|
})
|
||||||
|
.on('done', async () => {
|
||||||
|
setDownloadProg();
|
||||||
|
torrent.destroy();
|
||||||
|
processDownloaded(torrent, room.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
await doc.save();
|
||||||
|
ctx.body = room;
|
||||||
|
resolve(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
({ status: ctx.status, body: ctx.body } = errorResponse('room-01', 'Invalid magnet link'));
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get('/room', async (ctx) => {
|
||||||
|
const room = await RoomModel.findOne({ id: ctx.request.query.id }).exec();
|
||||||
|
if (room) {
|
||||||
|
ctx.body = room;
|
||||||
|
} else {
|
||||||
|
({ status: ctx.status, body: ctx.body } = errorResponse('room-00', 'Room not found'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post('/position', async (ctx) => {
|
||||||
|
await RoomModel.updateOne({ id: ctx.request.body.id }, {
|
||||||
|
position: Number(ctx.request.body.position),
|
||||||
|
syncedAt: new Date(),
|
||||||
|
});
|
||||||
|
ctx.body = 'success';
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get('/position', async (ctx) => {
|
||||||
|
const room = await RoomModel.findOne({ id: ctx.request.query.id }).exec();
|
||||||
|
if (room) {
|
||||||
|
const elapsedTime = new Date().getTime() - new Date(room.syncedAt).getTime();
|
||||||
|
ctx.body = {
|
||||||
|
position: room.position + elapsedTime / 1000,
|
||||||
|
syncedAt: room.syncedAt,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
({ status: ctx.status, body: ctx.body } = errorResponse('room-00', 'Room not found'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Лучше спрятать в вебсокет?
|
||||||
|
router.get('/status', async (ctx) => {
|
||||||
|
const room = await RoomModel.findOne({ id: ctx.request.query.id }).exec();
|
||||||
|
|
||||||
|
if (room) {
|
||||||
|
ctx.body = {
|
||||||
|
downloadedProg: room.downloadedProg,
|
||||||
|
reencodedProg: room.reencodedProg,
|
||||||
|
downloaded: room.downloaded,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
({ status: ctx.status, body: ctx.body } = errorResponse('status-01', 'No room found'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
||||||
Reference in New Issue
Block a user