示例#1
0
        /// <summary>
        /// Changes details of the episode
        /// </summary>
        /// <param name="record">Episode to change</param>
        /// <param name="oldName">Original name of the episode</param>
        public void editEpisode(EpisodeRecord record, string oldName)
        {
            record.ShowId = findEpisodesShowId(oldName);
            var episodeId = getIdofExistingEpisode(oldName, record.ShowId);

            _db.editEpisodeEntry(record, episodeId);
        }
示例#2
0
        public static void Populate(this TvDB_Episode episode, EpisodeRecord apiEpisode)
        {
            episode.Id            = apiEpisode.Id;
            episode.SeriesID      = apiEpisode.SeriesId;
            episode.SeasonID      = 0;
            episode.SeasonNumber  = apiEpisode.AiredSeason ?? 0;
            episode.EpisodeNumber = apiEpisode.AiredEpisodeNumber ?? 0;

            int flag = 0;

            if (apiEpisode.Filename != string.Empty)
            {
                flag = 1;
            }

            episode.EpImgFlag         = flag;
            episode.AbsoluteNumber    = apiEpisode.AbsoluteNumber ?? 0;
            episode.EpisodeName       = apiEpisode.EpisodeName ?? string.Empty;
            episode.Overview          = apiEpisode.Overview;
            episode.Filename          = apiEpisode.Filename ?? string.Empty;
            episode.AirsAfterSeason   = apiEpisode.AirsAfterSeason;
            episode.AirsBeforeEpisode = apiEpisode.AirsBeforeEpisode;
            episode.AirsBeforeSeason  = apiEpisode.AirsBeforeSeason;
            if (apiEpisode.SiteRating != null)
            {
                episode.Rating = (int)Math.Round(apiEpisode.SiteRating.Value);
            }
            if (!string.IsNullOrEmpty(apiEpisode.FirstAired))
            {
                episode.AirDate = DateTime.ParseExact(apiEpisode.FirstAired, "yyyy-MM-dd", DateTimeFormatInfo.InvariantInfo);
            }
        }
        private void remove_Click(object sender, RoutedEventArgs e)
        {
            EpisodeRecord episode = (EpisodeRecord)episodes.SelectedItem;

            _repo.removeEpisode(episode.Title);
            episodes.ItemsSource = _repo.getAllEpisodesInShow(_repo.FindShowsTitle(episode.ShowId));
        }
        private void makeCurrent_Click(object sender, RoutedEventArgs e)
        {
            EpisodeRecord episode = (EpisodeRecord)episodes.SelectedItem;

            episode.ShowId = _repo.findEpisodesShowId(episode.Title);
            _repo.changeCurrentEpisode(episode);
        }
示例#5
0
        /// <summary>
        /// Updates an episode entry in the database
        /// </summary>
        /// <param name="record">Episode to update</param>
        /// <param name="oldName">Old name of the episode</param>
        public void editEpisodeEntry(EpisodeRecord record, int id)
        {
            string query = string.Format("Update Episodes set Title=@Title, Season=@Season, EpisodeNumber=@Episode" +
                                         " where EpisodeId=@IdofEpisode;");
            var conn    = new SqlConnection(connectionString);
            var command = new SqlCommand(query, conn);

            command.Parameters.AddWithValue("@Title", record.Title);
            command.Parameters.AddWithValue("@Season", record.Season);
            command.Parameters.AddWithValue("@Episode", record.Episode);
            command.Parameters.AddWithValue("@IdofEpisode", id);
            try
            {
                conn.Open();
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                if ((conn.State == ConnectionState.Open))
                {
                    conn.Close();
                }
            }
        }
        private void edit_Click(object sender, RoutedEventArgs e)
        {
            EpisodeRecord record  = (EpisodeRecord)episodes.SelectedItem;
            EditEpisode   episode = new EditEpisode(record.Title);

            episode.DataContext = record;
            episode.Closed     += ChildWindowClosed;
            episode.Show();
        }
示例#7
0
 /// <summary>
 /// Creates an episode from the EpisodeRecord.
 /// </summary>
 private Episode CreateEpisode(EpisodeRecord record, Show show)
 => new Episode
 {
     Title          = record.EpisodeName ?? string.Empty,
     AbsoluteNumber = record.AbsoluteNumber,
     Overview       = record.Overview ?? string.Empty,
     IsMovie        = record.IsMovie > 0,
     SeasonNumber   = record.AiredSeason,
     EpisodeNumber  = record.AiredEpisodeNumber,
     TvDbId         = record.Id,
     ShowId         = show.Id
 };
        private void newEpisode_Click(object sender, RoutedEventArgs e)
        {
            var items = episodes.Items.Cast <EpisodeRecord>().ToList();
            var ep    = new EpisodeRecord()
            {
                ShowId = _repo.getIdOfExistingShow(title)
            };
            NewEpisode episode = new NewEpisode();

            episode.DataContext = ep;
            episode.Closed     += ChildWindowClosed;
            episode.Show();
        }
