diff --git a/src/utils/spotify/trackService.ts b/src/utils/spotify/trackService.ts index ecee11b..7881aaa 100644 --- a/src/utils/spotify/trackService.ts +++ b/src/utils/spotify/trackService.ts @@ -1,9 +1,15 @@ -import playdl, { Spotify, SpotifyPlaylist, SpotifyTrack } from "play-dl"; +import playdl from "play-dl"; import { getVideo } from "../youtube/videoService"; import spotifyApi from "./spotifyAPI"; import { ITrack, TypeTrack } from "../../interfaces/spotify/ITrack"; import { IPlaylist, TypePlaylist } from "../../interfaces/spotify/IPlaylist"; +const getTrackSearchName = (track: SpotifyApi.SingleTrackResponse) => { + const trackName = track.name; + const artists = track.artists.map((artist) => artist.name).join(", "); + return `${trackName} ${artists}`; +}; + const trackToYT = async (trackName: string): Promise => { const ytSearched = await playdl.search(trackName, { limit: 1 }); const ytURL = ytSearched[0].url; @@ -21,6 +27,27 @@ const trackToYT = async (trackName: string): Promise => { }; }; +const trackToYTByID = async (trackID: string): Promise => { + const track = (await spotifyApi.getTrack(trackID)).body; + + const ytSearched = await playdl.search(getTrackSearchName(track), { + limit: 1, + }); + const ytURL = ytSearched[0].url; + const videoId = ytSearched[0].id; + const videoInfo = await getVideo(videoId); + + return { + youtube_url: ytURL, + options: { + videoId, + title: videoInfo.title, + duration: videoInfo.duration, + description: videoInfo.description, + }, + }; +}; + const playlistToYT = async (playlistID: string): Promise => { const tracks = ( await spotifyApi.getPlaylistTracks(playlistID, { @@ -30,7 +57,9 @@ const playlistToYT = async (playlistID: string): Promise => { ).body; const promises = []; - tracks.items.map(({ track }) => promises.push(trackToYT(track.name))); + tracks.items.map(({ track }) => + promises.push(trackToYT(getTrackSearchName(track))) + ); const videos = await Promise.all(promises); @@ -44,7 +73,7 @@ const spotifyToYT = async (spotifyURL: string) => { switch (spotifyResponse.type) { case "track": { - const track = await trackToYT(spotifyResponse.name); + const track = await trackToYTByID(spotifyResponse.id); return { type: "VIDEO", ...track } as TypeTrack; } case "playlist": {