public void Update(DBMovieInfo movie)
        {
            List<DBSourceInfo> sources;
            lock (detailSources) sources = new List<DBSourceInfo>(detailSources);

            // unlock the movie fields for the first iteration
            movie.ProtectExistingValuesFromCopy(false);

            // first update from the primary source of this data
            int providerCount = 0;
            if (movie.PrimarySource != null && movie.PrimarySource.Provider != null) {
                UpdateResults success = movie.PrimarySource.Provider.Update(movie);
                logger.Debug("UPDATE: Title='{0}', Provider='{1}', Version={2}, Result={3}", movie.Title, movie.PrimarySource.Provider.Name, movie.PrimarySource.Provider.Version, success.ToString());
                providerCount++;
            }

            foreach (DBSourceInfo currSource in sources) {
                if (movie.IsFullyPopulated()) {
                    logger.Debug("UPDATE: All fields are populated. Done updating '" + movie.Title + "'.");
                    break;
                }

                if (currSource.IsDisabled(DataType.DETAILS))
                    continue;

                if (currSource == movie.PrimarySource)
                    continue;

                providerCount++;

                if (providerCount <= MovingPicturesCore.Settings.DataProviderRequestLimit || MovingPicturesCore.Settings.DataProviderRequestLimit == 0) {
                    UpdateResults success = currSource.Provider.Update(movie);
                    logger.Debug("UPDATE: Title='{0}', Provider='{1}', Version={2}, Result={3}", movie.Title, currSource.Provider.Name, currSource.Provider.Version, success.ToString());
                }
                else {
                    // stop update
                    break;
                }

                if (MovingPicturesCore.Settings.UseTranslator) {
                    movie.Translate();
                }
            }
        }