示例#9
0
        private void MapToEpisode(Episode episode, EpisodeRecord data)
        {
            episode.Title = data.EpisodeName;
            episode.Description = data.Overview;
            episode.ImdbId = data.ImdbId;
            episode.Number = data.AiredEpisodeNumber.Value;
            episode.SeasonNumber = data.AiredSeason.Value;
            episode.TheTvDbId = data.Id;

            if (!string.IsNullOrWhiteSpace(data.FirstAired))
            {
                episode.FirstAired = this.DateParser.ParseFirstAired(data.FirstAired);
            }

            episode.LastUpdated = data.LastUpdated.ToDateTime();
        }
示例#10
0
        private RemoteImageInfo GetImageInfo(EpisodeRecord episode)
        {
            if (string.IsNullOrEmpty(episode.Filename))
            {
                return(null);
            }

            return(new RemoteImageInfo
            {
                Width = Convert.ToInt32(episode.ThumbWidth),
                Height = Convert.ToInt32(episode.ThumbHeight),
                ProviderName = Name,
                Url = TvdbUtils.BannerUrl + episode.Filename,
                Type = ImageType.Primary
            });
        }
        private void AddVirtualEpisode(EpisodeRecord episode, Season season)
        {
            // tvdb has a lot of bad data?
            if (!IsValidEpisode(episode) || season == null)
            {
                return;
            }

            // Put as much metadata into it as possible
            DateTime.TryParse(episode.FirstAired, out var premiereDate);
            var newEpisode = new Episode
            {
                Name              = episode.EpisodeName,
                IndexNumber       = episode.AiredEpisodeNumber !.Value,
                ParentIndexNumber = episode.AiredSeason !.Value,
                Id = _libraryManager.GetNewItemId(
                    season.Series.Id + episode.AiredSeason.Value.ToString(CultureInfo.InvariantCulture) + "Episode " + episode.AiredEpisodeNumber,
                    typeof(Episode)),
                IsVirtualItem               = true,
                SeasonId                    = season.Id,
                SeriesId                    = season.Series.Id,
                AirsBeforeEpisodeNumber     = episode.AirsBeforeEpisode,
                AirsAfterSeasonNumber       = episode.AirsAfterSeason,
                AirsBeforeSeasonNumber      = episode.AirsBeforeSeason,
                Overview                    = episode.Overview,
                CommunityRating             = (float?)episode.SiteRating,
                OfficialRating              = episode.ContentRating,
                PremiereDate                = premiereDate,
                SeriesName                  = season.Series.Name,
                SeriesPresentationUniqueKey = season.SeriesPresentationUniqueKey,
                SeasonName                  = season.Name,
                DateLastSaved               = DateTime.UtcNow
            };

            newEpisode.PresentationUniqueKey = newEpisode.GetPresentationUniqueKey();
            newEpisode.SetProviderId(MetadataProvider.Tvdb, episode.Id.ToString(CultureInfo.InvariantCulture));

            _logger.LogInformation(
                "Creating virtual episode {0} {1}x{2}",
                season.Series.Name,
                episode.AiredSeason,
                episode.AiredEpisodeNumber);

            season.AddChild(newEpisode, CancellationToken.None);
        }
示例#12
0
        private Episode Map(EpisodeRecord episode)
        {
            var episodeMapper = new Mapper <EpisodeRecord, Episode>(StringComparison.OrdinalIgnoreCase);

            episodeMapper.AddMapping((s, d) =>
            {
                d.SeasonNumber          = s.AiredSeason;
                d.CombinedEpisodeNumber = (s.AbsoluteNumber?.ToString());
                d.CombinedSeason        = (s.AiredSeason?.ToString());
                d.Director      = s.Directors.Length > 0 ? s.Directors[0] : null;
                d.EpisodeNumber = s.AiredEpisodeNumber;
                if (DateTime.TryParse(s.FirstAired, out var firstAired))
                {
                    d.FirstAired = firstAired;
                }
                d.GuestStars   = string.Join(";", s.GuestStars);
                d.Rating       = (double)(s.SiteRating ?? 0);
                d.RatingString = d.Rating.ToString();
                d.Writer       = s.Writers.Length > 0 ? s.Writers[0] : null;
            });
            return(episodeMapper.CreateMappedObject(episode));
        }
