diff --git a/module/audio_upload.js b/module/audio_upload.js
deleted file mode 100644
index 6abc359..0000000
--- a/module/audio_upload.js
+++ /dev/null
@@ -1,151 +0,0 @@
-const { default: axios } = require('axios')
-var xml2js = require('xml2js')
-var parser = new xml2js.Parser(/* options */)
-module.exports = async (query, request) => {
- let ext = 'mp3'
- if (query.songFile.name.indexOf('flac') > -1) {
- ext = 'flac'
- }
- const filename = query.songFile.name
- .replace('.' + ext, '')
- .replace(/\s/g, '')
- .replace(/\./g, '_')
- // query.cookie.os = 'pc'
- // query.cookie.appver = '2.9.7'
- if (!query.songFile) {
- return Promise.reject({
- status: 500,
- body: {
- msg: '请上传音乐文件',
- code: 500,
- },
- })
- }
-
- const tokenRes = await request(
- 'POST',
- `https://music.163.com/weapi/nos/token/alloc`,
- {
- bucket: 'ymusic',
- ext: ext,
- filename: filename,
- local: false,
- nos_product: 0,
- type: 'other',
- },
- { crypto: 'weapi', cookie: query.cookie, proxy: query.proxy },
- )
-
- const objectKey = tokenRes.body.result.objectKey.replace('/', '%2F')
- const docId = tokenRes.body.result.docId
- const res = await axios({
- method: 'post',
- url: `https://ymusic.nos-hz.163yun.com/${objectKey}?uploads`,
- headers: {
- 'x-nos-token': tokenRes.body.result.token,
- // 'Content-Type': 'audio/mpeg',
- 'X-Nos-Meta-Content-Type': 'audio/mpeg',
- },
- data: null,
- })
- // return xml
- const res2 = await parser.parseStringPromise(res.data)
-
- const res3 = await axios({
- method: 'put',
- url: `https://ymusic.nos-hz.163yun.com/${objectKey}?partNumber=1&uploadId=${res2.InitiateMultipartUploadResult.UploadId[0]}`,
- headers: {
- 'x-nos-token': tokenRes.body.result.token,
- },
- data: query.songFile.data,
- })
-
- try {
- // get etag
- const etag = res3.headers.etag
- console.log(etag, 'etag')
- const res4 = await axios({
- method: 'post',
- url: `https://ymusic.nos-hz.163yun.com/${objectKey}?uploadId=${res2.InitiateMultipartUploadResult.UploadId[0]}`,
- headers: {
- 'Content-Type': 'text/plain;charset=UTF-8',
- 'X-Nos-Meta-Content-Type': 'audio/mpeg',
- 'x-nos-token': tokenRes.body.result.token,
- },
- data: `
- 1${etag}
- `,
- })
- console.log(res4, 'res4')
- const res5 = await parser.parseStringPromise(res4.data)
- console.log(res5, 'res5')
- const rr = await axios({
- method: 'post',
- url: `https://interface.music.163.com/weapi/voice/workbench/voice/batch/upload/preCheck`,
- headers: {
- 'x-nos-token': tokenRes.body.result.token,
- 'Content-Type': 'application/x-www-form-urlencoded',
- },
- data: {
- // dupkey: '0f50d114-199a-4b3e-8013-e980c78cfb8b',
- voiceData: JSON.stringify([
- {
- name: filename,
- autoPublish: true,
- autoPublishText: '',
- description: 'test',
- // 换成自己的
- voiceListId: 986001671,
- coverImgId: '109951168487511100',
- dfsId: docId,
- categoryId: 2001,
- secondCategoryId: 6171,
- composedSongs: [],
- privacy: true,
- publishTime: 0,
- orderNo: 1,
- },
- ]),
- },
- })
- console.log(rr, 'rr')
- const rr2 = await axios({
- method: 'post',
- url: `https://interface.music.163.com/weapi/voice/workbench/voice/batch/upload/v2`,
- headers: {
- 'x-nos-token': tokenRes.body.result.token,
- 'Content-Type': 'application/x-www-form-urlencoded',
- },
- data: {
- // dupkey: '0f50d114-199a-4b3e-8013-e980c78cfb8b',
- voiceData: JSON.stringify([
- {
- name: filename,
- autoPublish: true,
- autoPublishText: '',
- description: 'test',
- // 换成自己的
- voiceListId: 986001671,
- coverImgId: '109951168487511100',
- dfsId: docId,
- categoryId: 2001,
- secondCategoryId: 6171,
- composedSongs: [],
- privacy: true,
- publishTime: 0,
- orderNo: 1,
- },
- ]),
- },
- })
- console.log(rr2, 'rr2')
- } catch (error) {
- console.log(error)
- }
- return {
- status: 200,
- body: {
- code: 200,
- },
- }
-}
diff --git a/module/voice_upload.js b/module/voice_upload.js
new file mode 100644
index 0000000..116f23d
--- /dev/null
+++ b/module/voice_upload.js
@@ -0,0 +1,170 @@
+const { default: axios } = require('axios')
+var xml2js = require('xml2js')
+
+var parser = new xml2js.Parser(/* options */)
+function createDupkey() {
+ // 格式:3b443c7c-a87f-468d-ba38-46d407aaf23a
+ var s = []
+ var hexDigits = '0123456789abcdef'
+ for (var i = 0; i < 36; i++) {
+ s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
+ }
+ s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
+ s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
+ s[8] = s[13] = s[18] = s[23] = '-'
+ return s.join('')
+}
+module.exports = async (query, request) => {
+ let ext = 'mp3'
+ if (query.songFile.name.indexOf('flac') > -1) {
+ ext = 'flac'
+ }
+
+ const filename =
+ query.filename ||
+ query.songFile.name
+ .replace('.' + ext, '')
+ .replace(/\s/g, '')
+ .replace(/\./g, '_')
+ // query.cookie.os = 'pc'
+ // query.cookie.appver = '2.9.7'
+ if (!query.songFile) {
+ return Promise.reject({
+ status: 500,
+ body: {
+ msg: '请上传音频文件',
+ code: 500,
+ },
+ })
+ }
+
+ const tokenRes = await request(
+ 'POST',
+ `https://music.163.com/weapi/nos/token/alloc`,
+ {
+ bucket: 'ymusic',
+ ext: ext,
+ filename: filename,
+ local: false,
+ nos_product: 0,
+ type: 'other',
+ },
+ { crypto: 'weapi', cookie: query.cookie, proxy: query.proxy },
+ )
+
+ const objectKey = tokenRes.body.result.objectKey.replace('/', '%2F')
+ const docId = tokenRes.body.result.docId
+ const res = await axios({
+ method: 'post',
+ url: `https://ymusic.nos-hz.163yun.com/${objectKey}?uploads`,
+ headers: {
+ 'x-nos-token': tokenRes.body.result.token,
+ 'X-Nos-Meta-Content-Type': 'audio/mpeg',
+ },
+ data: null,
+ })
+ // return xml
+ const res2 = await parser.parseStringPromise(res.data)
+
+ const res3 = await axios({
+ method: 'put',
+ url: `https://ymusic.nos-hz.163yun.com/${objectKey}?partNumber=1&uploadId=${res2.InitiateMultipartUploadResult.UploadId[0]}`,
+ headers: {
+ 'x-nos-token': tokenRes.body.result.token,
+ 'Content-Type': 'audio/mpeg',
+ },
+ data: query.songFile.data,
+ })
+
+ // get etag
+ const etag = res3.headers.etag
+
+ // 文件处理
+ await axios({
+ method: 'post',
+ url: `https://ymusic.nos-hz.163yun.com/${objectKey}?uploadId=${res2.InitiateMultipartUploadResult.UploadId[0]}`,
+ headers: {
+ 'Content-Type': 'text/plain;charset=UTF-8',
+ 'X-Nos-Meta-Content-Type': 'audio/mpeg',
+ 'x-nos-token': tokenRes.body.result.token,
+ },
+ data: `
+ 1${etag}
+ `,
+ })
+
+ // preCheck
+ await request(
+ 'post',
+ `https://interface.music.163.com/weapi/voice/workbench/voice/batch/upload/preCheck`,
+ {
+ dupkey: createDupkey(),
+ voiceData: JSON.stringify([
+ {
+ name: filename,
+ autoPublish: true,
+ autoPublishText: '',
+ description: query.description,
+ // 换成自己的
+ voiceListId: query.voiceListId,
+ coverImgId: query.coverImgId,
+ dfsId: docId,
+ categoryId: query.categoryId,
+ secondCategoryId: query.secondCategoryId,
+ composedSongs: [],
+ privacy: true,
+ publishTime: 0,
+ orderNo: 1,
+ },
+ ]),
+ },
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ headers: {
+ 'x-nos-token': tokenRes.body.result.token,
+ },
+ },
+ )
+ const result = await request(
+ 'post',
+ `https://interface.music.163.com/weapi/voice/workbench/voice/batch/upload/v2`,
+ {
+ dupkey: createDupkey(),
+ voiceData: JSON.stringify([
+ {
+ name: filename,
+ autoPublish: true,
+ autoPublishText: '',
+ description: query.description,
+ // 换成自己的
+ voiceListId: query.voiceListId || 994681645,
+ coverImgId: query.coverImgId,
+ dfsId: docId,
+ categoryId: query.categoryId,
+ secondCategoryId: query.secondCategoryId || 466050,
+ composedSongs: [],
+ privacy: true,
+ publishTime: 0,
+ orderNo: 1,
+ },
+ ]),
+ },
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ headers: {
+ 'x-nos-token': tokenRes.body.result.token,
+ },
+ },
+ )
+ return {
+ status: 200,
+ body: {
+ code: 200,
+ data: result.body.data,
+ },
+ }
+}
diff --git a/module/voicelist_search.js b/module/voicelist_search.js
new file mode 100644
index 0000000..46fb708
--- /dev/null
+++ b/module/voicelist_search.js
@@ -0,0 +1,18 @@
+module.exports = (query, request) => {
+ const data = {
+ fee: '-1',
+ limit: '200',
+ podcastName: '',
+ }
+ return request(
+ 'POST',
+ `https://interface.music.163.com/weapi/voice/workbench/voicelist/search`,
+ data,
+ {
+ crypto: 'weapi',
+ cookie: query.cookie,
+ proxy: query.proxy,
+ realIP: query.realIP,
+ },
+ )
+}