const express = require('express'); const fs = require('fs'); const md5 = require('md5'); var app = express(); app.listen(30080, function () { console.log('ACG.WATCH API listening on port 30080!'); }); app.get('/api/', (req, res)=>{ res.send('Hello from ACG.WATCH API!!'); }); app.get('/api/getAll', async (req, res) => { res.send(video.obj); }); app.get('/api/getClassBySeries', async (req, res)=>{ await video.getClassBySeries(req.query['class']) .then(classess => res.send(classess)) .catch(err => { var tmp = {}; Object.assign(tmp, video.unknownObj); res.send(tmp); }); }); app.get('/api/getVideoByUrl', async (req, res) => { await video.getVideoByUrl(req.query.url) .then(video => res.send(video)) .catch(err => { var tmp = {}; Object.assign(tmp, video.unknownObj); tmp.url = req.query.url; tmp.danmakuID = md5(req.query.url).substring(0, 8); //String(parseInt(Math.random()*(90000000-50000000+1)+50000000,10)); res.send(tmp); }); }); app.get('/api/getNextByUrl', async (req, res) => { await video.getNextByUrl(req.query.url) .then(video => res.send(video)) .catch(err => { var tmp = {}; Object.assign(tmp, video.unknownObj); res.send(tmp); }); }); var video = { obj: {}, unknownObj: { name: 'unknown', season: 'unknown', url: 'https://cdn.yimian.xyz/video/404.mp4', description: 'unknown', danmakuID: '40404040', 'class': 'extra' }, getAll: () => JSON.parse(fs.readFileSync('mnt/cache/video/video.json')), getClassBySeries: series => new Promise((resolve, reject) => { Object.keys(video.obj).forEach(item => { if(video.obj[item].hasOwnProperty(series)){ resolve(item); } }); reject('err in get Class By Series'); }), getVideoByUrl: url => new Promise((resolve, reject) => { Object.keys(video.obj).forEach( classes => { Object.keys(video.obj[classes]).forEach(series => { video.obj[classes][series]['video'].forEach((vid, index) => { if(vid.url == url){ resolve(video.getVideo(classes, series, index)); } }); }); } ); reject('err in getVideoByUrl'); }), getVideo: (classes, series, vid) => { if(vid >= video.obj[classes][series]['video'].length){ vid = 0; } var tmp = { "class": classes, "seriesID": series, "vid": vid }; Object.assign(tmp, video.obj[classes][series]['video'][vid]); return tmp; }, getNextByUrl: url => new Promise(async (resolve, reject) => { try{ var lastVideo = await video.getVideoByUrl(url); resolve(video.getVideo(lastVideo['class'], lastVideo.seriesID, lastVideo.vid+1)); }catch(e){ reject(e); } }), reload: () => { video.obj = video.getAll(); }, } /* watch video.json cache */ video.reload(); fs.watch('/mnt/cache/video/', event => video.reload());