示例#13
0
        /// <summary>
        /// Gets all episodes for particular show from the database
        /// </summary>
        /// <param name="id">Id of show</param>
        /// <returns>A list of episodes for the particular show</returns>
        public List <EpisodeRecord> getAllEpisodeEntriesForShow(int id)
        {
            var    entries = new List <EpisodeRecord>();
            var    conn    = new SqlConnection(connectionString);
            string query   = string.Format("Select * from Episodes where IdofShow = @IdofShow;");
            var    command = new SqlCommand(query, conn);

            command.Parameters.AddWithValue("@IdofShow", id);
            try
            {
                conn.Open();
                SqlDataReader reader = command.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        EpisodeRecord record = new EpisodeRecord();
                        record.Title   = reader.GetString(reader.GetOrdinal("Title"));
                        record.Episode = reader.GetInt32(reader.GetOrdinal("EpisodeNumber"));
                        record.Season  = reader.GetInt32(reader.GetOrdinal("Season"));
                        record.ShowId  = reader.GetInt32(reader.GetOrdinal("IdofShow"));
                        entries.Add(record);
                    }
                }
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
            finally
            {
                if ((conn.State == ConnectionState.Open))
                {
                    conn.Close();
                }
            }
            return(entries);
        }
示例#14
0
        public static async Task QueueEpisodeImageDownloadAsync(BasicEpisode item, List <int> existingEpIds, bool downloadImages, bool forceRefresh)
        {
            try
            {
                // the episode id
                int id = item.Id;
                existingEpIds.Add(id);

                TvDB_Episode ep = RepoFactory.TvDB_Episode.GetByTvDBID(id);
                if (ep == null)
                {
                    ep = new TvDB_Episode();
                }

                EpisodeRecord episode = await GetEpisodeDetailsAsync(id);

                if (episode == null)
                {
                    return;
                }
                ep.Populate(episode);
                RepoFactory.TvDB_Episode.Save(ep);

                if (downloadImages)
                {
                    // download the image for this episode
                    if (!string.IsNullOrEmpty(ep.Filename))
                    {
                        bool fileExists = File.Exists(ep.GetFullImagePath());
                        if (!fileExists || forceRefresh)
                        {
                            CommandRequest_DownloadImage cmd =
                                new CommandRequest_DownloadImage(ep.TvDB_EpisodeID,
                                                                 JMMImageType.TvDB_Episode, forceRefresh);
                            cmd.Save();
                        }
                    }
                }
            }
            catch (TvDbSharper.Errors.TvDbServerException exception)
            {
                if (exception.StatusCode == HttpStatusCode.Unauthorized)
                {
                    client.Authentication.Token = null;
                    await _checkAuthorizationAsync();

                    if (client.Authentication.Token != null)
                    {
                        await QueueEpisodeImageDownloadAsync(item, existingEpIds, downloadImages, forceRefresh);

                        return;
                    }
                    // suppress 404 and move on
                }
                else if (exception.StatusCode == HttpStatusCode.NotFound)
                {
                    return;
                }
                logger.Error(exception, "TvDB returned an error code: " + exception.StatusCode + "\n        " + exception.Message);
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Error in TVDBHelper.GetEpisodes: " + ex.ToString());
            }
        }
示例#15
0
        public static async Task <TvDB_Episode> QueueEpisodeImageDownloadAsync(int tvDBEpisodeID, bool downloadImages, bool forceRefresh)
        {
            try
            {
                TvDB_Episode ep = RepoFactory.TvDB_Episode.GetByTvDBID(tvDBEpisodeID);
                if (ep == null || forceRefresh)
                {
                    EpisodeRecord episode = await GetEpisodeDetailsAsync(tvDBEpisodeID);

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

                    if (ep == null)
                    {
                        ep = new TvDB_Episode();
                    }
                    ep.Populate(episode);
                    RepoFactory.TvDB_Episode.Save(ep);
                }

                if (downloadImages)
                {
                    if (!string.IsNullOrEmpty(ep.Filename))
                    {
                        bool fileExists = File.Exists(ep.GetFullImagePath());
                        if (!fileExists || forceRefresh)
                        {
                            CommandRequest_DownloadImage cmd =
                                new CommandRequest_DownloadImage(ep.TvDB_EpisodeID,
                                                                 ImageEntityType.TvDB_Episode, forceRefresh);
                            cmd.Save();
                        }
                    }
                }
                return(ep);
            }
            catch (TvDbServerException exception)
            {
                if (exception.StatusCode == (int)HttpStatusCode.Unauthorized)
                {
                    client.Authentication.Token = null;
                    await CheckAuthorizationAsync();

                    if (!string.IsNullOrEmpty(client.Authentication.Token))
                    {
                        return(await QueueEpisodeImageDownloadAsync(tvDBEpisodeID, downloadImages, forceRefresh));
                    }
                    // suppress 404 and move on
                }
                else if (exception.StatusCode == (int)HttpStatusCode.NotFound)
                {
                    return(null);
                }
                logger.Error(exception,
                             $"TvDB returned an error code: {exception.StatusCode}\n        {exception.Message}");
            }
            catch (Exception ex)
            {
                logger.Error(ex, $"Error in TVDBHelper.GetEpisodes: {ex}");
            }
            return(null);
        }
