示例#1
0
        private string getImageBaseUrl()
        {
            DateTime now = DateTime.Now;

            DateTime lastCheckDate = DateTime.MinValue;

            if (DateTime.TryParse(MovingPicturesCore.Settings.TMDbConfigLastCheck, out lastCheckDate))
            {
                if (now.Subtract(lastCheckDate).Days <= MovingPicturesCore.Settings.TMDbConfigPeriod)
                {
                    return(MovingPicturesCore.Settings.TMDbImageBaseUrl);
                }
            }

            // request configuation object
            var tmdbConfig = TheMovieDbAPI.GetConfiguration();

            if (tmdbConfig == null || tmdbConfig.Images == null)
            {
                return(null);
            }

            MovingPicturesCore.Settings.TMDbConfigLastCheck = now.ToString("yyyy-MM-dd");

            // we only ever need the original size
            MovingPicturesCore.Settings.TMDbImageBaseUrl = tmdbConfig.Images.BaseUrl + "original";
            return(MovingPicturesCore.Settings.TMDbImageBaseUrl);
        }
示例#2
0
        private List <DBMovieInfo> Search(string title, int?year = null)
        {
            List <DBMovieInfo> results = new List <DBMovieInfo>();

            string releaseYear = year == null ? string.Empty : year.ToString();
            bool   adultSearch = false;

            bool.TryParse(MovingPicturesCore.Settings.TMDbAdultSearch, out adultSearch);

            var searchResults = TheMovieDbAPI.SearchMovies(title, language: MovingPicturesCore.Settings.DataProviderLanguageCode, includeAdult: adultSearch, year: releaseYear);

            if (searchResults == null || searchResults.TotalResults == 0)
            {
                return(results);
            }

            foreach (var result in searchResults.Results)
            {
                var movie = getMovieInformation(result.Id.ToString());
                if (movie != null)
                {
                    results.Add(movie);
                }
            }
            return(results);
        }
示例#3
0
        private string getTheMovieDbId(DBMovieInfo movie, bool fuzzyMatch)
        {
            // check for internally stored TMDb ID
            DBSourceMovieInfo idObj = movie.GetSourceMovieInfo(SourceInfo);

            if (idObj != null && idObj.Identifier != null)
            {
                return(idObj.Identifier);
            }

            // if available, lookup based on IMDb ID
            else if (movie.ImdbID != null && movie.ImdbID.Trim().Length == 9)
            {
                string imdbId    = movie.ImdbID.Trim();
                var    movieInfo = TheMovieDbAPI.GetMovieInfo(imdbId);
                if (movieInfo != null)
                {
                    return(movieInfo.Id.ToString());
                }
            }

            // if asked for, do a fuzzy match based on title and year
            else if (fuzzyMatch)
            {
                // grab possible matches by main title + year
                List <DBMovieInfo> results = Search(movie.Title, movie.Year);
                if (results.Count == 0)
                {
                    results = Search(movie.Title);
                }

                // grab possible matches by alt titles
                foreach (string currAltTitle in movie.AlternateTitles)
                {
                    List <DBMovieInfo> tempResults = Search(movie.Title, movie.Year);
                    if (tempResults.Count == 0)
                    {
                        tempResults = Search(movie.Title);
                    }

                    results.AddRange(tempResults);
                }

                // pick a possible match if one meets our requirements
                foreach (DBMovieInfo currMatch in results)
                {
                    if (CloseEnough(currMatch, movie))
                    {
                        return(currMatch.GetSourceMovieInfo(SourceInfo).Identifier);
                    }
                }
            }

            return(null);
        }
