yemot-new-api
Version:
```bash npm i yemot-new-api ``` מבוסס המודול ש- musicode1 בנה. כאן אני משפר הכל # exemple ```js const yemot_api = require("./");
114 lines (90 loc) • 3.76 kB
JavaScript
function ini_from_obj(obj) {
let arr = [];
for (const i of Object.entries(obj)) {
arr.push(i.join("="));
}
return arr.join("\n");
}
const ffmpeg = require('fluent-ffmpeg');
const convertToMp3 = (inputFile, outputFile) => {
return new Promise((resolve, reject) => {
ffmpeg(inputFile)
.output(outputFile)
.on('end', () => resolve(outputFile))
.on('error', (error) => reject(error))
.run();
});
};
const fs = require('fs/promises');
const chunkSize = 20000000;
const baseUrl = 'https://www.call2all.co.il';
async function* getChunks(filePath, chunkSize) {
const file = await fs.open(filePath, 'r');
const buffer = Buffer.alloc(chunkSize);
try {
while (true) {
const result = await file.read(buffer, 0, chunkSize);
if (result.bytesRead === chunkSize)
yield result.buffer;
else {
yield result.buffer.slice(0, result.bytesRead);
break;
}
}
} finally {
await file.close();
}
}
function createFormData(bytes,tokenYemot,remotePath,autoNumbering, contentName, partialData = null) {
const data = {
token: tokenYemot,
path: remotePath,
convertAudio: 1,
autoNumbering
};
if (partialData) {
data.uploader = 'yemot-admin';
data.qquuid = partialData.uuid;
data.qqfilename = contentName;
data.qqtotalfilesize = partialData.fileSize;
data.qqtotalparts = partialData.partCount;
//in final post request we don't need to send the file
if (partialData.part < partialData.partCount) {
data.qqpartbyteoffset = chunkSize * partialData.part;
data.qqpartindex = partialData.part;
data.qqchunksize = bytes.length;
}
}
const formData = new FormData();
for (const [key, value] of Object.entries(data))
formData.append(key, value);
if(bytes)
formData.append( partialData ? 'qqfile' : 'file', new Blob([bytes]), {filename: contentName, contentType: 'application/octet-stream'});
return formData;
}
async function uploadFile(tokenYemot,filePath,remotePath,autoNumbering) {
const fileSize = (await fs.stat(filePath)).size;
const callApi = (url, payload) => fetch(url, {method: 'POST', body: payload});
const chunks = getChunks(filePath, chunkSize);
const contentName = filePath.split('/').pop();
if (fileSize <= chunkSize) {
const formData = createFormData((await chunks.next()).value,tokenYemot,remotePath,autoNumbering, contentName);
await chunks.return();
return await callApi(baseUrl + '/ym/api/UploadFile', formData).then(x => x.json());
} else {
const uuid = crypto.randomUUID();
const partCount = Math.ceil(fileSize / chunkSize);
let part = 0;
for await (const chunk of chunks) {
const formData = createFormData(chunk,tokenYemot,remotePath,autoNumbering, contentName, {uuid, fileSize, partCount, part: part++});
const status = await callApi(baseUrl + '/ym/api/UploadFile', formData).then(x => x.json());
if (!status.success) {
console.log(status);
throw new Error(status.message);
}
}
return await callApi(baseUrl + '/ym/api/UploadFile?done', createFormData(null,tokenYemot,remotePath,autoNumbering, contentName,
{uuid, fileSize, partCount, part})).then(x => x.text());
}
}
module.exports = { ini_from_obj ,uploadFile, convertToMp3};