@page "/searchmovies" @using MovieActorLookup.Models @using MovieActorLookup.Models.Movies @using System.ComponentModel.DataAnnotations @inject MovieService MovieService @inject IJSRuntime JSRuntime @rendermode InteractiveServer

Discover Actors & Their Movies

Search by movie and character to explore an actor's complete filmography

🎬
🎭
@if (_isSearching) {

Finding the perfect match...

} else if (_actor != null) {

@_actor.Name

@_actor.MovieCharacters.Count movie@(_actor.MovieCharacters.Count != 1 ? "s" : "") found
@if (_matchedMovie != null) {

Your Search Match

}

Complete Movie Filmography

@foreach (var group in _actor.MovieCharacters .GroupBy(mc => mc.Franchise) .OrderBy(g => g.Key == "Standalone") .ThenBy(g => g.Key)) { @if (group.Key != "Standalone") {
@group.Key Collection
}
@foreach (var movie in (group.Key == "Standalone" ? group.OrderByDescending(mc => DateTime.TryParse(mc.ReleaseDate, out var d) ? d : DateTime.MinValue) : group.OrderBy(mc => DateTime.TryParse(mc.ReleaseDate, out var d) ? d : DateTime.MaxValue))) {
@movie.MovieTitle Poster
View Details
@movie.MovieTitle
as @movie.CharacterName
@if (!string.IsNullOrEmpty(movie.Overview)) {

@movie.Overview

@if (movie.Overview.Length > 150) { }
}
@movie.ReleaseDate
}
}
} else if (!string.IsNullOrEmpty(_movieTitle) || !string.IsNullOrEmpty(_characterName)) {
🔍

No matches found

Try adjusting your search terms or check the spelling

} else {
🎬

Ready to explore?

Enter a movie title and character name to discover an actor's complete film journey

}
@code { private string _movieTitle = ""; private string _characterName = ""; private Actor _actor; private MovieCharacter _matchedMovie; private bool _isSearching = false; private HashSet _expandedOverviews = new HashSet(); private bool IsOverviewExpanded(string movieTitle) { return _expandedOverviews.Contains(movieTitle); } private void ToggleOverview(string movieTitle) { if (_expandedOverviews.Contains(movieTitle)) { _expandedOverviews.Remove(movieTitle); } else { _expandedOverviews.Add(movieTitle); } } private async Task SearchForActorAndCharacters() { if (string.IsNullOrWhiteSpace(_movieTitle) || string.IsNullOrWhiteSpace(_characterName)) return; _isSearching = true; _actor = null; _matchedMovie = null; StateHasChanged(); await Task.Delay(100); await JSRuntime.InvokeVoidAsync("startAnimations"); try { var movies = await MovieService.GetMoviesByTitle(_movieTitle); foreach (var movie in movies) { var credits = await MovieService.GetMovieCreditsByMovieId(movie.Id); foreach (var castMember in credits.Cast) { if (castMember.Character.Contains(_characterName, StringComparison.OrdinalIgnoreCase)) { if (_actor == null) { _actor = new Actor(castMember.Name); await LoadActorFilmography(castMember.Id, movie, castMember); } break; } } if (_actor != null) break; } } catch (Exception ex) { Console.WriteLine($"Search error: {ex.Message}"); } finally { _isSearching = false; StateHasChanged(); } } private async Task LoadActorFilmography(int personId, object originalMovie, object originalCast) { var filmography = await MovieService.GetActorMovieCreditsById(personId); if (filmography?.Cast != null) { foreach (var role in filmography.Cast) { var fullMovie = await MovieService.GetMovieDetailsById(role.Id); var movieCharacter = new MovieCharacter { MovieTitle = role.Title ?? "Unknown Title", CharacterName = role.Character ?? "Unknown Character", MoviePosterPath = role.PosterPath ?? "", ReleaseDate = DateTime.TryParse(fullMovie?.ReleaseDate, out var parsedDate) ? parsedDate.ToString("MMM dd, yyyy") : "Unknown Date", Overview = fullMovie?.Overview ?? "", Franchise = fullMovie?.BelongsToCollection?.Name ?? "Standalone" }; _actor.MovieCharacters.Add(movieCharacter); if (_matchedMovie == null && string.Equals(role.Title, GetPropertyValue(originalMovie, "Title")?.ToString(), StringComparison.OrdinalIgnoreCase) && string.Equals(role.Character, GetPropertyValue(originalCast, "Character")?.ToString(), StringComparison.OrdinalIgnoreCase)) { _matchedMovie = movieCharacter; } } } } private object GetPropertyValue(object obj, string propertyName) { if (obj == null) return null; var property = obj.GetType().GetProperty(propertyName); return property?.GetValue(obj); } }