コード例 #1
0
 private void cmdLoadByImdbId_Click(object sender, EventArgs e)
 {
     if (!txtImdbSearchId.Text.Equals(""))
     {
         TvdbSearchResult result = m_tvdbHandler.GetSeriesByRemoteId(ExternalId.ImdbId, txtImdbSearchId.Text);
         if (result != null)
         {
             List <TvdbSearchResult> list = new List <TvdbSearchResult>();
             list.Add(result);
             SearchResultForm form = new SearchResultForm(list);
             form.StartPosition = FormStartPosition.Manual;
             form.Left          = this.Left + this.Width / 2 - form.Width / 2;
             form.Top           = this.Top + this.Height / 2 - form.Height / 2;
             DialogResult res = form.ShowDialog();
             if (res == DialogResult.OK)
             {
                 LoadSeries(form.Selection.Id);
             }
         }
         else
         {
             MessageBox.Show("No results for this series");
         }
     }
 }
コード例 #2
0
        public override async Task <bool> UpdateFromOnlineSeriesPersonAsync(SeriesInfo seriesInfo, PersonInfo person, TvdbLanguage language, bool cacheOnly)
        {
            try
            {
                if (person.Occupation != PersonAspect.OCCUPATION_ACTOR)
                {
                    return(false);
                }

                language = language ?? PreferredLanguage;

                TvdbSeries seriesDetail = null;
                if (seriesInfo.TvdbId > 0)
                {
                    seriesDetail = await _tvdbHandler.GetSeriesAsync(seriesInfo.TvdbId, language, true, true, false).ConfigureAwait(false);
                }
                if (seriesDetail == null && !cacheOnly && !string.IsNullOrEmpty(seriesInfo.ImdbId))
                {
                    TvdbSearchResult foundSeries = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, seriesInfo.ImdbId).ConfigureAwait(false);

                    if (foundSeries != null)
                    {
                        seriesDetail = await _tvdbHandler.GetSeriesAsync(foundSeries.Id, language, true, true, false).ConfigureAwait(false);
                    }
                }
                if (seriesDetail == null)
                {
                    return(false);
                }

                List <PersonInfo> actors = ConvertToPersons(seriesDetail.TvdbActors, PersonAspect.OCCUPATION_ACTOR, null, seriesDetail.SeriesName);
                int index = actors.IndexOf(person);
                if (index >= 0)
                {
                    person.TvdbId          = actors[index].TvdbId;
                    person.Name            = actors[index].Name;
                    person.Occupation      = actors[index].Occupation;
                    person.Order           = actors[index].Order;
                    person.ParentMediaName = seriesDetail.SeriesName;
                    if (!person.DataProviders.Contains(_name))
                    {
                        person.DataProviders.Add(_name);
                    }

                    return(true);
                }

                return(false);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("TvDbWrapper: Exception while processing person {0}", ex, person.ToString());
                return(false);
            }
        }
コード例 #3
0
        public override async Task <bool> UpdateFromOnlineSeriesSeasonAsync(SeasonInfo season, TvdbLanguage language, bool cacheOnly)
        {
            try
            {
                language = language ?? PreferredLanguage;

                TvdbSeries seriesDetail = null;
                if (season.SeriesTvdbId > 0)
                {
                    seriesDetail = await _tvdbHandler.GetSeriesAsync(season.SeriesTvdbId, language, true, false, false).ConfigureAwait(false);
                }
                if (seriesDetail == null && !cacheOnly && !string.IsNullOrEmpty(season.SeriesImdbId))
                {
                    TvdbSearchResult foundSeries = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, season.SeriesImdbId).ConfigureAwait(false);

                    if (foundSeries != null)
                    {
                        seriesDetail = await _tvdbHandler.GetSeriesAsync(foundSeries.Id, language, true, false, false).ConfigureAwait(false);
                    }
                }
                if (seriesDetail == null)
                {
                    return(false);
                }
                if (!season.SeasonNumber.HasValue)
                {
                    return(false);
                }
                var episode = seriesDetail.Episodes.Where(e => e.SeasonNumber == season.SeasonNumber).ToList().FirstOrDefault();
                if (episode == null)
                {
                    return(false);
                }

                season.TvdbId        = episode.SeasonId;
                season.SeriesTvdbId  = seriesDetail.Id;
                season.SeriesImdbId  = seriesDetail.ImdbId;
                season.FirstAired    = episode.FirstAired;
                season.SeriesName    = new SimpleTitle(seriesDetail.SeriesName, false);
                season.SeasonNumber  = season.SeasonNumber.Value;
                season.Description   = new SimpleTitle(seriesDetail.Overview, false);
                season.TotalEpisodes = seriesDetail.Episodes.FindAll(e => e.SeasonNumber == season.SeasonNumber).Count;
                if (!season.DataProviders.Contains(_name))
                {
                    season.DataProviders.Add(_name);
                }

                return(true);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("TvDbWrapper: Exception while processing season {0}", ex, season.ToString());
                return(false);
            }
        }
コード例 #4
0
        public override async Task <bool> UpdateFromOnlineSeriesCompanyAsync(SeriesInfo seriesInfo, CompanyInfo company, TvdbLanguage language, bool cacheOnly)
        {
            try
            {
                if (company.Type != CompanyAspect.COMPANY_TV_NETWORK)
                {
                    return(false);
                }

                language = language ?? PreferredLanguage;

                TvdbSeries seriesDetail = null;
                if (seriesInfo.TvdbId > 0)
                {
                    seriesDetail = await _tvdbHandler.GetSeriesAsync(seriesInfo.TvdbId, language, true, false, false).ConfigureAwait(false);
                }
                if (seriesDetail == null && !cacheOnly && !string.IsNullOrEmpty(seriesInfo.ImdbId))
                {
                    TvdbSearchResult foundSeries = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, seriesInfo.ImdbId).ConfigureAwait(false);

                    if (foundSeries != null)
                    {
                        seriesDetail = await _tvdbHandler.GetSeriesAsync(foundSeries.Id, language, true, false, false).ConfigureAwait(false);
                    }
                }
                if (seriesDetail == null)
                {
                    return(false);
                }

                List <CompanyInfo> companies = ConvertToCompanies(seriesDetail.NetworkID, seriesDetail.Network, CompanyAspect.COMPANY_TV_NETWORK);
                int index = companies.IndexOf(company);
                if (index >= 0)
                {
                    company.TvdbId = companies[index].TvdbId;
                    company.Name   = companies[index].Name;
                    company.Type   = companies[index].Type;
                    company.Order  = companies[index].Order;
                    if (!company.DataProviders.Contains(_name))
                    {
                        company.DataProviders.Add(_name);
                    }

                    return(true);
                }

                return(false);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("TvDbWrapper: Exception while processing company {0}", ex, company.ToString());
                return(false);
            }
        }
