Project Summary & Skills Used
Project Overview
FilmFinder is a Java web application developed using Spring Boot and a Vaadin user interface. The project addresses the problem of users being overwhelmed by movie choices, transforming movie selection into an efficient Decision Support System (DSS). Recommendations are generated using a flexible, score-based engine enhanced by Generative AI, ranking movies according to user preferences.
| Attribute | Details |
|---|---|
| My Name | Mark Miner |
| Teammates | Grayson Hambuchen, Leo Dehner |
| Core Concept | Data Analysis, AI Integration |
| Data Used | Local movie dataset (movie_data_cleaned.csv), TMDB API |
| Advanced Tools | Vaadin (UI), Tablesaw (Data), Google Gemini API (AI) |
Key Skills Used and Developed
- Custom Java Classes & Inheritance: Defined classes like
Movieto structure and manage movie attributes, supporting clean filtration logic.
- External Library Integration: Implemented Vaadin for UI, Tablesaw for CSV handling, and Gemini API for AI-driven enhancements.
- List & File Management: Loaded large datasets and processed them with
ArrayListsto compute scores and sort recommendations.
- Team Collaboration & Git Workflows: Managed repository stability with
.gitignoreand coordinated work division among teammates.
Project Development Process
Initial Filtration Logic
The original design filtered movies by exact matches, which failed for misspellings or ambiguous queries.
Pivot to Scoring System
Each movie earns a point per match with user inputs (genres, cast, keywords). Movies with scores >0 are displayed, sorted by descending score, with a top-50 limit.
AI-Enhanced Improvements
Spelling and ambiguous inputs were handled via the Gemini API, which produces clean, comma-delimited lists of actors or keywords for scoring.
Team Collaboration Challenges
Maintaining cohesion required centralizing all separate logic into the main filtration pipeline. Coordination ensured code compatibility across teammates’ efforts.
Key Features & Code Highlights
1. Advanced Scoring Engine
public int calculateScore(Movie movie, List<String> userPreferences) {
int score = 0;
for (String preference : userPreferences) {
if (movie.getGenres().contains(preference) || movie.getCast().contains(preference)) {
score++;
}
}
return score;
}
// Display top 50 results with score >0
// movieResults.stream()
// .filter(m -> m.getScore() > 0)
// .sorted((m1, m2) -> Integer.compare(m2.getScore(), m1.getScore()))
// .limit(50)
// .collect(Collectors.toList());2. Gemini API Autocorrect & Keyword Expansion
private final Client geminiClient = Client.builder()
.apiKey("AIzaSyA00DHzmivuUvTjNnYZV84KYYv53NeFeuE")
.build();
String systemPrompt = String.format(
"Given the user's input for %s, output only the corrected or standardized term(s) " +
"separated by commas. Do not add any extra text or explanation. " +
"If the input is already correct or standard, output the input as is.", fieldName);⸻
Individual Reflection
The primary lesson I took away from the FilmFinder project was the crucial realization that successful collaboration demands organization and strong coordination. I quickly understood that parallel coding was not enough. I needed to assume a leadership role to synthesize individual efforts and guarantee our code would actually work together as a unified system. One of my teammates provided excellent testing logic, and the other focused diligently on the front end Vaadin implementation. I am genuinely grateful for their help and contribution to the project’s success, as their dedicated work provided the solid components I needed to integrate into the core architecture.
My main technical hurdle involved managing the integration of the separate testing logic into our live filtration system. This required carefully migrating algorithms that were proven in a standalone environment directly into our core Java pipeline. This process was critical because our score based recommendation engine depended on flawless integration to accurately filter and rank movies. Successfully completing this integration and ensuring the stability of the final syste was a major moment of growth. It proved my ability to manage complex logistical issues and perform the necessary technical heavy lifting to drive a shared project to completion.
Ultimately, this project significantly boosted my confidence across two key technical areas. I now feel absolutely assured in my ability to define and utilize custom objects, such as the Movie class, to structure complex data and manipulate attributes for effective score calculation. More importantly, the project required me to implement technologies we had never covered in class, including the Google Gemini API for natural language processing and the Vaadin framework. This experience gave me a powerful new asset: the belief that I can self teach and seamlessly integrate entirely new, untouched components, enabling me to tackle any project with a high degree of self reliance and ownership.