Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var chokidar = require('chokidar');
- var fs = require('fs');
- var readline = require('readline');
- var google = require('googleapis');
- var googleAuth = require('google-auth-library');
- var mime = require('mime');
- var path = require('path');
- //var SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'];
- var SCOPES = ['https://www.googleapis.com/auth/drive'];
- var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
- process.env.USERPROFILE) + '/.credentials/';
- var TOKEN_PATH = TOKEN_DIR + 'drive-nodejs-quickstart.json';
- //Make sure this folder exist on your Google Drive Account
- var GOOGLE_DRIVE_FOLDER = "SyncPro"
- //The folder that we Sync with the Google Drive Storage
- var LOCAL_SYNC_FOLDER = "watch_me"
- // Constructor
- function GDrive() {
- // always initialize all instance properties
- this.drive;
- this.auth;
- // Load client secrets from a local file.
- fs.readFile('client_secret.json', function processClientSecrets(err, content) {
- if (err) {
- console.log('Error loading client secret file: ' + err);
- return;
- }
- // Authorize a client with the loaded credentials, then call the
- // Drive API.
- authorize(JSON.parse(content), find_folder);
- });
- function authorize(credentials, callback) {
- var clientSecret = credentials.installed.client_secret;
- var clientId = credentials.installed.client_id;
- var redirectUrl = credentials.installed.redirect_uris[0];
- var auth = new googleAuth();
- var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
- // Check if we have previously stored a token.
- fs.readFile(TOKEN_PATH, function(err, token) {
- if (err) {
- getNewToken(oauth2Client, callback);
- } else {
- oauth2Client.credentials = JSON.parse(token);
- callback(oauth2Client);
- }
- });
- }
- function find_folder(auth){
- var fetchPage = function(pageToken, pageFn, callback) {
- var service = google.drive('v3');
- service.files.list({
- auth:auth,
- q: "name contains '"+ GOOGLE_DRIVE_FOLDER +"' and mimeType = 'application/vnd.google-apps.folder'",
- fields: 'nextPageToken, files(id, name)',
- spaces: 'drive',
- pageToken: pageToken
- }, function(err, res) {
- if(err) {
- callback(err);
- } else {
- res.files.forEach(function(file) {
- console.log('Found file: ', file.name, file.id);
- load_watcher(auth,file.id);
- });
- if (res.nextPageToken) {
- console.log("Page token", res.nextPageToken);
- pageFn(res.nextPageToken, pageFn, callback);
- } else {
- callback();
- }
- }
- });
- };
- fetchPage(null, fetchPage, function(err) {
- if (err) {
- // Handle error
- console.log(err);
- } else {
- // All pages fetched
- }
- });
- }
- function load_watcher(auth,PARENT_FOLDER_ID){
- var watcher = chokidar.watch(LOCAL_SYNC_FOLDER, {
- ignored: /[\/\\]\./,
- persistent: true ,
- alwaysState: true
- });
- var log = console.log.bind(console);
- watcher
- .on('add', function(path) {
- log('File', path, 'has been added');
- googleDrive_upFile(path,auth,PARENT_FOLDER_ID)
- })
- .on('addDir', function(path) {
- if(path != LOCAL_SYNC_FOLDER){
- log('Directory', path, 'has been added');
- googleDrive_upFolder(path,auth,PARENT_FOLDER_ID)
- }
- })
- .on('change', function(path) {
- log('File', path, 'has been changed');
- googleDrive_upFile(path,auth,PARENT_FOLDER_ID)
- })
- .on('unlink', function(path) {
- log('File', path, 'has been removed');
- watcher.unwatch(path);
- })
- .on('unlinkDir', function(pathX) {
- log('Directory', path, 'has been removed');
- //TODO: the shit below does not work.
- //implement method to find the ID of the FOLDER we want to delete from GDrive
- //googleDrive_delFolder(get_id_of_file(path.basename(pathX)),auth,PARENT_FOLDER_ID)
- watcher.unwatch(pathX);
- })
- .on('error', function(error) { log('Error happened', error); })
- .on('ready', function() { log('Initial scan complete. Ready for changes.'); })
- }
- function googleDrive_upFolder(folder_data,auth,folder_id){
- var fileMetadata = {
- 'name' : path.basename(folder_data),
- parents: [ folder_id ],
- 'mimeType' : 'application/vnd.google-apps.folder'
- };
- var service = google.drive('v3');
- service.files.create({
- auth:auth,
- resource: fileMetadata,
- fields: 'id'
- }, function(err, file) {
- if(err) {
- // Handle error
- console.log(err);
- } else {
- console.log('Folder Id: ', file.id);
- }
- });
- }
- function googleDrive_delFolder(folder_data,auth,folder_id){
- var service = google.drive('v3');
- service.files.delete({
- fileId:folder_id,
- auth:auth,
- fields: 'id'
- }, function(err, file) {
- if(err) {
- // Handle error
- console.log(err);
- } else {
- console.log('Folder Id: ', file.id);
- }
- });
- }
- function googleDrive_upFile(file_data,auth,folder_id){
- var folderId = folder_id;
- var fileMetadata = {
- name: path.basename(file_data),
- parents: [ folderId ]
- };
- var media = {
- mimeType: mime.lookup(file_data),
- body: fs.createReadStream(file_data)
- };
- var service = google.drive('v3');
- service.files.create({
- auth:auth,
- resource: fileMetadata,
- media: media,
- fields: 'id'
- }, function(err, file) {
- if(err) {
- // Handle error
- console.log(err);
- } else {
- console.log('File Id: ', file.id);
- }
- });
- }
- function get_id_of_file(auth,fileName){
- var fetchPage = function(pageToken, pageFn, callback) {
- var service = google.drive('v3');
- service.files.list({
- auth:auth,
- q: "name contains '"+fileName+"'",
- fields: 'nextPageToken, files(id, name)',
- spaces: 'drive',
- pageToken: pageToken
- }, function(err, res) {
- if(err) {
- callback(err);
- } else {
- res.files.forEach(function(file) {
- console.log('Found file: ', file.name, file.id);
- });
- if (res.nextPageToken) {
- console.log("Page token", res.nextPageToken);
- pageFn(res.nextPageToken, pageFn, callback);
- } else {
- callback();
- }
- }
- });
- };
- fetchPage(null, fetchPage, function(err) {
- if (err) {
- // Handle error
- console.log(err);
- } else {
- // All pages fetched
- }
- });
- }
- function listFiles(auth) {
- var service = google.drive('v3');
- service.files.list({
- auth: auth,
- pageSize: 20,
- fields: "nextPageToken, files(id, name)"
- }, function(err, response) {
- if (err) {
- console.log('The API returned an error: ' + err);
- return;
- }
- var files = response.files;
- if (files.length == 0) {
- console.log('No files found.');
- } else {
- console.log('File List:'+"<br>");
- for (var i = 0; i < files.length; i++) {
- var file = files[i];
- console.log(file.name+"<br>");
- }
- }
- });
- }
- function getNewToken(oauth2Client, callback) {
- var authUrl = oauth2Client.generateAuthUrl({
- access_type: 'offline',
- scope: SCOPES
- });
- console.log('Authorize this app by visiting this url: ', authUrl);
- var rl = readline.createInterface({
- input: process.stdin,
- output: process.stdout
- });
- rl.question('Enter the code from that page here: ', function(code) {
- rl.close();
- oauth2Client.getToken(code, function(err, token) {
- if (err) {
- console.log('Error while trying to retrieve access token', err);
- return;
- }
- oauth2Client.credentials = token;
- storeToken(token);
- callback(oauth2Client);
- });
- });
- }
- function storeToken(token) {
- try {
- fs.mkdirSync(TOKEN_DIR);
- } catch (err) {
- if (err.code != 'EEXIST') {
- throw err;
- }
- }
- fs.writeFile(TOKEN_PATH, JSON.stringify(token));
- console.log('Token stored to ' + TOKEN_PATH);
- }
- }
- var f = new GDrive();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement