A JavaFX desktop application that clones some of the most core IMDb functionality such as: browsing movies, TV series, and celebrities with search, ratings, and user authentication.
University Project β Built for a university lesson. This is an older project but remains fairly well-organized and functional (for the most part). Open to imporvements and refactoring if someone wants to go the extra mile to help me.
| Category | Details |
|---|---|
| Content Browsing | Browse, search, filter, and sort movies and TV series with full metadata |
| Celebrity Profiles | Actor and director profiles with filmography and biographical data |
| User Authentication | Registration and login with BCrypt password hashing and session management |
| Rating System | Rate content on a 1β10 scale with per-user tracking |
| Advanced Search | Multi-criteria search across movies, series, and people (title, genre, year range, rating range) |
| CRUD Operations | Full create, read, update, delete for movies, series, seasons, episodes, actors, directors |
| Data Import | Parses structured TXT data files at startup into in-memory storage |
| Nested Content | Series with multiple seasons, each containing episodes |
| Technology | Version | Purpose |
|---|---|---|
| Java | 21 | Language |
| JavaFX | 21.0.3 | Desktop UI framework |
| Maven | 3.8+ | Build tool and dependency management |
| ControlsFX | 11.2.1 | Enhanced JavaFX UI components |
| Jackson | 2.17.1 | JSON serialization |
| jBCrypt | 0.4 | Password hashing (BCrypt) |
| Apache Commons Text | 1.11.0 | String utilities |
| SLF4J + Simple | 2.0.13 | Logging |
| JUnit 5 | 5.10.2 | Unit testing |
| PMD | 3.22.0 | Static code analysis |
All dependencies are managed via pom.xml with Maven. The javafx-maven-plugin handles JavaFX runtime and module configuration.
- Java 21+
- Maven 3.8+
git clone https://github.com/Je0Dev/ImdbCloneApp.git
cd ImdbCloneApp
mvn clean compile # Compile
mvn exec:java # Run (uses exec-maven-plugin with UserDataRegenerator)
mvn clean compile exec:java # Build & run in one step
mvn test # Run testsThe compiler is configured with -Xlint:all for full warnings and deprecation checks.
ImdbCloneApp/
βββ data/ # Runtime serialized user data (user_data.ser)
βββ docs/ # Detailed architecture documentation (12 markdown files)
βββ images/ # Application screenshots
βββ src/
β βββ main/
β β βββ java/com/papel/imdb_clone/
β β β βββ StartApplication.java # Entry point (main method)
β β β βββ module-info.java # Java module descriptor
β β β βββ config/ # ApplicationConfig.java
β β β βββ controllers/ # MVC controllers (UI logic)
β β β β βββ authentication/ # Login/Register
β β β β βββ content/ # Movies, Series, helpers
β β β β βββ coordinator/ # Screen navigation
β β β β βββ people/ # Celebrities
β β β β βββ search/ # Search controllers
β β β βββ data/ # DataManager facade
β β β βββ enums/ # Genre, ContentType, Ethnicity
β β β βββ exceptions/ # 10 custom exception classes
β β β βββ gui/ # MovieAppGui (JavaFX Application class)
β β β βββ model/ # Domain models
β β β β βββ content/ # Movie, Series, Season, Episode
β β β β βββ people/ # Actor, Director, Celebrity, User
β β β β βββ rating/ # Rating, UserRating
β β β βββ repository/ # Data access interfaces + in-memory impls
β β β βββ service/ # Business logic layer
β β β β βββ content/ # MoviesService, SeriesService
β β β β βββ data/ # Data loading framework (loaders)
β β β β βββ navigation/ # NavigationService
β β β β βββ people/ # UserService, CelebrityService
β β β β βββ rating/ # RatingService
β β β β βββ search/ # SearchService, ServiceLocator
β β β β βββ validation/ # AuthService, validation helpers
β β β βββ tools/ # UserDataRegenerator
β β β βββ util/ # PasswordHasher, FileUtils, UIUtils
β β βββ resources/
β β βββ application.properties # App config
β β βββ logback.xml # Logging config
β β βββ data/ # TXT data files
β β β βββ content/ # movies_updated.txt, series_updated.txt
β β β βββ nominations/ # awards_boxoffice_updated.txt
β β β βββ people/ # actors, directors, users txt files
β β βββ fxml/ # JavaFX FXML view layouts
β β βββ auth/ # login-view.fxml, register-view.fxml
β β βββ base/ # home-view.fxml
β β βββ celebrities/ # celebrities-view.fxml
β β βββ content/ # movie-view, series-view, etc.
β β βββ search/ # search-form, advanced-search, results-table
βββ pom.xml # Maven build configuration
Every directory contains its own README.md with a detailed breakdown of its contents.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FXML Views (resources/fxml/) β
β (login, movies, series, search, etc.) β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
β @FXML injection
βββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ
β Controllers (controllers/) β
β Handle UI events, coordinate views β services β
β Extend BaseController or BaseSearchController β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
β method calls
βββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ
β Services (service/) β
β Business logic, data processing, validation β
β Singleton pattern via ServiceLocator β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
β calls
βββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ
β Repositories (repository/) β
β Data access interfaces + in-memory implementations β
β Repository pattern for abstraction β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
β stores/retrieves
βββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ
β Models (model/) + Data files β
β Domain objects + TXT file data sources β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
StartApplication.main()
ββ Application.launch(MovieAppGui.class)
ββ MovieAppGui.start()
ββ ApplicationConfig.initialize() β load config properties
ββ ServiceLocator.getInstance() β register all services
ββ DataManager.getInstance().loadAllData() β parse TXT files
β ββ MovieDataLoader.load()
β ββ SeriesDataLoader.load()
β ββ ActorDataLoader.load()
β ββ DirectorDataLoader.load()
β ββ UserDataLoader.load()
ββ NavigationService.navigate("login") β show login screen
Dependency management uses a custom ServiceLocator (singleton registry) rather than a DI framework:
ServiceLocator.getInstance().getMoviesService();
ServiceLocator.getInstance().getSearchService();
ServiceLocator.getInstance().getAuthService();All services follow the lazy-initialized double-checked locking singleton pattern.
Single class ApplicationConfig.java manages file paths, data source locations, and runtime settings. Loaded once at startup by MovieAppGui.
All controllers extend BaseController (providing DataManager access, showAlert(), showError(), showConfirmationDialog()). Search-related controllers extend BaseSearchController for shared search service access.
authentication/AuthController.javaβ Login form, registration form, session management viaAuthServicecontent/MoviesController.java(~1390 lines) β Movie table, CRUD dialogs, filtering, sorting. UsesMoviesDialogHelperandMoviesLogicHelperfor extracted logiccontent/SeriesController.java(~1875 lines) β Series with nested seasons/episodes table, CRUD. UsesSeriesDialogHelperandSeriesLogicHelpercontent/EditContentController.javaβ Generic content editing form with type parameterizationcoordinator/UICoordinator.javaβ Manages screen transitions and UI statepeople/CelebritiesController.java(~1587 lines) β Actor/director listing and managementsearch/AdvancedSearchController.java(~1008 lines) β Multi-criteria advanced search formsearch/SearchFormController.javaβ Basic search with title, genre, year, rating filters
Content.javaβ Abstract base with title, id, releaseDate, synopsis, ratings mapMovie.javaβ Extends Content: boxOffice, awards, genres, duration, castSeries.javaβ Extends Content: seasons list, genre(s)Season.java/Episode.javaβ Nested content hierarchyCelebrity.javaβ Abstract base for people (firstName, lastName, birthDate, ethnicity)Actor.java/Director.javaβ Specific celebrity typesUser.javaβ Account model with username, email, passwordHash, ratings mapRating.java/UserRating.javaβ Rating value objects
content/MoviesService.java/SeriesService.javaβ CRUD operations, thread-safe with locksdata/base/FileDataLoaderService.javaβ Parses|-delimited TXT files from classpath resourcesdata/loader/*/β Specific loaders for movies, series, actors, directors, userspeople/UserStorageService.javaβ User persistence via Java serialization (user_data.ser)rating/RatingService.javaβ Per-user rating storage, average calculationssearch/SearchService.javaβ Composite search across all content typesvalidation/AuthService.java(~724 lines) β Login, registration, BCrypt verification, session tokens
Interfaces define the contract; impl/ contains in-memory implementations using List/Map collections. Designed for easy swapping (e.g., to a database-backed implementation).
10 exception classes organized by category: authentication (AuthException), validation (ValidationException, InvalidInputException), data (EntityNotFoundException, DataPersistenceException, FileParsingException), and domain-specific (UserAlreadyExistsException, DuplicateEntryException).
PasswordHasher.javaβ BCrypt hash/verify wrapperDataFileLoader.javaβ Classpath resource loadingFileUtils.javaβ Line-based file readingUIUtils.javaβ Alert and dialog helpers
User types in search field
ββ SearchFormController.handleSearch()
ββ SearchService.search(criteria)
ββ MoviesService.search(title) β search movies
ββ SeriesService.search(title) β search series
ββ CelebrityService.search(name) β search actors/directors
ββ ResultsTableController displays results
User clicks rate button
ββ MoviesController.handleRate(movie)
ββ RatingService.rateMovie(userId, movieId, rating)
ββ UserRating stored in User.ratings map
ββ UI refreshes to show updated average
Login form submit
ββ AuthController.handleLogin()
ββ AuthService.login(username, password)
ββ UserRepository.findByUsername(username)
ββ PasswordHasher.verify(password, user.passwordHash)
ββ Returns session token β navigate to main screen
Data files in src/main/resources/data/ use a pipe-delimited (|) format. Each file is parsed by a dedicated loader class:
| File | Loader | Entity |
|---|---|---|
content/movies_updated.txt |
MovieDataLoader |
Movie |
content/series_updated.txt |
SeriesDataLoader |
Series |
people/actors_updated.txt |
ActorDataLoader |
Actor |
people/directors_updated.txt |
DirectorDataLoader |
Director |
people/users_updated.txt |
UserDataLoader |
User |
nominations/awards_boxoffice_updated.txt |
AwardsDataLoader |
Awards data |
User sessions persist between runs via Java serialization to data/user_data.ser.
This project contains some large controller files that are candidates for further refactoring:
| File | Lines | Status |
|---|---|---|
SeriesController.java |
~1875 | Partial helper extraction |
CelebritiesController.java |
~1587 | Has dialog helper |
MoviesController.java |
~1390 | Using helpers |
AdvancedSearchController.java |
~1008 | Needs splitting |
AuthService.java |
~724 | Large service |
Helper classes (*DialogHelper, *LogicHelper) have been extracted from the largest controllers following a pattern of keeping @FXML-bound fields in the controller while moving business logic to helper classes.
This project is free to use for non-commercial, educational, and personal purposes. You may fork, modify, and share it for non-profit use. Commercial use requires permission. Mostly follows the MIT Licence
Copyright Β© 2026 Je0Dev
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the βSoftwareβ), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED βAS ISβ, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Areas that need attention (but will propably wont get that much imporvements):
- Further splitting of large files and removing dead code snippets
- Implementing tests for all major functioanlity to make everything be more maintanable and scalable in the future.
- Creating new meaningful features such as watchlists, sharing capabilities to improve engagement and a lot more to add them here.
See the
docs/directory for comprehensive architecture documentation before contributing. Every source directory also contains aREADME.mdwith its specific contents and purpose.
Last updated: June 2026