コード例 #5
0
        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            if (ResultsTabControl.SelectedIndex == 0 && MovieResultList.SelectedIndex > -1)
            {
                MovieDBSelectionResult = (SearchMovie)MovieResultList.SelectedItem;
            }
            if (ResultsTabControl.SelectedIndex == 1 && ShowResultList.SelectedIndex > -1)
            {
                TvdbSelectionResult = (TvdbSearchResult)ShowResultList.SelectedItem;
            }

            DialogResult = true;
        }
コード例 #6
0
        public override async Task <bool> UpdateFromOnlineSeriesCharacterAsync(SeriesInfo seriesInfo, CharacterInfo character, TvdbLanguage language, bool cacheOnly)
        {
            try
            {
                language = language ?? PreferredLanguage;

                TvdbSeries seriesDetail = null;
                if (seriesInfo.TvdbId > 0)
                {
                    seriesDetail = await _tvdbHandler.GetSeriesAsync(seriesInfo.TvdbId, language, true, true, false).ConfigureAwait(false);
                }
                if (seriesDetail == null && !cacheOnly && !string.IsNullOrEmpty(seriesInfo.ImdbId))
                {
                    TvdbSearchResult foundSeries = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, seriesInfo.ImdbId).ConfigureAwait(false);

                    if (foundSeries != null)
                    {
                        seriesDetail = await _tvdbHandler.GetSeriesAsync(foundSeries.Id, language, true, true, false).ConfigureAwait(false);
                    }
                }
                if (seriesDetail == null)
                {
                    return(false);
                }

                List <CharacterInfo> characters = ConvertToCharacters(seriesDetail.TvdbActors, null, seriesDetail.SeriesName);
                int index = characters.IndexOf(character);
                if (index >= 0)
                {
                    character.ActorTvdbId     = characters[index].ActorTvdbId;
                    character.ActorName       = characters[index].ActorName;
                    character.Name            = characters[index].Name;
                    character.Order           = characters[index].Order;
                    character.ParentMediaName = seriesDetail.SeriesName;
                    if (!character.DataProviders.Contains(_name))
                    {
                        character.DataProviders.Add(_name);
                    }

                    return(true);
                }

                return(false);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("TvDbWrapper: Exception while processing character {0}", ex, character.ToString());
                return(false);
            }
        }
コード例 #7
0
        /// <summary>
        /// Extract the results of a series search with format:
        /// <![CDATA[
        /// <?xml version="1.0" encoding="UTF-8" ?>
        /// <Data>
        ///   <Series>
        ///      <seriesid>73739</seriesid>
        ///      <language>en</language>
        ///      <SeriesName>Lost</SeriesName>
        ///      <banner>graphical/24313-g2.jpg</banner>
        ///      <Overview>After Oceanic Air flight 815...</Overview>
        ///      <FirstAired>2004-09-22</FirstAired>
        ///      <IMDB_ID>tt0411008</IMDB_ID>
        ///      <zap2it_id>SH672362</zap2it_id>
        ///      <id>73739</id>
        ///   </Series>
        /// </Data>
        /// ]]>
        /// </summary>
        /// <param name="_data"></param>
        /// <returns></returns>
        internal List <TvdbSearchResult> ExtractSeriesSearchResults(String _data)
        {
            XDocument xml = XDocument.Parse(_data);

            var allSeries = from series in xml.Descendants("Series")
                            where series.HasElements == true
                            select new
            {
                Id         = Util.Int32Parse(series.Element("seriesid").Value),
                FirstAired = series.Element("FirstAired") != null?series.Element("FirstAired").Value                       : "",
                Language   = series.Element("language") != null?series.Element("language").Value                           : "",
                Overview   = series.Element("Overview") != null?series.Element("Overview").Value                           : "",
                SeriesName = series.Element("SeriesName") != null?series.Element("SeriesName").Value                       : "",
                IMDB_ID    = series.Element("IMDB_ID") != null?series.Element("IMDB_ID").Value                             : "",
                BannerPath = series.Element("banner") != null?series.Element("banner").Value                               : "",
                AliasNames = series.Element("AliasNames") != null?Util.SplitTvdbString(series.Element("AliasNames").Value) : new List <string>(0)
            };

            List <TvdbSearchResult> retList = new List <TvdbSearchResult>();

            foreach (var s in allSeries)
            {
                TvdbSearchResult res = new TvdbSearchResult();
                res.Id     = s.Id;
                res.ImdbId = s.IMDB_ID;
                if (!s.FirstAired.Equals(""))
                {
                    res.FirstAired = DateTime.Parse(s.FirstAired);
                }
                if (!s.Language.Equals(""))
                {
                    res.Language = Util.ParseLanguage(s.Language);
                }
                res.SeriesName = s.SeriesName;
                res.Overview   = s.Overview;
                res.AliasNames = s.AliasNames;
                if (!s.BannerPath.Equals(""))
                {
                    res.Banner = new TvdbSeriesBanner(0, s.BannerPath, null, TvdbSeriesBanner.Type.none);
                }
                else
                {
                    res.Banner = new TvdbSeriesBanner(s.Id, null, null, TvdbSeriesBanner.Type.none);
                }
                retList.Add(res);
            }

            return(retList);
        }
コード例 #8
0
        private void lvSearchResult_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvSearchResult.SelectedItems.Count == 1)
            {
                m_selection = (TvdbSearchResult)lvSearchResult.SelectedItems[0].Tag;
                bcSeriesBanner.ClearControl();
                if (m_selection != null)
                {
                    bcSeriesBanner.BannerImage = m_selection.Banner;
                }

                txtOverview.Text   = m_selection.Overview;
                linkImdb.Text      = m_selection.ImdbId.Equals("")? "": "http://www.imdb.com/title/" + m_selection.ImdbId;
                txtFirstAired.Text = m_selection.FirstAired.ToShortDateString();
            }
        }