示例#4
0
        public bool GetBackdrop(DBMovieInfo movie)
        {
            if (movie == null)
            {
                return(false);
            }

            // if we already have a backdrop move on for now
            if (movie.BackdropFullPath.Trim().Length > 0)
            {
                return(true);
            }

            // do we have an id?
            string tmdbID = getTheMovieDbId(movie, true);

            if (tmdbID == null)
            {
                return(false);
            }

            // try to get movie artwork
            var movieArtwork = TheMovieDbAPI.GetMovieImages(tmdbID);

            if (movieArtwork == null || movieArtwork.Backdrops == null || movieArtwork.Backdrops.Count == 0)
            {
                return(false);
            }

            // filter out minimum size images
            int minWidth  = MovingPicturesCore.Settings.MinimumBackdropWidth;
            int minHeight = MovingPicturesCore.Settings.MinimumBackdropHeight;

            movieArtwork.Backdrops.RemoveAll(b => b.Width < minWidth || b.Height < minHeight);
            if (movieArtwork.Backdrops.Count == 0)
            {
                return(false);
            }

            // sort by highest rated / most popular
            var backdrops = movieArtwork.Backdrops.OrderByDescending(p => p.Score);

            // get the base url for images
            string baseImageUrl = getImageBaseUrl();

            if (string.IsNullOrEmpty(baseImageUrl))
            {
                return(false);
            }

            // moving pics currently only supports 1 backdrop per movie
            string backdropURL = baseImageUrl + backdrops.First().FilePath;

            if (backdropURL.Trim().Length > 0)
            {
                if (movie.AddBackdropFromURL(backdropURL) == ImageLoadResults.SUCCESS)
                {
                    movie.GetSourceMovieInfo(SourceInfo).Identifier = tmdbID;
                    return(true);
                }
            }

            // if we get here we didn't manage to find a proper backdrop
            // so return false
            return(false);
        }
示例#5
0
        private DBMovieInfo getMovieInformation(string movieId)
        {
            if (string.IsNullOrEmpty(movieId))
            {
                return(null);
            }

            // request the movie details by imdb id or tmdb id
            var movieDetails = TheMovieDbAPI.GetMovieInfo(movieId, MovingPicturesCore.Settings.DataProviderLanguageCode);

            if (movieDetails == null)
            {
                return(null);
            }

            var movie = new DBMovieInfo();

            // get the tmdb id
            movie.GetSourceMovieInfo(SourceInfo).Identifier = movieDetails.Id.ToString();

            // get the localised title if available otherwise fallback to original title
            movie.Title = string.IsNullOrEmpty(movieDetails.Title) ? movieDetails.OriginalTitle : movieDetails.Title;

            // get alternative titles
            var altTitles = TheMovieDbAPI.GetAlternativeTitles(movieDetails.Id.ToString());

            if (altTitles != null && altTitles.Titles != null)
            {
                movie.AlternateTitles.AddRange(altTitles.Titles.Select(a => a.Title));
            }

            // get languages
            if (movieDetails.SpokenLanguages != null)
            {
                movie.Language = string.Join("|", movieDetails.SpokenLanguages.Select(l => l.Name).ToArray());
            }

            // get tagline
            movie.Tagline = movieDetails.Tagline;

            // get imdb id
            movie.ImdbID = movieDetails.ImdbId;

            // get homepage
            movie.DetailsURL = movieDetails.HomePage;

            // get movie overview
            movie.Summary = movieDetails.Overview;

            // get movie score
            movie.Score = movieDetails.Score;

            // get movie vote count
            movie.Popularity = movieDetails.Votes;

            // get runtime (mins)
            movie.Runtime = movieDetails.Runtime == null ? 0 : (int)movieDetails.Runtime;

            // get movie cast
            var castInfo = TheMovieDbAPI.GetCastInfo(movieDetails.Id.ToString());

            if (castInfo != null)
            {
                // add actors, sort by order field
                if (castInfo.Cast != null)
                {
                    movie.Actors.AddRange(castInfo.Cast.OrderBy(a => a.Order).Select(a => a.Name));
                }

                // add directors
                if (castInfo.Crew != null)
                {
                    movie.Directors.AddRange(castInfo.Crew.Where(c => c.Department == "Directing").Select(c => c.Name).Distinct());
                }

                // add writers
                if (castInfo.Crew != null)
                {
                    movie.Writers.AddRange(castInfo.Crew.Where(c => c.Department == "Writing").Select(c => c.Name).Distinct());
                }
            }

            // add genres
            if (movieDetails.Genres != null)
            {
                movie.Genres.AddRange(movieDetails.Genres.Select(g => g.Name).ToArray());
            }

            // add collection - only one supported by TMDb
            if (movieDetails.BelongsToCollection != null)
            {
                // remove 'Collection' from name
                string collection = movieDetails.BelongsToCollection.Name.Replace("Collection", "").Trim();
                movie.Collections.Add(collection);
            }

            // add production companies (studios)
            if (movieDetails.ProductionCompanies != null)
            {
                movie.Studios.AddRange(movieDetails.ProductionCompanies.Select(p => p.Name));
            }

            // add release date and year
            DateTime date;

            if (DateTime.TryParse(movieDetails.ReleaseDate, out date))
            {
                movie.Year        = date.Year;
                movie.ReleaseDate = date;
            }

            // add certification (US MPAA rating)
            var movieCertifications = TheMovieDbAPI.GetReleaseInfo(movieDetails.Id.ToString());

            if (movieCertifications != null && movieCertifications.Countries != null)
            {
                // this could also be a scraper setting to get certification and release date from preferred country
                var releaseInfo = movieCertifications.Countries.Find(c => c.CountryCode == "US");
                if (releaseInfo != null)
                {
                    movie.Certification = releaseInfo.Certification;
                    // todo: uncomment this later if we have a setting for preferred country, it will override the release date that was previously set
                    //if (DateTime.TryParse(releaseInfo.ReleaseDate, out date))
                    //{
                    //    movie.ReleaseDate = date;
                    //}
                }
            }

            // get plot keywords
            var plotKeywords = TheMovieDbAPI.GetPlotKeywords(movieDetails.Id.ToString());

            if (plotKeywords != null)
            {
                movie.PlotKeywords.AddRange(plotKeywords.Keywords.Select(k => k.Name).ToArray());
            }

            return(movie);
        }
