diff --git a/.gitignore b/.gitignore index 14b499c..5813e97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea/ backend/node_modules/ frontend/node_modules/ -.env \ No newline at end of file +.env +data/ \ No newline at end of file diff --git a/backend/app/controllers/files.controllers.js b/backend/app/controllers/files.controllers.js new file mode 100644 index 0000000..c73e390 --- /dev/null +++ b/backend/app/controllers/files.controllers.js @@ -0,0 +1,42 @@ +import * as fs from "node:fs"; +import * as path from "node:path"; +import {getAllMusics, getMusicMetadata, insertMusicFile, insertMusicMetadata} from "../services/musics.services.js"; + +export async function scan(req, res) { + const dir = process.env.DATA_PATH; + + const content = fs.readdirSync(path.join(dir, "import"), 'utf8'); + + const inBase = await getAllMusics(); + + console.log("MUSIC IN BASE"); + console.log(inBase.rows); + + if (content.length > 1) { + res.status(400).json({ + "error": "400", + "message": "Too many files" + }) + } + + + const discogs_metadata = await getMusicMetadata(content[0]); + + const filename = content[0].split('.')[0]; + const file_id = await insertMusicFile(content[0]) + + console.log("FILE ID") + console.log(file_id.rows[0].id); + + const metadata = { + name: filename.split('---')[0], + artist: filename.split('---')[1], + album: discogs_metadata.results[0].title, + cover: discogs_metadata.results[0]["cover_image"], + file: file_id.rows[0].id + } + + const meta = await insertMusicMetadata(metadata) + + res.status(200).json(meta); +} \ No newline at end of file diff --git a/backend/app/middlewares/multer.middlewares.js b/backend/app/middlewares/multer.middlewares.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/routes/files.routes.js b/backend/app/routes/files.routes.js new file mode 100644 index 0000000..8e9f67f --- /dev/null +++ b/backend/app/routes/files.routes.js @@ -0,0 +1,8 @@ +import {Router} from 'express'; +import {scan} from "../controllers/files.controllers.js"; + +const router = Router(); + +router.get('/', scan); + +export default router; \ No newline at end of file diff --git a/backend/app/services/musics.services.js b/backend/app/services/musics.services.js new file mode 100644 index 0000000..d5592fd --- /dev/null +++ b/backend/app/services/musics.services.js @@ -0,0 +1,35 @@ +import db from './db.services.js' + +export async function getAllMusics() { + const query = "SELECT * FROM music_files"; + const values = []; + return await db(query, values); +} + +export async function getMusicMetadata(file) { + + const filename = file.split(".")[0]; + const name = filename.split("---")[0]; + const artist = filename.split("---")[1]; + + const endpoint = encodeURI(`https://api.discogs.com/database/search?q=${name}${(artist && artist.length > 0) ? "&artist=" + artist : ""}&type=track&track=${name}&token=EyYNWEgsvjQWwDrLPeRkkgjnUNdFxyNfimkbPqCn`); + + const req = await fetch(endpoint, {}); + const res = await req.json(); + console.log(endpoint); + console.log(res); + return res; + +} + +export async function insertMusicFile(filename) { + const query = "INSERT INTO music_files (file) VALUES ($1) RETURNING *"; + const values = [filename]; + return await db(query, values); +} + +export async function insertMusicMetadata(metadata) { + const query = "INSERT INTO music_metadatas (name, artist, album, cover, file) VALUES ($1, $2, $3, $4, $5) RETURNING *"; + const values = [metadata.name, metadata.artist, metadata.album, metadata.cover, metadata.file]; + return await db(query, values); +} \ No newline at end of file diff --git a/backend/index.js b/backend/index.js index 18b8251..485cf92 100644 --- a/backend/index.js +++ b/backend/index.js @@ -3,6 +3,8 @@ import dotenv from 'dotenv'; import cors from 'cors'; import UserRouter from "./app/routes/users.routes.js"; +import FileRouter from "./app/routes/files.routes.js"; +import createDir from "./utils/folders.js"; console.clear() @@ -10,8 +12,9 @@ dotenv.config({ path: `../.env`, }); -const app = express(); +createDir(); +const app = express(); const port = process.env.BACKEND_PORT || 3000; app.use(express.json()); @@ -24,9 +27,10 @@ app.use((err, req, res, next) => { message: err.message, }) }) - +app.use("/scan", FileRouter) app.use("/users", UserRouter); + app.get('/', (req, res) => { res.send("Welcome"); }) diff --git a/backend/utils/folders.js b/backend/utils/folders.js new file mode 100644 index 0000000..1f206f7 --- /dev/null +++ b/backend/utils/folders.js @@ -0,0 +1,18 @@ +import * as fs from "node:fs"; +import * as path from "node:path"; + + +export default function createDir() { + + const dir = process.env.DATA_PATH; + + const content = fs.readdirSync(dir, 'utf8'); + console.log(content); + + if (!fs.existsSync(path.join(dir, "import"))) { + fs.mkdirSync(path.join(dir, 'import')); + } else if (!fs.existsSync(path.join(dir, 'musics'))) { + fs.mkdirSync(path.join(dir, 'musics')); + } + +} \ No newline at end of file