45 lines
1.6 KiB
JavaScript
45 lines
1.6 KiB
JavaScript
import { PrismaClient } from '@prisma/client';
|
|
import { createDecipheriv, scryptSync } from 'crypto';
|
|
import { google } from 'googleapis';
|
|
import { writeFileSync } from 'fs';
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
function decrypt(text) {
|
|
const key = scryptSync('7017a681f5b32c3799d1bbf58ce58064', 'studioflow-salt', 32);
|
|
const [ivHex, encHex] = text.split(':');
|
|
const decipher = createDecipheriv('aes-256-cbc', key, Buffer.from(ivHex, 'hex'));
|
|
return Buffer.concat([decipher.update(Buffer.from(encHex, 'hex')), decipher.final()]).toString('utf8');
|
|
}
|
|
|
|
const channel = await prisma.channel.findFirst({ where: { name: 'My Channel' } });
|
|
const oauth2 = new google.auth.OAuth2(
|
|
'496320251583-rpbr13i0rh1112cdvv9ui5s373735qqj.apps.googleusercontent.com',
|
|
'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',
|
|
);
|
|
oauth2.setCredentials({
|
|
access_token: decrypt(channel.youtubeAccessToken),
|
|
refresh_token: channel.youtubeRefreshToken ? decrypt(channel.youtubeRefreshToken) : undefined,
|
|
});
|
|
|
|
const yt = google.youtube({ version: 'v3', auth: oauth2 });
|
|
|
|
const pages = [];
|
|
let pageToken;
|
|
do {
|
|
const res = await yt.playlistItems.list({
|
|
part: ['contentDetails', 'snippet', 'status'],
|
|
playlistId: channel.uploadsPlaylistId,
|
|
maxResults: 50,
|
|
...(pageToken ? { pageToken } : {}),
|
|
});
|
|
pages.push(res.data);
|
|
pageToken = res.data.nextPageToken;
|
|
} while (pageToken);
|
|
|
|
const outPath = new URL('./playlist-raw.json', import.meta.url).pathname.replace(/^\/([A-Z]:)/, '$1');
|
|
writeFileSync(outPath, JSON.stringify(pages, null, 2));
|
|
console.log(`Wrote ${pages.length} pages to ${outPath}`);
|
|
|
|
await prisma.$disconnect();
|