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

Search for Actor by Movie and Character Name

@if (_isSearching) {

Searching...

} else if (_actor != null) {

Actor: @_actor.Name

@if (_matchedMovie != null) {
Movie Poster
@_matchedMovie.MovieTitle
@_matchedMovie.CharacterName
@_matchedMovie.Franchise Release Date: @_matchedMovie.ReleaseDate
} @foreach (var franchiseGroup in _actor.MovieCharacters .GroupBy(mc => mc.Franchise) .OrderBy(g => g.Key == "Standalone") .ThenBy(g => g.Key)) {
@franchiseGroup.Key
@foreach (var movieCharacter in (franchiseGroup.Key == "Standalone" ? franchiseGroup.OrderByDescending(mc => DateTime.TryParse(mc.ReleaseDate, out var d) ? d : DateTime.MinValue) : franchiseGroup.OrderBy(mc => DateTime.TryParse(mc.ReleaseDate, out var d) ? d : DateTime.MaxValue))) {
Movie Poster
@movieCharacter.MovieTitle
@movieCharacter.CharacterName

@movieCharacter.Overview

Release Date: @movieCharacter.ReleaseDate
}
} } else {

Enter a movie title and character name to begin your search.

} @code { private string _movieTitle; private string _characterName; private Actor _actor; private MovieCharacter _matchedMovie; private bool _isSearching = false; private async Task SearchForActorAndCharacters() { _isSearching = true; _actor = null; _matchedMovie = null; // reset matched movie StateHasChanged(); if (!string.IsNullOrWhiteSpace(_movieTitle) && !string.IsNullOrWhiteSpace(_characterName)) { 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.ToLower().Contains(_characterName.ToLower())) { if (_actor == null) { _actor = new Actor(castMember.Name); int personId = castMember.Id; 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, CharacterName = role.Character, MoviePosterPath = role.PosterPath, ReleaseDate = DateTime.TryParse(fullMovie?.ReleaseDate, out var parsedDate) ? parsedDate.ToString("MM/dd/yyyy") : "N/A", Overview = fullMovie?.Overview ?? "", Franchise = fullMovie?.BelongsToCollection?.Name ?? "Standalone" }; _actor.MovieCharacters.Add(movieCharacter); if (_matchedMovie == null) { if (role.Title == movie.Title && role.Character == castMember.Character) { _matchedMovie = movieCharacter; } } } } } } } } } _isSearching = false; StateHasChanged(); } private async Task GetProperMovieBasedOffOfActorInvolvement(string movieActorTitle, CastMember actor) { List overallCredits = new(); List actorMovies = await MovieService.GetMoviesByTitle(movieActorTitle); foreach (Movie movie in actorMovies) { overallCredits.Add(await MovieService.GetMovieCreditsByMovieId(movie.Id)); } Credits actorMovieCredits = overallCredits.FirstOrDefault(x => x.Cast.Any(c => c.Id == actor.Id)); Movie movie1 = actorMovies.Where(x => x.Id == actorMovieCredits.Id).FirstOrDefault(); return movie1; } }