コード例 #9
0
        /// <summary>
        /// Extract the results of a series search with format:
        /// <![CDATA[
        /// <?xml version="1.0" encoding="UTF-8" ?>
        /// <Data>
        ///   <Series>
        ///      <seriesid>73739</seriesid>
        ///      <language>en</language>
        ///      <SeriesName>Lost</SeriesName>
        ///      <banner>graphical/24313-g2.jpg</banner>
        ///      <Overview>After Oceanic Air flight 815...</Overview>
        ///      <FirstAired>2004-09-22</FirstAired>
        ///      <IMDB_ID>tt0411008</IMDB_ID>
        ///      <zap2it_id>SH672362</zap2it_id>
        ///      <id>73739</id>
        ///   </Series>
        /// </Data>
        /// ]]>
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        internal List <TvdbSearchResult> ExtractSeriesSearchResults(String data)
        {
            XDocument xml = XDocument.Parse(data);

            var allSeries = from series in xml.Descendants("Series")
                            where series.HasElements
                            select new
            {
                Id         = Util.Int32Parse(series.Element("seriesid").Value),
                FirstAired = series.Element("FirstAired") != null?series.Element("FirstAired").Value : "",
                Language   = series.Element("language") != null?series.Element("language").Value     : "",
                Overview   = series.Element("Overview") != null?series.Element("Overview").Value     : "",
                SeriesName = series.Element("SeriesName") != null?series.Element("SeriesName").Value : "",
                IMDB_ID    = series.Element("IMDB_ID") != null?series.Element("IMDB_ID").Value       : "",
                BannerPath = series.Element("banner") != null?series.Element("banner").Value         : ""
            };

            List <TvdbSearchResult> retList = new List <TvdbSearchResult>();

            foreach (var s in allSeries)
            {
                TvdbSearchResult res = new TvdbSearchResult {
                    Id = s.Id, ImdbId = s.IMDB_ID
                };
                if (!s.FirstAired.Equals(""))
                {
                    res.FirstAired = DateTime.Parse(s.FirstAired, System.Globalization.CultureInfo.InvariantCulture);
                }
                if (!s.Language.Equals(""))
                {
                    res.Language = TvDbUtils.ParseLanguage(s.Language);
                }
                res.SeriesName = s.SeriesName;
                res.Overview   = s.Overview;
                res.Banner     = !s.BannerPath.Equals("") ?
                                 new TvdbSeriesBanner(0, s.BannerPath, null, TvdbSeriesBanner.Type.None) :
                                 new TvdbSeriesBanner(s.Id, null, null, TvdbSeriesBanner.Type.None);
                retList.Add(res);
            }

            return(retList);
        }
コード例 #10
0
        protected async Task <ApiWrapperImageCollection <TvdbBanner> > GetEpisodeFanArtAsync(EpisodeInfo episode, TvdbLanguage language)
        {
            if (episode == null || (episode.SeriesTvdbId < 1 && string.IsNullOrEmpty(episode.SeriesImdbId)) || !episode.SeasonNumber.HasValue || episode.EpisodeNumbers.Count == 0)
            {
                return(null);
            }
            TvdbSeries seriesDetail = null;

            if (episode.SeriesTvdbId > 0)
            {
                seriesDetail = await _tvdbHandler.GetSeriesAsync(episode.SeriesTvdbId, language, true, false, true).ConfigureAwait(false);
            }
            if (seriesDetail == null && !string.IsNullOrEmpty(episode.SeriesImdbId))
            {
                TvdbSearchResult foundSeries = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, episode.SeriesImdbId).ConfigureAwait(false);

                if (foundSeries != null)
                {
                    seriesDetail = await _tvdbHandler.GetSeriesAsync(foundSeries.Id, language, true, false, true).ConfigureAwait(false);
                }
            }
            if (seriesDetail == null)
            {
                return(null);
            }
            TvdbEpisode episodeDetail = seriesDetail.Episodes.Find(e => e.SeasonNumber == episode.SeasonNumber.Value && e.EpisodeNumber == episode.FirstEpisodeNumber);

            if (episodeDetail == null)
            {
                return(null);
            }
            ApiWrapperImageCollection <TvdbBanner> images = new ApiWrapperImageCollection <TvdbBanner>();

            images.Id = episode.TvdbId.ToString();
            images.Thumbnails.AddRange(new TvdbBanner[] { episodeDetail.Banner });
            return(images);
        }
コード例 #11
0
        protected async Task <ApiWrapperImageCollection <TvdbBanner> > GetSeasonFanArtAsync(SeasonInfo season, TvdbLanguage language)
        {
            if (season == null || (season.SeriesTvdbId < 1 && string.IsNullOrEmpty(season.SeriesImdbId)) || !season.SeasonNumber.HasValue)
            {
                return(null);
            }
            TvdbSeries seriesDetail = null;

            if (season.SeriesTvdbId > 0)
            {
                seriesDetail = await _tvdbHandler.GetSeriesAsync(season.SeriesTvdbId, language, false, false, true).ConfigureAwait(false);
            }
            if (seriesDetail == null && !string.IsNullOrEmpty(season.SeriesImdbId))
            {
                TvdbSearchResult foundSeries = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, season.SeriesImdbId).ConfigureAwait(false);

                if (foundSeries != null)
                {
                    seriesDetail = await _tvdbHandler.GetSeriesAsync(foundSeries.Id, language, false, false, true).ConfigureAwait(false);
                }
            }
            if (seriesDetail == null)
            {
                return(null);
            }
            ApiWrapperImageCollection <TvdbBanner> images = new ApiWrapperImageCollection <TvdbBanner>();

            images.Id = season.TvdbId.ToString();
            var seasonLookup = seriesDetail.SeasonBanners.Where(s => s.Season == season.SeasonNumber).ToLookup(s => string.Format("{0}_{1}", s.Season, s.BannerType), v => v);

            foreach (IGrouping <string, TvdbSeasonBanner> tvdbSeasonBanners in seasonLookup)
            {
                images.Banners.AddRange(seasonLookup[tvdbSeasonBanners.Key].Where(b => b.BannerPath.Contains("wide")).OrderBy(b => b.Language != language));
                images.Posters.AddRange(seasonLookup[tvdbSeasonBanners.Key].Where(b => !b.BannerPath.Contains("wide")).OrderBy(b => b.Language != language));
            }
            return(images);
        }
