diff --git a/src/Ombi.Api.Emby/EmbyApi.cs b/src/Ombi.Api.Emby/EmbyApi.cs index b249decd1..126b3c700 100644 --- a/src/Ombi.Api.Emby/EmbyApi.cs +++ b/src/Ombi.Api.Emby/EmbyApi.cs @@ -51,6 +51,7 @@ namespace Ombi.Api.Emby var body = new { username, + pw = password, password = password.GetSha1Hash().ToLower(), passwordMd5 = password.CalcuateMd5Hash() }; diff --git a/src/Ombi.Schedule/Jobs/Emby/EmbyEpisodeSync.cs b/src/Ombi.Schedule/Jobs/Emby/EmbyEpisodeSync.cs index 0e1a3dc79..749abd761 100644 --- a/src/Ombi.Schedule/Jobs/Emby/EmbyEpisodeSync.cs +++ b/src/Ombi.Schedule/Jobs/Emby/EmbyEpisodeSync.cs @@ -99,7 +99,7 @@ namespace Ombi.Schedule.Jobs.Emby continue; } - var existingEpisode = await _repo.GetByEmbyId(ep.Id); + var existingEpisode = await _repo.GetEpisodeByEmbyId(ep.Id); if (existingEpisode == null) { // add it diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs b/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs index 5472d671d..e44deb1df 100644 --- a/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs +++ b/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs @@ -122,7 +122,12 @@ namespace Ombi.Schedule.Jobs.Plex } // Do we already have this item? - var existingContent = await Repo.GetByKey(show.ratingKey); + // Let's try and match + var existingContent = await Repo.GetFirstContentByCustom(x => x.Title == show.title + && x.ReleaseYear == show.year.ToString() + && x.Type == PlexMediaTypeEntity.Show); + // The ratingKey keeps changing... + //var existingContent = await Repo.GetByKey(show.ratingKey); if (existingContent != null) { try @@ -197,7 +202,12 @@ namespace Ombi.Schedule.Jobs.Plex foreach (var movie in content?.Metadata ?? new Metadata[] { }) { // Let's check if we have this movie - var existing = await Repo.GetByKey(movie.ratingKey); + + var existing = await Repo.GetFirstContentByCustom(x => x.Title == movie.title + && x.ReleaseYear == movie.year.ToString() + && x.Type == PlexMediaTypeEntity.Movie); + // The rating key keeps changing + //var existing = await Repo.GetByKey(movie.ratingKey); if (existing != null) { continue; diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexEpisodeSync.cs b/src/Ombi.Schedule/Jobs/Plex/PlexEpisodeSync.cs index c6630ee0e..56d484abe 100644 --- a/src/Ombi.Schedule/Jobs/Plex/PlexEpisodeSync.cs +++ b/src/Ombi.Schedule/Jobs/Plex/PlexEpisodeSync.cs @@ -101,17 +101,20 @@ namespace Ombi.Schedule.Jobs.Plex var currentPosition = 0; var resultCount = settings.EpisodeBatchSize == 0 ? 50 : settings.EpisodeBatchSize; var episodes = await _api.GetAllEpisodes(settings.PlexAuthToken, settings.FullUri, section.key, currentPosition, resultCount); - var currentData = _repo.GetAllEpisodes().AsNoTracking(); _log.LogInformation(LoggingEvents.PlexEpisodeCacher, $"Total Epsiodes found for {episodes.MediaContainer.librarySectionTitle} = {episodes.MediaContainer.totalSize}"); - await ProcessEpsiodes(episodes, currentData); + // Delete all the episodes because we cannot uniquly match an episode to series every time, + // see comment below. + await _repo.ExecuteSql("DELETE FROM PlexEpisode"); + + await ProcessEpsiodes(episodes); currentPosition += resultCount; while (currentPosition < episodes.MediaContainer.totalSize) { var ep = await _api.GetAllEpisodes(settings.PlexAuthToken, settings.FullUri, section.key, currentPosition, resultCount); - await ProcessEpsiodes(ep, currentData); + await ProcessEpsiodes(ep); _log.LogInformation(LoggingEvents.PlexEpisodeCacher, $"Processed {resultCount} more episodes. Total Remaining {episodes.MediaContainer.totalSize - currentPosition}"); currentPosition += resultCount; } @@ -121,7 +124,7 @@ namespace Ombi.Schedule.Jobs.Plex await _repo.SaveChangesAsync(); } - private async Task ProcessEpsiodes(PlexContainer episodes, IQueryable currentEpisodes) + private async Task ProcessEpsiodes(PlexContainer episodes) { var ep = new HashSet(); @@ -131,12 +134,13 @@ namespace Ombi.Schedule.Jobs.Plex // We have the parent and grandparent rating keys to link up to the season and series //var metadata = _api.GetEpisodeMetaData(server.PlexAuthToken, server.FullUri, episode.ratingKey); - var epExists = currentEpisodes.Any(x => episode.ratingKey == x.Key && - episode.grandparentRatingKey == x.GrandparentKey); - if (epExists) - { - continue; - } + // This does seem to work, it looks like we can somehow get different rating, grandparent and parent keys with episodes. Not sure how. + //var epExists = currentEpisodes.Any(x => episode.ratingKey == x.Key && + // episode.grandparentRatingKey == x.GrandparentKey); + //if (epExists) + //{ + // continue; + //} ep.Add(new PlexEpisode { diff --git a/src/Ombi.Store/Migrations/20180128212409_EmbyEpisodeClear.Designer.cs b/src/Ombi.Store/Migrations/20180128212409_EmbyEpisodeClear.Designer.cs new file mode 100644 index 000000000..f8f53150e --- /dev/null +++ b/src/Ombi.Store/Migrations/20180128212409_EmbyEpisodeClear.Designer.cs @@ -0,0 +1,889 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Storage.Internal; +using Ombi.Helpers; +using Ombi.Store.Context; +using Ombi.Store.Entities; +using Ombi.Store.Entities.Requests; +using System; + +namespace Ombi.Store.Migrations +{ + [DbContext(typeof(OmbiContext))] + [Migration("20180128212409_EmbyEpisodeClear")] + partial class EmbyEpisodeClear + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.0.0-rtm-26452"); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.ApplicationConfiguration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Type"); + + b.Property("Value"); + + b.HasKey("Id"); + + b.ToTable("ApplicationConfiguration"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Audit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuditArea"); + + b.Property("AuditType"); + + b.Property("DateTime"); + + b.Property("Description"); + + b.Property("User"); + + b.HasKey("Id"); + + b.ToTable("Audit"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.CouchPotatoCache", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("TheMovieDbId"); + + b.HasKey("Id"); + + b.ToTable("CouchPotatoCache"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.EmbyContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedAt"); + + b.Property("EmbyId") + .IsRequired(); + + b.Property("ProviderId"); + + b.Property("Title"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.ToTable("EmbyContent"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.EmbyEpisode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedAt"); + + b.Property("EmbyId"); + + b.Property("EpisodeNumber"); + + b.Property("ParentId"); + + b.Property("ProviderId"); + + b.Property("SeasonNumber"); + + b.Property("Title"); + + b.HasKey("Id"); + + b.HasIndex("ParentId"); + + b.ToTable("EmbyEpisode"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.GlobalSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Content"); + + b.Property("SettingsName"); + + b.HasKey("Id"); + + b.ToTable("GlobalSettings"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.NotificationTemplates", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Agent"); + + b.Property("Enabled"); + + b.Property("Message"); + + b.Property("NotificationType"); + + b.Property("Subject"); + + b.HasKey("Id"); + + b.ToTable("NotificationTemplates"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.OmbiUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("Alias"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("EmbyConnectUserId"); + + b.Property("EpisodeRequestLimit"); + + b.Property("LastLoggedIn"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("MovieRequestLimit"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("ProviderUserId"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserAccessToken"); + + b.Property("UserName") + .HasMaxLength(256); + + b.Property("UserType"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.PlexEpisode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("EpisodeNumber"); + + b.Property("GrandparentKey"); + + b.Property("Key"); + + b.Property("ParentKey"); + + b.Property("SeasonNumber"); + + b.Property("Title"); + + b.HasKey("Id"); + + b.HasIndex("GrandparentKey"); + + b.ToTable("PlexEpisode"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.PlexSeasonsContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ParentKey"); + + b.Property("PlexContentId"); + + b.Property("PlexServerContentId"); + + b.Property("SeasonKey"); + + b.Property("SeasonNumber"); + + b.HasKey("Id"); + + b.HasIndex("PlexServerContentId"); + + b.ToTable("PlexSeasonsContent"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.PlexServerContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedAt"); + + b.Property("ImdbId"); + + b.Property("Key"); + + b.Property("Quality"); + + b.Property("ReleaseYear"); + + b.Property("TheMovieDbId"); + + b.Property("Title"); + + b.Property("TvDbId"); + + b.Property("Type"); + + b.Property("Url"); + + b.HasKey("Id"); + + b.ToTable("PlexServerContent"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.RadarrCache", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("HasFile"); + + b.Property("TheMovieDbId"); + + b.HasKey("Id"); + + b.ToTable("RadarrCache"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.ChildRequests", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Approved"); + + b.Property("Available"); + + b.Property("Denied"); + + b.Property("DeniedReason"); + + b.Property("IssueId"); + + b.Property("ParentRequestId"); + + b.Property("RequestType"); + + b.Property("RequestedDate"); + + b.Property("RequestedUserId"); + + b.Property("SeriesType"); + + b.Property("Title"); + + b.HasKey("Id"); + + b.HasIndex("ParentRequestId"); + + b.HasIndex("RequestedUserId"); + + b.ToTable("ChildRequests"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.IssueCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Value"); + + b.HasKey("Id"); + + b.ToTable("IssueCategory"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.IssueComments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Comment"); + + b.Property("Date"); + + b.Property("IssuesId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("IssuesId"); + + b.HasIndex("UserId"); + + b.ToTable("IssueComments"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.Issues", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Description"); + + b.Property("IssueCategoryId"); + + b.Property("IssueId"); + + b.Property("ProviderId"); + + b.Property("RequestId"); + + b.Property("RequestType"); + + b.Property("ResovledDate"); + + b.Property("Status"); + + b.Property("Subject"); + + b.Property("Title"); + + b.Property("UserReportedId"); + + b.HasKey("Id"); + + b.HasIndex("IssueCategoryId"); + + b.HasIndex("IssueId"); + + b.HasIndex("UserReportedId"); + + b.ToTable("Issues"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.MovieRequests", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Approved"); + + b.Property("Available"); + + b.Property("Background"); + + b.Property("Denied"); + + b.Property("DeniedReason"); + + b.Property("ImdbId"); + + b.Property("IssueId"); + + b.Property("Overview"); + + b.Property("PosterPath"); + + b.Property("QualityOverride"); + + b.Property("ReleaseDate"); + + b.Property("RequestType"); + + b.Property("RequestedDate"); + + b.Property("RequestedUserId"); + + b.Property("RootPathOverride"); + + b.Property("Status"); + + b.Property("TheMovieDbId"); + + b.Property("Title"); + + b.HasKey("Id"); + + b.HasIndex("RequestedUserId"); + + b.ToTable("MovieRequests"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.RequestLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("EpisodeCount"); + + b.Property("RequestDate"); + + b.Property("RequestId"); + + b.Property("RequestType"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RequestLog"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.TvRequests", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ImdbId"); + + b.Property("Overview"); + + b.Property("PosterPath"); + + b.Property("ReleaseDate"); + + b.Property("RootFolder"); + + b.Property("Status"); + + b.Property("Title"); + + b.Property("TvDbId"); + + b.HasKey("Id"); + + b.ToTable("TvRequests"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.SickRageCache", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("TvDbId"); + + b.HasKey("Id"); + + b.ToTable("SickRageCache"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.SickRageEpisodeCache", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("EpisodeNumber"); + + b.Property("SeasonNumber"); + + b.Property("TvDbId"); + + b.HasKey("Id"); + + b.ToTable("SickRageEpisodeCache"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.SonarrCache", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("TvDbId"); + + b.HasKey("Id"); + + b.ToTable("SonarrCache"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.SonarrEpisodeCache", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("EpisodeNumber"); + + b.Property("HasFile"); + + b.Property("SeasonNumber"); + + b.Property("TvDbId"); + + b.HasKey("Id"); + + b.ToTable("SonarrEpisodeCache"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Tokens", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Token"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Tokens"); + }); + + modelBuilder.Entity("Ombi.Store.Repository.Requests.EpisodeRequests", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AirDate"); + + b.Property("Approved"); + + b.Property("Available"); + + b.Property("EpisodeNumber"); + + b.Property("Requested"); + + b.Property("SeasonId"); + + b.Property("Title"); + + b.Property("Url"); + + b.HasKey("Id"); + + b.HasIndex("SeasonId"); + + b.ToTable("EpisodeRequests"); + }); + + modelBuilder.Entity("Ombi.Store.Repository.Requests.SeasonRequests", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChildRequestId"); + + b.Property("SeasonNumber"); + + b.HasKey("Id"); + + b.HasIndex("ChildRequestId"); + + b.ToTable("SeasonRequests"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Ombi.Store.Entities.OmbiUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Ombi.Store.Entities.OmbiUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Ombi.Store.Entities.OmbiUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Ombi.Store.Entities.OmbiUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Ombi.Store.Entities.EmbyEpisode", b => + { + b.HasOne("Ombi.Store.Entities.EmbyContent", "Series") + .WithMany("Episodes") + .HasForeignKey("ParentId") + .HasPrincipalKey("EmbyId"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.PlexEpisode", b => + { + b.HasOne("Ombi.Store.Entities.PlexServerContent", "Series") + .WithMany("Episodes") + .HasForeignKey("GrandparentKey") + .HasPrincipalKey("Key") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Ombi.Store.Entities.PlexSeasonsContent", b => + { + b.HasOne("Ombi.Store.Entities.PlexServerContent") + .WithMany("Seasons") + .HasForeignKey("PlexServerContentId"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.ChildRequests", b => + { + b.HasOne("Ombi.Store.Entities.Requests.TvRequests", "ParentRequest") + .WithMany("ChildRequests") + .HasForeignKey("ParentRequestId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Ombi.Store.Entities.OmbiUser", "RequestedUser") + .WithMany() + .HasForeignKey("RequestedUserId"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.IssueComments", b => + { + b.HasOne("Ombi.Store.Entities.Requests.Issues", "Issues") + .WithMany("Comments") + .HasForeignKey("IssuesId"); + + b.HasOne("Ombi.Store.Entities.OmbiUser", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.Issues", b => + { + b.HasOne("Ombi.Store.Entities.Requests.IssueCategory", "IssueCategory") + .WithMany() + .HasForeignKey("IssueCategoryId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Ombi.Store.Entities.Requests.ChildRequests") + .WithMany("Issues") + .HasForeignKey("IssueId"); + + b.HasOne("Ombi.Store.Entities.Requests.MovieRequests") + .WithMany("Issues") + .HasForeignKey("IssueId"); + + b.HasOne("Ombi.Store.Entities.OmbiUser", "UserReported") + .WithMany() + .HasForeignKey("UserReportedId"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.MovieRequests", b => + { + b.HasOne("Ombi.Store.Entities.OmbiUser", "RequestedUser") + .WithMany() + .HasForeignKey("RequestedUserId"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Requests.RequestLog", b => + { + b.HasOne("Ombi.Store.Entities.OmbiUser", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("Ombi.Store.Entities.Tokens", b => + { + b.HasOne("Ombi.Store.Entities.OmbiUser", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("Ombi.Store.Repository.Requests.EpisodeRequests", b => + { + b.HasOne("Ombi.Store.Repository.Requests.SeasonRequests", "Season") + .WithMany("Episodes") + .HasForeignKey("SeasonId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Ombi.Store.Repository.Requests.SeasonRequests", b => + { + b.HasOne("Ombi.Store.Entities.Requests.ChildRequests", "ChildRequest") + .WithMany("SeasonRequests") + .HasForeignKey("ChildRequestId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Ombi.Store/Migrations/20180128212409_EmbyEpisodeClear.cs b/src/Ombi.Store/Migrations/20180128212409_EmbyEpisodeClear.cs new file mode 100644 index 000000000..da7f4eb36 --- /dev/null +++ b/src/Ombi.Store/Migrations/20180128212409_EmbyEpisodeClear.cs @@ -0,0 +1,20 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using System; +using System.Collections.Generic; + +namespace Ombi.Store.Migrations +{ + public partial class EmbyEpisodeClear : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.Sql(@" +DELETE FROM EmbyEpisode"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/src/Ombi.Store/Repository/IPlexContentRepository.cs b/src/Ombi.Store/Repository/IPlexContentRepository.cs index 87d811e5d..cb244dcd2 100644 --- a/src/Ombi.Store/Repository/IPlexContentRepository.cs +++ b/src/Ombi.Store/Repository/IPlexContentRepository.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Threading.Tasks; using Ombi.Store.Entities; @@ -15,5 +17,7 @@ namespace Ombi.Store.Repository Task Add(PlexEpisode content); Task GetEpisodeByKey(int key); Task AddRange(IEnumerable content); + IEnumerable GetWhereContentByCustom(Expression> predicate); + Task GetFirstContentByCustom(Expression> predicate); } } \ No newline at end of file diff --git a/src/Ombi.Store/Repository/IRepository.cs b/src/Ombi.Store/Repository/IRepository.cs index 9df78f083..ed5ed28c5 100644 --- a/src/Ombi.Store/Repository/IRepository.cs +++ b/src/Ombi.Store/Repository/IRepository.cs @@ -22,5 +22,7 @@ namespace Ombi.Store.Repository IIncludableQueryable Include( IQueryable source, Expression> navigationPropertyPath) where TEntity : class; + + Task ExecuteSql(string sql); } } \ No newline at end of file diff --git a/src/Ombi.Store/Repository/PlexContentRepository.cs b/src/Ombi.Store/Repository/PlexContentRepository.cs index 284489cf4..e1df9e183 100644 --- a/src/Ombi.Store/Repository/PlexContentRepository.cs +++ b/src/Ombi.Store/Repository/PlexContentRepository.cs @@ -25,8 +25,10 @@ // ************************************************************************/ #endregion +using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Ombi.Store.Context; @@ -74,6 +76,16 @@ namespace Ombi.Store.Repository return await Db.PlexServerContent.Include(x => x.Seasons).FirstOrDefaultAsync(x => x.Key == key); } + public IEnumerable GetWhereContentByCustom(Expression> predicate) + { + return Db.PlexServerContent.Where(predicate); + } + + public async Task GetFirstContentByCustom(Expression> predicate) + { + return await Db.PlexServerContent.FirstOrDefaultAsync(predicate); + } + public async Task Update(PlexServerContent existingContent) { Db.PlexServerContent.Update(existingContent); diff --git a/src/Ombi.Store/Repository/Repository.cs b/src/Ombi.Store/Repository/Repository.cs index f7c12709f..b4b9f8e93 100644 --- a/src/Ombi.Store/Repository/Repository.cs +++ b/src/Ombi.Store/Repository/Repository.cs @@ -72,6 +72,11 @@ namespace Ombi.Store.Repository return source.Include(navigationPropertyPath); } + public async Task ExecuteSql(string sql) + { + await _ctx.Database.ExecuteSqlCommandAsync(sql); + } + private bool _disposed; // Protected implementation of Dispose pattern. diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index af0fd1abc..cce804818 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -118,7 +118,7 @@ export class MovieRequestsComponent implements OnInit { public deny(request: IMovieRequests) { request.denied = true; - this.updateRequest(request); + this.denyRequest(request); } public selectRootFolder(searchResult: IMovieRequests, rootFolderSelected: IRadarrRootFolder, event: any) { @@ -195,7 +195,7 @@ export class MovieRequestsComponent implements OnInit { private approveRequest(request: IMovieRequests) { this.requestService.approveMovie({ id: request.id }) .subscribe(x => { - + request.approved = true; if (x.result) { this.notificationService.success( `Request for ${request.title} has been approved successfully`); @@ -206,6 +206,19 @@ export class MovieRequestsComponent implements OnInit { }); } + private denyRequest(request: IMovieRequests) { + this.requestService.denyMovie({ id: request.id }) + .subscribe(x => { + if (x.result) { + this.notificationService.success( + `Request for ${request.title} has been denied successfully`); + } else { + this.notificationService.warning("Request Denied", x.message ? x.message : x.errorMessage); + request.denied = false; + } + }); + } + private loadInit() { this.requestService.getMovieRequests(this.amountToLoad, 0) .subscribe(x => { diff --git a/src/Ombi/wwwroot/translations/da.json b/src/Ombi/wwwroot/translations/da.json index 04ab27325..177a5ba9e 100644 --- a/src/Ombi/wwwroot/translations/da.json +++ b/src/Ombi/wwwroot/translations/da.json @@ -12,6 +12,7 @@ "Common": { "ContinueButton": "Fortsæt", "Available": "Tilgængelig", + "NotAvailable": "Not Available", "ProcessingRequest": "Behandler anmodning", "PendingApproval": "Afventer godkendelse", "RequestDenied": "Anmodning afvist", @@ -45,6 +46,7 @@ "UserManagement": "Brugeradministration", "Issues": "Problemer", "Donate": "Donér!", + "DonateLibraryMaintainer": "Donér til vedligeholder af bibliotek", "DonateTooltip": "Sådan overbeviser jeg min kone om, at jeg skal bruge min fritid på at udvikle Ombi :)", "UpdateAvailableTooltip": "Ny opdatering venter!", "Settings": "Indstillinger", @@ -59,9 +61,9 @@ "Italian": "Italiensk", "Danish": "Dansk", "Dutch": "Hollandsk", - "Norwegian": "Norwegian" + "Norwegian": "Norsk" }, - "OpenMobileApp": "Open Mobile App" + "OpenMobileApp": "Åbn mobilapp" }, "Search": { "Title": "Søg", @@ -104,7 +106,9 @@ "Season": "Sæson:", "GridTitle": "Titel", "AirDate": "Sendt", - "GridStatus": "Status" + "GridStatus": "Status", + "ReportIssue": "Report Issue", + "Filter": "Filter" }, "Issues": { "Title": "Problemer", @@ -124,5 +128,11 @@ "Comments": "Kommentarer", "WriteMessagePlaceholder": "Indtast din besked her...", "ReportedBy": "Anmeldt af" + }, + "Filter": { + "ClearFilter": "Clear Filter", + "FilterHeaderAvailability": "Availability", + "FilterHeaderRequestStatus": "Status", + "Approved": "Approved" } } \ No newline at end of file diff --git a/src/Ombi/wwwroot/translations/de.json b/src/Ombi/wwwroot/translations/de.json index 670ed06e8..ceb99872f 100644 --- a/src/Ombi/wwwroot/translations/de.json +++ b/src/Ombi/wwwroot/translations/de.json @@ -12,14 +12,15 @@ "Common": { "ContinueButton": "Weiter", "Available": "Verfügbar", + "NotAvailable": "Nicht verfügbar", "ProcessingRequest": "Anfrage wird bearbeitet", "PendingApproval": "Genehmigung ausstehend", - "RequestDenied": "Request Denied", + "RequestDenied": "Anfrage abgelehnt", "NotRequested": "Nicht angefragt", "Requested": "Angefordert", "Request": "Anfrage", - "Denied": "Denied", - "Approve": "Approve", + "Denied": "Abgelehnt", + "Approve": "Genehmigen", "Errors": { "Validation": "Bitte überprüfen Sie die eingegebenen Werte" } @@ -43,8 +44,9 @@ "Search": "Suche", "Requests": "Anfragen", "UserManagement": "Benutzerverwaltung", - "Issues": "Issues", + "Issues": "Probleme", "Donate": "Spenden!", + "DonateLibraryMaintainer": "Spende sie an den Bibliotheks Betreuer", "DonateTooltip": "So überzeuge ich meine Frau, meine Freizeit mit der Entwicklung von Ombi zu verbringen ;)", "UpdateAvailableTooltip": "Update verfügbar!", "Settings": "Einstellungen", @@ -59,9 +61,9 @@ "Italian": "Italienisch", "Danish": "Dänisch", "Dutch": "Niederländisch", - "Norwegian": "Norwegian" + "Norwegian": "Norwegisch" }, - "OpenMobileApp": "Open Mobile App" + "OpenMobileApp": "Mobile App" }, "Search": { "Title": "Suche", @@ -83,46 +85,54 @@ } }, "Requests": { - "Title": "Requests", - "Paragraph": "Below you can see yours and all other requests, as well as their download and approval status.", - "MoviesTab": "Movies", - "TvTab": "TV Shows", - "RequestedBy": "Requested By:", + "Title": "Anfragen", + "Paragraph": "Unten sehen Sie Ihre und alle anderen Anfragen, sowie deren Download-und Genehmigungsstatus.", + "MoviesTab": "Filme", + "TvTab": "Serien", + "RequestedBy": "Angefordert von:", "Status": "Status:", - "RequestStatus": "Request status:", - "Denied": " Denied:", - "ReleaseDate": "Release Date:", - "RequestDate": "Request Date:", - "QualityOverride": "Quality Override:", - "RootFolderOverride": "Root Folder Override:", - "ChangeRootFolder": "Change Root Folder", - "ChangeQualityProfile": "Change Quality Profile", - "MarkUnavailable": "Mark Unavailable", - "MarkAvailable": "Mark Available", - "Remove": "Remove", - "Deny": "Deny", - "Season": "Season:", - "GridTitle": "Title", - "AirDate": "AirDate", - "GridStatus": "Status" + "RequestStatus": "Anfrage Status:", + "Denied": " Abgelehnt:", + "ReleaseDate": "Veröffentlichungsdatum:", + "RequestDate": "Datum der Anfrage:", + "QualityOverride": "Qualitäts Überschreiben:", + "RootFolderOverride": "Stammverzeichnis Überschreiben:", + "ChangeRootFolder": "Stammordner ändern", + "ChangeQualityProfile": "Qualitätsprofil ändern", + "MarkUnavailable": "Als Nicht verfügbar markieren", + "MarkAvailable": "Als verfügbar markieren", + "Remove": "Entfernen", + "Deny": "Ablehnen", + "Season": "Staffel:", + "GridTitle": "Titel", + "AirDate": "Erstausstrahlung", + "GridStatus": "Status", + "ReportIssue": "Problem melden", + "Filter": "Filter" }, "Issues": { - "Title": "Issues", - "PendingTitle": "Pending Issues", - "InProgressTitle": "In Progress Issues", - "ResolvedTitle": "Resolved Issues", - "ColumnTitle": "Title", - "Category": "Category", + "Title": "Probleme", + "PendingTitle": "Ausstehende Probleme", + "InProgressTitle": "Probleme in bearbeitung", + "ResolvedTitle": "Behobene Probleme", + "ColumnTitle": "Titel", + "Category": "Kategorie", "Status": "Status", "Details": "Details", - "Description": "Description", - "NoComments": "No Comments!", - "MarkInProgress": "Mark In Progress", - "MarkResolved": "Mark Resolved", - "SendMessageButton": "Send", - "Subject": "Subject", - "Comments": "Comments", - "WriteMessagePlaceholder": "Write your message here...", - "ReportedBy": "Reported By" + "Description": "Beschreibung", + "NoComments": "Keine Kommentare!", + "MarkInProgress": "Als in Bearbeitung markieren", + "MarkResolved": "Als gelöst markieren", + "SendMessageButton": "Senden", + "Subject": "Betreff", + "Comments": "Kommentare", + "WriteMessagePlaceholder": "Nachricht eingeben...", + "ReportedBy": "Gemeldet von" + }, + "Filter": { + "ClearFilter": "Filter zurücksetzen", + "FilterHeaderAvailability": "Verfügbarkeit", + "FilterHeaderRequestStatus": "Status", + "Approved": "Bestätigt" } } \ No newline at end of file diff --git a/src/Ombi/wwwroot/translations/es.json b/src/Ombi/wwwroot/translations/es.json index 8afc00280..61c371094 100644 --- a/src/Ombi/wwwroot/translations/es.json +++ b/src/Ombi/wwwroot/translations/es.json @@ -12,6 +12,7 @@ "Common": { "ContinueButton": "Continuar", "Available": "Disponible", + "NotAvailable": "Not Available", "ProcessingRequest": "Procesando solicitud", "PendingApproval": "Pendiente de aprobación", "RequestDenied": "Solicitud denegada", @@ -45,6 +46,7 @@ "UserManagement": "Gestión de usuarios", "Issues": "Incidencias", "Donate": "¡Donar!", + "DonateLibraryMaintainer": "Donate to Library Maintainer", "DonateTooltip": "Para que mi esposa me deje desarrollar Ombi ;)", "UpdateAvailableTooltip": "¡Actualización disponible!", "Settings": "Ajustes", @@ -104,7 +106,9 @@ "Season": "Temporada:", "GridTitle": "Título", "AirDate": "Fecha de estreno", - "GridStatus": "Estado" + "GridStatus": "Estado", + "ReportIssue": "Report Issue", + "Filter": "Filter" }, "Issues": { "Title": "Incidencias", @@ -124,5 +128,11 @@ "Comments": "Comentarios", "WriteMessagePlaceholder": "Escribe tu mensaje aquí...", "ReportedBy": "Informado por" + }, + "Filter": { + "ClearFilter": "Clear Filter", + "FilterHeaderAvailability": "Availability", + "FilterHeaderRequestStatus": "Status", + "Approved": "Approved" } } \ No newline at end of file diff --git a/src/Ombi/wwwroot/translations/fr.json b/src/Ombi/wwwroot/translations/fr.json index 42b939030..51688f6c5 100644 --- a/src/Ombi/wwwroot/translations/fr.json +++ b/src/Ombi/wwwroot/translations/fr.json @@ -12,6 +12,7 @@ "Common": { "ContinueButton": "Continuer", "Available": "Disponible", + "NotAvailable": "Not Available", "ProcessingRequest": "En cours de traitement", "PendingApproval": "En attente d'approbation", "RequestDenied": "Demande refusée", @@ -45,6 +46,7 @@ "UserManagement": "Gestion des utilisateurs", "Issues": "Problèmes", "Donate": "Faire un don !", + "DonateLibraryMaintainer": "Donate to Library Maintainer", "DonateTooltip": "C’est pour convaincre ma femme de me laisser passer mon temps libre à développer Ombi ;)", "UpdateAvailableTooltip": "Mise à jour disponible !", "Settings": "Paramètres", @@ -104,7 +106,9 @@ "Season": "Saison :", "GridTitle": "Titre", "AirDate": "Date de diffusion", - "GridStatus": "Statut" + "GridStatus": "Statut", + "ReportIssue": "Report Issue", + "Filter": "Filter" }, "Issues": { "Title": "Problèmes", @@ -124,5 +128,11 @@ "Comments": "Commentaires", "WriteMessagePlaceholder": "Écrivez votre message ici...", "ReportedBy": "Signalé par" + }, + "Filter": { + "ClearFilter": "Clear Filter", + "FilterHeaderAvailability": "Availability", + "FilterHeaderRequestStatus": "Status", + "Approved": "Approved" } } \ No newline at end of file diff --git a/src/Ombi/wwwroot/translations/it.json b/src/Ombi/wwwroot/translations/it.json index d298e3e59..ab7fa361f 100644 --- a/src/Ombi/wwwroot/translations/it.json +++ b/src/Ombi/wwwroot/translations/it.json @@ -3,53 +3,55 @@ "SignInButton": "Accedi", "UsernamePlaceholder": "Nome utente", "PasswordPlaceholder": "Password", - "RememberMe": "Ricordati di Me", + "RememberMe": "Ricordati di me", "ForgottenPassword": "Hai dimenticato la password?", "Errors": { - "IncorrectCredentials": "Incorrect username or password" + "IncorrectCredentials": "Username o password non corretta" } }, "Common": { - "ContinueButton": "Continuare", - "Available": "Available", - "ProcessingRequest": "Processing Request", - "PendingApproval": "Pending Approval", - "RequestDenied": "Request Denied", - "NotRequested": "Not Requested", - "Requested": "Requested", - "Request": "Request", - "Denied": "Denied", - "Approve": "Approve", + "ContinueButton": "Continua", + "Available": "Disponibile", + "NotAvailable": "Not Available", + "ProcessingRequest": "Richiesta in elaborazione", + "PendingApproval": "In attesa di approvazione", + "RequestDenied": "Richiesta negata", + "NotRequested": "Non richiesto", + "Requested": "Richiesto", + "Request": "Richiesta", + "Denied": "Rifiutato", + "Approve": "Approva", "Errors": { - "Validation": "Please check your entered values" + "Validation": "Per favore, controlla i valori che hai inserito" } }, "PasswordReset": { - "EmailAddressPlaceholder": "Indirizzo di posta elettronica", - "ResetPasswordButton": "Reimpostare la Password" + "EmailAddressPlaceholder": "Indirizzo e-mail", + "ResetPasswordButton": "Reimposta la password" }, "LandingPage": { "OnlineHeading": "Attualmente Online", "OnlineParagraph": "Il media server è attualmente online", "PartiallyOnlineHeading": "Parzialmente in linea", "PartiallyOnlineParagraph": "Il media server è parzialmente in linea.", - "MultipleServersUnavailable": "Ci sono {{serversUnavailable}} server offline fuori {{totalServers}}.", - "SingleServerUnavailable": "C'è {{serversUnavailable}} il server offline fuori {{totalServers}}.", + "MultipleServersUnavailable": "Ci sono {{serversUnavailable}} server offline su {{totalServers}}.", + "SingleServerUnavailable": "C'è {{serversUnavailable}} server offline su {{totalServers}}.", "OfflineHeading": "Attualmente Offline", "OfflineParagraph": "Il media server è attualmente offline.", - "CheckPageForUpdates": "Check this page for continuous site updates." + "CheckPageForUpdates": "Controlla questa pagina per ottenere aggiornamenti del sito." }, "NavigationBar": { - "Search": "Ricerca", + "Search": "Cerca", "Requests": "Richieste", "UserManagement": "Gestione degli utenti", - "Issues": "Issues", + "Issues": "Problemi", "Donate": "Fai una donazione!", - "DonateTooltip": "Questo è come convincere mia moglie a farmi spendere il mio tempo libero lo sviluppo di Ombi ;)", + "DonateLibraryMaintainer": "Dona al manutentore della libreria", + "DonateTooltip": "Questo è come convinco mia moglie a farmi spendere il mio tempo libero nello sviluppo di Ombi ;)", "UpdateAvailableTooltip": "Aggiornamento disponibile!", "Settings": "Impostazioni", "Welcome": "Benvenuto {{username}}", - "UpdateDetails": "Aggiornare i dettagli", + "UpdateDetails": "Aggiorna i tuoi dati", "Logout": "Logout", "Language": { "English": "Inglese", @@ -59,70 +61,78 @@ "Italian": "Italiano", "Danish": "Danese", "Dutch": "Olandese", - "Norwegian": "Norwegian" + "Norwegian": "Norvegese" }, - "OpenMobileApp": "Open Mobile App" + "OpenMobileApp": "Apri l'applicazione mobile" }, "Search": { - "Title": "Search", - "Paragraph": "Want to watch something that is not currently available? No problem, just search for it below and request it!", - "MoviesTab": "Movies", - "TvTab": "TV Shows", - "Suggestions": "Suggestions", - "NoResults": "Sorry, we didn't find any results!", - "ReleaseDate": "Release Date", - "ViewOnPlex": "View On Plex", - "RequestAdded": "Request for {{title}} has been added successfully", + "Title": "Cerca", + "Paragraph": "Vuoi vedere qualcosa che non è attualmente disponibile? Nessun problema, basta cercare qui sotto e richiederlo!", + "MoviesTab": "Film", + "TvTab": "Serie TV", + "Suggestions": "Suggerimenti", + "NoResults": "Ci dispiace, non abbiamo trovato alcun risultato!", + "ReleaseDate": "Data di rilascio", + "ViewOnPlex": "Guarda su Plex", + "RequestAdded": "La richiesta per {{title}} è stata aggiunta correttamente", "Movies": { - "PopularMovies": "Popular Movies", - "UpcomingMovies": "Upcoming Movies", - "TopRatedMovies": "Top Rated Movies", - "NowPlayingMovies": "Now Playing Movies", - "HomePage": "Home Page", + "PopularMovies": "Film popolari", + "UpcomingMovies": "Film in arrivo", + "TopRatedMovies": "Film più votati", + "NowPlayingMovies": "Film ora in riproduzione", + "HomePage": "Pagina iniziale", "Trailer": "Trailer" } }, "Requests": { - "Title": "Requests", - "Paragraph": "Below you can see yours and all other requests, as well as their download and approval status.", - "MoviesTab": "Movies", - "TvTab": "TV Shows", - "RequestedBy": "Requested By:", - "Status": "Status:", - "RequestStatus": "Request status:", - "Denied": " Denied:", - "ReleaseDate": "Release Date:", - "RequestDate": "Request Date:", - "QualityOverride": "Quality Override:", - "RootFolderOverride": "Root Folder Override:", - "ChangeRootFolder": "Change Root Folder", - "ChangeQualityProfile": "Change Quality Profile", - "MarkUnavailable": "Mark Unavailable", - "MarkAvailable": "Mark Available", - "Remove": "Remove", - "Deny": "Deny", - "Season": "Season:", - "GridTitle": "Title", - "AirDate": "AirDate", - "GridStatus": "Status" + "Title": "Richieste", + "Paragraph": "Qui sotto puoi vedere le tue e tutte le altre richieste con il loro stato di download e approvazione.", + "MoviesTab": "Film", + "TvTab": "Serie TV", + "RequestedBy": "Richiesta da:", + "Status": "Stato:", + "RequestStatus": "Stato della richiesta:", + "Denied": " Rifiutato:", + "ReleaseDate": "Data di rilascio:", + "RequestDate": "Data della richiesta:", + "QualityOverride": "Sovrascrivi qualità:", + "RootFolderOverride": "Sovrascrivi cartella principale:", + "ChangeRootFolder": "Modifica cartella principale", + "ChangeQualityProfile": "Modifica il profilo della qualità", + "MarkUnavailable": "Segna come Non disponibile", + "MarkAvailable": "Segna come Disponibile", + "Remove": "Elimina", + "Deny": "Nega", + "Season": "Stagione:", + "GridTitle": "Titolo", + "AirDate": "Data di trasmissione", + "GridStatus": "Stato", + "ReportIssue": "Report Issue", + "Filter": "Filter" }, "Issues": { - "Title": "Issues", - "PendingTitle": "Pending Issues", - "InProgressTitle": "In Progress Issues", - "ResolvedTitle": "Resolved Issues", - "ColumnTitle": "Title", - "Category": "Category", - "Status": "Status", - "Details": "Details", - "Description": "Description", - "NoComments": "No Comments!", - "MarkInProgress": "Mark In Progress", - "MarkResolved": "Mark Resolved", - "SendMessageButton": "Send", - "Subject": "Subject", - "Comments": "Comments", - "WriteMessagePlaceholder": "Write your message here...", - "ReportedBy": "Reported By" + "Title": "Problemi", + "PendingTitle": "Problemi in sospeso", + "InProgressTitle": "Problemi in risoluzione", + "ResolvedTitle": "Problemi risolti", + "ColumnTitle": "Titolo", + "Category": "Categoria", + "Status": "Stato", + "Details": "Dettagli", + "Description": "Descrizione", + "NoComments": "Non ci sono commenti!", + "MarkInProgress": "Segna come in risoluzione", + "MarkResolved": "Segna come risolto", + "SendMessageButton": "Invia", + "Subject": "Oggetto", + "Comments": "Commenti", + "WriteMessagePlaceholder": "Scrivi qui il tuo messaggio...", + "ReportedBy": "Segnalato da" + }, + "Filter": { + "ClearFilter": "Clear Filter", + "FilterHeaderAvailability": "Availability", + "FilterHeaderRequestStatus": "Status", + "Approved": "Approved" } } \ No newline at end of file diff --git a/src/Ombi/wwwroot/translations/nl.json b/src/Ombi/wwwroot/translations/nl.json index af458f981..0cbb4639b 100644 --- a/src/Ombi/wwwroot/translations/nl.json +++ b/src/Ombi/wwwroot/translations/nl.json @@ -12,6 +12,7 @@ "Common": { "ContinueButton": "Doorgaan", "Available": "Beschikbaar", + "NotAvailable": "Not Available", "ProcessingRequest": "Verzoek wordt verwerkt", "PendingApproval": "Wacht op goedkeuring", "RequestDenied": "Verzoek geweigerd", @@ -45,6 +46,7 @@ "UserManagement": "Gebruikersbeheer", "Issues": "Problemen", "Donate": "Doneer!", + "DonateLibraryMaintainer": "Donate to Library Maintainer", "DonateTooltip": "Zo heb ik mijn vrouw overtuigd dat ik Ombi mag ontwikkelen ;)", "UpdateAvailableTooltip": "Update beschikbaar!", "Settings": "Instellingen", @@ -104,7 +106,9 @@ "Season": "Seizoen:", "GridTitle": "Titel", "AirDate": "Uitzenddatum", - "GridStatus": "Status" + "GridStatus": "Status", + "ReportIssue": "Report Issue", + "Filter": "Filter" }, "Issues": { "Title": "Problemen", @@ -124,5 +128,11 @@ "Comments": "Opmerkingen", "WriteMessagePlaceholder": "Schrijf hier je bericht...", "ReportedBy": "Gerapporteerd door" + }, + "Filter": { + "ClearFilter": "Clear Filter", + "FilterHeaderAvailability": "Availability", + "FilterHeaderRequestStatus": "Status", + "Approved": "Approved" } } \ No newline at end of file diff --git a/src/Ombi/wwwroot/translations/no.json b/src/Ombi/wwwroot/translations/no.json index 4eee72fa5..9e6af527b 100644 --- a/src/Ombi/wwwroot/translations/no.json +++ b/src/Ombi/wwwroot/translations/no.json @@ -12,6 +12,7 @@ "Common": { "ContinueButton": "Gå videre", "Available": "Tilgjengelig", + "NotAvailable": "Not Available", "ProcessingRequest": "Behandler forespørsel", "PendingApproval": "Venter på godkjenning", "RequestDenied": "Forespørsel avslått", @@ -45,6 +46,7 @@ "UserManagement": "Brukeradministrasjon", "Issues": "Mangler", "Donate": "Doner!", + "DonateLibraryMaintainer": "Doner til vedlikeholderen av biblioteket", "DonateTooltip": "Dette er hvordan jeg overbevise min kone til å la meg bruke min fritid til å utvikle Ombi ;)", "UpdateAvailableTooltip": "Ny opdatering venter!", "Settings": "Innstillinger", @@ -104,7 +106,9 @@ "Season": "Sesong:", "GridTitle": "Tittel", "AirDate": "Sendedato", - "GridStatus": "Status" + "GridStatus": "Status", + "ReportIssue": "Report Issue", + "Filter": "Filter" }, "Issues": { "Title": "Mangler", @@ -124,5 +128,11 @@ "Comments": "Kommentarer", "WriteMessagePlaceholder": "Skriv meldingen din her...", "ReportedBy": "Rapportert av" + }, + "Filter": { + "ClearFilter": "Clear Filter", + "FilterHeaderAvailability": "Availability", + "FilterHeaderRequestStatus": "Status", + "Approved": "Approved" } } \ No newline at end of file diff --git a/src/Ombi/wwwroot/translations/sv.json b/src/Ombi/wwwroot/translations/sv.json index 82e234be3..e5f02292c 100644 --- a/src/Ombi/wwwroot/translations/sv.json +++ b/src/Ombi/wwwroot/translations/sv.json @@ -12,6 +12,7 @@ "Common": { "ContinueButton": "Fortsätt", "Available": "Tillgänglig", + "NotAvailable": "Not Available", "ProcessingRequest": "Bearbetar förfrågan", "PendingApproval": "I väntan på godkännande", "RequestDenied": "Efterfrågan nekas", @@ -45,6 +46,7 @@ "UserManagement": "Användarhantering", "Issues": "Problem", "Donate": "Donera!", + "DonateLibraryMaintainer": "Donera till bibliotekets utvecklare", "DonateTooltip": "Det är så här jag övertygar min fru att jag vill spendera min fritid att utveckla Ombi ;)", "UpdateAvailableTooltip": "Uppdatering tillgänglig!", "Settings": "Inställningar", @@ -59,9 +61,9 @@ "Italian": "Italienska", "Danish": "Danska", "Dutch": "Holländska", - "Norwegian": "Norwegian" + "Norwegian": "Norska" }, - "OpenMobileApp": "Open Mobile App" + "OpenMobileApp": "Öppna Mobil App" }, "Search": { "Title": "Sök", @@ -89,7 +91,7 @@ "TvTab": "TV-serier", "RequestedBy": "Efterfrågats av:", "Status": "Status:", - "RequestStatus": "Request status:", + "RequestStatus": "Status för efterfrågan:", "Denied": " Nekad:", "ReleaseDate": "Releasedatum:", "RequestDate": "Datum för efterfrågan:", @@ -104,7 +106,9 @@ "Season": "Säsong:", "GridTitle": "Titel", "AirDate": "Sändningsdatum", - "GridStatus": "Status" + "GridStatus": "Status", + "ReportIssue": "Report Issue", + "Filter": "Filter" }, "Issues": { "Title": "Problem", @@ -124,5 +128,11 @@ "Comments": "Kommentarer", "WriteMessagePlaceholder": "Skriv ditt meddelande här...", "ReportedBy": "Rapporterad av" + }, + "Filter": { + "ClearFilter": "Clear Filter", + "FilterHeaderAvailability": "Availability", + "FilterHeaderRequestStatus": "Status", + "Approved": "Approved" } } \ No newline at end of file