|  | @@ -1,5 +1,4 @@
 | 
	
		
			
				|  |  |  let argv = require('minimist')(process.argv.slice(2));
 | 
	
		
			
				|  |  | -const cron = require("node-cron");
 | 
	
		
			
				|  |  |  const fs = require('fs');
 | 
	
		
			
				|  |  |  const express = require('express');
 | 
	
		
			
				|  |  |  const app = express();
 | 
	
	
		
			
				|  | @@ -9,7 +8,13 @@ const pool = mysql.createPool({
 | 
	
		
			
				|  |  |      keepAliveInitialDelay: 0, enableKeepAlive: true,
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  |  const db = mysql.createConnection({
 | 
	
		
			
				|  |  | -    host: 'mc.andyxie.cn', user: 'instrunet', password: 'Moyingren2015', database: "instrunet_data", pool: pool,enableKeepAlive: true, keepAliveInitialDelay: 0,
 | 
	
		
			
				|  |  | +    host: 'mc.andyxie.cn',
 | 
	
		
			
				|  |  | +    user: 'instrunet',
 | 
	
		
			
				|  |  | +    password: 'Moyingren2015',
 | 
	
		
			
				|  |  | +    database: "instrunet_data",
 | 
	
		
			
				|  |  | +    pool: pool,
 | 
	
		
			
				|  |  | +    enableKeepAlive: true,
 | 
	
		
			
				|  |  | +    keepAliveInitialDelay: 0,
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  |  const nodemailer = require('nodemailer')
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -17,18 +22,12 @@ const bodyParser = require("body-parser");
 | 
	
		
			
				|  |  |  const nrc = require('node-run-cmd')
 | 
	
		
			
				|  |  |  const https = require("node:https");
 | 
	
		
			
				|  |  |  const {OpenCC} = require("opencc");
 | 
	
		
			
				|  |  | -const converter = new OpenCC('s2t.json')
 | 
	
		
			
				|  |  | +const converters2t = new OpenCC('s2t.json')
 | 
	
		
			
				|  |  | +const convertert2s = new OpenCC('t2s.json')
 | 
	
		
			
				|  |  |  app.use(bodyParser.json({"limit": "200mb"}));
 | 
	
		
			
				|  |  |  app.use(express.json());
 | 
	
		
			
				|  |  |  app.use(SendSeekable)
 | 
	
		
			
				|  |  | -let availCache = {}
 | 
	
		
			
				|  |  | -cron.schedule('* */12 * * *', () => {
 | 
	
		
			
				|  |  | -    availCache = {}
 | 
	
		
			
				|  |  | -})
 | 
	
		
			
				|  |  | -cron.schedule('*/30 * * * *', () => {
 | 
	
		
			
				|  |  | -    db.prepare("SELECT 1");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -})
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const transporter = nodemailer.createTransport({
 | 
	
		
			
				|  |  |      host: 'smtp.qq.com', port: 465, secure: true, auth: {
 | 
	
	
		
			
				|  | @@ -175,29 +174,40 @@ app.options('/submit', function (req, res) {
 | 
	
		
			
				|  |  |      res.end()
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  |  app.post('/search_api', async function (req, res) {
 | 
	
		
			
				|  |  | -    async function OnFetched(err, rows) {
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            db.execute(`SELECT uuid, song_name, album_name, artist, kind
 | 
	
		
			
				|  |  | -                        FROM instrunet_entry
 | 
	
		
			
				|  |  | -                        WHERE song_name like '%${(req.body.searchStr)}%'
 | 
	
		
			
				|  |  | -                           or album_name like '%${(req.body.searchStr)}%'
 | 
	
		
			
				|  |  | -                           or artist like '%${(req.body.searchStr)}%'`, (err, result) => {
 | 
	
		
			
				|  |  | -                res.header("Access-Control-Allow-Origin", "*");
 | 
	
		
			
				|  |  | -                res.end(JSON.stringify(result) === JSON.stringify(rows) ? JSON.stringify(rows) : JSON.stringify(rows.concat(result)));
 | 
	
		
			
				|  |  | -            })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        } catch (e) {
 | 
	
		
			
				|  |  | -            console.log(e)
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      db.execute(`SELECT uuid, song_name, album_name, artist, kind
 | 
	
		
			
				|  |  |                  FROM instrunet_entry
 | 
	
		
			
				|  |  | -                WHERE song_name like '%${await converter.convertPromise(req.body.searchStr)}%'
 | 
	
		
			
				|  |  | -                   or album_name like '%${await converter.convertPromise(req.body.searchStr)}%'
 | 
	
		
			
				|  |  | -                   or artist like '%${await converter.convertPromise(req.body.searchStr)}%'`, OnFetched)
 | 
	
		
			
				|  |  | -    db.unprepare()
 | 
	
		
			
				|  |  | +                WHERE song_name like '%${await converters2t.convertPromise(req.body.searchStr)}%'
 | 
	
		
			
				|  |  | +                   or album_name like '%${await converters2t.convertPromise(req.body.searchStr)}%'
 | 
	
		
			
				|  |  | +                   or artist like '%${await converters2t.convertPromise(req.body.searchStr)}%'`, async (err, rowsT) => {
 | 
	
		
			
				|  |  | +        db.execute(`SELECT uuid, song_name, album_name, artist, kind
 | 
	
		
			
				|  |  | +                    FROM instrunet_entry
 | 
	
		
			
				|  |  | +                    WHERE song_name like '%${await convertert2s.convertPromise(req.body.searchStr)}%'
 | 
	
		
			
				|  |  | +                       or album_name like '%${await convertert2s.convertPromise(req.body.searchStr)}%'
 | 
	
		
			
				|  |  | +                       or artist like '%${await convertert2s.convertPromise(req.body.searchStr)}%'`, (err, rowsS) => {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                let prepare = [];
 | 
	
		
			
				|  |  | +                rowsT.forEach(row => {
 | 
	
		
			
				|  |  | +                    prepare = prepare.concat(row);
 | 
	
		
			
				|  |  | +                })
 | 
	
		
			
				|  |  | +                rowsS.forEach(row => {
 | 
	
		
			
				|  |  | +                    if (JSON.stringify(prepare).indexOf(JSON.stringify(row)) === -1) {
 | 
	
		
			
				|  |  | +                        prepare = prepare.concat(row);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                })
 | 
	
		
			
				|  |  | +                res.header("Access-Control-Allow-Origin", "*");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                res.end(JSON.stringify(prepare));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            } catch (e) {
 | 
	
		
			
				|  |  | +                console.log(e)
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  |  app.options('/search_api', function (req, res) {
 | 
	
		
			
				|  |  |      res.header("Access-Control-Allow-Origin", "*");
 | 
	
	
		
			
				|  | @@ -236,13 +246,11 @@ app.options('/ncm/url', function (req, res) {
 | 
	
		
			
				|  |  |  app.post("/ncm/url", function (req, res) {
 | 
	
		
			
				|  |  |      if (req.body.id) {
 | 
	
		
			
				|  |  |          let id = req.body.id
 | 
	
		
			
				|  |  | -        fetch(
 | 
	
		
			
				|  |  | -            ncmAPIUrl + "/song/download/url/v1?id=" + id + "&level=hires", {
 | 
	
		
			
				|  |  | -                headers: {
 | 
	
		
			
				|  |  | -                    Cookie: "MUSIC_U=0087F9D8E102A1C1661EBE1792412F3351DA64D1BD3D862BA77E45E9024524725F3A1983345D9B5A4014C725D19C069DD71081F6FE3659F9E1FD412DC427FB809FAF7789AEEA10E9DE6F06C58D1959BA209D2A83C3FA753261036C4CFD0D143B6C7748B8A6D2DD5C2E96E75D1E847E4AAE035CB2C86B175D9AFC6A164C522ED76E24AE654740AB6BAF5B29597F7E3B0158B2EC1C37F2688279871873FA7ADAEF8280A059E84C4BBFB9E4F225F9A2065DF652247D5496587A7B1E3D35DB0CD3F825C06FE5BFE5CFEF1770847099704360504B73C9B396E37CECE4F9DDEE6001588C3C4F5B2861D9ADF339FC47DD480858CA800620785EA032215B63B81025304DB3331F384793FF8EE681247E34C7931176F2F618B66C122F0602F1EA15F963E422DEC79C257F3577A197BECE71E316C751C3B9F5F3CD07BFDC0270A287A1BB6576"
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +        fetch(ncmAPIUrl + "/song/download/url/v1?id=" + id + "&level=hires", {
 | 
	
		
			
				|  |  | +            headers: {
 | 
	
		
			
				|  |  | +                Cookie: "MUSIC_U=0087F9D8E102A1C1661EBE1792412F3351DA64D1BD3D862BA77E45E9024524725F3A1983345D9B5A4014C725D19C069DD71081F6FE3659F9E1FD412DC427FB809FAF7789AEEA10E9DE6F06C58D1959BA209D2A83C3FA753261036C4CFD0D143B6C7748B8A6D2DD5C2E96E75D1E847E4AAE035CB2C86B175D9AFC6A164C522ED76E24AE654740AB6BAF5B29597F7E3B0158B2EC1C37F2688279871873FA7ADAEF8280A059E84C4BBFB9E4F225F9A2065DF652247D5496587A7B1E3D35DB0CD3F825C06FE5BFE5CFEF1770847099704360504B73C9B396E37CECE4F9DDEE6001588C3C4F5B2861D9ADF339FC47DD480858CA800620785EA032215B63B81025304DB3331F384793FF8EE681247E34C7931176F2F618B66C122F0602F1EA15F963E422DEC79C257F3577A197BECE71E316C751C3B9F5F3CD07BFDC0270A287A1BB6576"
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -        ).then(async result => {
 | 
	
		
			
				|  |  | +        }).then(async result => {
 | 
	
		
			
				|  |  |              let result_json = await result.json()
 | 
	
		
			
				|  |  |              if (result_json.data.url !== null) {
 | 
	
		
			
				|  |  |                  let infos = await (await fetch(ncmAPIUrl + "/song/detail?ids=" + id)).json();
 | 
	
	
		
			
				|  | @@ -276,6 +284,11 @@ app.post("/ncm/url", function (req, res) {
 | 
	
		
			
				|  |  |  app.get("/favicon.ico", function (req, res) {
 | 
	
		
			
				|  |  |      res.end("");
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  | +let availCache = {};
 | 
	
		
			
				|  |  | +setInterval(() => {
 | 
	
		
			
				|  |  | +    console.log(availCache);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}, 2000)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Fetch
 | 
	
		
			
				|  |  |  app.get('/:uuid', function (req, res) {
 |