/// <summary>
        /// Fetches the episode data.
        /// </summary>
        /// <param name="episode">The episode.</param>
        /// <param name="seriesId">The series id.</param>
        /// <returns>Task{System.Boolean}.</returns>
        private async Task <bool> FetchEpisodeData(Episode episode, string seriesId, CancellationToken cancellationToken)
        {
            string name     = episode.Name;
            string location = episode.Path;

            Logger.Debug("TvDbProvider: Fetching episode data for: " + name);
            string epNum = TVUtils.EpisodeNumberFromFile(location, episode.Season != null);

            if (epNum == null)
            {
                Logger.Warn("TvDbProvider: Could not determine episode number for: " + episode.Path);
                return(false);
            }

            var episodeNumber = Int32.Parse(epNum);

            episode.IndexNumber = episodeNumber;
            var usingAbsoluteData = false;

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

            var seasonNumber = "";

            if (episode.Parent is Season)
            {
                seasonNumber = episode.Parent.IndexNumber.ToString();
            }

            if (string.IsNullOrEmpty(seasonNumber))
            {
                seasonNumber = TVUtils.SeasonNumberFromEpisodeFile(location); // try and extract the season number from the file name for S1E1, 1x04 etc.
            }
            if (!string.IsNullOrEmpty(seasonNumber))
            {
                seasonNumber = seasonNumber.TrimStart('0');

                if (string.IsNullOrEmpty(seasonNumber))
                {
                    seasonNumber = "0"; // Specials
                }

                var url = string.Format(episodeQuery, TVUtils.TVDBApiKey, seriesId, seasonNumber, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage);
                var doc = new XmlDocument();

                try
                {
                    using (var result = await HttpClient.Get(url, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false))
                    {
                        doc.Load(result);
                    }
                }
                catch (HttpException)
                {
                }

                //episode does not exist under this season, try absolute numbering.
                //still assuming it's numbered as 1x01
                //this is basicly just for anime.
                if (!doc.HasChildNodes && Int32.Parse(seasonNumber) == 1)
                {
                    url = string.Format(absEpisodeQuery, TVUtils.TVDBApiKey, seriesId, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage);

                    try
                    {
                        using (var result = await HttpClient.Get(url, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false))
                        {
                            if (result != null)
                            {
                                doc.Load(result);
                            }
                            usingAbsoluteData = true;
                        }
                    }
                    catch (HttpException)
                    {
                    }
                }

                if (doc.HasChildNodes)
                {
                    var p = doc.SafeGetString("//filename");
                    if (p != null)
                    {
                        if (!Directory.Exists(episode.MetaLocation))
                        {
                            Directory.CreateDirectory(episode.MetaLocation);
                        }

                        try
                        {
                            episode.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(episode, TVUtils.BannerUrl + p, Path.GetFileName(p), RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken);
                        }
                        catch (HttpException)
                        {
                        }
                        catch (IOException)
                        {
                        }
                    }

                    episode.Overview = doc.SafeGetString("//Overview");
                    if (usingAbsoluteData)
                    {
                        episode.IndexNumber = doc.SafeGetInt32("//absolute_number", -1);
                    }
                    if (episode.IndexNumber < 0)
                    {
                        episode.IndexNumber = doc.SafeGetInt32("//EpisodeNumber");
                    }

                    episode.Name            = episode.IndexNumber.Value.ToString("000") + " - " + doc.SafeGetString("//EpisodeName");
                    episode.CommunityRating = doc.SafeGetSingle("//Rating", -1, 10);
                    var      firstAired = doc.SafeGetString("//FirstAired");
                    DateTime airDate;
                    if (DateTime.TryParse(firstAired, out airDate) && airDate.Year > 1850)
                    {
                        episode.PremiereDate   = airDate.ToUniversalTime();
                        episode.ProductionYear = airDate.Year;
                    }

                    var actors = doc.SafeGetString("//GuestStars");
                    if (actors != null)
                    {
                        episode.AddPeople(actors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo {
                            Type = "Actor", Name = str
                        }));
                    }


                    var directors = doc.SafeGetString("//Director");
                    if (directors != null)
                    {
                        episode.AddPeople(directors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo {
                            Type = "Director", Name = str
                        }));
                    }


                    var writers = doc.SafeGetString("//Writer");
                    if (writers != null)
                    {
                        episode.AddPeople(writers.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo {
                            Type = "Writer", Name = str
                        }));
                    }

                    if (ConfigurationManager.Configuration.SaveLocalMeta)
                    {
                        if (!Directory.Exists(episode.MetaLocation))
                        {
                            Directory.CreateDirectory(episode.MetaLocation);
                        }
                        var ms = new MemoryStream();
                        doc.Save(ms);

                        await _providerManager.SaveToLibraryFilesystem(episode, Path.Combine(episode.MetaLocation, Path.GetFileNameWithoutExtension(episode.Path) + ".xml"), ms, cancellationToken).ConfigureAwait(false);
                    }

                    return(true);
                }
            }

            return(false);
        }