示例#16
0
 private void Confirm_Executed(object sender, ExecutedRoutedEventArgs e)
 {
     _record   = new EpisodeRecord();
     e.Handled = true;
 }
示例#17
0
 /// <summary>
 /// Changes the current episode and season that are being watched by the user
 /// </summary>
 /// <param name="episode">A new episode to change</param>
 public void changeCurrentEpisode(EpisodeRecord episode)
 {
     _db.changeCurrentEpisode(episode.ShowId, episode.Episode, episode.Season);
 }
示例#18
0
        private static MetadataResult <Episode> MapEpisodeToResult(EpisodeInfo id, EpisodeRecord episode)
        {
            var result = new MetadataResult <Episode>
            {
                HasMetadata = true,
                Item        = new Episode
                {
                    IndexNumber             = id.IndexNumber,
                    ParentIndexNumber       = id.ParentIndexNumber,
                    IndexNumberEnd          = id.IndexNumberEnd,
                    AirsBeforeEpisodeNumber = episode.AirsBeforeEpisode,
                    AirsAfterSeasonNumber   = episode.AirsAfterSeason,
                    AirsBeforeSeasonNumber  = episode.AirsBeforeSeason,
                    Name            = episode.EpisodeName,
                    Overview        = episode.Overview,
                    CommunityRating = (float?)episode.SiteRating,
                }
            };

            result.ResetPeople();

            var item = result.Item;

            item.SetProviderId(MetadataProviders.Tvdb, episode.Id.ToString());
            item.SetProviderId(MetadataProviders.Imdb, episode.ImdbId);

            if (string.Equals(id.SeriesDisplayOrder, "dvd", StringComparison.OrdinalIgnoreCase))
            {
                item.IndexNumber       = Convert.ToInt32(episode.DvdEpisodeNumber ?? episode.AiredEpisodeNumber);
                item.ParentIndexNumber = episode.DvdSeason ?? episode.AiredSeason;
            }
            else if (episode.AiredEpisodeNumber.HasValue)
            {
                item.IndexNumber = episode.AiredEpisodeNumber;
            }
            else if (episode.AiredSeason.HasValue)
            {
                item.ParentIndexNumber = episode.AiredSeason;
            }

            if (DateTime.TryParse(episode.FirstAired, out var date))
            {
                // dates from tvdb are UTC but without offset or Z
                item.PremiereDate   = date;
                item.ProductionYear = date.Year;
            }

            foreach (var director in episode.Directors)
            {
                result.AddPerson(new PersonInfo
                {
                    Name = director,
                    Type = PersonType.Director
                });
            }

            // GuestStars is a weird list of names and roles
            // Example:
            // 1: Some Actor (Role1
            // 2: Role2
            // 3: Role3)
            // 4: Another Actor (Role1
            // ...
            for (var i = 0; i < episode.GuestStars.Length; ++i)
            {
                var currentActor   = episode.GuestStars[i];
                var roleStartIndex = currentActor.IndexOf('(');

                if (roleStartIndex == -1)
                {
                    result.AddPerson(new PersonInfo
                    {
                        Type = PersonType.GuestStar,
                        Name = currentActor,
                        Role = string.Empty
                    });
                    continue;
                }

                var roles = new List <string> {
                    currentActor.Substring(roleStartIndex + 1)
                };

                // Fetch all roles
                for (var j = i + 1; j < episode.GuestStars.Length; ++j)
                {
                    var currentRole  = episode.GuestStars[j];
                    var roleEndIndex = currentRole.IndexOf(')');

                    if (roleEndIndex == -1)
                    {
                        roles.Add(currentRole);
                        continue;
                    }

                    roles.Add(currentRole.TrimEnd(')'));
                    // Update the outer index (keep in mind it adds 1 after the iteration)
                    i = j;
                    break;
                }

                result.AddPerson(new PersonInfo
                {
                    Type = PersonType.GuestStar,
                    Name = currentActor.Substring(0, roleStartIndex).Trim(),
                    Role = string.Join(", ", roles)
                });
            }

            foreach (var writer in episode.Writers)
            {
                result.AddPerson(new PersonInfo
                {
                    Name = writer,
                    Type = PersonType.Writer
                });
            }

            result.ResultLanguage = episode.Language.EpisodeName;
            return(result);
        }
