Shinobi/libs/uploaders/backblazeB2.js

294 lines
12 KiB
JavaScript

var fs = require('fs');
module.exports = function(s,config,lang){
//Backblaze B2
var beforeAccountSaveForBackblazeB2 = function(d){
//d = save event
d.form.details.b2_use_global=d.d.b2_use_global
d.form.details.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 !== ''
){
var B2 = require('backblaze-b2')
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})
}
var createB2Connection = function(){
var b2 = new B2({
accountId: userDetails.bb_b2_accountId,
applicationKey: userDetails.bb_b2_applicationKey
})
b2.authorize().then(function(resp){
s.group[e.ke].bb_b2_downloadUrl = resp.data.downloadUrl
b2.listBuckets().then(function(resp){
var buckets = resp.data.buckets
var bucketN = -2
buckets.forEach(function(item,n){
if(item.bucketName === userDetails.bb_b2_bucket){
bucketN = n
}
})
if(bucketN > -1){
s.group[e.ke].bb_b2_bucketId = buckets[bucketN].bucketId
}else{
b2.createBucket(
userDetails.bb_b2_bucket,
'allPublic'
).then(function(resp){
s.group[e.ke].bb_b2_bucketId = resp.data.bucketId
}).catch(backblazeErr)
}
}).catch(backblazeErr)
}).catch(backblazeErr)
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
}
s.group[e.ke].bb_b2.deleteFileVersion({
fileId: videoDetails.fileId,
fileName: videoDetails.fileName
}).then(function(resp){
// console.log('deleteFileVersion',resp.data)
}).catch(function(err){
console.log('deleteFileVersion',err)
})
}
var uploadVideoToBackblazeB2 = function(e,k){
//e = video object
//k = temporary values
if(!k)k={};
//cloud saver - Backblaze B2
if(s.group[e.ke].bb_b2 && s.group[e.ke].init.use_bb_b2 !== '0' && s.group[e.ke].init.bb_b2_save === '1'){
var backblazeErr = function(err){
// console.log(err)
s.userLog({mid:'$USER',ke:e.ke},{type:lang['Backblaze Error'],msg:err.data})
}
fs.readFile(k.dir+k.filename,function(err,data){
var backblazeSavePath = s.group[e.ke].init.bb_b2_dir+e.ke+'/'+e.mid+'/'+k.filename
var getUploadUrl = function(bucketId,callback){
s.group[e.ke].bb_b2.getUploadUrl(bucketId).then(function(resp){
callback(resp.data)
}).catch(backblazeErr)
}
getUploadUrl(s.group[e.ke].bb_b2_bucketId,function(req){
s.group[e.ke].bb_b2.uploadFile({
uploadUrl: req.uploadUrl,
uploadAuthToken: req.authorizationToken,
filename: backblazeSavePath,
data: data,
onUploadProgress: null
}).then(function(resp){
if(s.group[e.ke].init.bb_b2_log === '1' && resp.data.fileId){
var backblazeDownloadUrl = s.group[e.ke].bb_b2_downloadUrl + '/file/' + s.group[e.ke].init.bb_b2_bucket + '/' + backblazeSavePath
var save = [
e.mid,
e.ke,
k.startTime,
1,
s.s({
type : 'b2',
bucketId : resp.data.bucketId,
fileId : resp.data.fileId,
fileName : resp.data.fileName
}),
k.filesize,
k.endTime,
backblazeDownloadUrl
]
s.sqlQuery('INSERT INTO `Cloud Videos` (mid,ke,time,status,details,size,end,href) VALUES (?,?,?,?,?,?,?,?)',save)
s.setCloudDiskUsedForGroup(e,{
amount : k.filesizeMB,
storageType : 'b2'
})
s.purgeCloudDiskForGroup(e,'b2')
}
}).catch(backblazeErr)
})
})
}
}
//backblaze b2
s.addCloudUploader({
name: 'b2',
loadGroupAppExtender: loadBackblazeB2ForUser,
unloadGroupAppExtender: unloadBackblazeB2ForUser,
insertCompletedVideoExtender: uploadVideoToBackblazeB2,
deleteVideoFromCloudExtensions: deleteVideoFromBackblazeB2,
cloudDiskUseStartupExtensions: cloudDiskUseStartupForBackblazeB2,
beforeAccountSave: beforeAccountSaveForBackblazeB2,
onAccountSave: cloudDiskUseStartupForBackblazeB2,
})
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,
"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": ""
},
]
}
}