From c1b63f0d3dfe1b8a1604973715cafc4b51b593b7 Mon Sep 17 00:00:00 2001 From: sacha <sachaterrasson@gmail.com> Date: Sat, 4 Nov 2023 17:22:23 +0100 Subject: [PATCH] Ecriture de recommendation + tierces --- backend/src/class_user.js | 1 - backend/src/controllers/recommendation.js | 95 ++++++++++++++++++++++- backend/src/controllers/userController.js | 13 ++++ 3 files changed, 107 insertions(+), 2 deletions(-) diff --git a/backend/src/class_user.js b/backend/src/class_user.js index 8767afb..e3835bf 100644 --- a/backend/src/class_user.js +++ b/backend/src/class_user.js @@ -8,5 +8,4 @@ class User{ this.movies.append(movieSeen); } - } \ No newline at end of file diff --git a/backend/src/controllers/recommendation.js b/backend/src/controllers/recommendation.js index f1e8e6d..2d965dc 100644 --- a/backend/src/controllers/recommendation.js +++ b/backend/src/controllers/recommendation.js @@ -1,6 +1,6 @@ /** - * Cette fonction selectionne les 3 meilleurs movies d'une liste de film. + * Cette fonction selectionne les 3 meilleurs films d'une liste de film. * * @param {Movie[]} movies - Liste de film. * @returns {Movie[]} - La liste des 3 films. @@ -24,4 +24,97 @@ function top3(movies) { return highestNotes; } +/** + * Cette fonction selectionne les 3 meilleurs films pour un utilisateur. + * + * @param {string} user_login - Login de l'utilisateur. + * @returns {Movie[]} - La liste des 3 films. + */ + +function recommendationForUser(user_login) { + let person = get_user(user_login); + + let fav_styles = []; //styles des films présents dans les films aimés par l'utilisateur + let fav_authors = []; //auteurs récurents dans les films aimés par l'utilisateur : moyenne (auteur * note du film) + let fav_actors = []; //acteurs récurents dans les films aimés par l'utilisateur : moyenne (acteur * note du film (* %temps écran)) + //let fav_duration; + + let seen = person.movies; + let authors = getAllAuthors(seen).slice(0,3); + for (let i = 0; i < authors.length; i++) { + fav_authors = authors[i][0]; //recuperer seulement l'auteur, pas le reste + } + + + +} + +/** + * trier une matrice par l'indice 1, puis par l'indice 2, puis par l'indice 0. + * + * @param {[string, Number, Number]} a - ligne d'une matrice + * @param {[string, Number, Number]} b - ligne d'une matrice + * @returns {Number} - 1 si a est plus grand, 0 si a=b, -1 si b est plus grand. + */ +function comparerLignes(a, b) { + // trier par le nombre d'apparition de l'auteur dans la liste de film vus (int) + if (a[1] < b[1]) return -1; + if (a[1] > b[1]) return 1; + + // Si le nombre d'apparition est le même, trier par la moyenne de notes des films de l'auteur (float) + if (a[2] < b[2]) return -1; + if (a[2] > b[2]) return 1; + + // Si la moyenne est la même, trier par le nom de l'auteur (string) + if (a[0] < b[0]) return -1; + if (a[0] > b[0]) return 1; + + // Les lignes sont égales + alert("doublon d'auteur !!"); + return 0; +} + +/** + * renvoie une liste d'auteurs, avec leur nombre d'apparition dans la liste des films vus par un utilisateur, puis leur note moyenne + * + * @param {Movie[]} movies - Liste de film vus par un utilisateur. + * @param {string(Movie)} recupElement - Fonction qui recupere un element d'un film (pour generaliser allAutors à allElement). + * @returns {[[string, Number, Number]]} - La liste des auteurs. + */ +function getAllAuthors(movies, recupElement){ + let authors = [[]]; + //premier indice = couple auteur/nombre d'apparition/moyenne notes films, 2e indice: 0 auteur, 1 nbr apparition, 2 mpyenne films + for (let i = 0; i < seen.length; i++) { + let j = 0; + let found = false; + while(j < authors.length && !found){ + if (authors[j][0] == seen[i].author) { + found = true; + authors[j][1] += 1; + authors[j][2] += seen[i].note; + } + j++; + } + if(!found){ + authors.append([seen[i].author, 1, seen[i].note]); + } + } + for (let i = 0; i < authors.length; i++) { + authors[i][2] /= authors[i][1]; + } + + authors.sort(comparerLignes); + return authors; +} + +function getAuthor(movie){ + return movie.author; +} + +function getActors(movie){ + return movie.actors; +} +function getStyles(movie){ + return movie.styles; +} \ No newline at end of file diff --git a/backend/src/controllers/userController.js b/backend/src/controllers/userController.js index 4f09706..98876af 100644 --- a/backend/src/controllers/userController.js +++ b/backend/src/controllers/userController.js @@ -100,4 +100,17 @@ function getFilmsByAuthor(author, isOrdered = false, length = -1){ function getFilmsByStyle(style, isOrdered = false, length = -1){ return true; +} + + + +/** + * Cette fonction récupere un utilisateur avec son login. + * + * @param {string} login - login de l'utilisateur. + * @returns {User} - L'utilisateur. + */ + +function get_user(login){ + return true; } \ No newline at end of file -- GitLab