示例#19
0
        private static MetadataResult <Episode> MapEpisodeToResult(EpisodeInfo id, EpisodeRecord episode)
        {
            var result = new MetadataResult <Episode>
            {
                HasMetadata = true,
                Item        = new Episode
                {
                    IndexNumber             = id.IndexNumber,
                    ParentIndexNumber       = id.ParentIndexNumber,
                    IndexNumberEnd          = id.IndexNumberEnd,
                    AirsBeforeEpisodeNumber = episode.AirsBeforeEpisode,
                    AirsAfterSeasonNumber   = episode.AirsAfterSeason,
                    AirsBeforeSeasonNumber  = episode.AirsBeforeSeason,
                    Name            = episode.EpisodeName,
                    Overview        = episode.Overview,
                    CommunityRating = (float?)episode.SiteRating,
                }
            };

            result.ResetPeople();

            var item = result.Item;

            item.SetProviderId(MetadataProviders.Tvdb, episode.Id.ToString());
            item.SetProviderId(MetadataProviders.Imdb, episode.ImdbId);

            if (string.Equals(id.SeriesDisplayOrder, "dvd", StringComparison.OrdinalIgnoreCase))
            {
                item.IndexNumber       = Convert.ToInt32(episode.DvdEpisodeNumber ?? episode.AiredEpisodeNumber);
                item.ParentIndexNumber = episode.DvdSeason ?? episode.AiredSeason;
            }
            else if (episode.AiredEpisodeNumber.HasValue)
            {
                item.IndexNumber = episode.AiredEpisodeNumber;
            }
            else if (episode.AiredSeason.HasValue)
            {
                item.ParentIndexNumber = episode.AiredSeason;
            }

            if (DateTime.TryParse(episode.FirstAired, out var date))
            {
                // dates from tvdb are UTC but without offset or Z
                item.PremiereDate   = date;
                item.ProductionYear = date.Year;
            }

            foreach (var director in episode.Directors)
            {
                result.AddPerson(new PersonInfo
                {
                    Name = director,
                    Type = PersonType.Director
                });
            }
            foreach (var person in episode.GuestStars)
            {
                var    index = person.IndexOf('(');
                string role  = null;
                var    name  = person;

                if (index != -1)
                {
                    role = person.Substring(index + 1).Trim().TrimEnd(')');

                    name = person.Substring(0, index).Trim();
                }

                result.AddPerson(new PersonInfo
                {
                    Type = PersonType.GuestStar,
                    Name = name,
                    Role = role
                });
            }
            foreach (var writer in episode.Writers)
            {
                result.AddPerson(new PersonInfo
                {
                    Name = writer,
                    Type = PersonType.Writer
                });
            }

            result.ResultLanguage = episode.Language.EpisodeName;
            return(result);
        }
示例#20
0
 /// <summary>
 /// Checks if particular episode already existant for the chosen show
 /// </summary>
 /// <param name="record">Episode record to check for</param>
 /// <returns>True if exists else false</returns>
 public bool checkIfEpisodeAlreadyExists(EpisodeRecord record)
 {
     return(_db.checkForExistingEpisodeEntry(record.Title, record.ShowId));
 }
示例#21
0
 private static bool EpisodeExists(EpisodeRecord episodeRecord, IReadOnlyList <Episode> existingEpisodes)
 {
     return(existingEpisodes.Any(ep => ep.ContainsEpisodeNumber(episodeRecord.AiredEpisodeNumber !.Value) && ep.ParentIndexNumber == episodeRecord.AiredSeason));
 }
 private static bool IsValidEpisode(EpisodeRecord episodeRecord)
 {
     return(episodeRecord?.AiredSeason != null && episodeRecord.AiredEpisodeNumber != null);
 }