main.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. const cron = require("node-cron");
  2. const fs = require('fs');
  3. const express = require('express');
  4. const app = express();
  5. const app_serve = express();
  6. const mysql = require('mysql2')
  7. const SendSeekable = require('send-seekable');
  8. const WebSocket = require('ws');
  9. const pool = mysql.createPool({
  10. keepAliveInitialDelay: 10000, enableKeepAlive: true,
  11. })
  12. const db = mysql.createConnection({
  13. host: 'mc.andyxie.cn', user: 'instrunet', password: 'Moyingren2015', database: "instrunet_data", pool: pool,
  14. })
  15. const nodemailer = require('nodemailer')
  16. const bodyParser = require("body-parser");
  17. const nrc = require('node-run-cmd')
  18. const https = require("node:https");
  19. const {WebSocketServer} = require("ws");
  20. const http = require("node:http");
  21. const {OpenCC} = require("opencc");
  22. const converter = new OpenCC('s2t.json')
  23. app.use(bodyParser.json({"limit": "200mb"}));
  24. app.use(express.json());
  25. app_serve.use(bodyParser.json({"limit": "200mb"}));
  26. app_serve.use(express.json());
  27. app_serve.use(SendSeekable)
  28. const transporter = nodemailer.createTransport({
  29. host: 'smtp.qq.com', port: 465, secure: true, auth: {
  30. user: '3095864740@qq.com', pass: 'caemyuagapsadfff',
  31. }
  32. })
  33. app.post('/submit', function (req, res) {
  34. let uuid = crypto.randomUUID()
  35. db.connect(function (err) {
  36. if (err) {
  37. console.log(err)
  38. }
  39. })
  40. res.header("Access-Control-Allow-Origin", "*");
  41. try {
  42. fetch(req.body.file).then(res => {
  43. res.arrayBuffer().then(r => fs.writeFileSync("./" + uuid, Buffer.from(r)));
  44. })
  45. res.end("api_success");
  46. } catch (err) {
  47. res.status(500).send("Server Error");
  48. return
  49. }
  50. const callback = function (d) {
  51. console.log(d.toString());
  52. }
  53. const errcb = function (d) {
  54. console.log(d.toString());
  55. }
  56. let kind_of = [];
  57. switch (req.body.kind) {
  58. case 0:
  59. kind_of[0] = `audio-separator ./${uuid} --model_filename UVR-MDX-NET-Inst_HQ_5.onnx --mdx_segment_size 4000 --mdx_overlap 0.75 --output_format mp3 --mdx_batch_size 300 --output_dir output`
  60. kind_of[1] = `./output/${uuid}_(Instrumental)_UVR-MDX-NET-Inst_HQ_5.mp3`
  61. kind_of[2] = `${uuid}_(Instrumental)_UVR-MDX-NET-Inst_HQ_5.mp3`
  62. kind_of[3] = `./output/${uuid}_(Vocals)_UVR-MDX-NET-Inst_HQ_5.mp3`
  63. break;
  64. case 1:
  65. kind_of[0] = `audio-separator ./${uuid} --model_filename UVR_MDXNET_KARA.onnx --mdx_segment_size 4000 --mdx_overlap 0.75 --output_format mp3 --mdx_batch_size 300 --output_dir output`
  66. kind_of[1] = `./output/${uuid}_(Instrumental)_UVR_MDXNET_KARA.mp3`
  67. kind_of[2] = `${uuid}_(Instrumental)_UVR_MDXNET_KARA.mp3`
  68. kind_of[3] = `./output/${uuid}_(Vocals)_UVR_MDXNET_KARA.mp3`
  69. break;
  70. case 3:
  71. kind_of[0] = `audio-separator ./${uuid} --model_filename kuielab_a_bass.onnx --mdx_segment_size 4000 --mdx_overlap 0.75 --output_format mp3 --mdx_batch_size 300 --output_dir output`
  72. kind_of[1] = `./output/${uuid}_(Bass)_kuielab_a_bass.mp3`
  73. kind_of[2] = `${uuid}_(Bass)_kuielab_a_bass.mp3`
  74. kind_of[3] = `./output/${uuid}_(No Bass)_kuielab_a_bass.mp3`
  75. break;
  76. case 4:
  77. kind_of[0] = `audio-separator ./${uuid} --model_filename kuielab_a_drums.onnx --mdx_segment_size 4000 --mdx_overlap 0.75 --output_format mp3 --mdx_batch_size 300 --output_dir output`
  78. kind_of[1] = `./output/${uuid}_(Drums)_kuielab_a_drums.mp3`
  79. kind_of[2] = `${uuid}_(Drums)_kuielab_a_drums.mp3`
  80. kind_of[3] = `./output/${uuid}_(No Drums)_kuielab_a_drums.mp3`
  81. break;
  82. }
  83. nrc.run([kind_of[0]], {
  84. onData: callback, onError: errcb
  85. }).then(() => {
  86. db.execute(("INSERT INTO instrunet_entry (uuid, song_name, album_name, link_to, databinary, artist,kind) VALUES (?,?,?,?,?,?,?)"), [uuid, req.body.name, req.body.albumName, req.body.link, fs.readFileSync(kind_of[1]), req.body.artist, req.body.kind])
  87. db.unprepare(() => {
  88. })
  89. fs.rm(kind_of[1], (err) => {
  90. if (err) {
  91. console.log(err);
  92. }
  93. })
  94. fs.rm(kind_of[3], (err) => {
  95. if (err) {
  96. console.log(err);
  97. }
  98. })
  99. fs.rm(uuid, (err) => {
  100. if (err) {
  101. console.log(err);
  102. }
  103. })
  104. if (req.body.email !== undefined) {
  105. console.log(req.body.email)
  106. transporter.sendMail({
  107. from: '"xiey0" <xiey0@qq.com>',
  108. to: req.body.email,
  109. subject: "你的音频已处理完成。",
  110. text: "你的音频已处理完成。",
  111. html: fs.readFileSync("./Template.html", "utf8").toString()
  112. }).then((result) => {
  113. console.log("Message sent: %s", result.messageId)
  114. })
  115. }
  116. })
  117. })
  118. app.options('/submit', function (req, res) {
  119. res.header("Access-Control-Allow-Origin", "*");
  120. res.header("Access-Control-Allow-Headers", "Content-Type");
  121. res.end()
  122. })
  123. app.post('/search_api', async function (req, res) {
  124. async function OnFetched(err, rows) {
  125. try {
  126. db.execute(`SELECT uuid, song_name, album_name, artist, kind
  127. FROM instrunet_entry
  128. WHERE song_name like '%${(req.body.searchStr)}%'
  129. or album_name like '%${(req.body.searchStr)}%'
  130. or artist like '%${(req.body.searchStr)}%'`, (err, result) => {
  131. res.header("Access-Control-Allow-Origin", "*");
  132. res.end(JSON.stringify(result) === JSON.stringify(rows) ? JSON.stringify(rows) : JSON.stringify(rows.concat(result)));
  133. })
  134. } catch (e) {
  135. console.log(e)
  136. }
  137. }
  138. db.execute(`SELECT uuid, song_name, album_name, artist, kind
  139. FROM instrunet_entry
  140. WHERE song_name like '%${await converter.convertPromise(req.body.searchStr)}%'
  141. or album_name like '%${await converter.convertPromise(req.body.searchStr)}%'
  142. or artist like '%${await converter.convertPromise(req.body.searchStr)}%'`, OnFetched)
  143. db.unprepare()
  144. })
  145. app.options('/search_api', function (req, res) {
  146. res.header("Access-Control-Allow-Origin", "*");
  147. res.header("Access-Control-Allow-Headers", "Content-Type");
  148. res.end()
  149. })
  150. app.get("/getSingle", function (req, res) {
  151. if (req.query.id) {
  152. db.execute(`SELECT song_name, album_name, artist, kind
  153. FROM instrunet_entry
  154. WHERE uuid = "${req.query.id}"`, function (err, rows) {
  155. if (err) {
  156. console.log(err);
  157. }
  158. res.contentType("application/json");
  159. res.header("Access-Control-Allow-Origin", "*");
  160. res.header("Access-Control-Allow-Headers", "Content-Type");
  161. res.end(JSON.stringify(rows[0]));
  162. })
  163. } else {
  164. res.contentType("application/json");
  165. res.header("Access-Control-Allow-Origin", "*");
  166. res.header("Access-Control-Allow-Headers", "Content-Type");
  167. res.end("{}")
  168. }
  169. })
  170. var availCache = {}
  171. cron.schedule('* */12 * * *', () => {
  172. availCache = {}
  173. })
  174. app_serve.get('/:uuid', function (req, res, next) {
  175. let uuid = req.params.uuid;
  176. function Provider(err, rows) {
  177. try {
  178. res.contentType("audio/mp3");
  179. res.header("Access-Control-Allow-Origin", "*");
  180. res.header("Access-Control-Allow-Headers", "Content-Type");
  181. res.header("Access-Control-Allow-Origin", "*");
  182. res.header('Content-Disposition', `attachment; filename="${encodeURI(rows[0].song_name)}"`);
  183. /** @type {ArrayBuffer}*/
  184. availCache[uuid] = rows[0].databinary
  185. res.sendSeekable(availCache[uuid])
  186. } catch (e) {
  187. console.log(e)
  188. console.log("Triggered err");
  189. }
  190. }
  191. if (availCache[uuid] !== undefined) {
  192. db.execute(`SELECT song_name
  193. FROM instrunet_entry
  194. WHERE uuid = '${uuid}'`, (err, rows) => {
  195. res.contentType("audio/mp3");
  196. res.header("Access-Control-Allow-Origin", "*");
  197. res.header("Access-Control-Allow-Headers", "Content-Type");
  198. res.header("Access-Control-Allow-Origin", "*");
  199. res.header('Content-Disposition', `attachment; filename="${encodeURI(rows[0].song_name)}"`);
  200. res.sendSeekable(availCache[uuid])
  201. })
  202. } else {
  203. db.execute(`SELECT song_name, databinary
  204. FROM instrunet_entry
  205. WHERE uuid = '${uuid}'`, Provider)
  206. db.unprepare()
  207. }
  208. })
  209. // TODO Always use HTTPS before publishing.
  210. https.createServer({
  211. key: fs.readFileSync('andyxie.cn.key'), cert: fs.readFileSync('andyxie.cn.pem')
  212. }, app).listen(8080)
  213. https.createServer({
  214. key: fs.readFileSync('andyxie.cn.key'), cert: fs.readFileSync('andyxie.cn.pem')
  215. }, app_serve).listen(8079)
  216. // app.listen(8080)
  217. // app_serve.listen(8079)