public CollectedEpisode CollectEpisodeData(FileInfo file)
        {
            var foundSeries = FindSeries(file);

            if(foundSeries.Count == 0)
                throw new Exception("Could not find a series for file: {0}".FormatReplace(file.Name));

            var series = foundSeries.Count == 1 ? foundSeries.FirstOrDefault() : OnFoundMultipleSeries(foundSeries);

            RememberSeriesWithFolder(series, file.DirectoryName);

            var epData = new CollectedEpisode
            {
                Path = file.FullName,
                Series = series
            };

            var directories = GetDirectories(file.FullName);
            directories.Add(file.Name);

            epData.Season = FindSeason(directories);
            if (epData.Season.HasValue)
            {
                epData.EpInSeason = FindEpInSeason(directories);
            }

            epData.ProductionNumber = FindProductionNumber(directories);

            epData.Title = FindTitle(file.FullName);

            return epData;
        }
        public Episode GetEpisode(CollectedEpisode collectedEpisodeData)
        {
            if (collectedEpisodeData.Series != null)
            {
                var series = collectedEpisodeData.Series;

                if(collectedEpisodeData.Season.HasValue
                && series.HasSeason(collectedEpisodeData.Season.Value)
                && collectedEpisodeData.EpInSeason.HasValue
                && series.Seasons[collectedEpisodeData.Season.Value].HasEpisode(collectedEpisodeData.EpInSeason.Value))
                {
                    return collectedEpisodeData.Series.Seasons[collectedEpisodeData.Season.Value].Episodes[collectedEpisodeData.EpInSeason.Value];
                }

                if(!string.IsNullOrEmpty(collectedEpisodeData.ProductionNumber))
                {
                    return series.FindEpisodeByProductionNumber(collectedEpisodeData.ProductionNumber);
                }

                if(!string.IsNullOrEmpty(collectedEpisodeData.Title))
                {
                    return series.FindEpisodeByTitle(collectedEpisodeData.Title);
                }
            }

            return null;
        }
        public Episode RetrieveEpisode(CollectedEpisode collectedEpisodeData)
        {
            if ((collectedEpisodeData.Season.HasValue && collectedEpisodeData.EpInSeason.HasValue)
                || !string.IsNullOrEmpty(collectedEpisodeData.ProductionNumber)
                || !string.IsNullOrEmpty(collectedEpisodeData.Title))
            {
                foreach (var dataRetriever in DataRetrievers)
                {
                    var episode = dataRetriever.GetEpisode(collectedEpisodeData);

                    if (episode != null)
                    {
                        return episode;
                    }
                }
            }

            return null;
        }
        public Episode RetrieveEpisode(CollectedEpisode collectedEpisodeData)
        {
            if(!collectedEpisodeData.HasSeries())
            {
                return null;
            }

            var episode = EpisodeDataRepository.RetrieveEpisode(collectedEpisodeData);
            episode.Series = collectedEpisodeData.Series;
            episode.Series.AddEpisode(episode);

            return episode;
        }