main.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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. app.use(bodyParser.json({"limit": "200mb"}));
  22. app.use(express.json());
  23. app_serve.use(bodyParser.json({"limit": "200mb"}));
  24. app_serve.use(express.json());
  25. app_serve.use(SendSeekable)
  26. const transporter = nodemailer.createTransport({
  27. host: 'smtp.qq.com', port: 465, secure: true, auth: {
  28. user: '3095864740@qq.com', pass: 'caemyuagapsadfff',
  29. }
  30. })
  31. app.post('/submit', function (req, res) {
  32. let uuid = crypto.randomUUID()
  33. db.connect(function (err) {
  34. if (err) {
  35. console.log(err)
  36. }
  37. })
  38. res.header("Access-Control-Allow-Origin", "*");
  39. try {
  40. fetch(req.body.file).then(res => {
  41. res.arrayBuffer().then(r => fs.writeFileSync("./" + uuid, Buffer.from(r)));
  42. })
  43. res.end("api_success");
  44. } catch (err) {
  45. res.status(500).send("Server Error");
  46. return
  47. }
  48. const callback = function (d) {
  49. console.log(d.toString());
  50. }
  51. const errcb = function (d) {
  52. console.log(d.toString());
  53. }
  54. let kind_of = [];
  55. switch (req.body.kind) {
  56. case 0:
  57. 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`
  58. kind_of[1] = `./output/${uuid}_(Instrumental)_UVR-MDX-NET-Inst_HQ_5.mp3`
  59. kind_of[2] = `${uuid}_(Instrumental)_UVR-MDX-NET-Inst_HQ_5.mp3`
  60. kind_of[3] = `./output/${uuid}_(Vocals)_UVR-MDX-NET-Inst_HQ_5.mp3`
  61. break;
  62. case 1:
  63. 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`
  64. kind_of[1] = `./output/${uuid}_(Instrumental)_UVR_MDXNET_KARA.mp3`
  65. kind_of[2] = `${uuid}_(Instrumental)_UVR_MDXNET_KARA.mp3`
  66. kind_of[3] = `./output/${uuid}_(Vocals)_UVR_MDXNET_KARA.mp3`
  67. break;
  68. case 3:
  69. 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`
  70. kind_of[1] = `./output/${uuid}_(Bass)_kuielab_a_bass.mp3`
  71. kind_of[2] = `${uuid}_(Bass)_kuielab_a_bass.mp3`
  72. kind_of[3] = `./output/${uuid}_(No Bass)_kuielab_a_bass.mp3`
  73. break;
  74. case 4:
  75. 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`
  76. kind_of[1] = `./output/${uuid}_(Drums)_kuielab_a_drums.mp3`
  77. kind_of[2] = `${uuid}_(Drums)_kuielab_a_drums.mp3`
  78. kind_of[3] = `./output/${uuid}_(No Drums)_kuielab_a_drums.mp3`
  79. break;
  80. }
  81. nrc.run([kind_of[0]], {
  82. onData: callback, onError: errcb
  83. }).then(() => {
  84. 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])
  85. db.unprepare(() => {
  86. })
  87. fs.rm(kind_of[1], (err) => {
  88. if (err) {
  89. console.log(err);
  90. }
  91. })
  92. fs.rm(kind_of[3], (err) => {
  93. if (err) {
  94. console.log(err);
  95. }
  96. })
  97. fs.rm(uuid, (err) => {
  98. if (err) {
  99. console.log(err);
  100. }
  101. })
  102. if (req.body.email !== undefined) {
  103. console.log(req.body.email)
  104. transporter.sendMail({
  105. from: '"xiey0" <xiey0@qq.com>',
  106. to: req.body.email,
  107. subject: "你的音频已处理完成。",
  108. text: "你的音频已处理完成。",
  109. html: "<h1>哈喽👋</h1><p>你在伴奏网网站上传的音频已经处理完毕,快来下载吧!<br/>下载链接:<br/><a href='https://andyxie.cn:8201/" + uuid + "'>这里</a><br/><br/>" + "与其他网站不一样,本邮件发送邮箱真的有个伞兵在后面!<br/>" + "请随意骚扰!</p>"
  110. }).then((result) => {
  111. console.log("Message sent: %s", result.messageId)
  112. })
  113. }
  114. })
  115. })
  116. app.options('/submit', function (req, res) {
  117. res.header("Access-Control-Allow-Origin", "*");
  118. res.header("Access-Control-Allow-Headers", "Content-Type");
  119. res.end()
  120. })
  121. app.post('/search_api', function (req, res) {
  122. function OnFetched(err, rows) {
  123. try {
  124. res.header("Access-Control-Allow-Origin", "*");
  125. res.end(JSON.stringify(rows));
  126. } catch (e) {
  127. }
  128. }
  129. db.execute(`SELECT uuid, song_name, album_name, artist, kind
  130. FROM instrunet_entry
  131. WHERE song_name like '%${req.body.searchStr}%'
  132. or album_name like '%${req.body.searchStr}%'
  133. or artist like '%${req.body.searchStr}%'`, OnFetched)
  134. db.unprepare()
  135. })
  136. app.options('/search_api', function (req, res) {
  137. res.header("Access-Control-Allow-Origin", "*");
  138. res.header("Access-Control-Allow-Headers", "Content-Type");
  139. res.end()
  140. })
  141. app.get("/getSingle", function (req, res) {
  142. if (req.query.id) {
  143. db.execute(`SELECT song_name, album_name, artist, kind
  144. FROM instrunet_entry
  145. WHERE uuid = "${req.query.id}"`, function (err, rows) {
  146. if (err) {
  147. console.log(err);
  148. }
  149. res.contentType("application/json");
  150. res.header("Access-Control-Allow-Origin", "*");
  151. res.header("Access-Control-Allow-Headers", "Content-Type");
  152. res.end(JSON.stringify(rows[0]));
  153. })
  154. } else {
  155. res.contentType("application/json");
  156. res.header("Access-Control-Allow-Origin", "*");
  157. res.header("Access-Control-Allow-Headers", "Content-Type");
  158. res.end("{}")
  159. }
  160. })
  161. var availCache = {}
  162. cron.schedule('* */12 * * *', ()=>{
  163. availCache = {}
  164. })
  165. app_serve.get('/:uuid', function (req, res, next) {
  166. let uuid = req.params.uuid;
  167. function Provider(err, rows) {
  168. try {
  169. res.contentType("audio/mp3");
  170. res.header("Access-Control-Allow-Origin", "*");
  171. res.header("Access-Control-Allow-Headers", "Content-Type");
  172. res.header("Access-Control-Allow-Origin", "*");
  173. res.header('Content-Disposition', `attachment; filename="${encodeURI(rows[0].song_name)}"`);
  174. /** @type {ArrayBuffer}*/
  175. availCache[uuid] = rows[0].databinary
  176. res.sendSeekable(availCache[uuid])
  177. } catch (e) {
  178. console.log(e)
  179. console.log("Triggered err");
  180. }
  181. }
  182. if (availCache[uuid] !== undefined) {
  183. db.execute(`SELECT song_name
  184. FROM instrunet_entry
  185. WHERE uuid = '${uuid}'`, (err, rows) => {
  186. res.contentType("audio/mp3");
  187. res.header("Access-Control-Allow-Origin", "*");
  188. res.header("Access-Control-Allow-Headers", "Content-Type");
  189. res.header("Access-Control-Allow-Origin", "*");
  190. res.header('Content-Disposition', `attachment; filename="${encodeURI(rows[0].song_name)}"`);
  191. res.sendSeekable(availCache[uuid])
  192. })
  193. }else{
  194. db.execute(`SELECT song_name, databinary
  195. FROM instrunet_entry
  196. WHERE uuid = '${uuid}'`, Provider)
  197. db.unprepare()
  198. }
  199. })
  200. // TODO Always use HTTPS before publishing.
  201. https.createServer({
  202. key: fs.readFileSync('andyxie.cn.key'), cert: fs.readFileSync('andyxie.cn.pem')
  203. }, app).listen(8080)
  204. https.createServer({
  205. key: fs.readFileSync('andyxie.cn.key'), cert: fs.readFileSync('andyxie.cn.pem')
  206. }, app_serve).listen(8079)
  207. // app.listen(8080)
  208. // app_serve.listen(8079)