|
const fetch = require("node-fetch") |
|
const express = require("express") |
|
const cookieParser = require("cookie-parser") |
|
const app = express() |
|
app.use(cookieParser()) |
|
const fs = require("fs") |
|
const path = require("path") |
|
|
|
const file_to_download_to = "your file" |
|
|
|
const config = require("./config.json") |
|
|
|
app.get('/login', (req, res) => { |
|
res.redirect(`https://accounts.google.com/o/oauth2/v2/auth?client_id=${config.client_id}&redirect_uri=${config.redirect_uri}&response_type=code&scope=https://www.googleapis.com/auth/photoslibrary.readonly`) |
|
}) |
|
|
|
app.get('/auth/google/callback', (req, res) => { |
|
const code = req.query.code; |
|
if(!code) return res.redirect('/login') |
|
|
|
const url = `https://oauth2.googleapis.com/token?code=${code}&client_id=${config.client_id}&client_secret=${config.client_secret}&redirect_uri=${config.redirect_uri}&grant_type=authorization_code`; |
|
fetch(url, { method: 'POST' }) |
|
.then(response => response.json()) |
|
.then(data => { |
|
res.cookie('token', data.access_token) |
|
res.redirect("/") |
|
}) |
|
.catch(error => { |
|
console.error(error) |
|
res.status(500).send('Error retrieving access token') |
|
}); |
|
}) |
|
|
|
app.get('/', (req, res) => { |
|
if(req.cookies.token) var code = req.cookies.token |
|
else return res.redirect('./login') |
|
|
|
var selected = req.query.album |
|
|
|
fetch("https://photoslibrary.googleapis.com/v1/albums?pageSize=50", { |
|
headers: { |
|
"Authorization": "Bearer " + code, |
|
'Content-Type': 'application/json' |
|
} |
|
}).then(res => res.json()).then(data => { |
|
var album = data.albums.find(a => a.title === selected).id |
|
|
|
fetch(`https://photoslibrary.googleapis.com/v1/mediaItems:search?pageSize=50`, { |
|
headers: { |
|
"Authorization": "Bearer " + code, |
|
'Content-Type': 'application/json' |
|
}, |
|
method: "POST", |
|
body: JSON.stringify({ |
|
pageSize: 10, |
|
albumId: album |
|
}) |
|
}).then(res => res.json()).then(json => { |
|
res.send(json) |
|
|
|
json.mediaItems.forEach((item, i) => { |
|
setTimeout(item => { |
|
let photo = item |
|
fetch(`https://photoslibrary.googleapis.com/v1/mediaItems/` + photo.id, { |
|
headers: { |
|
"Authorization": "Bearer " + code, |
|
'Content-Type': 'application/json' |
|
}, |
|
}).then(res => res.json()).then(data => { |
|
let file = path.join(file_to_download_to, json.mediaItems[i].filename) |
|
console.log(file) |
|
fetch(data.baseUrl + `=w${data.mediaMetadata.width}-h${data.mediaMetadata.height}`).then(res => res.body.pipe(fs.createWriteStream(file))) |
|
}) |
|
}, i * 500, item) |
|
}) |
|
|
|
}).catch(console.error) |
|
|
|
}).catch(console.error) |
|
}) |
|
|
|
app.listen(80) |