From 944192bb4dceeea1cbdc0f688c5a36e3453928a8 Mon Sep 17 00:00:00 2001 From: badaueba Date: Fri, 28 Jul 2023 01:22:34 -0300 Subject: [PATCH 1/2] feat(src/bot): adding command lyrics --- src/bot/commands/command-lyrics.ts | 33 +++++++++++++++++++++++++++++ src/bot/commands/command-map.ts | 2 ++ src/bot/commands/command-play.ts | 4 +++- src/bot/commands/index.ts | 1 + src/bot/index.ts | 34 ++++++++++++++++++------------ src/bot/marli-music.ts | 2 ++ src/sources/source-lyrics.ts | 9 ++++++++ 7 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 src/bot/commands/command-lyrics.ts create mode 100644 src/sources/source-lyrics.ts diff --git a/src/bot/commands/command-lyrics.ts b/src/bot/commands/command-lyrics.ts new file mode 100644 index 0000000..8440ba5 --- /dev/null +++ b/src/bot/commands/command-lyrics.ts @@ -0,0 +1,33 @@ +import { Message } from 'discord.js'; +import { Command } from './command'; +import { MarliMusic } from '../marli-music'; +import { LyricsSearch } from '@/sources/source-lyrics'; + +export class ShowLyrics extends Command { + constructor(protected bot: MarliMusic) { + super(bot); + this.name = 'lyrics'; + } + async execute(message: Message): Promise { + try { + this.validate(message, 'show lyrics'); + const queue = this.getQueue(); + const items = queue.getList(message.member.voice.channelId); + const current = items.shift(); + + const { userSearch, streamInfo } = current; + + const search: LyricsSearch = { + artist: streamInfo.artist, + title: streamInfo.title, + userSearch, + }; + + const lyrics = await this.bot.sourceLyrics.getLyrics(search); + console.log({ lyrics }); + message.channel.send(lyrics); + } catch (error) { + this.sendCommandError(error, message); + } + } +} diff --git a/src/bot/commands/command-map.ts b/src/bot/commands/command-map.ts index aa69f66..4b118de 100644 --- a/src/bot/commands/command-map.ts +++ b/src/bot/commands/command-map.ts @@ -1,3 +1,4 @@ +import { ShowLyrics } from './command-lyrics'; import { CommandHelp } from './command-help'; import { ListQueue } from './command-list-queue'; import { Pause } from './command-pause'; @@ -18,4 +19,5 @@ export const ALL_COMMANDS: Record = { queue: ListQueue, help: CommandHelp, shuffle: Shuffle, + lyrics: ShowLyrics, }; diff --git a/src/bot/commands/command-play.ts b/src/bot/commands/command-play.ts index 441649e..c7cebe0 100644 --- a/src/bot/commands/command-play.ts +++ b/src/bot/commands/command-play.ts @@ -7,6 +7,7 @@ import { BOT_MESSAGES } from '../containts/default-messages'; import { MarliMusic } from '../marli-music'; import { Command } from './command'; import { PlayHook } from './hooks/command-play-hook'; +import { ListQueue } from './command-list-queue'; export class Play extends Command { constructor(bot: MarliMusic) { @@ -62,8 +63,9 @@ export class Play extends Command { replyContent = `${message.author.username} ${BOT_MESSAGES.CURRENT_PLAYING} ${firstSong.title} - ${firstSong.artist}`; } - await message.channel.send(replyContent); + const listQueue = new ListQueue(this.bot); + await listQueue.execute(message); } catch (err) { await this.sendCommandError(err, message); } diff --git a/src/bot/commands/index.ts b/src/bot/commands/index.ts index 768ace0..4ecfc63 100644 --- a/src/bot/commands/index.ts +++ b/src/bot/commands/index.ts @@ -9,3 +9,4 @@ export { Command } from './command'; export { ListQueue } from './command-list-queue'; export { CommandHelp } from './command-help'; export { Shuffle } from './command-shuffle'; +export { ShowLyrics } from './command-lyrics'; diff --git a/src/bot/index.ts b/src/bot/index.ts index f6166af..e8106b4 100644 --- a/src/bot/index.ts +++ b/src/bot/index.ts @@ -3,6 +3,7 @@ import * as dotenv from 'dotenv'; import { LocalQueue } from '../queue/queue'; import { PlayDlSourceStream } from '../sources/play-dl-source/play-dl-source'; import { MarliMusic } from './marli-music'; +import { GeniusLyricsSource } from '@/sources/genius-lyrics/genius-lyrics-source'; dotenv.config(); @@ -13,20 +14,27 @@ export function botStartup() { }; const queue = new LocalQueue(); const sourceStream = new PlayDlSourceStream(); + const sourceLyrics = new GeniusLyricsSource(); - const marliMusic = new MarliMusic(botInfo, sourceStream, queue, { - intents: [ - 'Guilds', - 'GuildMessages', - 'MessageContent', - 'GuildVoiceStates', - 'DirectMessageReactions', - 'GuildEmojisAndStickers', - 'GuildMembers', - 'GuildMessageTyping', - 'GuildMessageReactions', - ], - }); + const marliMusic = new MarliMusic( + botInfo, + sourceStream, + sourceLyrics, + queue, + { + intents: [ + 'Guilds', + 'GuildMessages', + 'MessageContent', + 'GuildVoiceStates', + 'DirectMessageReactions', + 'GuildEmojisAndStickers', + 'GuildMembers', + 'GuildMessageTyping', + 'GuildMessageReactions', + ], + } + ); return marliMusic; } diff --git a/src/bot/marli-music.ts b/src/bot/marli-music.ts index 6450365..4383861 100644 --- a/src/bot/marli-music.ts +++ b/src/bot/marli-music.ts @@ -10,6 +10,7 @@ import { AudioPlayer } from '@discordjs/voice'; import { ALL_COMMANDS, Command } from './commands'; import { CommandHelp } from './commands/command-help'; import { BOT_MESSAGES } from './containts/default-messages'; +import { SourceLyrics } from '@/sources/source-lyrics'; export interface BotInfo { prefix: string; @@ -24,6 +25,7 @@ export class MarliMusic extends Client { constructor( private botInfo: BotInfo, public sourceStream: SourceStream, + public sourceLyrics: SourceLyrics, public queue: Queue, options?: ClientOptions ) { diff --git a/src/sources/source-lyrics.ts b/src/sources/source-lyrics.ts new file mode 100644 index 0000000..b5fc3c7 --- /dev/null +++ b/src/sources/source-lyrics.ts @@ -0,0 +1,9 @@ +export interface LyricsSearch { + title: string; + artist?: string; + userSearch?: string; +} + +export interface SourceLyrics { + getLyrics(input: LyricsSearch): Promise; +} From 56a56a5a52d4c261995ed0ea55d31f5afb6e452e Mon Sep 17 00:00:00 2001 From: badaueba Date: Fri, 28 Jul 2023 01:23:11 -0300 Subject: [PATCH 2/2] feat(src/sources): testing out lyrics libs (genius-lyrics-ts, songlyrics) --- package.json | 2 + .../genius-lyrics/genius-lyrics-source.ts | 26 +++ src/sources/song-lyrics/song-lyrics-source.ts | 10 ++ yarn.lock | 149 +++++++++++++++++- 4 files changed, 183 insertions(+), 4 deletions(-) create mode 100644 src/sources/genius-lyrics/genius-lyrics-source.ts create mode 100644 src/sources/song-lyrics/song-lyrics-source.ts diff --git a/package.json b/package.json index b2b4787..3cb4eec 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,10 @@ "express": "^4.18.2", "ffmpeg": "^0.0.4", "fluent-ffmpeg": "^2.1.2", + "genius-lyrics-ts": "^0.2.4", "http": "^0.0.1-security", "play-dl": "^1.9.6", + "songlyrics": "^2.4.5", "winston": "^3.8.2", "yt-search": "^2.10.4", "ytdl-core": "^4.11.4" diff --git a/src/sources/genius-lyrics/genius-lyrics-source.ts b/src/sources/genius-lyrics/genius-lyrics-source.ts new file mode 100644 index 0000000..18ee6cf --- /dev/null +++ b/src/sources/genius-lyrics/genius-lyrics-source.ts @@ -0,0 +1,26 @@ +import { LyricsSearch } from './../source-lyrics'; +import genius from 'genius-lyrics-ts'; +import { SongLyricsSource } from '../song-lyrics/song-lyrics-source'; + +export class GeniusLyricsSource implements SongLyricsSource { + public async getLyrics(search: LyricsSearch, retries = 2): Promise { + try { + const { artist, title } = search; + console.log({ search, retries }); + const response = await genius({ title, artist, optimizeQuery: false }); + console.log({ response }); + if (!response) throw new Error('LYRICS_NOT_FOUND'); + return response; + } catch (error) { + console.log({ error }); + if (retries > 1) { + return await this.getLyrics( + { + title: search.userSearch, + }, + --retries + ); + } else throw new Error('LYRICS_NOT_FOUND'); + } + } +} diff --git a/src/sources/song-lyrics/song-lyrics-source.ts b/src/sources/song-lyrics/song-lyrics-source.ts new file mode 100644 index 0000000..37474a9 --- /dev/null +++ b/src/sources/song-lyrics/song-lyrics-source.ts @@ -0,0 +1,10 @@ +import songLyrics from 'songlyrics'; +import { LyricsSearch, SourceLyrics } from '../source-lyrics'; + +export class SongLyricsSource implements SourceLyrics { + public async getLyrics(search: LyricsSearch): Promise { + const response = await songLyrics(search.artist + search.title); + console.log(response); + return response.lyrics; + } +} diff --git a/yarn.lock b/yarn.lock index 7f6f62c..9458807 100644 --- a/yarn.lock +++ b/yarn.lock @@ -312,6 +312,51 @@ tslib "^2.5.0" ws "^8.13.0" +"@effect/data@>=0.16.0 <0.17.0", "@effect/data@^0.16.0", "@effect/data@^0.16.2", "@effect/data@^0.16.3": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@effect/data/-/data-0.16.3.tgz#bb878414c4c0aca6effec6948b386ad85cb9d5d2" + integrity sha512-RxRN3Vm8YPys0GjH/yjl2Z57kGCwJGjY6omgcDbeXhLVd+SUaVWbM6hJysKvb/gD9cuN1XwhXUnJ0shVErDelg== + +"@effect/io@>=0.35.0 <0.36.0", "@effect/io@^0.35.0", "@effect/io@^0.35.1", "@effect/io@^0.35.2": + version "0.35.3" + resolved "https://registry.yarnpkg.com/@effect/io/-/io-0.35.3.tgz#aafcb30a7875abb00484c2cd278b1cec12acba2f" + integrity sha512-f0K2XQJvQY0DP6GQC76NUZgFh2QxKIpZZzIELyI8796uJtLt4CRx3s+YsJF68htgUttKm9hxkfcbtcJAg2Rmcw== + dependencies: + "@effect/data" "^0.16.0" + +"@effect/match@>=0.29.0 <0.30.0": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@effect/match/-/match-0.29.1.tgz#4bd796b453ae9e5dea15f9d18bd648ab48bd27eb" + integrity sha512-ZstaS5ZLpX5RwLX8GuV9JeQuAKLCxFu+pU8iirVFYftc+8wUxcPUiGI1ryNupKW62m4IlcNrTz05JvtemNy82A== + dependencies: + "@effect/data" "^0.16.3" + "@effect/schema" "^0.30.3" + +"@effect/schema@^0.30.3": + version "0.30.4" + resolved "https://registry.yarnpkg.com/@effect/schema/-/schema-0.30.4.tgz#ffbd21c24bf4e1ea175dd71073b5ad2a7c3bdcb9" + integrity sha512-4MQkp4mStbJ2f5tRXc0cquCp1KgnmqgstGAjJAteed2dz84yoQ4kBD4gy7OCO8E1uChoqMbvB1ezxPrJ9EPEOw== + dependencies: + "@effect/data" "^0.16.2" + "@effect/io" "^0.35.2" + fast-check "^3.11.0" + +"@effect/stm@>=0.19.0 <0.20.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@effect/stm/-/stm-0.19.0.tgz#c86631637b1da81df9bd7f3267147a339361fdf9" + integrity sha512-mwyz0gU3AmX4IpO+/xF19PC3ZZ2nRkZW07ii19SXqzrPk7TkbMmrWoJiDe4Uki5ZMe7nIHIHhCiHmC+cXXJEIA== + dependencies: + "@effect/data" "^0.16.0" + "@effect/io" "^0.35.0" + +"@effect/stream@>=0.30.0 <0.31.0": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@effect/stream/-/stream-0.30.1.tgz#1b97bf6c6ca792659ab76c8b000f9730dd1dece6" + integrity sha512-OU/7qG6iyyYHxh5BmbXvgsiJnq6YeVv3aPJBJbAamK3bTDJv4Tbc0Ps7H3hF3X+1OzfgrRYQd1zKtrtlyoCUDA== + dependencies: + "@effect/data" "^0.16.0" + "@effect/io" "^0.35.1" + "@esbuild-kit/cjs-loader@^2.4.2": version "2.4.2" resolved "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.2.tgz" @@ -1925,6 +1970,17 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css-select@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + css-select@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" @@ -1936,7 +1992,7 @@ css-select@^5.1.0: domutils "^3.0.1" nth-check "^2.0.1" -css-what@^6.1.0: +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -2121,6 +2177,15 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + dom-serializer@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" @@ -2130,11 +2195,18 @@ dom-serializer@^2.0.0: domhandler "^5.0.2" entities "^4.2.0" -domelementtype@^2.3.0: +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== +domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" @@ -2142,6 +2214,15 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + domutils@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" @@ -2166,6 +2247,17 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +effect@2.0.0-next.20: + version "2.0.0-next.20" + resolved "https://registry.yarnpkg.com/effect/-/effect-2.0.0-next.20.tgz#d776bf3b23374439e19bfbc61d285213fb27ffff" + integrity sha512-4YZ1fB6gV/QOVuLxKAhTGiHc4QFk4BTqWlM2DNRW1viK6L7TR7qMybqPvCV/0YeIHjnpKhhtzyQeCq5s5UfSjg== + dependencies: + "@effect/data" ">=0.16.0 <0.17.0" + "@effect/io" ">=0.35.0 <0.36.0" + "@effect/match" ">=0.29.0 <0.30.0" + "@effect/stm" ">=0.19.0 <0.20.0" + "@effect/stream" ">=0.30.0 <0.31.0" + electron-to-chromium@^1.4.284: version "1.4.371" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.371.tgz#393983ef087268a20c926a89be30e9f0bfc803b0" @@ -2191,6 +2283,11 @@ encodeurl@~1.0.2: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" @@ -2541,6 +2638,13 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +fast-check@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.12.0.tgz#440949277387a053f7f82cd532fa3fcf67346ba1" + integrity sha512-SqahE9mlL3+lhjJ39joMLwcj6F+24hfZdf/tchlNO8sHcTdrUUdA5P/ZbSFZM9Xpzs36XaneGwE0FWepm/zyOA== + dependencies: + pure-rand "^6.0.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -2698,7 +2802,7 @@ fn.name@1.x.x: resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, follow-redirects@^1.15.1: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -2789,6 +2893,14 @@ gauge@^3.0.0: strip-ansi "^6.0.1" wide-align "^1.1.2" +genius-lyrics-ts@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/genius-lyrics-ts/-/genius-lyrics-ts-0.2.4.tgz#58173501279450ac355009e813b2f4254fc4ae14" + integrity sha512-aKoQES5O40pGykUgDmghaTUrvxs2oo+j8vDJfrOtNgJTYPEvIq5I3GJ0nmN8mjNkMDzbWO9+hoTfHRuzT7LSJQ== + dependencies: + effect "2.0.0-next.20" + node-html-parser "^6.1.5" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -2980,7 +3092,7 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -he@^1.2.0: +he@1.2.0, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -3902,6 +4014,22 @@ node-fzf@~0.5.1: string-width "~2.1.1" ttys "0.0.3" +node-html-parser@^5.3.3: + version "5.4.2" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-5.4.2.tgz#93e004038c17af80226c942336990a0eaed8136a" + integrity sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw== + dependencies: + css-select "^4.2.1" + he "1.2.0" + +node-html-parser@^6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-6.1.5.tgz#c819dceb13a10a7642ff92f94f870b4f77968097" + integrity sha512-fAaM511feX++/Chnhe475a0NHD8M7AxDInsqQpz6x63GRF7xYNdS8Vo5dKsIVPgsOvG7eioRRTZQnWBrhDHBSg== + dependencies: + css-select "^5.1.0" + he "1.2.0" + node-releases@^2.0.8: version "2.0.10" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" @@ -4289,6 +4417,11 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + qs@6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" @@ -4671,6 +4804,14 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +songlyrics@^2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/songlyrics/-/songlyrics-2.4.5.tgz#048f860d467a0e3d7cba65c0a80f0396c020d1d6" + integrity sha512-Ncue046yIWUnnQTuk4dQMJq6i3VvNZeDGlFFW4/1sBmCUfzc9JXP8kAaxhT3qVt9bTRVIDRn/Kk/gzF33CoqvQ== + dependencies: + follow-redirects "^1.15.1" + node-html-parser "^5.3.3" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"