From 035737312360279efd5026b225f30ef14aa55abf Mon Sep 17 00:00:00 2001 From: Max Isom Date: Wed, 18 Mar 2020 19:17:47 -0500 Subject: [PATCH] Limit playlist adds to 50 songs --- package.json | 1 + src/commands/play.ts | 19 ++++++++++++++++--- src/services/get-songs.ts | 23 ++++++++++++++++++----- yarn.lock | 12 ++++++++++++ 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index c37da7e..0472ca3 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,7 @@ "spotify-uri": "^2.0.0", "spotify-web-api-node": "^4.0.0", "sqlite3": "^4.1.1", + "unique-random-array": "^2.0.0", "youtube.ts": "^0.1.1", "ytdl-core": "^2.0.0", "ytsr": "^0.1.11" diff --git a/src/commands/play.ts b/src/commands/play.ts index bcafdbf..eceac94 100644 --- a/src/commands/play.ts +++ b/src/commands/play.ts @@ -71,6 +71,7 @@ export default class implements Command { } const newSongs: QueuedSong[] = []; + let extraMsg = ''; // Test if it's a complete URL try { @@ -95,7 +96,15 @@ export default class implements Command { } } } else if (url.protocol === 'spotify:' || url.host === 'open.spotify.com') { - const [convertedSongs] = await this.getSongs.spotifySource(args[0]); + const [convertedSongs, nSongsNotFound, totalSongs] = await this.getSongs.spotifySource(args[0]); + + if (totalSongs > 50) { + extraMsg = 'a random sample of 50 songs was taken'; + } + + if (nSongsNotFound !== 0) { + extraMsg += `and ${nSongsNotFound.toString()} songs were not found`; + } newSongs.push(...convertedSongs); } @@ -122,10 +131,14 @@ export default class implements Command { const firstSong = newSongs[0]; + if (extraMsg !== '') { + extraMsg = ` (${extraMsg})`; + } + if (newSongs.length === 1) { - await res.stop(`u betcha, **${firstSong.title}** added to the queue`); + await res.stop(`u betcha, **${firstSong.title}** added to the queue${extraMsg}`); } else { - await res.stop(`u betcha, **${firstSong.title}** and ${newSongs.length - 1} other songs were added to the queue`); + await res.stop(`u betcha, **${firstSong.title}** and ${newSongs.length - 1} other songs were added to the queue${extraMsg}`); } if (this.playerManager.get(msg.guild!.id).voiceConnection === null) { diff --git a/src/services/get-songs.ts b/src/services/get-songs.ts index 19fc6c0..347d9d6 100644 --- a/src/services/get-songs.ts +++ b/src/services/get-songs.ts @@ -7,6 +7,7 @@ import Spotify from 'spotify-web-api-node'; import ytsr from 'ytsr'; import YouTube from 'youtube.ts'; import pLimit from 'p-limit'; +import uniqueRandomArray from 'unique-random-array'; import {QueuedSong, QueuedPlaylist} from '../services/queue'; import {TYPES} from '../types'; @@ -77,10 +78,10 @@ export default class { }); } - async spotifySource(url: string): Promise<[QueuedSong[], number]> { + async spotifySource(url: string): Promise<[QueuedSong[], number, number]> { const parsed = spotifyURI.parse(url); - const tracks: SpotifyApi.TrackObjectSimplified[] = []; + let tracks: SpotifyApi.TrackObjectSimplified[] = []; let playlist: QueuedPlaylist | null = null; @@ -137,12 +138,24 @@ export default class { } default: { - return [[], 0]; + return [[], 0, 0]; + } + } + + // Get 50 random songs if many + const originalNSongs = tracks.length; + + if (tracks.length > 50) { + const random = uniqueRandomArray(tracks); + + tracks = []; + for (let i = 0; i < 50; i++) { + tracks.push(random()); } } // Limit concurrency so hopefully we don't get banned for searching - const limit = pLimit(3); + const limit = pLimit(5); let songs = await Promise.all(tracks.map(async track => limit(async () => this.spotifyToYouTube(track, playlist)))); let nSongsNotFound = 0; @@ -158,7 +171,7 @@ export default class { return accum; }, []); - return [songs as QueuedSong[], nSongsNotFound]; + return [songs as QueuedSong[], nSongsNotFound, originalNSongs]; } private async spotifyToYouTube(track: SpotifyApi.TrackObjectSimplified, playlist: QueuedPlaylist | null): Promise { diff --git a/yarn.lock b/yarn.lock index 0c74bda..5aab5c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2805,6 +2805,18 @@ undefsafe@^2.0.2: dependencies: debug "^2.2.0" +unique-random-array@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-random-array/-/unique-random-array-2.0.0.tgz#9e639b1a9dc141e97350a6fc6f17da4b0717b1ad" + integrity sha512-xR87O95fZ7hljw84J8r1YDXrvffPLWN513BNOP4Bv0KcgG5dyEUrHwsvP7mVAOKg4Y80uqRbpUk0GKr8il70qg== + dependencies: + unique-random "^2.1.0" + +unique-random@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unique-random/-/unique-random-2.1.0.tgz#7a8413da5176d028567168b57125ac5c0cec5c25" + integrity sha512-iQ1ZgWac3b8YxGThecQFRQiqgk6xFERRwHZIWeVVsqlbmgCRl0PY13R4mUkodNgctmg5b5odG1nyW/IbOxQTqg== + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"