CinéFouine — app mobile de reco & quiz cinéma

CinéFouine — movie recommendation & quiz mobile app

janvier 2025

January 2025

Flutter.NET 8C#PostgreSQLSignalRPython (Flask)scikit-learnActiveMQDockerSwagger
Trois écrans de l'app mobile CinéFouine : le fil de films, la fiche détaillée d'un film avec ses acteurs, et un quiz à choix multiples sur The Dark Knight. / Three screens of the CinéFouine mobile app: the movie feed, a movie's detail page with its cast, and a multiple-choice quiz about The Dark Knight.
CinéFouine en trois écrans : parcourir les films, consulter une fiche, jouer au quiz.
CinéFouine in three screens: browsing movies, viewing a detail page, playing the quiz.

« CinéFouine » — application mobile de recommandation de films et de quiz, conçue dans le cadre du projet final de 5e année IRC à CPE Lyon. Côté mobile, une app Flutter ; côté serveur, une dizaine de microservices .NET et un service Python dédié aux recommandations.

Le projet

Projet de groupe. L’application propose à l’utilisateur des films personnalisés selon ses préférences et son historique, des quiz sur le cinéma en temps réel, des badges de progression, un contenu quotidien et un fil d’évènements. Chaque domaine fonctionnel (auth, utilisateurs, films, quiz, badges, recommandations, notifications…) vit dans son propre service, et un ESB relie le tout.

Aperçus de l’interface

Recherche de films « the dark k » et fiche détaillée d'un film dans CinéFouine

Recherche par titre et fiche film — note, acteurs, commentaires et accès au quiz.

Ce sur quoi j’ai travaillé

  • App mobile Flutter (cinefouine) — navigation auto_route, état avec Riverpod, modèles immuables via Freezed, appels HTTP via Dio, écoute temps réel des quiz via SignalR.
  • Microservices .NET 8 — MovieMS, QuizzMS, ms-auth, ms-badge, ms-recommend-net : ASP.NET Core Web API + EF Core + PostgreSQL, doc Swagger.
  • Recommandation ML — service Python (Flask + pandas + scikit-learn) avec deux moteurs : recommandation par profil utilisateur et par genres.
  • Quiz temps réel — Hubs SignalR côté .NET, client signalr_netcore côté Flutter, sessions multi-joueurs.
  • ESB & messaging — ActiveMQ (Apache.NMS) pour découpler producteurs et consommateurs d’évènements entre services.

La stack

Flutter / Dart côté mobile (Riverpod, auto_route, Dio, Freezed, SignalR). .NET 8

  • ASP.NET Core + EF Core + PostgreSQL côté API. Python + Flask + scikit-learn pour la couche ML. ActiveMQ pour le bus. Docker et Swagger en transverse.

Ce que j’en ai retenu

Trois grandes leçons.

D’abord, dès qu’une app mobile parle à six services différents, le contrat d’API doit être clair et stable. Un petit changement côté serveur, et c’est toute l’app qui casse.

Ensuite, le temps réel change la façon de penser. Pour afficher une liste de films, un appel REST suffit. Pour un quiz multi-joueurs où chacun voit la réponse des autres en direct, il faut des websockets (SignalR). Ce sont deux outils différents pour deux besoins différents — pas deux options interchangeables.

Enfin, la reco est écrite en Python plutôt qu’en .NET, parce que pandas et scikit-learn font le travail en quelques lignes. Choisir le bon langage pour la bonne tâche, même si ça complique un peu le déploiement.

“CinéFouine” — a mobile app for movie recommendations and quizzes, built as the final-year project of the 5th-year IRC program at CPE Lyon. On the mobile side, a Flutter app; on the server side, about ten .NET microservices and a Python service dedicated to recommendations.

The project

Group project. The app offers users personalized movies based on their preferences and history, real-time movie-trivia quizzes, progress badges, daily content and an event feed. Each functional domain (auth, users, movies, quiz, badges, recommendations, notifications…) lives in its own service, tied together by an ESB.

Interface previews

Searching for "the dark k" and a movie's detail page in CinéFouine

Title search and movie detail page — rating, cast, comments and access to the quiz.

What I worked on

  • Flutter mobile app (cinefouine) — auto_route navigation, state management with Riverpod, immutable models via Freezed, HTTP calls via Dio, real-time quiz updates via SignalR.
  • .NET 8 microservices — MovieMS, QuizzMS, ms-auth, ms-badge, ms-recommend-net: ASP.NET Core Web API + EF Core + PostgreSQL, Swagger docs.
  • ML recommendation — Python service (Flask + pandas + scikit-learn) with two engines: recommendation by user profile and by genre.
  • Real-time quiz — SignalR hubs on the .NET side, signalr_netcore client on the Flutter side, multiplayer sessions.
  • ESB & messaging — ActiveMQ (Apache.NMS) to decouple event producers and consumers between services.

The stack

Flutter / Dart on mobile (Riverpod, auto_route, Dio, Freezed, SignalR). .NET 8

  • ASP.NET Core + EF Core + PostgreSQL for the API. Python + Flask + scikit-learn for the ML layer. ActiveMQ for the bus. Docker and Swagger throughout.

What I took away from it

Three big lessons.

First, as soon as a mobile app talks to six different services, the API contract needs to be clear and stable. One small server-side change and the whole app breaks.

Second, real-time changes the way you think. To display a list of movies, a REST call is enough. For a multiplayer quiz where everyone sees others’ answers live, you need websockets (SignalR). Two different tools for two different needs — not two interchangeable options.

Finally, the recommendation engine is written in Python rather than .NET, because pandas and scikit-learn do the job in a few lines. Pick the right language for the right task, even if it complicates deployment a bit.