示例#6
0
        public bool GetArtwork(DBMovieInfo movie)
        {
            if (movie == null)
            {
                return(false);
            }

            // do we have an id?
            string tmdbID = getTheMovieDbId(movie, true);

            if (tmdbID == null)
            {
                return(false);
            }

            // try to get movie artwork
            var movieArtwork = TheMovieDbAPI.GetMovieImages(tmdbID);

            if (movieArtwork == null || movieArtwork.Posters == null || movieArtwork.Posters.Count == 0)
            {
                return(false);
            }

            // filter out minimum size images
            int minWidth  = MovingPicturesCore.Settings.MinimumCoverWidth;
            int minHeight = MovingPicturesCore.Settings.MinimumCoverHeight;

            movieArtwork.Posters.RemoveAll(p => p.Width < minWidth || p.Height < minHeight);
            if (movieArtwork.Posters.Count == 0)
            {
                return(false);
            }

            // filter posters by language
            var langPosters = movieArtwork.Posters.Where(p => p.LanguageCode == MovingPicturesCore.Settings.DataProviderLanguageCode);

            if (MovingPicturesCore.Settings.DataProviderLanguageCode == "en")
            {
                // include no language posters with english (sometimes language is not assigned)
                langPosters = langPosters.Union(movieArtwork.Posters.Where(p => p.LanguageCode == null));
            }
            // if no localised posters available use all posters
            if (langPosters.Count() == 0)
            {
                langPosters = movieArtwork.Posters;
            }

            // sort by highest rated / most popular
            langPosters = langPosters.OrderByDescending(p => p.Score);

            // grab coverart loading settings
            int maxCovers          = MovingPicturesCore.Settings.MaxCoversPerMovie;
            int maxCoversInSession = MovingPicturesCore.Settings.MaxCoversPerSession;
            int coversAdded        = 0;

            // get the base url for images
            string baseImageUrl = getImageBaseUrl();

            if (string.IsNullOrEmpty(baseImageUrl))
            {
                return(false);
            }

            // download posters
            foreach (var poster in langPosters)
            {
                // if we have hit our limit quit
                if (movie.AlternateCovers.Count >= maxCovers || coversAdded >= maxCoversInSession)
                {
                    return(true);
                }

                // get url for cover and load it via the movie object
                string coverPath = baseImageUrl + poster.FilePath;
                if (coverPath.Trim() != string.Empty)
                {
                    if (movie.AddCoverFromURL(coverPath) == ImageLoadResults.SUCCESS)
                    {
                        coversAdded++;
                    }
                }
            }

            if (coversAdded > 0)
            {
                // Update source info
                movie.GetSourceMovieInfo(SourceInfo).Identifier = tmdbID;
                return(true);
            }

            return(false);
        }