コード例 #12
0
        public override async Task <bool> UpdateFromOnlineSeriesEpisodeAsync(EpisodeInfo episode, TvdbLanguage language, bool cacheOnly)
        {
            try
            {
                language = language ?? PreferredLanguage;

                List <EpisodeInfo> episodeDetails = new List <EpisodeInfo>();
                TvdbSeries         seriesDetail   = null;
                TvdbEpisode        episodeDetail  = null;

                if ((episode.SeriesTvdbId > 0 || !string.IsNullOrEmpty(episode.SeriesImdbId)) && episode.SeasonNumber.HasValue && episode.EpisodeNumbers.Count > 0)
                {
                    if (episode.SeriesTvdbId > 0)
                    {
                        seriesDetail = await _tvdbHandler.GetSeriesAsync(episode.SeriesTvdbId, language, true, true, true).ConfigureAwait(false);
                    }
                    if (seriesDetail == null && !cacheOnly && !string.IsNullOrEmpty(episode.SeriesImdbId))
                    {
                        TvdbSearchResult foundSeries = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, episode.SeriesImdbId).ConfigureAwait(false);

                        if (foundSeries != null)
                        {
                            seriesDetail = await _tvdbHandler.GetSeriesAsync(foundSeries.Id, language, true, true, true).ConfigureAwait(false);
                        }
                    }
                    if (seriesDetail == null)
                    {
                        return(false);
                    }

                    bool isFirstEpisode = true;
                    foreach (int episodeNumber in episode.EpisodeNumbers)
                    {
                        episodeDetail = seriesDetail.Episodes.Where(e => e.EpisodeNumber == episodeNumber &&
                                                                    e.SeasonNumber == episode.SeasonNumber.Value).OrderByDescending(e => e.Id).FirstOrDefault();
                        if (episodeDetail == null)
                        {
                            continue;
                        }

                        EpisodeInfo info = new EpisodeInfo()
                        {
                            TvdbId = episodeDetail.Id,

                            SeriesTvdbId     = seriesDetail.Id,
                            SeriesImdbId     = seriesDetail.ImdbId,
                            SeriesName       = new SimpleTitle(seriesDetail.SeriesName, false),
                            SeriesFirstAired = seriesDetail.FirstAired,

                            ImdbId         = episodeDetail.ImdbId,
                            SeasonNumber   = episodeDetail.SeasonNumber,
                            EpisodeNumbers = new List <int>(new int[] { episodeDetail.EpisodeNumber }),
                            FirstAired     = episodeDetail.FirstAired,
                            EpisodeName    = new SimpleTitle(episodeDetail.EpisodeName, false),
                            Summary        = new SimpleTitle(episodeDetail.Overview, false),
                            Genres         = seriesDetail.Genre.Where(s => !string.IsNullOrEmpty(s?.Trim())).Select(s => new GenreInfo {
                                Name = s.Trim()
                            }).ToList(),
                            Rating = new SimpleRating(episodeDetail.Rating, episodeDetail.RatingCount),
                        };

                        if (episodeDetail.DvdEpisodeNumber > 0)
                        {
                            info.DvdEpisodeNumbers = new List <double>(new double[] { episodeDetail.DvdEpisodeNumber });
                        }

                        info.Actors = ConvertToPersons(seriesDetail.TvdbActors, PersonAspect.OCCUPATION_ACTOR, episodeDetail.EpisodeName, seriesDetail.SeriesName);
                        //info.Actors.AddRange(ConvertToPersons(episodeDetail.GuestStars, PersonAspect.OCCUPATION_ACTOR, info.Actors.Count));
                        info.Characters = ConvertToCharacters(seriesDetail.TvdbActors, episodeDetail.EpisodeName, seriesDetail.SeriesName);
                        info.Directors  = ConvertToPersons(episodeDetail.Directors, PersonAspect.OCCUPATION_DIRECTOR, 0, episodeDetail.EpisodeName, seriesDetail.SeriesName);
                        info.Writers    = ConvertToPersons(episodeDetail.Writer, PersonAspect.OCCUPATION_WRITER, 0, episodeDetail.EpisodeName, seriesDetail.SeriesName);
                        info.Languages.Add(episodeDetail.Language.Abbriviation);

                        if (isFirstEpisode && !episode.HasThumbnail && episodeDetail.Banner != null)
                        {
                            info.Thumbnail = await episodeDetail.Banner.LoadImageDataAsync().ConfigureAwait(false);
                        }

                        episodeDetails.Add(info);
                        isFirstEpisode = false;
                    }
                }

                if (episodeDetails.Count > 1)
                {
                    SetMultiEpisodeDetails(episode, episodeDetails);
                    return(true);
                }
                else if (episodeDetails.Count > 0)
                {
                    SetEpisodeDetails(episode, episodeDetails[0]);
                    return(true);
                }
                return(false);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("TvDbWrapper: Exception while processing episode {0}", ex, episode.ToString());
                return(false);
            }
        }
