internal static bool GetSeriesAndEpisodeFromTVDb(string seriesName, string seriesID, TVDBLib tvdb, int episodeNumber,
                                                        int seasonNumber, out ITVDBEpisode episode, out ITVDBSeries series)
        {
            if (GetSeriesFromTVDb(seriesName, seriesID, tvdb, out series))
            {
                episode = null;
                return true;
            }

            return GetEpisodeFromTvDb(seriesName, seriesID, tvdb,
                                      seasonNumber, episodeNumber, out episode);

        }
        internal static void PopulateEpisodeMetadata(IMLItem item, bool fileServerIsOnline, bool isUNC, string mdfSettingsb,
                                                    IBaseSystem iBaseSystem, int seasonNumber, WebClient client,
                                                    ITVDBSeries series, ITVDBEpisode episode)
        {
            if (episode == null)
                return;

            if (String.IsNullOrEmpty(episode.ID.Trim()) ||
                episode.ID == null) 
                return;

            Debugger.LogMessageToFile("Found episode named " +
                                      episode.EpisodeName + "with ID " +
                                      episode.ID + ".");

            Debugger.LogMessageToFile("Writing series tags...");

            item.Tags["SeriesName"] = series.SeriesName;
            item.Tags["SeriesIMDbID"] = series.IMDb_ID;
            item.Tags["SeriesID"] = series.ID;


            GetEpisodeDetailsAndImages(item, fileServerIsOnline, isUNC,
                                                                             mdfSettingsb, iBaseSystem, client,
                                                                             seasonNumber, episode, series);


        }
        internal static bool GetSeriesFromTVDb(string seriesName, string seriesID,
                                              TVDBLib tvdb, out ITVDBSeries series)
        {

            Debugger.LogMessageToFile("Getting information for Series " + seriesName + "...");
            MainImportingEngine.ThisProgress.Progress(MainImportingEngine.CurrentProgress,
                                                      "Getting information for Series " + seriesName + "...");

            try
            {
                series = tvdb.GetSeries(seriesID);
            }
            catch
            {
                MainImportingEngine.ThisProgress.Progress(MainImportingEngine.CurrentProgress,
                                                          "TVdb did not respond. Retrying...");

                try
                {
                    series = tvdb.GetSeries(seriesID);
                }
                catch (Exception)
                {
                    Debugger.LogMessageToFile("Unable to connect to TVdb." +
                                              " Cannot get information for this Series.");
                    
                    StatusForm.statusForm.TrayIcon.ShowBalloonTip(2000, "Unable to connect to TVdb",
                                                                  "MediaFairy was unable to contact TVdb database in order to download episode information. Please check your internet connection availability, otherwise the online database may be temporarily unavailable.",
                                                                  ToolTipIcon.Info);

                    Thread.Sleep(2000);
                    series = null;
                    return true;

                }

            }

            return false;
        
        }
        internal static void GetEpisodeDetailsAndImages(IMLItem item, bool fileServerIsOnline, bool isUNC, string mdfSettingsb,
                                                       IBaseSystem iBaseSystem, WebClient client, int seasonNumber,
                                                       ITVDBEpisode episode, ITVDBSeries series)
        {

            PopulateEpisodeDetails
                (item, episode, series);

            GetEpisodeThumbnail(item, fileServerIsOnline, isUNC, mdfSettingsb,
                                iBaseSystem, episode, client);

            GetSeasonPoster
                (item, mdfSettingsb, iBaseSystem, episode, seasonNumber);

        }
        internal static void PopulateEpisodeDetails(IMLItem item, ITVDBEpisode episode, ITVDBSeries series)
        {

            Debugger.LogMessageToFile("Populating episode details...");

            item.Name = series.SeriesName + " " +
                        episode.SeasonNumber + "x" +
                        episode.EpisodeNumber + " - " +
                        episode.EpisodeName;


            item.Tags["SeasonID"] = episode.SeasonID;
            item.Tags["SeriesID"] = episode.SeriesID;
            item.Tags["TVDbID"] = episode.ID;

            item.Tags["EpisodeNumber"] = Convert.ToString(episode.EpisodeNumber);
            item.Tags["SeasonNumber"] = Convert.ToString(episode.SeasonNumber);
            item.Tags["EpisodeName"] = episode.EpisodeName;

            if (!Settings.WantEpisodeDetails)
                return;

            item.Tags["Director"] = episode.Director;
            item.Tags["Overview"] = episode.Overview;
            item.Tags["SeriesOverview"] = series.Overview;
            item.Tags["SeriesActors"] = series.Actors;
            item.Tags["Rating"] = episode.Rating;
            item.Tags["Writer"] = episode.Writer;
            item.Tags["GuestStars"] = episode.GuestStars;
            item.Tags["DVD_Chapter"] = episode.DVD_Chapter;
            item.Tags["DVD_Disc_ID"] = episode.DVD_Disc_ID;
            item.Tags["DVD_Episode_Number"] = episode.DVD_Episode_Number;


        }
        private static void GetMainDetails(IMLItem item, ITVDBSeries series)
        {

            if (!String.IsNullOrEmpty(series.ID))
            {

                MediaSectionsAllocator.TvSeriesSection.BeginUpdate();

                IMLItem seriesItem = MediaSectionsAllocator.TvSeriesSection.AddNewItem(series.SeriesName, series.ID);
                seriesItem.ExternalID = series.ID;
                seriesItem.SaveTags();

                MediaSectionsAllocator.TvSeriesSection.EndUpdate();

                item.Tags["SeriesID"] = series.ID;


            }


            if (!String.IsNullOrEmpty(series.Actors))
                item.Tags["SeriesActors"] = series.Actors;

            if (!String.IsNullOrEmpty(series.Airs_DayOfWeek) && !String.IsNullOrEmpty(series.Airs_TimeOfDay))
                item.Tags["SeriesAirs"] = series.Airs_DayOfWeek + " @ " + series.Airs_TimeOfDay;

            if (!String.IsNullOrEmpty(series.FirstAired.ToShortDateString()))
                item.Tags["SeriesFirstAired"] = series.FirstAired;

            if (!String.IsNullOrEmpty(series.Genre))
                item.Tags["SeriesGenre"] = series.Genre;

            if (!String.IsNullOrEmpty(series.IMDb_ID))
                item.Tags["SeriesIMDbID"] = series.IMDb_ID;

            if (!String.IsNullOrEmpty(series.Language))
            item.Tags["SeriesLanguage"] = series.Language;

            if (series.LastUpdated != 0)
            item.Tags["SeriesLastUpdated"] = series.LastUpdated;

            if (!String.IsNullOrEmpty(series.Network))
            item.Tags["SeriesNetwork"] = series.Network;

            if (!String.IsNullOrEmpty(series.Overview))
            item.Tags["SeriesOverview"] = series.Overview;

            if (series.Rating > 0)
                item.Tags["SeriesRating"] = series.Rating;


            if (!String.IsNullOrEmpty(series.Runtime))
                item.Tags["SeriesRuntime"] = series.Runtime;

            if (!String.IsNullOrEmpty(series.SeriesName))
            item.Tags["SeriesName"] = series.SeriesName;

            if (!String.IsNullOrEmpty(series.Status))
            item.Tags["SeriesStatus"] = series.Status;

            if (!String.IsNullOrEmpty(series.Zap2It_ID))
            item.Tags["Zap2ItID"] = series.Zap2It_ID;

            if (!String.IsNullOrEmpty(series.ID))
            item.Tags["SeriesID"] = series.ID;
            


            item.SaveTags();
        

        }
        internal static void PopulateSeriesDetails(IMLItem item,
                string mdfSettingsb, IBaseSystem ibs, ITVDBSeries series)
        {

            Debugger.LogMessageToFile("Populating Series Details...");


            GetMainDetails(item, series);


            GetSeriesBanner(item, mdfSettingsb, ibs);


            //TODO: Add Series Posters downloading feature
            //if (Importer.WantSeriesPosters)
            //{
            //    try
            //    {

            //        string ImageFile = MetaDataFolders.TVShows.CreateSeasonPostersFilePath(Item, MDFSettingsb, ".jpg", IBS);
            //        //MessageBox.Show(ImageFile);
            //        Debugger.LogMessageToFile("Downloading Series Poster...");
            //        TvSeriesOperations.DownloadSeriesBanner(SeriesItem, "SeriesPoster", 0, "", ImageFile);
            //    }
            //    catch (Exception e)
            //    {
            //        Debugger.LogMessageToFile("[Series metadata downloader] An unexpected error occured while trying to create a Series Poster file path. The error was: " + e.ToString());
            //        StatusForm.statusForm.TrayIcon.ShowBalloonTip(5000, "Error creating image file path", "MediaFairy encountered an error while trying to create a Series Poster file path. Please see Debug.log for details on this error.", ToolTipIcon.Warning);
            //    }

            //}


            GetSeriesFanart(item, mdfSettingsb, ibs);


        }