From 229bbc7a11d4a58840d37dbe0e5678f6fa37d37e Mon Sep 17 00:00:00 2001 From: killer069 <65385476+killer069@users.noreply.github.com> Date: Tue, 12 Oct 2021 13:56:33 +0530 Subject: [PATCH] SetToken function added --- play-dl/SoundCloud/index.ts | 4 + play-dl/Spotify/index.ts | 25 ++++- play-dl/YouTube/utils/cookie.ts | 18 +++- play-dl/index.ts | 169 ++++++++++++++++++-------------- play-dl/token.ts | 24 +++++ 5 files changed, 160 insertions(+), 80 deletions(-) create mode 100644 play-dl/token.ts diff --git a/play-dl/SoundCloud/index.ts b/play-dl/SoundCloud/index.ts index d21d9eb..13312fe 100644 --- a/play-dl/SoundCloud/index.ts +++ b/play-dl/SoundCloud/index.ts @@ -151,3 +151,7 @@ function parseHlsFormats(data: SoundCloudTrackFormat[]) { }); return result; } + +export function setSoundCloudToken(options : SoundDataOptions){ + soundData = options +} \ No newline at end of file diff --git a/play-dl/Spotify/index.ts b/play-dl/Spotify/index.ts index 2297848..297e249 100644 --- a/play-dl/Spotify/index.ts +++ b/play-dl/Spotify/index.ts @@ -5,6 +5,7 @@ import fs from 'fs'; let spotifyData: SpotifyDataOptions; if (fs.existsSync('.data/spotify.data')) { spotifyData = JSON.parse(fs.readFileSync('.data/spotify.data').toString()); + spotifyData.file = true } /** * Spotify Data options that are stored in spotify.data file. @@ -12,7 +13,7 @@ if (fs.existsSync('.data/spotify.data')) { export interface SpotifyDataOptions { client_id: string; client_secret: string; - redirect_url: string; + redirect_url?: string; authorization_code?: string; access_token?: string; refresh_token?: string; @@ -20,6 +21,7 @@ export interface SpotifyDataOptions { expires_in?: number; expiry?: number; market?: string; + file? : boolean } const pattern = /^((https:)?\/\/)?open.spotify.com\/(track|album|playlist)\//; @@ -89,14 +91,14 @@ export function sp_validate(url: string): 'track' | 'playlist' | 'album' | 'sear * @param data Sportify Data options to validate * @returns boolean. */ -export async function SpotifyAuthorize(data: SpotifyDataOptions): Promise { +export async function SpotifyAuthorize(data: SpotifyDataOptions, file : boolean): Promise { const response = await request(`https://accounts.spotify.com/api/token`, { headers: { 'Authorization': `Basic ${Buffer.from(`${data.client_id}:${data.client_secret}`).toString('base64')}`, 'Content-Type': 'application/x-www-form-urlencoded' }, body: `grant_type=authorization_code&code=${data.authorization_code}&redirect_uri=${encodeURI( - data.redirect_url + data.redirect_url as string )}`, method: 'POST' }).catch((err: Error) => { @@ -115,7 +117,14 @@ export async function SpotifyAuthorize(data: SpotifyDataOptions): Promise { spotifyData.expires_in = Number(resp_json.expires_in); spotifyData.expiry = Date.now() + (resp_json.expires_in - 1) * 1000; spotifyData.token_type = resp_json.token_type; - fs.writeFileSync('.data/spotify.data', JSON.stringify(spotifyData, undefined, 4)); + if(spotifyData.file) fs.writeFileSync('.data/spotify.data', JSON.stringify(spotifyData, undefined, 4)); return true; } + +export function setSpotifyToken(options: SpotifyDataOptions) { + spotifyData = options + spotifyData.file = false + refreshToken() +} \ No newline at end of file diff --git a/play-dl/YouTube/utils/cookie.ts b/play-dl/YouTube/utils/cookie.ts index e43293a..835f1bf 100644 --- a/play-dl/YouTube/utils/cookie.ts +++ b/play-dl/YouTube/utils/cookie.ts @@ -3,10 +3,12 @@ import fs from 'fs'; let youtubeData: youtubeDataOptions; if (fs.existsSync('.data/youtube.data')) { youtubeData = JSON.parse(fs.readFileSync('.data/youtube.data').toString()); + youtubeData.file = true } interface youtubeDataOptions { cookie?: Object; + file? : boolean; } export function getCookies(): undefined | string { @@ -27,5 +29,19 @@ export function setCookie(key: string, value: string): boolean { } export function uploadCookie() { - if (youtubeData) fs.writeFileSync('.data/youtube.data', JSON.stringify(youtubeData, undefined, 4)); + if (youtubeData.cookie && youtubeData.file) fs.writeFileSync('.data/youtube.data', JSON.stringify(youtubeData, undefined, 4)); } + +export function setCookieToken(options : { cookie : string }){ + let cook = options.cookie + let cookie: Object = {}; + cook.split(';').forEach((x) => { + const arr = x.split('='); + if (arr.length <= 1) return; + const key = arr.shift()?.trim() as string; + const value = arr.join('=').trim(); + Object.assign(cookie, { [key]: value }); + }); + youtubeData = { cookie } + youtubeData.file = false +} \ No newline at end of file diff --git a/play-dl/index.ts b/play-dl/index.ts index ad9fa55..19a4a59 100644 --- a/play-dl/index.ts +++ b/play-dl/index.ts @@ -1,6 +1,7 @@ export { playlist_info, video_basic_info, video_info, yt_validate, extractID, YouTube, YouTubeStream } from './YouTube'; export { spotify, sp_validate, refreshToken, is_expired, Spotify } from './Spotify'; export { soundcloud, so_validate, SoundCloud, SoundCloudStream } from './SoundCloud'; +export { setToken } from './token' enum AudioPlayerStatus { Idle = 'idle', @@ -114,92 +115,112 @@ export function authorization(): void { input: process.stdin, output: process.stdout }); - ask.question('Choose your service - sc (for SoundCloud) / sp (for Spotify) / yo (for YouTube): ', (msg) => { - if (msg.toLowerCase().startsWith('sp')) { - let client_id: string, client_secret: string, redirect_url: string, market: string; - ask.question('Start by entering your Client ID : ', (id) => { - client_id = id; - ask.question('Now enter your Client Secret : ', (secret) => { - client_secret = secret; - ask.question('Enter your Redirect URL now : ', (url) => { - redirect_url = url; - console.log( - '\nIf you would like to know your region code visit : \nhttps://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements \n' - ); - ask.question('Enter your region code (2-letter country code) : ', (mar) => { - if (mar.length === 2) market = mar; - else { + ask.question('Do you want to save data in a file ? (Yes / No): ', (msg) => { + let file : boolean; + if(msg.toLowerCase() === 'yes') file = true + else if(msg.toLowerCase() === 'no') file = false + else { + console.log("That option doesn't exist. Try again..."); + ask.close(); + return; + } + ask.question('Choose your service - sc (for SoundCloud) / sp (for Spotify) / yo (for YouTube): ', (msg) => { + if (msg.toLowerCase().startsWith('sp')) { + let client_id: string, client_secret: string, redirect_url: string, market: string; + ask.question('Start by entering your Client ID : ', (id) => { + client_id = id; + ask.question('Now enter your Client Secret : ', (secret) => { + client_secret = secret; + ask.question('Enter your Redirect URL now : ', (url) => { + redirect_url = url; + console.log( + '\nIf you would like to know your region code visit : \nhttps://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements \n' + ); + ask.question('Enter your region code (2-letter country code) : ', (mar) => { + if (mar.length === 2) market = mar; + else { + console.log( + "That doesn't look like a valid region code, IN will be selected as default." + ); + market = 'IN'; + } console.log( - "That doesn't look like a valid region code, IN will be selected as default." + '\nNow open your browser and paste the below url, then authorize it and copy the redirected url. \n' ); - market = 'IN'; - } - console.log( - '\nNow open your browser and paste the below url, then authorize it and copy the redirected url. \n' - ); - console.log( - `https://accounts.spotify.com/authorize?client_id=${client_id}&response_type=code&redirect_uri=${encodeURI( - redirect_url - )} \n` - ); - ask.question('Paste the url which you just copied : ', async (url) => { - if (!fs.existsSync('.data')) fs.mkdirSync('.data'); - const spotifyData = { - client_id, - client_secret, - redirect_url, - authorization_code: url.split('code=')[1], - market - }; - const check = await SpotifyAuthorize(spotifyData); - if (check === false) throw new Error('Failed to get access token.'); - ask.close(); + console.log( + `https://accounts.spotify.com/authorize?client_id=${client_id}&response_type=code&redirect_uri=${encodeURI( + redirect_url + )} \n` + ); + ask.question('Paste the url which you just copied : ', async (url) => { + if (!fs.existsSync('.data')) fs.mkdirSync('.data'); + const spotifyData = { + client_id, + client_secret, + redirect_url, + authorization_code: url.split('code=')[1], + market + }; + const check = await SpotifyAuthorize(spotifyData, file); + if (check === false) throw new Error('Failed to get access token.'); + ask.close(); + }); }); }); }); }); - }); - } else if (msg.toLowerCase().startsWith('sc')) { - ask.question('Client ID : ', async (id) => { - let client_id = id; - if (!client_id) { - console.log("You didn't provide a client ID. Try again..."); + } else if (msg.toLowerCase().startsWith('sc')) { + if(!file){ + console.log("You already had a client ID, just paste that in setToken function."); ask.close(); return; } - if (!fs.existsSync('.data')) fs.mkdirSync('.data'); - console.log('Validating your client ID, hold on...'); - if (await check_id(client_id)) { - console.log('Client ID has been validated successfully.'); - fs.writeFileSync('.data/soundcloud.data', JSON.stringify({ client_id }, undefined, 4)); - } else console.log("That doesn't look like a valid client ID. Retry with a correct client ID."); - ask.close(); - }); - } else if (msg.toLowerCase().startsWith('yo')) { - ask.question('Cookies : ', (cook: string) => { - if (!cook || cook.length === 0) { - console.log("You didn't provide a cookie. Try again..."); + ask.question('Client ID : ', async (id) => { + let client_id = id; + if (!client_id) { + console.log("You didn't provide a client ID. Try again..."); + ask.close(); + return; + } + if (!fs.existsSync('.data')) fs.mkdirSync('.data'); + console.log('Validating your client ID, hold on...'); + if (await check_id(client_id)) { + console.log('Client ID has been validated successfully.'); + fs.writeFileSync('.data/soundcloud.data', JSON.stringify({ client_id }, undefined, 4)); + } else console.log("That doesn't look like a valid client ID. Retry with a correct client ID."); ask.close(); - return; - } - if (!fs.existsSync('.data')) fs.mkdirSync('.data'); - console.log('Cookies has been added successfully.'); - let cookie: Object = {}; - cook.split(';').forEach((x) => { - const arr = x.split('='); - if (arr.length <= 1) return; - const key = arr.shift()?.trim() as string; - const value = arr.join('=').trim(); - Object.assign(cookie, { [key]: value }); }); - fs.writeFileSync('.data/youtube.data', JSON.stringify({ cookie }, undefined, 4)); + } else if (msg.toLowerCase().startsWith('yo')) { + if(!file){ + console.log("You already had cookie, just paste that in setToken function."); + ask.close(); + return; + } + ask.question('Cookies : ', (cook: string) => { + if (!cook || cook.length === 0) { + console.log("You didn't provide a cookie. Try again..."); + ask.close(); + return; + } + if (!fs.existsSync('.data')) fs.mkdirSync('.data'); + console.log('Cookies has been added successfully.'); + let cookie: Object = {}; + cook.split(';').forEach((x) => { + const arr = x.split('='); + if (arr.length <= 1) return; + const key = arr.shift()?.trim() as string; + const value = arr.join('=').trim(); + Object.assign(cookie, { [key]: value }); + }); + fs.writeFileSync('.data/youtube.data', JSON.stringify({ cookie }, undefined, 4)); + ask.close(); + }); + } else { + console.log("That option doesn't exist. Try again..."); ask.close(); - }); - } else { - console.log("That option doesn't exist. Try again..."); - ask.close(); - } - }); + } + }); + }) } export function attachListeners(player: EventEmitter, resource: YouTubeStream | SoundCloudStream) { diff --git a/play-dl/token.ts b/play-dl/token.ts new file mode 100644 index 0000000..0d56169 --- /dev/null +++ b/play-dl/token.ts @@ -0,0 +1,24 @@ +import { setSoundCloudToken } from "./SoundCloud"; +import { setSpotifyToken } from "./Spotify"; +import { setCookieToken } from "./YouTube/utils/cookie"; + +interface tokenOptions { + spotify? : { + client_id : string + client_secret : string; + refresh_token : string + market : string + } + soundcloud? : { + client_id : string + } + youtube? : { + cookie : string + } +} + +export function setToken(options : tokenOptions){ + if(options.spotify) setSpotifyToken(options.spotify) + if(options.soundcloud) setSoundCloudToken(options.soundcloud) + if(options.youtube) setCookieToken(options.youtube) +} \ No newline at end of file