コード例 #13
0
        public override async Task <bool> UpdateFromOnlineSeriesAsync(SeriesInfo series, TvdbLanguage language, bool cacheOnly)
        {
            try
            {
                language = language ?? PreferredLanguage;

                TvdbSeries seriesDetail = null;
                if (series.TvdbId > 0)
                {
                    seriesDetail = await _tvdbHandler.GetSeriesAsync(series.TvdbId, language, true, true, false).ConfigureAwait(false);
                }
                if (seriesDetail == null && !cacheOnly && !string.IsNullOrEmpty(series.ImdbId))
                {
                    TvdbSearchResult foundSeries = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, series.ImdbId).ConfigureAwait(false);

                    if (foundSeries != null)
                    {
                        seriesDetail = await _tvdbHandler.GetSeriesAsync(foundSeries.Id, language, true, true, false).ConfigureAwait(false);
                    }
                }
                if (seriesDetail == null)
                {
                    return(false);
                }

                series.TvdbId = seriesDetail.Id;
                series.ImdbId = seriesDetail.ImdbId;

                series.SeriesName  = new SimpleTitle(seriesDetail.SeriesName, false);
                series.FirstAired  = seriesDetail.FirstAired;
                series.Description = new SimpleTitle(seriesDetail.Overview, false);
                series.Rating      = new SimpleRating(seriesDetail.Rating, seriesDetail.RatingCount);
                series.Genres      = seriesDetail.Genre.Where(s => !string.IsNullOrEmpty(s?.Trim())).Select(s => new GenreInfo {
                    Name = s.Trim()
                }).ToList();
                series.Networks = ConvertToCompanies(seriesDetail.NetworkID, seriesDetail.Network, CompanyAspect.COMPANY_TV_NETWORK);
                if (seriesDetail.Status.IndexOf("Ended", StringComparison.InvariantCultureIgnoreCase) >= 0)
                {
                    series.IsEnded = true;
                }

                CertificationMapping certification = null;
                if (CertificationMapper.TryFindMovieCertification(seriesDetail.ContentRating, out certification))
                {
                    series.Certification = certification.CertificationId;
                }

                series.Actors     = ConvertToPersons(seriesDetail.TvdbActors, PersonAspect.OCCUPATION_ACTOR, null, seriesDetail.SeriesName);
                series.Characters = ConvertToCharacters(seriesDetail.TvdbActors, null, seriesDetail.SeriesName);

                foreach (TvdbActor actor in seriesDetail.TvdbActors)
                {
                    _seriesToActorMap.StoreMappedId(actor.Id.ToString(), seriesDetail.Id.ToString());
                }

                foreach (TvdbEpisode episodeDetail in seriesDetail.Episodes.OrderByDescending(e => e.Id))
                {
                    SeasonInfo seasonInfo = new SeasonInfo()
                    {
                        TvdbId = episodeDetail.SeasonId,

                        SeriesTvdbId = seriesDetail.Id,
                        SeriesImdbId = seriesDetail.ImdbId,
                        SeriesName   = new SimpleTitle(seriesDetail.SeriesName, false),
                        SeasonNumber = episodeDetail.SeasonNumber,
                    };
                    if (!series.Seasons.Contains(seasonInfo))
                    {
                        series.Seasons.Add(seasonInfo);
                    }

                    EpisodeInfo episodeInfo = new EpisodeInfo()
                    {
                        TvdbId = episodeDetail.Id,

                        SeriesTvdbId     = seriesDetail.Id,
                        SeriesImdbId     = seriesDetail.ImdbId,
                        SeriesName       = new SimpleTitle(seriesDetail.SeriesName, false),
                        SeriesFirstAired = seriesDetail.FirstAired,

                        ImdbId         = episodeDetail.ImdbId,
                        SeasonNumber   = episodeDetail.SeasonNumber,
                        EpisodeNumbers = new List <int>(new int[] { episodeDetail.EpisodeNumber }),
                        FirstAired     = episodeDetail.FirstAired,
                        EpisodeName    = new SimpleTitle(episodeDetail.EpisodeName, false),
                        Summary        = new SimpleTitle(episodeDetail.Overview, false),
                        Genres         = seriesDetail.Genre.Where(s => !string.IsNullOrEmpty(s?.Trim())).Select(s => new GenreInfo {
                            Name = s.Trim()
                        }).ToList(),
                        Rating = new SimpleRating(episodeDetail.Rating, episodeDetail.RatingCount),
                    };

                    if (episodeDetail.DvdEpisodeNumber > 0)
                    {
                        episodeInfo.DvdEpisodeNumbers = new List <double>(new double[] { episodeDetail.DvdEpisodeNumber });
                    }

                    episodeInfo.Actors = ConvertToPersons(seriesDetail.TvdbActors, PersonAspect.OCCUPATION_ACTOR, episodeDetail.EpisodeName, seriesDetail.SeriesName);
                    //info.Actors.AddRange(ConvertToPersons(episodeDetail.GuestStars, PersonAspect.OCCUPATION_ACTOR, info.Actors.Count));
                    episodeInfo.Characters = ConvertToCharacters(seriesDetail.TvdbActors, episodeDetail.EpisodeName, seriesDetail.SeriesName);
                    episodeInfo.Directors  = ConvertToPersons(episodeDetail.Directors, PersonAspect.OCCUPATION_DIRECTOR, 0, episodeDetail.EpisodeName, seriesDetail.SeriesName);
                    episodeInfo.Writers    = ConvertToPersons(episodeDetail.Writer, PersonAspect.OCCUPATION_WRITER, 0, episodeDetail.EpisodeName, seriesDetail.SeriesName);
                    episodeInfo.Languages.Add(episodeDetail.Language.Abbriviation);

                    if (!series.Episodes.Contains(episodeInfo))
                    {
                        series.Episodes.Add(episodeInfo);
                    }
                }
                series.Episodes.Sort();
                series.TotalEpisodes = series.Episodes.Count;

                for (int index = 0; index < series.Seasons.Count; index++)
                {
                    series.Seasons[index].FirstAired    = series.Episodes.Find(e => e.SeasonNumber == series.Seasons[index].SeasonNumber).FirstAired;
                    series.Seasons[index].TotalEpisodes = series.Episodes.FindAll(e => e.SeasonNumber == series.Seasons[index].SeasonNumber).Count;
                }
                series.Seasons.Sort();
                series.TotalSeasons = series.Seasons.Count;

                TvdbEpisode nextEpisode = seriesDetail.Episodes.Where(e => e.FirstAired > DateTime.Now).OrderBy(e => e.FirstAired)
                                          .ThenByDescending(p => p.Id).FirstOrDefault();
                if (nextEpisode != null)
                {
                    series.NextEpisodeName         = new SimpleTitle(nextEpisode.EpisodeName, false);
                    series.NextEpisodeAirDate      = nextEpisode.FirstAired;
                    series.NextEpisodeSeasonNumber = nextEpisode.SeasonNumber;
                    series.NextEpisodeNumber       = nextEpisode.EpisodeNumber;
                }

                return(true);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("TvDbWrapper: Exception while processing series {0}", ex, series.ToString());
                return(false);
            }
        }
