320 lines
12 KiB
JavaScript
320 lines
12 KiB
JavaScript
const fs = require('fs');
|
|
const { Readable } = require('stream');
|
|
const B2 = require('backblaze-b2')
|
|
module.exports = function(s,config,lang){
|
|
//Backblaze B2
|
|
var beforeAccountSaveForBackblazeB2 = function(d){
|
|
//d = save event
|
|
d.formDetails.b2_use_global=d.d.b2_use_global
|
|
d.formDetails.use_bb_b2=d.d.use_bb_b2
|
|
}
|
|
var cloudDiskUseStartupForBackblazeB2 = function(group,userDetails){
|
|
group.cloudDiskUse['b2'].name = 'Backblaze B2'
|
|
group.cloudDiskUse['b2'].sizeLimitCheck = (userDetails.use_bb_b2_size_limit === '1')
|
|
if(!userDetails.bb_b2_size_limit || userDetails.bb_b2_size_limit === ''){
|
|
group.cloudDiskUse['b2'].sizeLimit = 10000
|
|
}else{
|
|
group.cloudDiskUse['b2'].sizeLimit = parseFloat(userDetails.bb_b2_size_limit)
|
|
}
|
|
}
|
|
var loadBackblazeB2ForUser = function(e){
|
|
var userDetails = JSON.parse(e.details);
|
|
try{
|
|
if(userDetails.b2_use_global === '1' && config.cloudUploaders && config.cloudUploaders.BackblazeB2){
|
|
// {
|
|
// bb_b2_accountId: "",
|
|
// bb_b2_applicationKey: "",
|
|
// bb_b2_bucket: "",
|
|
// bb_b2_dir: "",
|
|
// }
|
|
userDetails = Object.assign(userDetails,config.cloudUploaders.BackblazeB2)
|
|
}
|
|
if(!s.group[e.ke].bb_b2 &&
|
|
userDetails.bb_b2_accountId &&
|
|
userDetails.bb_b2_accountId !=='' &&
|
|
userDetails.bb_b2_applicationKey &&
|
|
userDetails.bb_b2_applicationKey !=='' &&
|
|
userDetails.bb_b2_bucket &&
|
|
userDetails.bb_b2_bucket !== '' &&
|
|
userDetails.bb_b2_save === '1'
|
|
){
|
|
if(!userDetails.bb_b2_dir || userDetails.bb_b2_dir === '/'){
|
|
userDetails.bb_b2_dir = ''
|
|
}
|
|
if(userDetails.bb_b2_dir !== ''){
|
|
userDetails.bb_b2_dir = s.checkCorrectPathEnding(userDetails.bb_b2_dir)
|
|
}
|
|
var backblazeErr = function(err){
|
|
// console.log(err)
|
|
s.userLog({mid:'$USER',ke:e.ke},{type:lang['Backblaze Error'],msg:err.stack || err.data || err})
|
|
}
|
|
async function createB2Connection(){
|
|
const b2 = new B2({
|
|
accountId: userDetails.bb_b2_accountId,
|
|
applicationKey: userDetails.bb_b2_applicationKey
|
|
});
|
|
const bucketName = userDetails.bb_b2_bucket
|
|
try{
|
|
const authResponse = await b2.authorize();
|
|
const getBucketResponse = await b2.getBucket({bucketName: bucketName})
|
|
const bucketId = getBucketResponse.data.buckets[0].bucketId
|
|
s.group[e.ke].bb_b2_bucketId = bucketId
|
|
}catch(err){
|
|
console.error('b2.authorize',err)
|
|
backblazeErr(err)
|
|
}
|
|
s.group[e.ke].bb_b2 = b2
|
|
}
|
|
createB2Connection()
|
|
s.group[e.ke].bb_b2_refreshTimer = setInterval(createB2Connection,1000 * 60 * 60)
|
|
}
|
|
}catch(err){
|
|
s.debugLog(err)
|
|
}
|
|
}
|
|
var unloadBackblazeB2ForUser = function(user){
|
|
s.group[user.ke].bb_b2 = null
|
|
clearInterval(s.group[user.ke].bb_b2_refreshTimer)
|
|
}
|
|
var deleteVideoFromBackblazeB2 = function(e,video,callback){
|
|
// e = user
|
|
try{
|
|
var videoDetails = JSON.parse(video.details)
|
|
}catch(err){
|
|
var videoDetails = video.details
|
|
}
|
|
if(video.type !== 'b2'){
|
|
callback()
|
|
return
|
|
}
|
|
s.group[e.ke].bb_b2.deleteFileVersion({
|
|
fileId: videoDetails.fileId,
|
|
fileName: videoDetails.fileName
|
|
}).then(function(resp){
|
|
// console.log('deleteFileVersion',resp)
|
|
callback()
|
|
}).catch(function(err){
|
|
console.log('deleteFileVersion',err)
|
|
callback()
|
|
})
|
|
}
|
|
var uploadVideoToBackblazeB2 = function(e,k){
|
|
//e = video object
|
|
//k = temporary values
|
|
if(!k)k={};
|
|
//cloud saver - Backblaze B2
|
|
const theGroup = s.group[e.ke]
|
|
if(theGroup.bb_b2 && theGroup.init.use_bb_b2 !== '0' && theGroup.init.bb_b2_save === '1'){
|
|
function backblazeErr(err){
|
|
s.userLog({mid:'$USER',ke:e.ke},{type:lang['Backblaze Error'],msg:err})
|
|
s.debugLog(err)
|
|
}
|
|
fs.readFile(k.dir+k.filename,function(err,data){
|
|
var backblazeSavePath = theGroup.init.bb_b2_dir+e.ke+'/'+e.mid+'/'+k.filename
|
|
var getUploadUrl = function(bucketId,callback){
|
|
theGroup.bb_b2.getUploadUrl(bucketId).then(function(resp){
|
|
callback(resp)
|
|
}).catch(backblazeErr)
|
|
}
|
|
getUploadUrl(theGroup.bb_b2_bucketId,function(req){
|
|
const uploadUrl = req.data.uploadUrl
|
|
const authorizationToken = req.data.authorizationToken
|
|
theGroup.bb_b2.uploadFile({
|
|
uploadUrl: uploadUrl,
|
|
uploadAuthToken: authorizationToken,
|
|
filename: backblazeSavePath,
|
|
data: data,
|
|
onUploadProgress: null
|
|
}).then(function(resp){
|
|
const uploadResponse = resp.data
|
|
if(theGroup.init.bb_b2_log === '1' && uploadResponse.fileId){
|
|
s.knexQuery({
|
|
action: "insert",
|
|
table: "Cloud Videos",
|
|
insert: {
|
|
mid: e.mid,
|
|
ke: e.ke,
|
|
time: k.startTime,
|
|
status: 1,
|
|
type : 'b2',
|
|
details: s.s({
|
|
bucketId : uploadResponse.bucketId,
|
|
fileId : uploadResponse.fileId,
|
|
fileName : uploadResponse.fileName
|
|
}),
|
|
size: k.filesize,
|
|
end: k.endTime,
|
|
href: ''
|
|
}
|
|
})
|
|
s.setCloudDiskUsedForGroup(e.ke,{
|
|
amount : k.filesizeMB,
|
|
storageType : 'b2'
|
|
})
|
|
s.purgeCloudDiskForGroup(e,'b2')
|
|
}
|
|
}).catch(backblazeErr)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
function onGetVideoData(video){
|
|
const videoDetails = s.parseJSON(video.details)
|
|
const fileName = videoDetails.fileName
|
|
const groupKey = video.ke
|
|
const b2 = s.group[video.ke].bb_b2
|
|
const bucketName = s.group[groupKey].init.bb_b2_bucket
|
|
return new Promise((resolve, reject) => {
|
|
b2.downloadFileByName({
|
|
bucketName,
|
|
fileName,
|
|
responseType: 'stream',
|
|
onDownloadProgress: (event) => {
|
|
s.debugLog(event)
|
|
},
|
|
}).then((response) => {
|
|
const fileStream = Readable.from(response.data);
|
|
resolve(fileStream)
|
|
}).catch((err) => {
|
|
s.debugLog(err)
|
|
reject(err)
|
|
});
|
|
})
|
|
}
|
|
//backblaze b2
|
|
s.addCloudUploader({
|
|
name: 'b2',
|
|
loadGroupAppExtender: loadBackblazeB2ForUser,
|
|
unloadGroupAppExtender: unloadBackblazeB2ForUser,
|
|
insertCompletedVideoExtender: uploadVideoToBackblazeB2,
|
|
deleteVideoFromCloudExtensions: deleteVideoFromBackblazeB2,
|
|
cloudDiskUseStartupExtensions: cloudDiskUseStartupForBackblazeB2,
|
|
beforeAccountSave: beforeAccountSaveForBackblazeB2,
|
|
onAccountSave: cloudDiskUseStartupForBackblazeB2,
|
|
onGetVideoData,
|
|
})
|
|
return {
|
|
"evaluation": "details.use_bb_b2 !== '0'",
|
|
"name": lang["Backblaze B2"],
|
|
"color": "forestgreen",
|
|
"info": [
|
|
{
|
|
"name": "detail=bb_b2_save",
|
|
"selector":"autosave_bb_b2",
|
|
"field": lang.Autosave,
|
|
"description": "",
|
|
"default": lang.No,
|
|
"example": "",
|
|
"fieldType": "select",
|
|
"possible": [
|
|
{
|
|
"name": lang.No,
|
|
"value": "0"
|
|
},
|
|
{
|
|
"name": lang.Yes,
|
|
"value": "1"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"hidden": true,
|
|
"field": lang['Bucket ID'],
|
|
"name": "detail=bb_b2_bucket",
|
|
"placeholder": "Example : slippery-seal",
|
|
"form-group-class": "autosave_bb_b2_input autosave_bb_b2_1",
|
|
"description": "",
|
|
"default": "",
|
|
"example": "",
|
|
"possible": ""
|
|
},
|
|
{
|
|
"hidden": true,
|
|
"field": lang.keyId,
|
|
"name": "detail=bb_b2_accountId",
|
|
"form-group-class": "autosave_bb_b2_input autosave_bb_b2_1",
|
|
"description": "",
|
|
"default": "",
|
|
"example": "",
|
|
"possible": ""
|
|
},
|
|
{
|
|
"hidden": true,
|
|
"name": "detail=bb_b2_applicationKey",
|
|
"fieldType":"password",
|
|
"placeholder": "XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXXXX",
|
|
"field": lang.applicationKey,
|
|
"form-group-class":"autosave_bb_b2_input autosave_bb_b2_1",
|
|
"description": "",
|
|
"default": "",
|
|
"example": "",
|
|
"possible": ""
|
|
},
|
|
{
|
|
"hidden": true,
|
|
"name": "detail=bb_b2_log",
|
|
"field": lang['Save Links to Database'],
|
|
"fieldType": "select",
|
|
"selector": "h_b2sld",
|
|
"form-group-class":"autosave_bb_b2_input autosave_bb_b2_1",
|
|
"description": "",
|
|
"default": "",
|
|
"example": "",
|
|
"possible": [
|
|
{
|
|
"name": lang.No,
|
|
"value": "0"
|
|
},
|
|
{
|
|
"name": lang.Yes,
|
|
"value": "1"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"hidden": true,
|
|
"name": "detail=use_bb_b2_size_limit",
|
|
"field": lang['Use Max Storage Amount'],
|
|
"fieldType": "select",
|
|
"selector": "h_b2zl",
|
|
"form-group-class":"autosave_bb_b2_input autosave_bb_b2_1",
|
|
"form-group-class-pre-layer":"h_b2sld_input h_b2sld_1",
|
|
"description": "",
|
|
"default": "",
|
|
"example": "",
|
|
"possible": [
|
|
{
|
|
"name": lang.No,
|
|
"value": "0"
|
|
},
|
|
{
|
|
"name": lang.Yes,
|
|
"value": "1"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"hidden": true,
|
|
"name": "detail=bb_b2_size_limit",
|
|
"field": lang['Max Storage Amount'],
|
|
"form-group-class":"autosave_bb_b2_input autosave_bb_b2_1",
|
|
"form-group-class-pre-layer":"h_b2sld_input h_b2sld_1",
|
|
"description": "",
|
|
"default": "10000",
|
|
"example": "",
|
|
"possible": ""
|
|
},
|
|
{
|
|
"hidden": true,
|
|
"name": "detail=bb_b2_dir",
|
|
"field": lang['Save Directory'],
|
|
"form-group-class":"autosave_bb_b2_input autosave_bb_b2_1",
|
|
"description": "",
|
|
"default": "/",
|
|
"example": "",
|
|
"possible": ""
|
|
},
|
|
]
|
|
}
|
|
}
|