main.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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. let albumCover = null;
  42. try {
  43. fetch(req.body.file).then(res => {
  44. res.arrayBuffer().then(r => fs.writeFileSync("./" + uuid, Buffer.from(r)));
  45. })
  46. fetch(req.body.albumCover).then(res=>{
  47. res.arrayBuffer().then(r=>{
  48. albumCover = r
  49. })
  50. })
  51. res.end("api_success");
  52. } catch (err) {
  53. res.status(500).send("Server Error");
  54. return
  55. }
  56. const callback = function (d) {
  57. console.log(d.toString());
  58. }
  59. const errcb = function (d) {
  60. console.log(d.toString());
  61. }
  62. let kind_of = [];
  63. switch (req.body.kind) {
  64. case 0:
  65. 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`
  66. kind_of[1] = `./output/${uuid}_(Instrumental)_UVR-MDX-NET-Inst_HQ_5.mp3`
  67. kind_of[2] = `${uuid}_(Instrumental)_UVR-MDX-NET-Inst_HQ_5.mp3`
  68. kind_of[3] = `./output/${uuid}_(Vocals)_UVR-MDX-NET-Inst_HQ_5.mp3`
  69. break;
  70. case 1:
  71. 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`
  72. kind_of[1] = `./output/${uuid}_(Instrumental)_UVR_MDXNET_KARA.mp3`
  73. kind_of[2] = `${uuid}_(Instrumental)_UVR_MDXNET_KARA.mp3`
  74. kind_of[3] = `./output/${uuid}_(Vocals)_UVR_MDXNET_KARA.mp3`
  75. break;
  76. case 3:
  77. 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`
  78. kind_of[1] = `./output/${uuid}_(Bass)_kuielab_a_bass.mp3`
  79. kind_of[2] = `${uuid}_(Bass)_kuielab_a_bass.mp3`
  80. kind_of[3] = `./output/${uuid}_(No Bass)_kuielab_a_bass.mp3`
  81. break;
  82. case 4:
  83. 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`
  84. kind_of[1] = `./output/${uuid}_(Drums)_kuielab_a_drums.mp3`
  85. kind_of[2] = `${uuid}_(Drums)_kuielab_a_drums.mp3`
  86. kind_of[3] = `./output/${uuid}_(No Drums)_kuielab_a_drums.mp3`
  87. break;
  88. }
  89. nrc.run([kind_of[0]], {
  90. onData: callback, onError: errcb
  91. }).then(() => {
  92. db.execute(("INSERT INTO instrunet_entry (uuid, song_name, album_name, link_to, databinary, artist,kind, albumcover) VALUES (?,?,?,?,?,?,?,?)"), [uuid, req.body.name, req.body.albumName, req.body.link, fs.readFileSync(kind_of[1]), req.body.artist, req.body.kind, albumCover])
  93. db.unprepare(() => {
  94. })
  95. fs.rm(kind_of[1], (err) => {
  96. if (err) {
  97. console.log(err);
  98. }
  99. })
  100. fs.rm(kind_of[3], (err) => {
  101. if (err) {
  102. console.log(err);
  103. }
  104. })
  105. fs.rm(uuid, (err) => {
  106. if (err) {
  107. console.log(err);
  108. }
  109. })
  110. if (req.body.email !== undefined) {
  111. console.log(req.body.email)
  112. transporter.sendMail({
  113. from: '"xiey0" <xiey0@qq.com>',
  114. to: req.body.email,
  115. subject: "你的音频已处理完成。",
  116. text: "你的音频已处理完成。",
  117. html: fs.readFileSync("./Template.html", "utf8").toString()
  118. }).then((result) => {
  119. console.log("Message sent: %s", result.messageId)
  120. })
  121. }
  122. })
  123. // res.header("Access-Control-Allow-Origin", "*");
  124. // console.log(fs.readFileSync("main.js"))
  125. // console.log(req.body.albumCover);
  126. // res.end("")
  127. })
  128. app.options('/submit', function (req, res) {
  129. res.header("Access-Control-Allow-Origin", "*");
  130. res.header("Access-Control-Allow-Headers", "Content-Type");
  131. res.end()
  132. })
  133. app.post('/search_api', async function (req, res) {
  134. async function OnFetched(err, rows) {
  135. try {
  136. db.execute(`SELECT uuid, song_name, album_name, artist, kind
  137. FROM instrunet_entry
  138. WHERE song_name like '%${(req.body.searchStr)}%'
  139. or album_name like '%${(req.body.searchStr)}%'
  140. or artist like '%${(req.body.searchStr)}%'`, (err, result) => {
  141. res.header("Access-Control-Allow-Origin", "*");
  142. res.end(JSON.stringify(result) === JSON.stringify(rows) ? JSON.stringify(rows) : JSON.stringify(rows.concat(result)));
  143. })
  144. } catch (e) {
  145. console.log(e)
  146. }
  147. }
  148. db.execute(`SELECT uuid, song_name, album_name, artist, kind
  149. FROM instrunet_entry
  150. WHERE song_name like '%${await converter.convertPromise(req.body.searchStr)}%'
  151. or album_name like '%${await converter.convertPromise(req.body.searchStr)}%'
  152. or artist like '%${await converter.convertPromise(req.body.searchStr)}%'`, OnFetched)
  153. db.unprepare()
  154. })
  155. app.options('/search_api', function (req, res) {
  156. res.header("Access-Control-Allow-Origin", "*");
  157. res.header("Access-Control-Allow-Headers", "Content-Type");
  158. res.end()
  159. })
  160. app.get("/getSingle", function (req, res) {
  161. if (req.query.id) {
  162. db.execute(`SELECT song_name, album_name, artist, kind, albumcover
  163. FROM instrunet_entry
  164. WHERE uuid = "${req.query.id}"`, function (err, rows) {
  165. if (err) {
  166. console.log(err);
  167. }
  168. res.contentType("application/json");
  169. res.header("Access-Control-Allow-Origin", "*");
  170. res.header("Access-Control-Allow-Headers", "Content-Type");
  171. res.end(JSON.stringify(rows[0]));
  172. })
  173. } else {
  174. res.contentType("application/json");
  175. res.header("Access-Control-Allow-Origin", "*");
  176. res.header("Access-Control-Allow-Headers", "Content-Type");
  177. res.end("{}")
  178. }
  179. })
  180. var availCache = {}
  181. cron.schedule('* */12 * * *', () => {
  182. availCache = {}
  183. })
  184. app_serve.get('/:uuid', function (req, res, next) {
  185. let uuid = req.params.uuid;
  186. function Provider(err, rows) {
  187. try {
  188. res.contentType("audio/mp3");
  189. res.header("Access-Control-Allow-Origin", "*");
  190. res.header("Access-Control-Allow-Headers", "Content-Type");
  191. res.header("Access-Control-Allow-Origin", "*");
  192. res.header('Content-Disposition', `attachment; filename="${encodeURI(rows[0].song_name)}"`);
  193. /** @type {ArrayBuffer}*/
  194. availCache[uuid] = rows[0].databinary
  195. res.sendSeekable(availCache[uuid])
  196. } catch (e) {
  197. console.log(e)
  198. console.log("Triggered err");
  199. }
  200. }
  201. if (availCache[uuid] !== undefined) {
  202. db.execute(`SELECT song_name
  203. FROM instrunet_entry
  204. WHERE uuid = '${uuid}'`, (err, rows) => {
  205. res.contentType("audio/mp3");
  206. res.header("Access-Control-Allow-Origin", "*");
  207. res.header("Access-Control-Allow-Headers", "Content-Type");
  208. res.header("Access-Control-Allow-Origin", "*");
  209. res.header('Content-Disposition', `attachment; filename="${encodeURI(rows[0].song_name)}"`);
  210. res.sendSeekable(availCache[uuid])
  211. })
  212. } else {
  213. db.execute(`SELECT song_name, databinary
  214. FROM instrunet_entry
  215. WHERE uuid = '${uuid}'`, Provider)
  216. db.unprepare()
  217. }
  218. })
  219. // TODO Always use HTTPS before publishing.
  220. // https.createServer({
  221. // key: fs.readFileSync('andyxie.cn.key'), cert: fs.readFileSync('andyxie.cn.pem')
  222. // }, app).listen(8080)
  223. //
  224. //
  225. //
  226. // https.createServer({
  227. // key: fs.readFileSync('andyxie.cn.key'), cert: fs.readFileSync('andyxie.cn.pem')
  228. //
  229. // }, app_serve).listen(8079)
  230. app.listen(8080)
  231. app_serve.listen(8079)