Skip to content

Commit

Permalink
getTrackBySongsArray
Browse files Browse the repository at this point in the history
  • Loading branch information
Dobrunia committed Dec 11, 2023
1 parent 9e5f835 commit 8ef4dd3
Show file tree
Hide file tree
Showing 22 changed files with 292 additions and 80 deletions.
245 changes: 177 additions & 68 deletions controlers/music-controller.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
import fs from 'fs';
import path from 'path';
import { promisify } from 'util';
import {
returnPlaylistsByAuthor,
saveAudioToPlaylist,
savePlaylist,
} from '../services/sqlwrapper.js';
import { uuid } from 'uuidv4';
const readFileAsync = promisify(fs.readFile);

class MusicController {
async saveAudio(request, response, next) {
try {
// Получение данных из формы
const trackName = request.body.trackName ? request.body.trackName : 'Не указано';
const trackName = request.body.trackName
? request.body.trackName
: 'Не указано';
const trackAuthor = request.body.trackAuthor
? request.body.trackAuthor
: 'Не указан';

// Получение загруженных файлов
const audioFile = request.files['audioFile']
? request.files['audioFile'][0]
: null;
Expand All @@ -24,69 +30,87 @@ class MusicController {
? request.files['imageFile'][0]
: null;

// Проверка наличия папки с требуемым именем
const folderName = `${trackName}_${trackAuthor}_${request.user.id}`;
const trackId = uuid();
const folderName = `${trackName}_${trackAuthor}_${trackId}`; // Генерация уникального id
const folderPath = path.join('uploads', folderName);
if (fs.existsSync(folderPath)) {
return response.status(400).json({ error: 'Папка уже существует' });
}

// Создание новой папки
if (audioFile) {
fs.mkdirSync(folderPath);
}

// Создание нового имени для сохраняемых файлов
const audioFileName = `${trackName}.mp3`;
const imageFileName = `${trackName}.png`;

// Перемещение аудиофайла в нужную папку
if (audioFile) {
fs.renameSync(audioFile.path, path.join(folderPath, audioFileName));
}

// Перемещение изображения, если оно было загружено
if (imageFile) {
fs.renameSync(imageFile.path, path.join(folderPath, imageFileName));
}

// Создание текстового файла
const txtData = `trackName: ${trackName}\ntrackAuthor: ${trackAuthor}`;
const txtData = `id: ${trackId}\ntrackName: ${trackName}\ntrackAuthor: ${trackAuthor}`;
fs.writeFileSync(path.join(folderPath, 'info.txt'), txtData);

// Возврат ответа с информацией о сохранении
response.status(200).json({ message: 'Файлы успешно сохранены' });
} catch (error) {
// Обработка ошибок
console.error(error);
response.status(500).json({ error: 'Что-то пошло не так' });
}
}

async savePlaylist(request, response, next) {
try {
const DATA = {
name: request.body.playlistName
? request.body.playlistName
: 'Без названия',
description: request.body.playlistDescription
? request.body.playlistDescription
: '',
img: request.file ? request.file.buffer : null,
authorId: request.user.id,
};
const res = await savePlaylist(DATA);
response.json(res);
} catch (error) {
next(error);
}
}

async addAudioToPlaylist(request, response, next) {
try {
const res = await saveAudioToPlaylist(
request.body.audioId,
request.body.playlistId,
);
response.json(res);
} catch (error) {
next(error);
}
}

async getAllTracks(request, response, next) {
try {
const tracksDir = 'uploads'; // Папка, где хранятся все треки
const tracksDir = 'uploads';
const trackFolders = fs.readdirSync(tracksDir);

// Создание массива для хранения данных о треках
const tracks = [];

// Обход всех папок (треков)
for (const folder of trackFolders) {
const folderPath = path.join(tracksDir, folder);

// Проверка, является ли элемент папкой
if (fs.lstatSync(folderPath).isDirectory()) {
// Чтение информации из текстового файла
const txtFilePath = path.join(folderPath, 'info.txt');
const txtData = fs.readFileSync(txtFilePath, 'utf8');

// Разбиение данных на строки и чтение полей
const lines = txtData.split('\n');
const trackName = lines[0].split(':')[1].trim();
const trackAuthor = lines[1].split(':')[1].trim();
const trackId = lines[0].split(':')[1].trim();
const trackName = lines[1].split(':')[1].trim();
const trackAuthor = lines[2].split(':')[1].trim();

// Поиск изображения в папке трека
const imageFiles = fs
.readdirSync(folderPath)
.filter(
Expand All @@ -96,66 +120,64 @@ class MusicController {
file.endsWith('.jpeg'),
);

// Проверка наличия изображения в папке
let trackImage = null;
if (imageFiles.length > 0) {
const imageFilePath = path.join(folderPath, imageFiles[0]);
const imageData = await readFileAsync(imageFilePath);
trackImage = imageData.toString('base64');
const imageData = await readFileAsync(imageFilePath, 'base64'); // Открываем файл как base64
trackImage = imageData.toString();
}

// Поиск аудиофайлов mp3 в папке трека
const audioFiles = fs
.readdirSync(folderPath)
.filter((file) => file.endsWith('.mp3'));

// Проверка наличия аудиофайлов в папке
const trackAudios = [];
if (audioFiles.length > 0) {
for (const audioFile of audioFiles) {
const audioFilePath = path.join(folderPath, audioFile);
const audioData = await readFileAsync(audioFilePath);
const base64Audio = audioData.toString('base64');
const audioData = await readFileAsync(audioFilePath, 'base64'); // Открываем файл как base64
const base64Audio = audioData.toString();
const audioName = audioFile.replace('.mp3', '');
trackAudios.push({ audioName, base64Audio });
}
}

// Добавление данных о треке, изображении и аудиофайлах в массив
tracks.push({ trackName, trackAuthor, trackImage, trackAudios });
tracks.push({
trackId,
trackName,
trackAuthor,
trackImage,
trackAudios,
});
}
}

// Отправка массива треков в качестве ответа
response.status(200).json(tracks);
} catch (error) {
// Обработка ошибок
response.status(500).json({ error: 'Что-то пошло не так' });
}
}

async getTrackByString(request, response, next) {
try {
const searchString = request.params.string.toLowerCase(); // Get the string parameter from the request and convert it to lowercase for case insensitivity
const tracksDir = 'uploads'; // Folder where the tracks are stored
const searchString = request.params.string.toLowerCase();

const tracksDir = 'uploads';
const trackFolders = fs.readdirSync(tracksDir);
const tracks = [];

// Search for the track matching the string in each track folder

for (const folder of trackFolders) {
const folderPath = path.join(tracksDir, folder);

if (fs.lstatSync(folderPath).isDirectory()) {
// Read track information from the info.txt file
const txtFilePath = path.join(folderPath, 'info.txt');
const txtData = fs.readFileSync(txtFilePath, 'utf8');

const lines = txtData.split('\n');
const trackName = lines[0].split(':')[1].trim().toLowerCase(); // Get the track name and convert it to lowercase
const trackAuthor = lines[1].split(':')[1].trim();

// Поиск изображения в папке трека
const trackId = lines[0].split(':')[1].trim();
const trackName = lines[1].split(':')[1].trim();
const trackAuthor = lines[2].split(':')[1].trim();

const imageFiles = fs
.readdirSync(folderPath)
.filter(
Expand All @@ -164,55 +186,142 @@ class MusicController {
file.endsWith('.jpg') ||
file.endsWith('.jpeg'),
);

// Проверка наличия изображения в папке

let trackImage = null;
if (imageFiles.length > 0) {
const imageFilePath = path.join(folderPath, imageFiles[0]);
const imageData = await readFileAsync(imageFilePath);
trackImage = imageData.toString('base64');
const imageData = await readFileAsync(imageFilePath, 'base64'); // Открываем файл как base64
trackImage = imageData.toString();
}

// Поиск аудиофайлов mp3 в папке трека

const audioFiles = fs
.readdirSync(folderPath)
.filter((file) => file.endsWith('.mp3'));

// Проверка наличия аудиофайлов в папке

const trackAudios = [];
if (audioFiles.length > 0) {
for (const audioFile of audioFiles) {
const audioFilePath = path.join(folderPath, audioFile);
const audioData = await readFileAsync(audioFilePath);
const base64Audio = audioData.toString('base64');
const audioData = await readFileAsync(audioFilePath, 'base64'); // Открываем файл как base64
const base64Audio = audioData.toString();
const audioName = audioFile.replace('.mp3', '');
trackAudios.push({ audioName, base64Audio });
}
}

// Check if the track name contains the search string
if (trackName.includes(searchString) || trackAuthor.includes(searchString)) {
// Read track image and audio files
// ...

// Push the track information to the array of tracks
tracks.push({ trackName, trackAuthor, trackImage, trackAudios });

if (
trackName.includes(searchString) ||
trackAuthor.includes(searchString)
) {
tracks.push({
trackId,
trackName,
trackAuthor,
trackImage,
trackAudios,
});
}
}
}

// If tracks are found, return the array of tracks

if (tracks.length > 0) {
response.status(200).json(tracks);
} else {
// If no track is found, return a response indicating that no track was found
response.status(404).json({ error: 'Track not found' });
}
} catch (error) {
// Handle errors
response.status(500).json({ error: 'Something went wrong' });
}
}

async getTrackBySongsArray(request, response, next) {
try {
const songsArray = request.params.songsarray.split('_'); // Разделение строки на id треков
const tracksDir = 'uploads';
const trackFolders = fs.readdirSync(tracksDir);
const tracks = [];

for (const folder of trackFolders) {
const folderPath = path.join(tracksDir, folder);

if (fs.lstatSync(folderPath).isDirectory()) {
const txtFilePath = path.join(folderPath, 'info.txt');
const txtData = fs.readFileSync(txtFilePath, 'utf8');

const lines = txtData.split('\n');
const trackId = lines[0].split(':')[1].trim();
const trackName = lines[1].split(':')[1].trim();
const trackAuthor = lines[2].split(':')[1].trim();

const imageFiles = fs
.readdirSync(folderPath)
.filter(
(file) =>
file.endsWith('.png') ||
file.endsWith('.jpg') ||
file.endsWith('.jpeg'),
);

let trackImage = null;
if (imageFiles.length > 0) {
const imageFilePath = path.join(folderPath, imageFiles[0]);
const imageData = await readFileAsync(imageFilePath, 'base64');
trackImage = imageData.toString();
}

const audioFiles = fs
.readdirSync(folderPath)
.filter((file) => file.endsWith('.mp3'));

const trackAudios = [];
if (audioFiles.length > 0) {
for (const audioFile of audioFiles) {
const audioFilePath = path.join(folderPath, audioFile);
const audioData = await readFileAsync(audioFilePath, 'base64');
const base64Audio = audioData.toString();
const audioName = audioFile.replace('.mp3', '');
trackAudios.push({ audioName, base64Audio });
}
}

// Проверяем, содержится ли id трека в songsArray
const trackContained = songsArray.some((id) =>
folder.includes(id.trim()),
);

if (trackContained) {
tracks.push({
trackId,
trackName,
trackAuthor,
trackImage,
trackAudios,
});
}
}
}

if (tracks.length > 0) {
response.status(200).json(tracks);
} else {
response.status(404).json({ error: 'Track not found' });
}
} catch (error) {
response.status(500).json({ error: 'Something went wrong' });
}
}

async returnMyPlaylists(request, response, next) {
try {
const playlists_response = await returnPlaylistsByAuthor(request.user.id);
playlists_response.forEach((elem) => {
elem.img = elem.img.toString('base64');
});
response.json(playlists_response);
} catch (error) {
next(error);
}
}
}

export const musicController = new MusicController();
Loading

0 comments on commit 8ef4dd3

Please sign in to comment.