Advertisement
molsec

GDrive JS

Jan 22nd, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var chokidar = require('chokidar');
  2. var fs = require('fs');
  3. var readline = require('readline');
  4. var google = require('googleapis');
  5. var googleAuth = require('google-auth-library');
  6. var mime = require('mime');
  7. var path = require('path');
  8.  
  9.  
  10. //var SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'];
  11. var SCOPES = ['https://www.googleapis.com/auth/drive'];
  12. var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
  13.     process.env.USERPROFILE) + '/.credentials/';
  14. var TOKEN_PATH = TOKEN_DIR + 'drive-nodejs-quickstart.json';
  15.  
  16. //Make sure this folder exist on your Google Drive Account
  17. var GOOGLE_DRIVE_FOLDER = "SyncPro"
  18. //The folder that we Sync with the Google Drive Storage
  19. var LOCAL_SYNC_FOLDER = "watch_me"
  20. // Constructor
  21. function GDrive() {
  22.     // always initialize all instance properties
  23.     this.drive;
  24.     this.auth;
  25.     // Load client secrets from a local file.
  26.     fs.readFile('client_secret.json', function processClientSecrets(err, content) {
  27.       if (err) {
  28.         console.log('Error loading client secret file: ' + err);
  29.         return;
  30.       }
  31.       // Authorize a client with the loaded credentials, then call the
  32.       // Drive API.
  33.       authorize(JSON.parse(content), find_folder); 
  34.     });
  35.    
  36.     function authorize(credentials, callback) {
  37.       var clientSecret = credentials.installed.client_secret;
  38.       var clientId = credentials.installed.client_id;
  39.       var redirectUrl = credentials.installed.redirect_uris[0];
  40.       var auth = new googleAuth();
  41.       var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
  42.  
  43.       // Check if we have previously stored a token.
  44.       fs.readFile(TOKEN_PATH, function(err, token) {
  45.         if (err) {
  46.           getNewToken(oauth2Client, callback);
  47.         } else {
  48.           oauth2Client.credentials = JSON.parse(token);
  49.           callback(oauth2Client);
  50.         }
  51.       });
  52.     }
  53.    
  54.     function find_folder(auth){
  55.            
  56.           var fetchPage = function(pageToken, pageFn, callback) {
  57.               var service = google.drive('v3');
  58.               service.files.list({
  59.                 auth:auth,
  60.                 q: "name contains '"+ GOOGLE_DRIVE_FOLDER +"' and mimeType = 'application/vnd.google-apps.folder'",
  61.                 fields: 'nextPageToken, files(id, name)',
  62.                 spaces: 'drive',
  63.                 pageToken: pageToken
  64.               }, function(err, res) {
  65.                 if(err) {
  66.                   callback(err);
  67.                 } else {
  68.                   res.files.forEach(function(file) {
  69.                     console.log('Found file: ', file.name, file.id);
  70.                     load_watcher(auth,file.id);
  71.                   });
  72.                   if (res.nextPageToken) {
  73.                     console.log("Page token", res.nextPageToken);
  74.                     pageFn(res.nextPageToken, pageFn, callback);
  75.                   } else {
  76.                     callback();
  77.                   }
  78.                 }
  79.               });
  80.             };
  81.             fetchPage(null, fetchPage, function(err) {
  82.               if (err) {
  83.                 // Handle error
  84.                 console.log(err);
  85.               } else {
  86.                 // All pages fetched
  87.               }
  88.             });
  89.     }
  90.    
  91.     function load_watcher(auth,PARENT_FOLDER_ID){
  92.         var watcher = chokidar.watch(LOCAL_SYNC_FOLDER, {
  93.           ignored: /[\/\\]\./,
  94.           persistent: true ,
  95.           alwaysState: true
  96.         });
  97.  
  98.         var log = console.log.bind(console);
  99.         watcher
  100.         .on('add', function(path) {
  101.             log('File', path, 'has been added');
  102.             googleDrive_upFile(path,auth,PARENT_FOLDER_ID) 
  103.         })
  104.         .on('addDir', function(path) {
  105.             if(path != LOCAL_SYNC_FOLDER){
  106.                 log('Directory', path, 'has been added');
  107.                 googleDrive_upFolder(path,auth,PARENT_FOLDER_ID)       
  108.             }
  109.         })
  110.         .on('change', function(path) {
  111.             log('File', path, 'has been changed');
  112.             googleDrive_upFile(path,auth,PARENT_FOLDER_ID)
  113.         })
  114.         .on('unlink', function(path) {
  115.             log('File', path, 'has been removed');
  116.             watcher.unwatch(path); 
  117.         })
  118.         .on('unlinkDir', function(pathX) {
  119.             log('Directory', path, 'has been removed');
  120.             //TODO: the shit below does not work.
  121.             //implement method to find the ID of the FOLDER we want to delete from GDrive
  122.             //googleDrive_delFolder(get_id_of_file(path.basename(pathX)),auth,PARENT_FOLDER_ID)
  123.             watcher.unwatch(pathX);
  124.         })
  125.         .on('error', function(error) { log('Error happened', error); })
  126.         .on('ready', function() { log('Initial scan complete. Ready for changes.'); })
  127.     }
  128.    
  129.     function googleDrive_upFolder(folder_data,auth,folder_id){
  130.         var fileMetadata = {
  131.           'name' : path.basename(folder_data),
  132.           parents: [ folder_id ],
  133.           'mimeType' : 'application/vnd.google-apps.folder'
  134.         };
  135.         var service = google.drive('v3');
  136.         service.files.create({
  137.            auth:auth,
  138.            resource: fileMetadata,
  139.            fields: 'id'
  140.         }, function(err, file) {
  141.           if(err) {
  142.             // Handle error
  143.             console.log(err);
  144.           } else {
  145.             console.log('Folder Id: ', file.id);
  146.           }
  147.         });
  148.     }
  149.     function googleDrive_delFolder(folder_data,auth,folder_id){
  150.        
  151.         var service = google.drive('v3');
  152.         service.files.delete({
  153.            fileId:folder_id,
  154.            auth:auth,
  155.            fields: 'id'
  156.         }, function(err, file) {
  157.           if(err) {
  158.             // Handle error
  159.             console.log(err);
  160.           } else {
  161.             console.log('Folder Id: ', file.id);
  162.           }
  163.         });
  164.     }
  165.    
  166.     function googleDrive_upFile(file_data,auth,folder_id){
  167.         var folderId = folder_id;
  168.         var fileMetadata = {
  169.           name: path.basename(file_data),
  170.           parents: [ folderId ]
  171.         };
  172.         var media = {
  173.           mimeType: mime.lookup(file_data),
  174.           body: fs.createReadStream(file_data)
  175.         };
  176.         var service = google.drive('v3');
  177.         service.files.create({
  178.            auth:auth,
  179.            resource: fileMetadata,
  180.            media: media,
  181.            fields: 'id'
  182.         }, function(err, file) {
  183.           if(err) {
  184.             // Handle error
  185.             console.log(err);
  186.           } else {
  187.             console.log('File Id: ', file.id);
  188.           }
  189.         });
  190.     }
  191.    
  192.     function get_id_of_file(auth,fileName){
  193.         var fetchPage = function(pageToken, pageFn, callback) {
  194.               var service = google.drive('v3');
  195.               service.files.list({
  196.                 auth:auth,
  197.                 q: "name contains '"+fileName+"'",
  198.                 fields: 'nextPageToken, files(id, name)',
  199.                 spaces: 'drive',
  200.                 pageToken: pageToken
  201.               }, function(err, res) {
  202.                 if(err) {
  203.                   callback(err);
  204.                 } else {
  205.                   res.files.forEach(function(file) {
  206.                     console.log('Found file: ', file.name, file.id);
  207.                   });
  208.                   if (res.nextPageToken) {
  209.                     console.log("Page token", res.nextPageToken);
  210.                     pageFn(res.nextPageToken, pageFn, callback);
  211.                   } else {
  212.                     callback();
  213.                   }
  214.                 }
  215.               });
  216.             };
  217.             fetchPage(null, fetchPage, function(err) {
  218.               if (err) {
  219.                 // Handle error
  220.                 console.log(err);
  221.               } else {
  222.                 // All pages fetched
  223.               }
  224.             });
  225.    
  226.     }
  227.    
  228.     function listFiles(auth) {
  229.       var service = google.drive('v3');
  230.       service.files.list({
  231.         auth: auth,
  232.         pageSize: 20,
  233.         fields: "nextPageToken, files(id, name)"
  234.       }, function(err, response) {
  235.         if (err) {
  236.           console.log('The API returned an error: ' + err);
  237.           return;
  238.         }
  239.         var files = response.files;
  240.         if (files.length == 0) {
  241.           console.log('No files found.');
  242.         } else {
  243.           console.log('File List:'+"<br>");
  244.           for (var i = 0; i < files.length; i++) {
  245.             var file = files[i];
  246.             console.log(file.name+"<br>");
  247.           }
  248.         }
  249.       });
  250.     }
  251.    
  252.     function getNewToken(oauth2Client, callback) {
  253.       var authUrl = oauth2Client.generateAuthUrl({
  254.         access_type: 'offline',
  255.         scope: SCOPES
  256.       });
  257.       console.log('Authorize this app by visiting this url: ', authUrl);
  258.       var rl = readline.createInterface({
  259.         input: process.stdin,
  260.         output: process.stdout
  261.       });
  262.       rl.question('Enter the code from that page here: ', function(code) {
  263.         rl.close();
  264.         oauth2Client.getToken(code, function(err, token) {
  265.           if (err) {
  266.             console.log('Error while trying to retrieve access token', err);
  267.             return;
  268.           }
  269.           oauth2Client.credentials = token;
  270.           storeToken(token);
  271.           callback(oauth2Client);
  272.         });
  273.       });
  274.     }
  275.    
  276.     function storeToken(token) {
  277.       try {
  278.         fs.mkdirSync(TOKEN_DIR);
  279.       } catch (err) {
  280.         if (err.code != 'EEXIST') {
  281.           throw err;
  282.         }
  283.       }
  284.       fs.writeFile(TOKEN_PATH, JSON.stringify(token));
  285.       console.log('Token stored to ' + TOKEN_PATH);
  286.     }
  287. }
  288. var f = new GDrive();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement