mirror of
https://github.com/ragestudio/relic.git
synced 2025-06-09 10:34:18 +00:00
added google drive lib
This commit is contained in:
parent
96fbae8bc4
commit
979a4fa515
171
src/main/lib/google_drive/index.js
Normal file
171
src/main/lib/google_drive/index.js
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
import fs from "node:fs"
|
||||||
|
import path from "node:path"
|
||||||
|
import { ipcMain } from "electron"
|
||||||
|
import progressHandler from "progress-stream"
|
||||||
|
|
||||||
|
import { authenticate } from "@google-cloud/local-auth"
|
||||||
|
import { google } from "googleapis"
|
||||||
|
|
||||||
|
import { safeStorage } from "electron"
|
||||||
|
|
||||||
|
import sendToRender from "../../utils/sendToRender"
|
||||||
|
|
||||||
|
export default class GoogleDriveAPI {
|
||||||
|
static drive_app_cred_path = path.resolve(process.cwd(), "drive.secret.json")
|
||||||
|
|
||||||
|
static async createClientAuthFromCredentials(credentials) {
|
||||||
|
return await google.auth.fromJSON(credentials)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async getDriveInstance() {
|
||||||
|
const credentials = await GoogleDriveAPI.readCredentials()
|
||||||
|
|
||||||
|
if (!credentials) {
|
||||||
|
throw new Error("No credentials or auth found")
|
||||||
|
}
|
||||||
|
|
||||||
|
const client = await GoogleDriveAPI.createClientAuthFromCredentials(credentials)
|
||||||
|
|
||||||
|
return google.drive({
|
||||||
|
version: "v3",
|
||||||
|
auth: client,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static async readCredentials() {
|
||||||
|
const encryptedValue = global.SettingsStore.get("drive_auth")
|
||||||
|
const decryptedValue = safeStorage.decryptString(Buffer.from(encryptedValue, "latin1"))
|
||||||
|
|
||||||
|
if (!decryptedValue) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.parse(decryptedValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async saveCredentials(credentials) {
|
||||||
|
const app_credentials = JSON.parse(fs.readFileSync(GoogleDriveAPI.drive_app_cred_path)).installed
|
||||||
|
|
||||||
|
const payload = {
|
||||||
|
type: "authorized_user",
|
||||||
|
client_id: app_credentials.client_id,
|
||||||
|
client_secret: app_credentials.client_secret,
|
||||||
|
access_token: credentials.access_token,
|
||||||
|
refresh_token: credentials.refresh_token,
|
||||||
|
}
|
||||||
|
|
||||||
|
const encryptedBuffer = safeStorage.encryptString(JSON.stringify(payload))
|
||||||
|
|
||||||
|
global.SettingsStore.set("drive_auth", encryptedBuffer.toString("latin1"))
|
||||||
|
|
||||||
|
console.log("Saved Drive credentials...",)
|
||||||
|
}
|
||||||
|
|
||||||
|
static async authorize() {
|
||||||
|
const auth = await authenticate({
|
||||||
|
scopes: ["https://www.googleapis.com/auth/drive"],
|
||||||
|
keyfilePath: GoogleDriveAPI.drive_app_cred_path,
|
||||||
|
})
|
||||||
|
|
||||||
|
await GoogleDriveAPI.saveCredentials(auth.credentials)
|
||||||
|
|
||||||
|
await sendToRender("drive:authorized")
|
||||||
|
|
||||||
|
return auth
|
||||||
|
}
|
||||||
|
|
||||||
|
static async init() {
|
||||||
|
// register ipc events
|
||||||
|
for (const [key, fn] of Object.entries(GoogleDriveAPI.ipcHandlers)) {
|
||||||
|
ipcMain.handle(key, fn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static operations = {
|
||||||
|
listFiles: async () => {
|
||||||
|
const drive = await GoogleDriveAPI.getDriveInstance()
|
||||||
|
|
||||||
|
const res = await drive.files.list({
|
||||||
|
pageSize: 10,
|
||||||
|
fields: "nextPageToken, files(id, name)",
|
||||||
|
})
|
||||||
|
|
||||||
|
const files = res.data.files.map((file) => {
|
||||||
|
return {
|
||||||
|
id: file.id,
|
||||||
|
name: file.name,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return files
|
||||||
|
},
|
||||||
|
downloadFile: (file_id, dest_path, callback, progressCallback) => {
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
if (!file_id) {
|
||||||
|
throw new Error("No file_id provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dest_path) {
|
||||||
|
throw new Error("No destination path provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
const drive = await GoogleDriveAPI.getDriveInstance()
|
||||||
|
|
||||||
|
const { data: metadata } = await drive.files.get({
|
||||||
|
fileId: file_id,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!metadata) {
|
||||||
|
throw new Error("Cannot retrieve file metadata")
|
||||||
|
}
|
||||||
|
|
||||||
|
let progress = progressHandler({
|
||||||
|
length: metadata.size,
|
||||||
|
time: 500,
|
||||||
|
})
|
||||||
|
|
||||||
|
const dest_stream = fs.createWriteStream(dest_path)
|
||||||
|
|
||||||
|
drive.files.get({
|
||||||
|
fileId: file_id,
|
||||||
|
alt: "media",
|
||||||
|
}, {
|
||||||
|
responseType: "stream",
|
||||||
|
}, (err, { data }) => {
|
||||||
|
if (err) {
|
||||||
|
return reject(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data
|
||||||
|
.on("error", (err) => {
|
||||||
|
if (typeof callback === "function") {
|
||||||
|
callback(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
.pipe(progress).pipe(dest_stream)
|
||||||
|
})
|
||||||
|
|
||||||
|
progress.on("progress", (progress) => {
|
||||||
|
if (typeof progressCallback === "function") {
|
||||||
|
progressCallback(progress)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
dest_stream.on("finish", () => {
|
||||||
|
if (typeof callback === "function") {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ipcHandlers = {
|
||||||
|
"drive:listFiles": GoogleDriveAPI.operations.listFiles,
|
||||||
|
"drive:authorize": GoogleDriveAPI.authorize,
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user