diff --git a/src/backend/src/playlist/playlist.module.ts b/src/backend/src/playlist/playlist.module.ts index 17299da..4095f71 100644 --- a/src/backend/src/playlist/playlist.module.ts +++ b/src/backend/src/playlist/playlist.module.ts @@ -4,10 +4,12 @@ import {PlaylistEntity} from "./playlist.entity"; import {PlaylistService} from "./playlist.service"; import {PlaylistController} from "./playlist.controller"; import {TrackModule} from "../track/track.module"; +import {ConfigModule} from "@nestjs/config"; @Module({ imports: [ TypeOrmModule.forFeature([PlaylistEntity]), + ConfigModule, TrackModule, ], providers: [PlaylistService], diff --git a/src/backend/src/playlist/playlist.service.ts b/src/backend/src/playlist/playlist.service.ts index 010ae35..8a62999 100644 --- a/src/backend/src/playlist/playlist.service.ts +++ b/src/backend/src/playlist/playlist.service.ts @@ -6,7 +6,10 @@ import {TrackService} from "../track/track.service"; import {WebSocketGateway, WebSocketServer} from "@nestjs/websockets"; import {Server} from "socket.io"; import {TrackStatusEnum} from "../track/track.model"; - +import {resolve} from "path"; +import {ConfigService} from "@nestjs/config"; +import {EnviromentEnum} from "../enviroment.enum"; +import * as fs from 'fs'; const fetch = require('isomorphic-unfetch'); const { getData, getPreview, getTracks, getDetails } = require('spotify-url-info')(fetch); @@ -20,6 +23,7 @@ export class PlaylistService { @InjectRepository(PlaylistEntity) private repository: Repository, private readonly trackService: TrackService, + private readonly configService: ConfigService, ) {} findAll(): Promise { @@ -46,6 +50,8 @@ export class PlaylistService { } const savedPlaylist = await this.repository.save(playlist2Save); this.io.emit('playlistNew', savedPlaylist); + const folderName = resolve(__dirname, '..',this.configService.get(EnviromentEnum.DOWNLOADS_PATH), savedPlaylist.name); + !fs.existsSync(folderName) && fs.mkdirSync(folderName); for(let track of details?.tracks ?? []) { await this.trackService.create({ artist: track.artist, diff --git a/src/backend/src/track/track.service.ts b/src/backend/src/track/track.service.ts index 3447d29..e28f65e 100644 --- a/src/backend/src/track/track.service.ts +++ b/src/backend/src/track/track.service.ts @@ -28,8 +28,8 @@ export class TrackService { private readonly configService: ConfigService, ) {} - findAll(criteria?: Partial): Promise { - return this.repository.find({where: criteria}); + findAll(where?: Partial, relations: string[] = []): Promise { + return this.repository.find({where, relations}); } getAllByPlaylist(id: number): Promise { @@ -82,14 +82,14 @@ export class TrackService { @Interval(1000) async download() { - const queuedTracks = await this.findAll({status: TrackStatusEnum.Queued}); + const queuedTracks = await this.findAll({status: TrackStatusEnum.Queued}, ['playlist']); for (let track of queuedTracks) { await this.update(track.id, {...track, status: TrackStatusEnum.Downloading}); } for(let track of queuedTracks) { let error: string; try { - await this.youtubeDownload(track); + await this.youtubeDownload(track, track.playlist.name); } catch(err) { console.log(err); error = String(err); @@ -103,7 +103,7 @@ export class TrackService { } } - private youtubeDownload(track: TrackEntity): Promise { + private youtubeDownload(track: TrackEntity, playlistName: string): Promise { return new Promise((res, reject) => { const audio = ytdl(track.youtubeUrl, {quality: "highestaudio", filter: "audioonly"}) .on('error', (err) => reject(err)); @@ -114,7 +114,7 @@ export class TrackService { .pipe( fs.createWriteStream( resolve( - __dirname, '..', this.configService.get(EnviromentEnum.DOWNLOADS_PATH), + __dirname, '..', this.configService.get(EnviromentEnum.DOWNLOADS_PATH), playlistName, `${track.artist} - ${track.song.replace('/', '')}.${this.configService.get(EnviromentEnum.FORMAT)}` ) ).on('finish', () => res()).on('error', (err) => reject(err))