private void ProcessFilmInfo(Cineworld.Configuration config, Dictionary <int, FilmInfo> currentFilms, Dictionary <int, List <CinemaInfo> > filmCinemas, RegionDef region, bool searchTMDB = true)
        {
            CineworldService cws    = new CineworldService();
            Films            films  = null;
            Task <Films>     tfilms = cws.GetFilms(region, true);

            tfilms.Wait();

            if (!tfilms.IsCanceled && tfilms.Result != null)
            {
                films = tfilms.Result;
            }

            TMDBService tmdb = new TMDBService();

            HashSet <int> newFilmIds = new HashSet <int>();

            CineMobileService mobileService = new CineMobileService();

            //foreach (var film in films.films)
            for (int i = 0; i < films.films.Count; i++)
            {
                //if (i > 0)
                //    break;

                var film = films.films[i];

                newFilmIds.Add(film.edi);

                //if (film.edi != 128529 && film.edi != 139438)
                //    continue;

                Task <Cinemas> tcinemas = cws.GetCinemas(region, false, int.MinValue, film.edi);

                if (!currentFilms.ContainsKey(film.edi) || !currentFilms[film.edi].TMDBDataLoaded)
                {
                    Movie             movieData    = null;
                    Task <FilmImages> tmovieImages = null;

                    FilmInfo filminfo = new FilmInfo()
                    {
                        EDI = film.edi, Classification = !String.IsNullOrWhiteSpace(film.classification) ? film.classification : "TBC", Title = film.ProcessedTitle, TMDBDataLoaded = false
                    };

                    if (movieData == null)
                    {
                        Results res = null;
                        try
                        {
                            DateTime       ukRelease = film.GetReleaseDate();
                            Task <Results> tres      = tmdb.GetSearchResults(film.CleanTitle, ukRelease);
                            tres.Wait();
                            if (!tres.IsFaulted && tres.Result != null)
                            {
                                res = tres.Result;
                            }

                            if (res.SearchResults == null || res.SearchResults.Count == 0 && ukRelease != DateTime.MinValue)
                            {
                                Task <Results> tres2 = tmdb.GetSearchResults(film.CleanTitle, DateTime.MinValue);
                                tres2.Wait();
                                if (!tres2.IsFaulted && tres2.Result != null)
                                {
                                    res = tres2.Result;
                                }
                            }

                            if (res.SearchResults != null && res.SearchResults.Count > 0)
                            {
                                Result movieSearchRes = res.SearchResults.First();

                                Task <Movie> tmovieData = tmdb.GetMovieDetails(movieSearchRes.Id);
                                tmovieData.Wait();

                                tmovieImages = tmdb.GetFilmImages(movieSearchRes.Id);

                                if (!tmovieData.IsFaulted && tmovieData.Result != null)
                                {
                                    movieData = tmovieData.Result;
                                }

                                if (movieData.Trailers != null && movieData.Trailers.Youtube != null && movieData.Trailers.Youtube.Count > 0 && !String.IsNullOrEmpty(movieData.Trailers.Youtube[0].Source))
                                {
                                    if (movieData.Trailers.Youtube[0].Source.IndexOf('=') == -1)
                                    {
                                        string[] trailerparts = movieData.Trailers.Youtube[0].Source.Split('=');
                                        movieData.YouTubeTrailerID = trailerparts[trailerparts.Length - 1];
                                    }
                                    else
                                    {
                                        movieData.YouTubeTrailerID = movieData.Trailers.Youtube[0].Source;
                                    }
                                }
                                else
                                {
                                    Task <string> tyoutube = (new YouTubeService().GetVideoId(film.CleanTitle));
                                    tyoutube.Wait();

                                    if (!tyoutube.IsCanceled && tyoutube.Result != null)
                                    {
                                        movieData.YouTubeTrailerID = tyoutube.Result;
                                    }
                                }

                                if (ukRelease == DateTime.MinValue)
                                {
                                    Country c = movieData.Releases.Countries.FirstOrDefault(country => String.Compare(country.Iso31661, region == RegionDef.GB ? "GB" : "IE", StringComparison.OrdinalIgnoreCase) == 0);
                                    if (c != null)
                                    {
                                        ukRelease = DateTime.ParseExact(c.ReleaseDate, "yyyy-MM-dd", CultureInfo.InvariantCulture);
                                    }
                                    else if (!String.IsNullOrEmpty(movieSearchRes.ReleaseDate))
                                    {
                                        ukRelease = DateTime.ParseExact(movieSearchRes.ReleaseDate, "yyyy-MM-dd", CultureInfo.InvariantCulture);
                                    }
                                }

                                movieData.CineworldReleaseDate = ukRelease;
                            }
                        }
                        catch { }
                    }

                    if (movieData != null)
                    {
                        filminfo.TMDBDataLoaded = true;

                        filminfo.TmdbId   = movieData.Id;
                        filminfo.Overview = movieData.Overview;
                        filminfo.Tagline  = movieData.Tagline;
                        filminfo.Runtime  = movieData.Runtime;
                        filminfo.Genres   = new List <string>();
                        if (movieData.Genres != null)
                        {
                            foreach (var g in movieData.Genres)
                            {
                                filminfo.Genres.Add(g.Name);
                            }
                        }

                        if (tmovieImages != null)
                        {
                            tmovieImages.Wait();

                            if (!tmovieImages.IsFaulted && tmovieImages.Result != null)
                            {
                                if (tmovieImages.Result.Backdrops != null)
                                {
                                    foreach (var backdrop in tmovieImages.Result.Backdrops)
                                    {
                                        string url = string.Format("{0}{1}{2}", config.Images.BaseUrl, ConfigurationManager.AppSettings["mediumposterwidth"], backdrop.FilePath);
                                        filminfo.Backdrops.Add(new Uri(url));
                                    }
                                }

                                if (tmovieImages.Result.Posters != null)
                                {
                                    foreach (var poster in tmovieImages.Result.Posters)
                                    {
                                        string url = string.Format("{0}{1}{2}", config.Images.BaseUrl, ConfigurationManager.AppSettings["mediumposterwidth"], poster.FilePath);
                                        filminfo.Posters.Add(new Uri(url));
                                    }
                                }
                            }
                        }

                        if (!String.IsNullOrEmpty(movieData.PosterPath))
                        {
                            string poster = string.Format("{0}{1}{2}", config.Images.BaseUrl, ConfigurationManager.AppSettings["posterwidth"], movieData.PosterPath);

                            string mediumposter = string.Format("{0}{1}{2}", config.Images.BaseUrl, ConfigurationManager.AppSettings["mediumposterwidth"], movieData.PosterPath);

                            if (!MoviePosters.ContainsKey(filminfo.TmdbId))
                            {
                                MoviePosters.Add(filminfo.TmdbId, mediumposter);
                            }

                            filminfo.PosterUrl       = new Uri(poster);
                            filminfo.MediumPosterUrl = new Uri(mediumposter);
                        }
                        else if (!String.IsNullOrEmpty(film.poster_url))
                        {
                            filminfo.PosterUrl = new Uri(film.poster_url);
                        }

                        if (!String.IsNullOrEmpty(movieData.BackdropPath))
                        {
                            string backdrop = string.Format("{0}{1}{2}", config.Images.BaseUrl, ConfigurationManager.AppSettings["backdropwidth"], movieData.BackdropPath);
                            filminfo.BackdropUrl = new Uri(backdrop);
                        }

                        filminfo.YoutubeTrailer = movieData.YouTubeTrailerID;

                        filminfo.Release = movieData.CineworldReleaseDate;

                        if (movieData.Casts != null && movieData.Casts.Cast != null)
                        {
                            foreach (var cast in movieData.Casts.Cast)
                            {
                                filminfo.FilmCast.Add(new CastInfo()
                                {
                                    ID          = cast.Id,
                                    Name        = cast.Name,
                                    Character   = cast.Character,
                                    ProfilePath = (!String.IsNullOrEmpty(cast.ProfilePath) ? new Uri(string.Format("{0}{1}{2}", config.Images.BaseUrl, ConfigurationManager.AppSettings["posterwidth"], cast.ProfilePath)) : null)
                                });
                            }
                        }
                    }
                    else
                    {
                        if (!String.IsNullOrEmpty(film.poster_url))
                        {
                            filminfo.PosterUrl = new Uri(film.poster_url);
                        }
                    }

                    Task <List <FilmReview> > tReviews = mobileService.GetFilmReviews(filminfo);

                    tReviews.Wait();

                    if (!tReviews.IsFaulted && tReviews.Result != null)
                    {
                        filminfo.Reviews = tReviews.Result;
                    }

                    currentFilms[filminfo.EDI] = filminfo;
                }

                tcinemas.Wait();

                if (!tcinemas.IsFaulted && tcinemas.Result != null)
                {
                    List <CinemaInfo> fCinemas = new List <CinemaInfo>();
                    foreach (var cinema in tcinemas.Result.cinemas)
                    {
                        fCinemas.Add(new CinemaInfo()
                        {
                            ID = cinema.id, Name = cinema.name
                        });
                    }

                    filmCinemas[film.edi] = fCinemas;
                }
            }

            HashSet <int> currentFilmIds = new HashSet <int>(currentFilms.Keys);

            currentFilmIds.ExceptWith(newFilmIds);

            foreach (var id in currentFilmIds)
            {
                currentFilms.Remove(id);
            }
        }
        private void ProcessCinemaInfo(Dictionary <int, CinemaInfo> currentCinemas, Dictionary <int, List <FilmInfo> > cinemaFilms, Dictionary <int, FilmInfo> Films, RegionDef region)
        {
            CineworldService cws      = new CineworldService();
            Cinemas          cinemas  = null;
            Task <Cinemas>   tcinemas = cws.GetCinemas(region, true);

            tcinemas.Wait();

            if (!tcinemas.IsFaulted && tcinemas.Result != null)
            {
                cinemas = tcinemas.Result;
            }

            CineMobileService mobileService = new CineMobileService();

            //foreach (var cinema in cinemas.cinemas)
            for (int i = 0; i < cinemas.cinemas.Count; i++)
            {
                //if (i > 1)
                //    break;

                var cinema = cinemas.cinemas[i];

                //if (cinema.id != 91)
                //    continue;

                Task <Films> tf = cws.GetFilms(region, false, cinema.id);

                Task <List <CinemaReview> > tReviews = mobileService.GetCinemaReviews(cinema.id);

                if (!currentCinemas.ContainsKey(cinema.id))
                {
                    CinemaInfo ci = new CinemaInfo()
                    {
                        Address   = cinema.address,
                        ID        = cinema.id,
                        Name      = cinema.name,
                        Postcode  = cinema.postcode,
                        Telephone = cinema.telephone
                    };

                    if (this.LatitudeDictionary.ContainsKey(cinema.id) && this.LongitudeDictionary.ContainsKey(cinema.id))
                    {
                        ci.Latitude  = this.LatitudeDictionary[cinema.id];
                        ci.Longitute = this.LongitudeDictionary[cinema.id];
                    }
                    else
                    {
                        Bing.MapsClient mapClient = new Bing.MapsClient("At7qhfJw20G5JptEm0fdIaMehzBAU6GT4jJRpznGY_rdPRa5NquCN5GP8bzzdG0d", "en-GB");
                        var             tLocation = mapClient.LocationQuery(
                            new Bing.Maps.Address()
                        {
                            AddressLine   = cinema.address,
                            PostalCode    = cinema.postcode,
                            CountryRegion = (region == RegionDef.GB ? "United Kingdom" : "Ireland")
                        });

                        tLocation.Wait();

                        Bing.Maps.Location location = null;

                        try
                        {
                            if (!tLocation.IsFaulted && tLocation.Result != null)
                            {
                                location = tLocation.Result.GetLocations().FirstOrDefault();
                            }
                        }
                        catch { }

                        if (location != null && location.Point != null && location.Point.Coordinates.Length == 2)
                        {
                            ci.Latitude  = location.Point.Coordinates[0];
                            ci.Longitute = location.Point.Coordinates[1];
                        }
                    }

                    tReviews.Wait();
                    if (!tReviews.IsFaulted && tReviews.Result != null)
                    {
                        ci.Reviews = tReviews.Result;
                    }

                    currentCinemas[cinema.id] = ci;
                }

                tf.Wait();

                if (!tf.IsFaulted && tf.Result != null)
                {
                    List <FilmInfo> cFilms = new List <FilmInfo>();
                    foreach (var film in tf.Result.films)
                    {
                        if (!Films.ContainsKey(film.edi))
                        {
                            continue;
                        }

                        FilmInfo fi = new FilmInfo()
                        {
                            EDI = film.edi, Title = film.CleanTitle
                        };
                        fi.ShowingToday = true;

                        cFilms.Add(fi);
                    }
                    cinemaFilms[cinema.id] = cFilms;
                }
            }
        }