コード例 #14
0
        public override async Task <List <EpisodeInfo> > SearchSeriesEpisodeAsync(EpisodeInfo episodeSearch, TvdbLanguage language)
        {
            language = language ?? PreferredLanguage;

            SeriesInfo seriesSearch = episodeSearch.CloneBasicInstance <SeriesInfo>();

            if (episodeSearch.SeriesTvdbId <= 0 && string.IsNullOrEmpty(episodeSearch.SeriesImdbId))
            {
                if (!await SearchSeriesUniqueAndUpdateAsync(seriesSearch, language).ConfigureAwait(false))
                {
                    return(null);
                }
                episodeSearch.CopyIdsFrom(seriesSearch);
            }

            List <EpisodeInfo> episodes = null;

            if ((episodeSearch.SeriesTvdbId > 0 || !string.IsNullOrEmpty(episodeSearch.SeriesImdbId)) && episodeSearch.SeasonNumber.HasValue)
            {
                int seriesId = 0;
                if (episodeSearch.SeriesTvdbId > 0)
                {
                    seriesId = episodeSearch.SeriesTvdbId;
                }
                else if (!string.IsNullOrEmpty(episodeSearch.SeriesImdbId))
                {
                    TvdbSearchResult searchResult = await _tvdbHandler.GetSeriesByRemoteIdAsync(ExternalId.ImdbId, episodeSearch.SeriesImdbId);

                    if (searchResult?.Id > 0)
                    {
                        seriesId = searchResult.Id;
                    }
                }
                TvdbSeries seriesDetail = await _tvdbHandler.GetSeriesAsync(seriesId, language, true, false, false).ConfigureAwait(false);

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

                foreach (TvdbEpisode episode in seriesDetail.Episodes.OrderByDescending(e => e.Id))
                {
                    if ((episodeSearch.EpisodeNumbers.Contains(episode.EpisodeNumber) || episodeSearch.EpisodeNumbers.Count == 0) &&
                        (episodeSearch.SeasonNumber == episode.SeasonNumber || episodeSearch.SeasonNumber.HasValue == false))
                    {
                        if (episodes == null)
                        {
                            episodes = new List <EpisodeInfo>();
                        }

                        EpisodeInfo info = new EpisodeInfo
                        {
                            TvdbId       = episode.Id,
                            SeriesName   = new SimpleTitle(seriesDetail.SeriesName, false),
                            SeasonNumber = episode.SeasonNumber,
                            EpisodeName  = new SimpleTitle(episode.EpisodeName, false),
                        };
                        info.EpisodeNumbers.Add(episode.EpisodeNumber);
                        info.CopyIdsFrom(seriesSearch);
                        info.Languages.Add(episode.Language.Abbriviation);
                        if (!episodes.Contains(info))
                        {
                            episodes.Add(info);
                        }
                    }
                }
                if (episodes != null)
                {
                    episodes.Sort();
                }
            }

            if (episodes == null)
            {
                episodes = new List <EpisodeInfo>();
                EpisodeInfo info = new EpisodeInfo
                {
                    SeriesName   = seriesSearch.SeriesName,
                    SeasonNumber = episodeSearch.SeasonNumber,
                    EpisodeName  = episodeSearch.EpisodeName,
                };
                info.CopyIdsFrom(seriesSearch);
                info.EpisodeNumbers = info.EpisodeNumbers.Union(episodeSearch.EpisodeNumbers).ToList();
                info.Languages      = seriesSearch.Languages;
                episodes.Add(info);
            }

            return(episodes);
        }
コード例 #15
0
 /// <summary>
 /// Gets Series information from TvDB.
 /// </summary>
 /// <param name="imdbId">The IMDB id for the Series.</param>
 /// <param name="series">Returns the Series information</param>
 /// <returns><c>true</c> if successful</returns>
 public bool GetSeries(string imdbId, out TvdbSearchResult series)
 {
     series = _tvdbHandler.GetSeriesByRemoteId(ExternalId.ImdbId, imdbId);
     return(series != null);
 }
コード例 #16
0
 private void cmdTestGetSeriesByExternalId_Click(object sender, EventArgs e)
 {
     TvdbDownloader   downloader = new TvdbDownloader(File.ReadAllText("api_key.txt"));
     TvdbSearchResult s          = downloader.DownloadSeriesSearchByExternalId(ExternalId.ImdbId, txtExternalId.Text);
 }
コード例 #17
0
        protected bool TryMatch(string seriesNameOrImdbId, bool isImdbId, bool cacheOnly, out TvdbSeries seriesDetail, int tvdbid = 0)
        {
            seriesDetail = null;
            try
            {
                // Prefer memory cache
                CheckCacheAndRefresh();
                if (_memoryCache.TryGetValue(seriesNameOrImdbId, out seriesDetail))
                {
                    if (tvdbid == 0 || seriesDetail.Id == tvdbid)
                    {
                        return(true);
                    }
                }

                // Load cache or create new list
                List <SeriesMatch> matches;
                lock (_syncObj)
                    matches = Settings.Load <List <SeriesMatch> >(MatchesSettingsFile) ?? new List <SeriesMatch>();

                // Init empty
                seriesDetail = null;

                // Use cached values before doing online query
                SeriesMatch match = matches.Find(m =>
                                                 (
                                                     string.Equals(m.ItemName, seriesNameOrImdbId, StringComparison.OrdinalIgnoreCase) ||
                                                     string.Equals(m.TvDBName, seriesNameOrImdbId, StringComparison.OrdinalIgnoreCase)
                                                 ) && (tvdbid == 0 || m.Id == tvdbid));

                ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: Try to lookup series \"{0}\" from cache: {1}", seriesNameOrImdbId, match != null && match.Id != 0);

                // Try online lookup
                if (!Init())
                {
                    return(false);
                }

                // If this is a known series, only return the series details (including episodes).
                if (match != null)
                {
                    return(match.Id != 0 && _tv.GetSeries(match.Id, true, out seriesDetail));
                }

                if (cacheOnly)
                {
                    return(false);
                }

                TvdbSearchResult matchedSeries = null;
                bool             foundResult   = false;
                if (tvdbid != 0)
                {
                    foundResult = _tv.GetSeries(tvdbid, true, out seriesDetail);
                }
                else
                if (isImdbId)
                {
                    // If we got an IMDBID, use it to lookup by key directly
                    _tv.GetSeries(seriesNameOrImdbId, out matchedSeries);
                }
                else
                {
                    // Otherwise we try to find unique series by name
                    List <TvdbSearchResult> series;
                    if (_tv.SearchSeriesUnique(seriesNameOrImdbId, out series))
                    {
                        matchedSeries = series[0];
                    }
                }

                if (matchedSeries != null)
                {
                    ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: Found unique online match for \"{0}\": \"{1}\" [Lang: {2}]", seriesNameOrImdbId, matchedSeries.SeriesName, matchedSeries.Language);
                    foundResult = _tv.GetSeries(matchedSeries.Id, true, out seriesDetail);
                }
                if (foundResult)
                {
                    ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: Loaded details for \"{0}\"", seriesDetail.SeriesName);
                    // Add this match to cache
                    SeriesMatch onlineMatch = new SeriesMatch
                    {
                        ItemName = seriesNameOrImdbId,
                        Id       = seriesDetail.Id,
                        TvDBName = seriesDetail.SeriesName
                    };

                    // Save cache
                    _storage.TryAddMatch(onlineMatch);
                    return(true);
                }

                ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: No unique match found for \"{0}\"", seriesNameOrImdbId);
                // Also save "non matches" to avoid retrying
                _storage.TryAddMatch(new SeriesMatch {
                    ItemName = seriesNameOrImdbId
                });
                return(false);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: Exception while processing series {0}", ex, seriesNameOrImdbId);
                return(false);
            }
            finally
            {
                if (seriesDetail != null)
                {
                    _memoryCache.TryAdd(seriesNameOrImdbId, seriesDetail);
                }
            }
        }
