@@ -7,11 +7,11 @@ import { NodeSymbol, queueTrackEnd } from "./Utils";
77import type { Player } from "./Player" ;
88import type { DestroyReasonsType } from "./Types/Player" ;
99import type { LavalinkTrack , PluginInfo , Track } from "./Types/Track" ;
10- import type { Base64 , InvalidLavalinkRestRequest , LavalinkPlayer , LavaSearchQuery , LavaSearchResponse , LoadTypes , PlayerEvents , PlayerEventType , PlayerUpdateInfo , RoutePlanner , SearchQuery , SearchResult , Session , SponsorBlockChaptersLoaded , SponsorBlockChapterStarted , SponsorBlockSegmentSkipped , SponsorBlockSegmentsLoaded , TrackEndEvent , TrackExceptionEvent , TrackStartEvent , TrackStuckEvent , WebSocketClosedEvent } from "./Types/Utils" ;
10+ import type { Base64 , InvalidLavalinkRestRequest , LavalinkPlayer , LavaSearchQuery , LavaSearchResponse , LoadTypes , LyricsFoundEvent , LyricsLineEvent , LyricsNotFoundEvent , PlayerEvents , PlayerEventType , PlayerUpdateInfo , RoutePlanner , SearchQuery , SearchResult , Session , SponsorBlockChaptersLoaded , SponsorBlockChapterStarted , SponsorBlockSegmentSkipped , SponsorBlockSegmentsLoaded , TrackEndEvent , TrackExceptionEvent , TrackStartEvent , TrackStuckEvent , WebSocketClosedEvent } from "./Types/Utils" ;
1111import type { NodeManager } from "./NodeManager" ;
1212
1313import type {
14- BaseNodeStats , LavalinkInfo , LavalinkNodeOptions , ModifyRequest , NodeStats , SponsorBlockSegment
14+ BaseNodeStats , LavalinkInfo , LavalinkNodeOptions , LyricsResult , ModifyRequest , NodeStats , SponsorBlockSegment
1515} from "./Types/Node" ;
1616/**
1717 * Lavalink Node creator class
@@ -637,6 +637,124 @@ export class LavalinkNode {
637637 }
638638 }
639639
640+ lyrics = {
641+ /**
642+ * Get the lyrics of a track
643+ * @param track the track to get the lyrics for
644+ * @param skipTrackSource wether to skip the track source or not
645+ * @returns the lyrics of the track
646+ * @example
647+ *
648+ * ```ts
649+ * const lyrics = await player.node.lyrics.get(track, true);
650+ * // use it of player instead:
651+ * // const lyrics = await player.getLyrics(track, true);
652+ * ```
653+ */
654+ get : async ( track : Track , skipTrackSource : boolean = false ) => {
655+ if ( ! this . sessionId ) throw new Error ( "the Lavalink-Node is either not ready, or not up to date!" ) ;
656+
657+ if (
658+ ! this . info . plugins . find ( v => v . name === "lavalyrics-plugin" )
659+ ) throw new RangeError ( `there is no lavalyrics-plugin available in the lavalink node (required for lyrics): ${ this . id } ` ) ;
660+
661+ if (
662+ ! this . info . plugins . find ( v => v . name === "lavasrc-plugin" ) &&
663+ ! this . info . plugins . find ( v => v . name === "java-lyrics-plugin" )
664+ ) throw new RangeError ( `there is no lyrics source (via lavasrc-plugin / java-lyrics-plugin) available in the lavalink node (required for lyrics): ${ this . id } ` ) ;
665+
666+ const url = `/lyrics?track=${ track . encoded } &skipTrackSource=${ skipTrackSource } ` ;
667+ return ( await this . request ( url ) ) as LyricsResult | null ;
668+ } ,
669+
670+ /**
671+ * Get the lyrics of the current playing track
672+ *
673+ * @param guildId the guild id of the player
674+ * @param skipTrackSource wether to skip the track source or not
675+ * @returns the lyrics of the current playing track
676+ * @example
677+ * ```ts
678+ * const lyrics = await player.node.lyrics.getCurrent(guildId);
679+ * // use it of player instead:
680+ * // const lyrics = await player.getCurrentLyrics();
681+ * ```
682+ */
683+ getCurrent : async ( guildId : string , skipTrackSource : boolean = false ) => {
684+ if ( ! this . sessionId ) throw new Error ( "the Lavalink-Node is either not ready, or not up to date!" ) ;
685+
686+ if (
687+ ! this . info . plugins . find ( v => v . name === "lavalyrics-plugin" )
688+ ) throw new RangeError ( `there is no lavalyrics-plugin available in the lavalink node (required for lyrics): ${ this . id } ` ) ;
689+
690+ if (
691+ ! this . info . plugins . find ( v => v . name === "lavasrc-plugin" ) &&
692+ ! this . info . plugins . find ( v => v . name === "java-lyrics-plugin" )
693+ ) throw new RangeError ( `there is no lyrics source (via lavasrc-plugin / java-lyrics-plugin) available in the lavalink node (required for lyrics): ${ this . id } ` ) ;
694+
695+ const url = `/sessions/${ this . sessionId } /players/${ guildId } /track/lyrics?skipTrackSource=${ skipTrackSource } ` ;
696+ return ( await this . request ( url ) ) as LyricsResult | null ;
697+ } ,
698+
699+ /**
700+ * subscribe to lyrics updates for a guild
701+ * @param guildId the guild id of the player
702+ * @returns request data of the request
703+ *
704+ * @example
705+ * ```ts
706+ * await player.node.lyrics.subscribe(guildId);
707+ * // use it of player instead:
708+ * // const lyrics = await player.subscribeLyrics();
709+ * ```
710+ */
711+
712+ subscribe : async ( guildId : string ) => {
713+ if ( ! this . sessionId ) throw new Error ( "the Lavalink-Node is either not ready, or not up to date!" ) ;
714+
715+ if (
716+ ! this . info . plugins . find ( v => v . name === "lavalyrics-plugin" )
717+ ) throw new RangeError ( `there is no lavalyrics-plugin available in the lavalink node (required for lyrics): ${ this . id } ` ) ;
718+
719+ if (
720+ ! this . info . plugins . find ( v => v . name === "lavasrc-plugin" ) &&
721+ ! this . info . plugins . find ( v => v . name === "java-lyrics-plugin" )
722+ ) throw new RangeError ( `there is no lyrics source (via lavasrc-plugin / java-lyrics-plugin) available in the lavalink node (required for lyrics): ${ this . id } ` ) ;
723+
724+ return await this . request ( `/sessions/${ this . sessionId } /players/${ guildId } /lyrics/subscribe` , ( options ) => {
725+ options . method = "POST" ;
726+ } ) . catch ( ( ) => { } ) ;
727+ } ,
728+ /**
729+ * unsubscribe from lyrics updates for a guild
730+ * @param guildId the guild id of the player
731+ * @returns request data of the request
732+ *
733+ * @example
734+ * ```ts
735+ * await player.node.lyrics.unsubscribe(guildId);
736+ * // use it of player instead:
737+ * // const lyrics = await player.unsubscribeLyrics();
738+ * ```
739+ */
740+ unsubscribe : async ( guildId : string ) => {
741+ if ( ! this . sessionId ) throw new Error ( "the Lavalink-Node is either not ready, or not up to date!" ) ;
742+
743+ if (
744+ ! this . info . plugins . find ( v => v . name === "lavalyrics-plugin" )
745+ ) throw new RangeError ( `there is no lavalyrics-plugin available in the lavalink node (required for lyrics): ${ this . id } ` ) ;
746+
747+ if (
748+ ! this . info . plugins . find ( v => v . name === "lavasrc-plugin" ) &&
749+ ! this . info . plugins . find ( v => v . name === "java-lyrics-plugin" )
750+ ) throw new RangeError ( `there is no lyrics source (via lavasrc-plugin / java-lyrics-plugin) available in the lavalink node (required for lyrics): ${ this . id } ` ) ;
751+
752+ return await this . request ( `/sessions/${ this . sessionId } /players/${ guildId } /lyrics/unsubscribe` , ( options ) => {
753+ options . method = "DELETE" ;
754+ } ) . catch ( ( ) => { } ) ;
755+ } ,
756+ } ;
757+
640758 /**
641759 * Request Lavalink statistics.
642760 * @returns the lavalink node stats
@@ -1017,6 +1135,9 @@ export class LavalinkNode {
10171135 case "SegmentSkipped" : this . SponsorBlockSegmentSkipped ( player , player . queue . current as Track , payload ) ; break ;
10181136 case "ChaptersLoaded" : this . SponsorBlockChaptersLoaded ( player , player . queue . current as Track , payload ) ; break ;
10191137 case "ChapterStarted" : this . SponsorBlockChapterStarted ( player , player . queue . current as Track , payload ) ; break ;
1138+ case "LyricsLineEvent" : this . LyricsLine ( player , player . queue . current as Track , payload ) ; break ;
1139+ case "LyricsFoundEvent" : this . LyricsFound ( player , player . queue . current as Track , payload ) ; break ;
1140+ case "LyricsNotFoundEvent" : this . LyricsNotFound ( player , player . queue . current as Track , payload ) ; break ;
10201141 default : this . NodeManager . emit ( "error" , this , new Error ( `Node#event unknown event '${ ( payload as PlayerEventType & PlayerEvents ) . type } '.` ) , ( payload as PlayerEventType & PlayerEvents ) ) ; break ;
10211142 }
10221143 return ;
@@ -1369,4 +1490,36 @@ export class LavalinkNode {
13691490
13701491 return this . NodeManager . LavalinkManager . emit ( "queueEnd" , player , track , payload ) ;
13711492 }
1493+
1494+ /**
1495+ * Emitted whenever a line of lyrics gets emitted
1496+ * @event
1497+ * @param {Player } player The player that emitted the event
1498+ * @param {Track } track The track that emitted the event
1499+ * @param {LyricsLineEvent } payload The payload of the event
1500+ */
1501+ private LyricsLine ( player : Player , track : Track , payload : LyricsLineEvent ) {
1502+ return this . NodeManager . LavalinkManager . emit ( "LyricsLine" , player , track , payload ) ;
1503+ }
1504+
1505+ /**
1506+ * Emitted whenever the lyrics for a track got found
1507+ * @event
1508+ * @param {Player } player The player that emitted the event
1509+ * @param {Track } track The track that emitted the event
1510+ * @param {LyricsFoundEvent } payload The payload of the event
1511+ */
1512+ private LyricsFound ( player : Player , track : Track , payload : LyricsFoundEvent ) {
1513+ return this . NodeManager . LavalinkManager . emit ( "LyricsFound" , player , track , payload ) ;
1514+ }
1515+ /**
1516+ * Emitted whenever the lyrics for a track got not found
1517+ * @event
1518+ * @param {Player } player The player that emitted the event
1519+ * @param {Track } track The track that emitted the event
1520+ * @param {LyricsNotFoundEvent } payload The payload of the event
1521+ */
1522+ private LyricsNotFound ( player : Player , track : Track , payload : LyricsNotFoundEvent ) {
1523+ return this . NodeManager . LavalinkManager . emit ( "LyricsNotFound" , player , track , payload ) ;
1524+ }
13721525}
0 commit comments