Add album chooser

This commit is contained in:
Daniel Kluge 2022-05-07 16:40:36 +02:00
parent a6418e82bf
commit e94a52d00a
2 changed files with 73 additions and 0 deletions

View File

@ -5,6 +5,7 @@
"main": "src/sync.js", "main": "src/sync.js",
"type": "module", "type": "module",
"scripts": { "scripts": {
"albums": "node src/getAlbums.js",
"token": "node src/getToken.js", "token": "node src/getToken.js",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },

72
src/getAlbums.js Normal file
View File

@ -0,0 +1,72 @@
import fetch from "node-fetch";
import readline from "readline";
import {readFileSync, writeFileSync} from "fs";
import { exit } from "process";
import {dirname} from "path";
import {fileURLToPath} from "url";
// Read and parse JSON. There is no __dirname for modules
const secretsFile = `${dirname(fileURLToPath(import.meta.url))}/../secrets.json`;
const secrets = JSON.parse(readFileSync(secretsFile, "utf8"));
if (!secrets.refreshToken) {
console.error("No refresh token found. Please run 'npm run getToken' first.");
exit();
}
async function getToken() {
const response = await fetch("https://oauth2.googleapis.com/token", {
method: "POST",
body: JSON.stringify({
client_id: secrets.clientId,
client_secret: secrets.clientSecret,
grant_type: "refresh_token",
refresh_token: secrets.refreshToken
}),
headers: {'Content-Type': 'application/json'}
});
const data = await response.json();
return data.access_token;
}
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
(async () => {
let nextPageToken;
const albums = [];
do {
const response = await fetch(`https://photoslibrary.googleapis.com/v1/albums?pageSize=50${nextPageToken ? `&${nextPageToken}`: ""}`, {
headers: {
Authorization: `Bearer ${await getToken()}`,
"Content-Type": "application/json"
}
});
const data = await response.json();
albums.push(...data.albums);
nextPageToken = data.nextPageToken;
} while (nextPageToken);
for(let i = 0; i < albums.length; i++) {
console.log(`${i+1}:\t${albums[i].title} (${albums[i].mediaItemsCount} items)`);
}
console.log("\n");
let albumIndex;
while(true) {
albumIndex = await new Promise((resolve) => rl.question("Please choose an album: ", resolve));
if(Number.isNaN(Number.parseInt(albumIndex)) || Number.parseInt(albumIndex) < 1 || Number.parseInt(albumIndex) > albums.length) {
console.warn("This is not a valid number, please try again.");
continue;
} else {
break;
}
}
rl.close();
secrets.albumId = albums[albumIndex-1].id;
console.log("Writeing album ID to secrets...");
writeFileSync(secretsFile, JSON.stringify(secrets, null, 2));
console.log("Done!");
})()