コード例 #18
0
        private void GetTvDBInfo(string searchMedia, string selectedLang, string fallbackLang)
        {
            const string tvDBFanartPath = "http://thetvdb.com/banners/";

            InitLists();

            string regexSearch = AppSettings.TvDBParseString;

            regexSearch =
                regexSearch.Replace("%show%", @"(?<show>[\w\s]*)")
                .Replace("%season%", @"(?<season>[\d]*)")
                .Replace("%episode%", @"(?<episode>[\d]*)")
                .Replace("%episode_name%", @"(?<episodename>[\w\s]*)");

            Regex searchObj   = new Regex(regexSearch, RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
            Match matchResult = searchObj.Match(searchMedia);

            // check first if we can use the search string
            if (!matchResult.Success)
            {
                regexSearch = regexSearch.Replace(@"(?<episodename>[\w\s]*)", "").Trim().TrimEnd(new [] { '-' }).Trim();
                searchObj   = new Regex(regexSearch, RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
                matchResult = searchObj.Match(searchMedia);
                if (!matchResult.Success)
                {
                    return;
                }
            }

            TvdbLanguage dbLang = _tvDbclient.Languages.Single(language => language.Abbriviation == selectedLang) ??
                                  _tvDbclient.Languages.Single(language => language.Abbriviation == fallbackLang);

            List <TvdbSearchResult> searchResults = _tvDbclient.SearchSeries(matchResult.Groups["show"].Value, dbLang);

            if (searchResults == null)
            {
                return;
            }

            TvdbSearchResult resultShow = new TvdbSearchResult();

            if (searchResults.Count > 1)
            {
                DBMultipleSelection selectWindow = new DBMultipleSelection
                {
                    Owner             = this,
                    TvdbSearchResults = searchResults
                };
                if (selectWindow.ShowDialog() == true)
                {
                    resultShow = selectWindow.TvdbSelectionResult;
                }
            }
            else
            {
                resultShow = searchResults.Count > 0 ? searchResults.First() : null;
            }

            if (resultShow == null || resultShow.Id == 0)
            {
                return;
            }

            TvdbSeries series = _tvDbclient.GetSeries(resultShow.Id, dbLang, true, true, true, true);

            TvShowTitle.Text      = series.SeriesName;
            TvShowGenre.Text      = string.Join(" / ", series.Genre);
            TvShowRating.Text     = series.Rating.ToString("g", AppSettings.CInfo);
            TvShowRuntime.Text    = series.Runtime.ToString("g", AppSettings.CInfo);
            TvShowFirstAired.Text = series.FirstAired.ToString("yyyy-MM-dd");
            TvShowPlot.Text       = series.Overview;
            TvShowMpaaRating.Text = series.ContentRating;
            TvShowImdbId.Text     = series.ImdbId;
            TvShowNetwork.Text    = series.Network;

            foreach (TvdbEpisode episode in series.Episodes)
            {
                DBTvShowSeason season;
                try
                {
                    season = _seasonList.First(showSeason => showSeason.SeasonNumber == episode.SeasonNumber);
                }
                catch (InvalidOperationException)
                {
                    season = new DBTvShowSeason
                    {
                        SeasonNumber = episode.SeasonNumber,
                        Title        = episode.IsSpecial ? "Special" : "Season " + episode.SeasonNumber
                    };
                    _seasonList.Add(season);
                }

                season.Episodes.Add(new DBTvShowEpisode
                {
                    Directors             = episode.Directors,
                    Writers               = episode.Writer,
                    SeasonNumber          = episode.SeasonNumber,
                    Runtime               = (int)series.Runtime,
                    Rating                = episode.Rating,
                    Plot                  = episode.Overview,
                    IsSpecial             = episode.IsSpecial,
                    ImdbId                = episode.ImdbId,
                    GuestStars            = episode.GuestStars,
                    FirstAired            = episode.FirstAired,
                    EpisodeTitle          = episode.EpisodeName,
                    EpisodeNumber         = episode.EpisodeNumber,
                    DvdEpisodeNumber      = episode.DvdEpisodeNumber,
                    CombinedEpisodeNumber = episode.CombinedEpisodeNumber,
                    AbsoluteEpisodeNumber = episode.AbsoluteNumber,
                    EpisodeImageUrl       = tvDBFanartPath + episode.BannerPath,
                });
            }

            TvShowSeason.ItemsSource = _seasonList;

            int tempInt;

            int.TryParse(matchResult.Groups["season"].Value, NumberStyles.Integer, AppSettings.CInfo, out tempInt);
            TvShowSeason.SelectedIndex = _seasonList.ToList().FindIndex(season => season.SeasonNumber == tempInt);

            int.TryParse(matchResult.Groups["episode"].Value, NumberStyles.Integer, AppSettings.CInfo, out tempInt);
            TvShowEpisodeNumber.SelectedIndex =
                ((List <DBTvShowEpisode>)TvShowEpisodeNumber.Items.SourceCollection).FindIndex(
                    episode => episode.EpisodeNumber == tempInt);

            int imageCounter = 1;

            foreach (TvdbSeriesBanner banner in series.SeriesBanners)
            {
                _bannerList.Add(new MovieDBBannerImage
                {
                    UrlOriginal = tvDBFanartPath + banner.BannerPath,
                    UrlPreview  =
                        tvDBFanartPath + (!string.IsNullOrEmpty(banner.ThumbPath)
                                                  ? banner.ThumbPath
                                                  : "_cache/" + banner.BannerPath),
                    Title = "Online image " + imageCounter
                });
                imageCounter++;
            }
            foreach (TvdbSeasonBanner banner in series.SeasonBanners)
            {
                _seasonBannerList.Add(new MovieDBSeasonBannerImage
                {
                    UrlOriginal = tvDBFanartPath + banner.BannerPath,
                    UrlPreview  =
                        tvDBFanartPath + (!string.IsNullOrEmpty(banner.ThumbPath)
                                                  ? banner.ThumbPath
                                                  : "_cache/" + banner.BannerPath),
                    Title  = "Online image " + imageCounter,
                    Season = banner.Season
                });
                imageCounter++;
            }
            _bannerList.ToList().ForEach(image => _previewBannerList.Add(image));
            _seasonBannerList.ToList().ForEach(image => _previewBannerList.Add(image));

            imageCounter = 1;
            foreach (TvdbFanartBanner banner in series.FanartBanners)
            {
                _backdropsList.Add(new MovieDBImageInfo
                {
                    Title       = "Online image " + imageCounter,
                    UrlOriginal = tvDBFanartPath + banner.BannerPath,
                    UrlPreview  =
                        tvDBFanartPath + (!string.IsNullOrEmpty(banner.ThumbPath)
                                                  ? banner.ThumbPath
                                                  : "_cache/" + banner.BannerPath)
                });
                imageCounter++;
            }

            imageCounter = 1;
            foreach (TvdbPosterBanner banner in series.PosterBanners)
            {
                _postersList.Add(new MovieDBPosterImage
                {
                    Title       = "Online image " + imageCounter,
                    UrlOriginal = tvDBFanartPath + banner.BannerPath,
                    UrlPreview  =
                        tvDBFanartPath + (!string.IsNullOrEmpty(banner.ThumbPath)
                                                  ? banner.ThumbPath
                                                  : "_cache/" + banner.BannerPath)
                });
                imageCounter++;
            }
            TvShowBannerList.ItemsSource   = _previewBannerList;
            TvShowBannerList.SelectedValue = tvDBFanartPath + "_cache/" + series.BannerPath;

            TvShowFanartList.ItemsSource   = _backdropsList;
            TvShowFanartList.SelectedValue = tvDBFanartPath + "_cache/" + series.FanartPath;

            TvShowPosterList.ItemsSource   = _postersList;
            TvShowPosterList.SelectedValue = tvDBFanartPath + "_cache/" + series.PosterPath;

            foreach (TvdbActor actor in series.TvdbActors)
            {
                _castList.Casts.Add(new MovieDBCast
                {
                    Name      = actor.Name,
                    Role      = actor.Role,
                    Thumbnail =
                        actor.ActorImage != null && !string.IsNullOrEmpty(actor.ActorImage.BannerPath)
                                ? tvDBFanartPath + actor.ActorImage.BannerPath
                                : string.Empty
                });
            }
            TvShowCastList.ItemsSource = _castList.Casts;

            ResultTabControl.SelectedIndex = 2;
        }
コード例 #19
0
        protected bool TryMatch(string seriesName, bool cacheOnly, out TvdbSeries seriesDetail)
        {
            seriesDetail = null;
            try
            {
                // Prefer memory cache
                if (_memoryCache.TryGetValue(seriesName, out seriesDetail))
                {
                    return(true);
                }

                // Load cache or create new list
                List <SeriesMatch> matches;
                lock (_syncObj)
                    matches = Settings.Load <List <SeriesMatch> >(MatchesSettingsFile) ?? new List <SeriesMatch>();

                // Init empty
                seriesDetail = null;

                // Use cached values before doing online query
                SeriesMatch match = matches.Find(m => m.ItemName == seriesName || m.TvDBName == seriesName);
                ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: Try to lookup series \"{0}\" from cache: {1}", seriesName, match != null && match.Id != 0);

                // Try online lookup
                if (!Init())
                {
                    return(false);
                }

                // If this is a known series, only return the series details (including episodes).
                if (match != null)
                {
                    return(match.Id != 0 && _tv.GetSeries(match.Id, true, out seriesDetail));
                }

                if (cacheOnly)
                {
                    return(false);
                }

                List <TvdbSearchResult> series;
                if (_tv.SearchSeriesUnique(seriesName, out series))
                {
                    TvdbSearchResult matchedSeries = series[0];
                    ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: Found unique online match for \"{0}\": \"{1}\" [Lang: {2}]", seriesName, matchedSeries.SeriesName, matchedSeries.Language);

                    if (_tv.GetSeries(matchedSeries.Id, true, out seriesDetail))
                    {
                        ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: Loaded details for \"{0}\"", matchedSeries.SeriesName);
                        // Add this match to cache
                        SeriesMatch onlineMatch = new SeriesMatch
                        {
                            ItemName = seriesName,
                            Id       = seriesDetail.Id,
                            TvDBName = seriesDetail.SeriesName
                        };

                        // Save cache
                        _storage.SaveNewMatch(seriesName, onlineMatch);
                        return(true);
                    }
                }
                ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: No unique match found for \"{0}\"", seriesName);
                // Also save "non matches" to avoid retrying
                _storage.SaveNewMatch(seriesName, new SeriesMatch {
                    ItemName = seriesName
                });
                return(false);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("SeriesTvDbMatcher: Exception while processing series {0}", ex, seriesName);
                return(false);
            }
            finally
            {
                if (seriesDetail != null && !_memoryCache.ContainsKey(seriesName))
                {
                    _memoryCache.Add(seriesName, seriesDetail);
                }
            }
        }