//Returns a Movie based on the information provided. If no movie was found, returns null. No dependencies are modified or added to the TheaterContext. public async Task<Movie> GetRequestedMovie(string name = "-1", string imdbId = "-1", string year = "-1", PlotVersion plotVersion = PlotVersion.Both) { if (name == "-1" && imdbId == "-1") throw new InvalidOperationException("While name and ImdbId are both optional, at least one must be provided."); var movieToReturn = new Movie(); var searchBy = new[] {"", ""}; if (name == "-1") { searchBy[0] = "i"; searchBy[1] = imdbId; year = "-1"; } else { searchBy[0] = "t"; searchBy[1] = name; } var valuesList = new List<Dictionary<string, string>>(); if (year == "-1") { if (plotVersion == PlotVersion.Short || plotVersion == PlotVersion.Both) { var values = new Dictionary<string, string> { { searchBy[0], searchBy[1] }, { "r", "xml"}, { "plot", "short"} }; valuesList.Add(values); } if (plotVersion == PlotVersion.Full || plotVersion == PlotVersion.Both) { var values = new Dictionary<string, string> { { searchBy[0], searchBy[1] }, { "r", "xml"}, { "plot", "full"} }; valuesList.Add(values); } } else { if (plotVersion == PlotVersion.Short || plotVersion == PlotVersion.Both) { var values = new Dictionary<string, string> { { searchBy[0], searchBy[1] }, { "y", year }, { "r", "xml"}, { "plot", "short"} }; valuesList.Add(values); } if (plotVersion == PlotVersion.Full || plotVersion == PlotVersion.Both) { var values = new Dictionary<string, string> { { searchBy[0], searchBy[1] }, { "y", year }, { "r", "xml"}, { "plot", "full"} }; valuesList.Add(values); } } var client = new HttpClient(); var requestUrls = new List<string>(); foreach (var valuesDictionary in valuesList) { var omdbUrl = "http://www.omdbapi.com/?"; for (var i = 0; i < valuesList.ElementAt(0).Count; i++) { omdbUrl += (i == 0 ? "" : "&") + valuesDictionary.Keys.ElementAt(i) + "=" + valuesDictionary[valuesDictionary.Keys.ElementAt(i)]; } requestUrls.Add(omdbUrl); } var responseNodes = new List<XmlNode>(); for(int i = 0; i < requestUrls.Count; i++) { var responseString = await client.GetStringAsync(requestUrls.ElementAt(i)); var doc = new XmlDocument(); doc.LoadXml(responseString); var rootNode = doc.SelectSingleNode("root"); if (rootNode == null) { BasicLogger.Log("Something went wrong while obtaining rootnode from document for " + requestUrls.ElementAt(i).Clone(), Verbosity.Error); requestUrls.Remove(requestUrls.ElementAt(i)); i = -1; continue; } if (rootNode.Attributes != null && rootNode.Attributes.GetNamedItem("response").Value == "False") { BasicLogger.Log("Invalid Identifier for " + requestUrls.ElementAt(i), Verbosity.Error); requestUrls.Remove(requestUrls.ElementAt(i)); i = -1; continue; } var docNode = rootNode.SelectSingleNode("movie"); if (docNode == null) { BasicLogger.Log("Empty XML for " + requestUrls.ElementAt(i), Verbosity.Error); requestUrls.Remove(requestUrls.ElementAt(i)); i = -1; continue; } responseNodes.Add(docNode); } for (var i = 0; i < responseNodes.Count; i++) { var xmlAttributeCollection = responseNodes.ElementAt(i).Attributes; if (xmlAttributeCollection == null) continue; if (xmlAttributeCollection.GetNamedItem("type").Value != "movie") { BasicLogger.Log("Element "+xmlAttributeCollection.GetNamedItem("imdbID").Value+" is not a movie!", Verbosity.Warning); continue; } if (i == 0) { movieToReturn.Title = xmlAttributeCollection.GetNamedItem("title").Value; movieToReturn.ImdbId = xmlAttributeCollection.GetNamedItem("imdbID").Value; movieToReturn.ImdbRating = decimal.Parse(xmlAttributeCollection.GetNamedItem("imdbRating").Value); var runtime = xmlAttributeCollection.GetNamedItem("runtime").Value; if (runtime.Contains("min")) runtime = runtime.Remove(runtime.IndexOf("min", StringComparison.Ordinal)).Trim(); movieToReturn.RunTime = short.Parse(runtime); movieToReturn.Language = xmlAttributeCollection.GetNamedItem("language").Value; movieToReturn.Rating = xmlAttributeCollection.GetNamedItem("rated").Value; movieToReturn.Year = xmlAttributeCollection.GetNamedItem("year").Value; movieToReturn.ReleaseDate = DateTime.Parse(xmlAttributeCollection.GetNamedItem("released").Value); movieToReturn.Actors = new List<Actor>(); var actorsString = xmlAttributeCollection.GetNamedItem("actors").Value; while (actorsString.Contains("(")) { actorsString = actorsString.Remove(actorsString.IndexOf("(", StringComparison.Ordinal), actorsString.IndexOf(")", StringComparison.Ordinal)+1 - actorsString.IndexOf("(", StringComparison.Ordinal)); } var actorsList = actorsString.Split(',').ToList(); foreach (var actor in actorsList) { if (actor.Trim() == "") continue; var act = _actorsRepository.Query(x => x.Name == actor.Trim()).FirstOrDefault() ?? new Actor { Name = actor.Trim() }; act.Portrait = _defaultAvatar.ToArray(); movieToReturn.Actors.Add(act); } movieToReturn.Directors = new List<Director>(); var directorsString = xmlAttributeCollection.GetNamedItem("director").Value; while (directorsString.Contains("(")) { directorsString = directorsString.Remove(directorsString.IndexOf("(", StringComparison.Ordinal), directorsString.IndexOf(")", StringComparison.Ordinal)+1 - directorsString.IndexOf("(", StringComparison.Ordinal)); } var directorsList = directorsString.Split(',').ToList(); foreach (var director in directorsList) { if (director.Trim() == "") continue; var dir = _directorsRepository.Query(x => x.Name == director.Trim()).FirstOrDefault() ?? new Director { Name = director.Trim() }; dir.Portrait = _defaultAvatar.ToArray(); movieToReturn.Directors.Add(dir); } movieToReturn.Writers = new List<Writer>(); var writersString = xmlAttributeCollection.GetNamedItem("writer").Value; while (writersString.Contains("(")) { writersString = writersString.Remove(writersString.IndexOf("(", StringComparison.Ordinal), writersString.IndexOf(")", StringComparison.Ordinal)+1 - writersString.IndexOf("(", StringComparison.Ordinal)); } var writersList = writersString.Split(',').ToList(); foreach (var writer in writersList) { if (writer.Trim() == "") continue; var wri = _writersRepository.Query(x => x.Name == writer.Trim()).FirstOrDefault() ?? new Writer { Name = writer.Trim() }; wri.Portrait = _defaultAvatar.ToArray(); movieToReturn.Writers.Add(wri); } movieToReturn.Genres = new List<Genre>(); var genresString = xmlAttributeCollection.GetNamedItem("genre").Value; while (genresString.Contains("(")) { genresString = genresString.Remove(genresString.IndexOf("(", StringComparison.Ordinal), genresString.IndexOf(")", StringComparison.Ordinal)+1 - genresString.IndexOf("(", StringComparison.Ordinal)); } var genresList = genresString.Split(',').ToList(); foreach (var genre in genresList) { var gen = _genresRepository.Query(x => x.Name == genre.Trim()).FirstOrDefault() ?? new Genre { Name = genre.Trim() }; movieToReturn.Genres.Add(gen); } var stringImage = client.GetStreamAsync(xmlAttributeCollection.GetNamedItem("poster").Value); await stringImage; var reader = new BinaryReader(stringImage.Result); var imagebytes = reader.ReadAllBytes(); movieToReturn.Poster = imagebytes; } if (requestUrls.ElementAt(i).Contains("plot=short")) movieToReturn.ShortPlot = responseNodes.ElementAt(i).Attributes.GetNamedItem("plot").Value; else movieToReturn.LongPlot = responseNodes.ElementAt(i).Attributes.GetNamedItem("plot").Value; } return (String.IsNullOrEmpty(movieToReturn.ImdbId) ? null : movieToReturn); }
//Returns a Movie based on the information provided. If no movie was found, returns null. No dependencies are modified or added to the TheaterContext. public async Task <Movie> GetRequestedMovie(string name = "-1", string imdbId = "-1", string year = "-1", PlotVersion plotVersion = PlotVersion.Both) { if (name == "-1" && imdbId == "-1") { throw new InvalidOperationException("While name and ImdbId are both optional, at least one must be provided."); } var movieToReturn = new Movie(); var searchBy = new[] { "", "" }; if (name == "-1") { searchBy[0] = "i"; searchBy[1] = imdbId; year = "-1"; } else { searchBy[0] = "t"; searchBy[1] = name; } var valuesList = new List <Dictionary <string, string> >(); if (year == "-1") { if (plotVersion == PlotVersion.Short || plotVersion == PlotVersion.Both) { var values = new Dictionary <string, string> { { searchBy[0], searchBy[1] }, { "r", "xml" }, { "plot", "short" } }; valuesList.Add(values); } if (plotVersion == PlotVersion.Full || plotVersion == PlotVersion.Both) { var values = new Dictionary <string, string> { { searchBy[0], searchBy[1] }, { "r", "xml" }, { "plot", "full" } }; valuesList.Add(values); } } else { if (plotVersion == PlotVersion.Short || plotVersion == PlotVersion.Both) { var values = new Dictionary <string, string> { { searchBy[0], searchBy[1] }, { "y", year }, { "r", "xml" }, { "plot", "short" } }; valuesList.Add(values); } if (plotVersion == PlotVersion.Full || plotVersion == PlotVersion.Both) { var values = new Dictionary <string, string> { { searchBy[0], searchBy[1] }, { "y", year }, { "r", "xml" }, { "plot", "full" } }; valuesList.Add(values); } } var client = new HttpClient(); var requestUrls = new List <string>(); foreach (var valuesDictionary in valuesList) { var omdbUrl = "http://www.omdbapi.com/?"; for (var i = 0; i < valuesList.ElementAt(0).Count; i++) { omdbUrl += (i == 0 ? "" : "&") + valuesDictionary.Keys.ElementAt(i) + "=" + valuesDictionary[valuesDictionary.Keys.ElementAt(i)]; } requestUrls.Add(omdbUrl); } var responseNodes = new List <XmlNode>(); for (int i = 0; i < requestUrls.Count; i++) { var responseString = await client.GetStringAsync(requestUrls.ElementAt(i)); var doc = new XmlDocument(); doc.LoadXml(responseString); var rootNode = doc.SelectSingleNode("root"); if (rootNode == null) { BasicLogger.Log("Something went wrong while obtaining rootnode from document for " + requestUrls.ElementAt(i).Clone(), Verbosity.Error); requestUrls.Remove(requestUrls.ElementAt(i)); i = -1; continue; } if (rootNode.Attributes != null && rootNode.Attributes.GetNamedItem("response").Value == "False") { BasicLogger.Log("Invalid Identifier for " + requestUrls.ElementAt(i), Verbosity.Error); requestUrls.Remove(requestUrls.ElementAt(i)); i = -1; continue; } var docNode = rootNode.SelectSingleNode("movie"); if (docNode == null) { BasicLogger.Log("Empty XML for " + requestUrls.ElementAt(i), Verbosity.Error); requestUrls.Remove(requestUrls.ElementAt(i)); i = -1; continue; } responseNodes.Add(docNode); } for (var i = 0; i < responseNodes.Count; i++) { var xmlAttributeCollection = responseNodes.ElementAt(i).Attributes; if (xmlAttributeCollection == null) { continue; } if (xmlAttributeCollection.GetNamedItem("type").Value != "movie") { BasicLogger.Log("Element " + xmlAttributeCollection.GetNamedItem("imdbID").Value + " is not a movie!", Verbosity.Warning); continue; } if (i == 0) { movieToReturn.Title = xmlAttributeCollection.GetNamedItem("title").Value; movieToReturn.ImdbId = xmlAttributeCollection.GetNamedItem("imdbID").Value; movieToReturn.ImdbRating = decimal.Parse(xmlAttributeCollection.GetNamedItem("imdbRating").Value); var runtime = xmlAttributeCollection.GetNamedItem("runtime").Value; if (runtime.Contains("min")) { runtime = runtime.Remove(runtime.IndexOf("min", StringComparison.Ordinal)).Trim(); } movieToReturn.RunTime = short.Parse(runtime); movieToReturn.Language = xmlAttributeCollection.GetNamedItem("language").Value; movieToReturn.Rating = xmlAttributeCollection.GetNamedItem("rated").Value; movieToReturn.Year = xmlAttributeCollection.GetNamedItem("year").Value; movieToReturn.ReleaseDate = DateTime.Parse(xmlAttributeCollection.GetNamedItem("released").Value); movieToReturn.Actors = new List <Actor>(); var actorsString = xmlAttributeCollection.GetNamedItem("actors").Value; while (actorsString.Contains("(")) { actorsString = actorsString.Remove(actorsString.IndexOf("(", StringComparison.Ordinal), actorsString.IndexOf(")", StringComparison.Ordinal) + 1 - actorsString.IndexOf("(", StringComparison.Ordinal)); } var actorsList = actorsString.Split(',').ToList(); foreach (var actor in actorsList) { if (actor.Trim() == "") { continue; } var act = _actorsRepository.Query(x => x.Name == actor.Trim()).FirstOrDefault() ?? new Actor { Name = actor.Trim() }; act.Portrait = _defaultAvatar.ToArray(); movieToReturn.Actors.Add(act); } movieToReturn.Directors = new List <Director>(); var directorsString = xmlAttributeCollection.GetNamedItem("director").Value; while (directorsString.Contains("(")) { directorsString = directorsString.Remove(directorsString.IndexOf("(", StringComparison.Ordinal), directorsString.IndexOf(")", StringComparison.Ordinal) + 1 - directorsString.IndexOf("(", StringComparison.Ordinal)); } var directorsList = directorsString.Split(',').ToList(); foreach (var director in directorsList) { if (director.Trim() == "") { continue; } var dir = _directorsRepository.Query(x => x.Name == director.Trim()).FirstOrDefault() ?? new Director { Name = director.Trim() }; dir.Portrait = _defaultAvatar.ToArray(); movieToReturn.Directors.Add(dir); } movieToReturn.Writers = new List <Writer>(); var writersString = xmlAttributeCollection.GetNamedItem("writer").Value; while (writersString.Contains("(")) { writersString = writersString.Remove(writersString.IndexOf("(", StringComparison.Ordinal), writersString.IndexOf(")", StringComparison.Ordinal) + 1 - writersString.IndexOf("(", StringComparison.Ordinal)); } var writersList = writersString.Split(',').ToList(); foreach (var writer in writersList) { if (writer.Trim() == "") { continue; } var wri = _writersRepository.Query(x => x.Name == writer.Trim()).FirstOrDefault() ?? new Writer { Name = writer.Trim() }; wri.Portrait = _defaultAvatar.ToArray(); movieToReturn.Writers.Add(wri); } movieToReturn.Genres = new List <Genre>(); var genresString = xmlAttributeCollection.GetNamedItem("genre").Value; while (genresString.Contains("(")) { genresString = genresString.Remove(genresString.IndexOf("(", StringComparison.Ordinal), genresString.IndexOf(")", StringComparison.Ordinal) + 1 - genresString.IndexOf("(", StringComparison.Ordinal)); } var genresList = genresString.Split(',').ToList(); foreach (var genre in genresList) { var gen = _genresRepository.Query(x => x.Name == genre.Trim()).FirstOrDefault() ?? new Genre { Name = genre.Trim() }; movieToReturn.Genres.Add(gen); } var stringImage = client.GetStreamAsync(xmlAttributeCollection.GetNamedItem("poster").Value); await stringImage; var reader = new BinaryReader(stringImage.Result); var imagebytes = reader.ReadAllBytes(); movieToReturn.Poster = imagebytes; } if (requestUrls.ElementAt(i).Contains("plot=short")) { movieToReturn.ShortPlot = responseNodes.ElementAt(i).Attributes.GetNamedItem("plot").Value; } else { movieToReturn.LongPlot = responseNodes.ElementAt(i).Attributes.GetNamedItem("plot").Value; } } return(String.IsNullOrEmpty(movieToReturn.ImdbId) ? null : movieToReturn); }