Merge pull request #1334 from tidusjar/dev

Sonarr rework
pull/1362/head
Jamie 8 years ago committed by GitHub
commit 8afce7ba91

@ -56,5 +56,8 @@ namespace Ombi.Api.Interfaces
Series UpdateSeries(Series series, string apiKey, Uri baseUrl);
SonarrSeasonSearchResult SearchForSeason(int seriesId, int seasonNumber, string apiKey, Uri baseUrl);
SonarrSeriesSearchResult SearchForSeries(int seriesId, string apiKey, Uri baseUrl);
SonarrAddSeries AddSeries(SonarrAddSeries series, string apiKey, Uri baseUrl);
}
}

@ -148,6 +148,42 @@ namespace Ombi.Api
return result;
}
public SonarrAddSeries AddSeries(SonarrAddSeries series,string apiKey, Uri baseUrl)
{
var request = new RestRequest
{
Resource = "/api/Series?",
Method = Method.POST
};
Log.Debug("Sonarr API Options:");
Log.Debug(series.DumpJson());
request.AddHeader("X-Api-Key", apiKey);
request.AddJsonBody(series);
SonarrAddSeries result;
try
{
var policy = RetryHandler.RetryAndWaitPolicy((exception, timespan) => Log.Error(exception, "Exception when calling AddSeries for Sonarr, Retrying {0}", timespan), new TimeSpan[] {
TimeSpan.FromSeconds (2)
});
result = policy.Execute(() => Api.ExecuteJson<SonarrAddSeries>(request, baseUrl));
}
catch (JsonSerializationException jse)
{
Log.Error(jse);
var error = Api.ExecuteJson<List<SonarrError>>(request, baseUrl);
var messages = error?.Select(x => x.errorMessage).ToList();
messages?.ForEach(x => Log.Error(x));
result = new SonarrAddSeries { ErrorMessages = messages };
}
return result;
}
public SonarrAddSeries AddSeriesNew(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, int[] seasons, string apiKey, Uri baseUrl, bool monitor = true, bool searchForMissingEpisodes = false)
{
var request = new RestRequest
@ -244,7 +280,18 @@ namespace Ombi.Api
TimeSpan.FromSeconds(5)
});
return policy.Execute(() => Api.ExecuteJson<List<Series>>(request, baseUrl));
var series = policy.Execute(() => Api.ExecuteJson<List<Series>>(request, baseUrl));
// Remove the 'specials from the object'
foreach (var s in series)
{
var seasonToRemove = s.seasons.FirstOrDefault(x => x.seasonNumber == 0);
if (seasonToRemove != null)
{
s.seasons.Remove(seasonToRemove);
}
}
return series;
}
catch (Exception e)
{
@ -266,7 +313,15 @@ namespace Ombi.Api
Log.Error(exception, "Exception when calling GetSeries by ID for Sonarr, Retrying {0}",
timespan));
return policy.Execute(() => Api.ExecuteJson<Series>(request, baseUrl));
var series = policy.Execute(() => Api.ExecuteJson<Series>(request, baseUrl));
// Remove the specials season
var toRemove = series.seasons.FirstOrDefault(x => x.seasonNumber == 0);
if (toRemove != null)
{
series.seasons.Remove(toRemove);
}
return series;
}
catch (Exception e)
{

@ -155,8 +155,9 @@
<Compile Include="StatusChecker\AppveyorArtifactResult.cs" />
<Compile Include="StatusChecker\StatusChecker.cs" />
<Compile Include="StatusChecker\AppveyorBranchResult.cs" />
<Compile Include="TvSender.cs" />
<Compile Include="TvSenderOld.cs" />
<Compile Include="Tv\TvSender.cs" />
<Compile Include="Tv\TvSenderOld.cs" />
<Compile Include="Tv\TvSenderV2.cs" />
<Compile Include="Users\IUserHelper.cs" />
<Compile Include="Users\UserHelper.cs" />
<Compile Include="UserIdentity.cs" />

@ -87,6 +87,8 @@ namespace Ombi.Core
var rootFolderPath = model.RootFolderSelected <= 0 ? sonarrSettings.FullRootPath : await GetRootPath(model.RootFolderSelected, sonarrSettings);
if (episodeRequest)
{
// Does series exist?

@ -0,0 +1,302 @@
#region Copyright
// /************************************************************************
// Copyright (c) 2017 Jamie Rees
// File: TvSenderV2.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ************************************************************************/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NLog;
using Ombi.Api.Interfaces;
using Ombi.Api.Models.SickRage;
using Ombi.Api.Models.Sonarr;
using Ombi.Core.SettingModels;
using Ombi.Helpers;
using Ombi.Store;
namespace Ombi.Core.Tv
{
public class TvSenderV2
{
public TvSenderV2(ISonarrApi sonarrApi, ISickRageApi srApi, ICacheProvider cache)
{
SonarrApi = sonarrApi;
SickrageApi = srApi;
Cache = cache;
}
private ISonarrApi SonarrApi { get; }
private ISickRageApi SickrageApi { get; }
private ICacheProvider Cache { get; }
private static Logger _log = LogManager.GetCurrentClassLogger();
public async Task<SonarrAddSeries> SendToSonarr(SonarrSettings sonarrSettings, RequestedModel model)
{
return await SendToSonarr(sonarrSettings, model, string.Empty);
}
public async Task<SonarrAddSeries> SendToSonarr(SonarrSettings sonarrSettings, RequestedModel model,
string qualityId)
{
var qualityProfile = 0;
if (!string.IsNullOrEmpty(qualityId)) // try to parse the passed in quality, otherwise use the settings default quality
{
int.TryParse(qualityId, out qualityProfile);
}
if (qualityProfile <= 0)
{
int.TryParse(sonarrSettings.QualityProfile, out qualityProfile);
}
var rootFolderPath = model.RootFolderSelected <= 0 ? sonarrSettings.FullRootPath : await GetSonarrRootPath(model.RootFolderSelected, sonarrSettings);
var episodeRequest = model.Episodes.Any();
var requestAll = model.SeasonsRequested?.Equals("All", StringComparison.CurrentCultureIgnoreCase);
var first = model.SeasonsRequested?.Equals("First", StringComparison.CurrentCultureIgnoreCase);
var latest = model.SeasonsRequested?.Equals("Latest", StringComparison.CurrentCultureIgnoreCase);
var specificSeasonRequest = model.SeasonList?.Any();
if (episodeRequest)
{
return await ProcessSonarrEpisodeRequest(sonarrSettings, model, qualityProfile, rootFolderPath);
}
if (requestAll ?? false)
{
return await ProcessSonarrRequestSeason(sonarrSettings, model, qualityProfile, rootFolderPath);
}
if (first ?? false)
{
return await ProcessSonarrRequestSeason(sonarrSettings, model, qualityProfile, rootFolderPath);
}
if (latest ?? false)
{
return await ProcessSonarrRequestSeason(sonarrSettings, model, qualityProfile, rootFolderPath);
}
if (specificSeasonRequest ?? false)
{
return await ProcessSonarrRequestSeason(sonarrSettings, model, qualityProfile, rootFolderPath);
}
return null;
}
private async Task<SonarrAddSeries> ProcessSonarrRequestSeason(SonarrSettings sonarrSettings, RequestedModel model, int qualityId, string rootFolderPath)
{
// Does the series exist?
var series = await GetSonarrSeries(sonarrSettings, model.ProviderId);
if (series == null)
{
//WORKS
// Add the series
return AddSeries(sonarrSettings, model, rootFolderPath, qualityId);
}
// Also make sure the series is now monitored otherwise we won't search for it
series.monitored = true;
foreach (var seasons in series.seasons)
{
seasons.monitored = true;
}
// Send the update command
series = SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri);
SonarrApi.SearchForSeries(series.id, sonarrSettings.ApiKey, sonarrSettings.FullUri);
return new SonarrAddSeries { title = series.title };
}
private async Task<SonarrAddSeries> ProcessSonarrEpisodeRequest(SonarrSettings sonarrSettings, RequestedModel model, int qualityId, string rootFolderPath)
{
// Does the series exist?
var series = await GetSonarrSeries(sonarrSettings, model.ProviderId);
if (series == null)
{
var seriesToAdd = new SonarrAddSeries
{
seasonFolder = sonarrSettings.SeasonFolders,
title = model.Title,
qualityProfileId = qualityId,
tvdbId = model.ProviderId,
titleSlug = model.Title,
seasons = new List<Season>(),
rootFolderPath = rootFolderPath,
monitored = true, // Montior the series
images = new List<SonarrImage>(),
addOptions = new AddOptions
{
ignoreEpisodesWithFiles = true, // We don't really care about these
ignoreEpisodesWithoutFiles = true, // We do not want to grab random episodes missing
searchForMissingEpisodes = false // we want don't want to search for the missing episodes either
}
};
for (var i = 1; i <= model.SeasonCount; i++)
{
var season = new Season
{
seasonNumber = i,
monitored = false // Do not monitor any seasons
};
seriesToAdd.seasons.Add(season);
}
// Add the series now
var result = SonarrApi.AddSeries(seriesToAdd, sonarrSettings.ApiKey, sonarrSettings.FullUri);
await RequestEpisodesForSonarr(model, result.id, sonarrSettings);
}
else
{
await RequestEpisodesForSonarr(model, series.id, sonarrSettings);
}
return new SonarrAddSeries() { title = model.Title };
}
public SonarrAddSeries AddSeries(SonarrSettings sonarrSettings, RequestedModel model, string rootFolderPath, int qualityId)
{
//WORKS
// Add the series
var seriesToAdd = new SonarrAddSeries
{
seasonFolder = sonarrSettings.SeasonFolders,
title = model.Title,
qualityProfileId = qualityId,
tvdbId = model.ProviderId,
titleSlug = model.Title,
seasons = new List<Season>(),
rootFolderPath = rootFolderPath,
monitored = true, // Montior the series
images = new List<SonarrImage>(),
addOptions = new AddOptions
{
ignoreEpisodesWithFiles = true, // We don't really care about these
ignoreEpisodesWithoutFiles = false, // We want to get the whole season
searchForMissingEpisodes = true // we want to search for missing
}
};
for (var i = 1; i <= model.SeasonCount; i++)
{
var season = new Season
{
seasonNumber = i,
// The model.SeasonList.Lenth is 0 when this is a "request all"
monitored = model.SeasonList.Length == 0 || model.SeasonList.Any(x => x == i)
};
seriesToAdd.seasons.Add(season);
}
return SonarrApi.AddSeries(seriesToAdd, sonarrSettings.ApiKey, sonarrSettings.FullUri);
}
private async Task RequestEpisodesForSonarr(RequestedModel model, int showId, SonarrSettings sonarrSettings)
{
// Now lookup all episodes
var ep = SonarrApi.GetEpisodes(showId.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri);
var episodes = ep?.ToList() ?? new List<SonarrEpisodes>();
var internalEpisodeIds = new List<int>();
var tasks = new List<Task>();
foreach (var r in model.Episodes)
{
// Match the episode and season number.
// If the episode is monitored we might not be searching for it.
var episode =
episodes.FirstOrDefault(
x => x.episodeNumber == r.EpisodeNumber && x.seasonNumber == r.SeasonNumber);
if (episode == null)
{
continue;
}
var episodeInfo = SonarrApi.GetEpisode(episode.id.ToString(), sonarrSettings.ApiKey,
sonarrSettings.FullUri);
episodeInfo.monitored = true; // Set the episode to monitored
tasks.Add(Task.Run(() => SonarrApi.UpdateEpisode(episodeInfo, sonarrSettings.ApiKey,
sonarrSettings.FullUri)));
internalEpisodeIds.Add(episode.id);
}
await Task.WhenAll(tasks.ToArray());
SonarrApi.SearchForEpisodes(internalEpisodeIds.ToArray(), sonarrSettings.ApiKey, sonarrSettings.FullUri);
}
public SickRageTvAdd SendToSickRage(SickRageSettings sickRageSettings, RequestedModel model)
{
return SendToSickRage(sickRageSettings, model, sickRageSettings.QualityProfile);
}
public SickRageTvAdd SendToSickRage(SickRageSettings sickRageSettings, RequestedModel model, string qualityId)
{
_log.Info("Sending to SickRage {0}", model.Title);
if (sickRageSettings.Qualities.All(x => x.Key != qualityId))
{
qualityId = sickRageSettings.QualityProfile;
}
var apiResult = SickrageApi.AddSeries(model.ProviderId, model.SeasonCount, model.SeasonList, qualityId,
sickRageSettings.ApiKey, sickRageSettings.FullUri);
var result = apiResult.Result;
return result;
}
private async Task<Series> GetSonarrSeries(SonarrSettings sonarrSettings, int showId)
{
var task = await Task.Run(() => SonarrApi.GetSeries(sonarrSettings.ApiKey, sonarrSettings.FullUri)).ConfigureAwait(false);
var selectedSeries = task.FirstOrDefault(series => series.tvdbId == showId);
return selectedSeries;
}
private async Task<string> GetSonarrRootPath(int pathId, SonarrSettings sonarrSettings)
{
var rootFoldersResult = await Cache.GetOrSetAsync(CacheKeys.SonarrRootFolders, async () =>
{
return await Task.Run(() => SonarrApi.GetRootFolders(sonarrSettings.ApiKey, sonarrSettings.FullUri));
});
foreach (var r in rootFoldersResult.Where(r => r.id == pathId))
{
return r.path;
}
return string.Empty;
}
}
}

@ -109,7 +109,7 @@ namespace Ombi.Services.Jobs
var metadata = PlexApi.GetEpisodeMetaData(settings.PlexAuthToken, settings.FullUri, video.RatingKey);
// Loop through the metadata and create the model to insert into the DB
foreach (var metadataVideo in metadata.Video)
foreach (var metadataVideo in metadata?.Video ?? new List<Video>())
{
if(string.IsNullOrEmpty(metadataVideo.GrandparentTitle))
{
@ -119,11 +119,11 @@ namespace Ombi.Services.Jobs
entities.TryAdd(
new PlexEpisodes
{
EpisodeNumber = epInfo.EpisodeNumber,
EpisodeNumber = epInfo?.EpisodeNumber ?? 0,
EpisodeTitle = metadataVideo.Title,
ProviderId = epInfo.ProviderId,
ProviderId = epInfo?.ProviderId ?? "",
RatingKey = metadataVideo.RatingKey,
SeasonNumber = epInfo.SeasonNumber,
SeasonNumber = epInfo?.SeasonNumber ?? 0,
ShowTitle = metadataVideo.GrandparentTitle
},
1);
@ -152,15 +152,7 @@ namespace Ombi.Services.Jobs
return;
}
var jobs = Job.GetJobs();
var job = jobs.FirstOrDefault(x => x.Name.Equals(JobNames.EpisodeCacher, StringComparison.CurrentCultureIgnoreCase));
if (job != null)
{
if (job.LastRun > DateTime.Now.AddHours(-11)) // If it's been run in the last 11 hours
{
return;
}
}
Job.SetRunning(true, JobNames.EpisodeCacher);
CacheEpisodes(s);
}

@ -31,6 +31,7 @@ using System;
using System.Linq;
using NLog;
using Ombi.Api.Interfaces;
using Ombi.Api.Models.Plex;
using Ombi.Core;
using Ombi.Core.SettingModels;
using Ombi.Core.Users;
@ -89,7 +90,7 @@ namespace Ombi.Services.Jobs
var localUsers = LocalUserRepository.GetAll().ToList();
// Regular users
foreach (var user in plexUsers.User)
foreach (var user in plexUsers?.User ?? new UserFriends[]{})
{
var dbUser = dbUsers.FirstOrDefault(x => x.PlexUserId == user.Id);
if (dbUser != null)

@ -45,6 +45,7 @@ using Ombi.Store.Models.Emby;
using Ombi.Store.Repository;
using TMDbLib.Objects.Exceptions;
using EmbyMediaType = Ombi.Store.Models.Plex.EmbyMediaType;
using Polly;
namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
{
@ -121,14 +122,20 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
var info = new List<EmbyRecentlyAddedModel>();
foreach (var m in filteredMovies)
{
var i = Api.GetInformation(m.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Movie,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
info.Add(new EmbyRecentlyAddedModel
var policy = RetryHandler.RetryAndWaitPolicy((exception, timespan) =>
Log.Error(exception, "Exception thrown when processing an emby movie for the newsletter, Retrying {0}", timespan));
var result = policy.Execute(() =>
{
EmbyInformation = i,
EmbyContent = m
var i = Api.GetInformation(m.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Movie,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
return new EmbyRecentlyAddedModel
{
EmbyInformation = i,
EmbyContent = m
};
});
info.Add(result);
}
GenerateMovieHtml(info, sb);
newsletter.MovieCount = info.Count;
@ -142,44 +149,49 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
var recentlyAddedModel = new List<EmbyRecentlyAddedModel>();
foreach (var embyEpisodes in filteredEp)
{
// Let's sleep, Emby can't keep up with us.
Thread.Sleep(1000);
try
{
var policy = RetryHandler.RetryAndWaitPolicy((exception, timespan) =>
Log.Error(exception, "Exception thrown when processing an emby episode for the newsletter, Retrying {0}", timespan));
// Find related series item
var relatedSeries = series.FirstOrDefault(x => x.EmbyId == embyEpisodes.ParentId);
if (relatedSeries == null)
policy.Execute(() =>
{
continue;
}
// Find related series item
var relatedSeries = series.FirstOrDefault(x => x.EmbyId == embyEpisodes.ParentId);
// Get series information
var i = Api.GetInformation(relatedSeries.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
if (relatedSeries == null)
{
return;
}
var episodeInfo = Api.GetInformation(embyEpisodes.EmbyId,
Ombi.Api.Models.Emby.EmbyMediaType.Episode,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
// Check if we already have this series
var existingSeries = recentlyAddedModel.FirstOrDefault(x =>
x.EmbyInformation.SeriesInformation.Id.Equals(i.SeriesInformation.Id,
StringComparison.CurrentCultureIgnoreCase));
// Get series information
var i = Api.GetInformation(relatedSeries.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
if (existingSeries != null)
{
existingSeries.EpisodeInformation.Add(episodeInfo.EpisodeInformation);
}
else
{
recentlyAddedModel.Add(new EmbyRecentlyAddedModel
Thread.Sleep(200);
var episodeInfo = Api.GetInformation(embyEpisodes.EmbyId,
Ombi.Api.Models.Emby.EmbyMediaType.Episode,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
// Check if we already have this series
var existingSeries = recentlyAddedModel.FirstOrDefault(x =>
x.EmbyInformation.SeriesInformation.Id.Equals(i.SeriesInformation.Id,
StringComparison.CurrentCultureIgnoreCase));
if (existingSeries != null)
{
EmbyInformation = i,
EpisodeInformation = new List<EmbyEpisodeInformation>() { episodeInfo.EpisodeInformation },
EmbyContent = relatedSeries
});
}
existingSeries.EpisodeInformation.Add(episodeInfo.EpisodeInformation);
}
else
{
recentlyAddedModel.Add(new EmbyRecentlyAddedModel
{
EmbyInformation = i,
EpisodeInformation = new List<EmbyEpisodeInformation>() { episodeInfo.EpisodeInformation },
EmbyContent = relatedSeries
});
}
});
}
catch (JsonReaderException)
@ -195,37 +207,21 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
{
foreach (var t in filteredSeries)
{
var i = Api.GetInformation(t.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
var ep = filteredEp.Where(x => x.ParentId == t.EmbyId).ToList();
var item = new EmbyRecentlyAddedModel
{
EmbyContent = t,
EmbyInformation = i,
};
if (ep.Any() && embySettings.EnableEpisodeSearching)
var policy = RetryHandler.RetryAndWaitPolicy((exception, timespan) =>
Log.Error(exception, "Exception thrown when processing an emby series for the newsletter, Retrying {0}", timespan));
var item = policy.Execute(() =>
{
try
{
var episodeList = new List<EmbyEpisodeInformation>();
foreach (var embyEpisodese in ep)
{
var epInfo = Api.GetInformation(embyEpisodese.EmbyId,
Ombi.Api.Models.Emby.EmbyMediaType.Episode,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
episodeList.Add(epInfo.EpisodeInformation);
Thread.Sleep(600); // Let's not try and overload the server
}
item.EpisodeInformation = episodeList;
}
catch (JsonReaderException)
var i = Api.GetInformation(t.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series,
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
var model = new EmbyRecentlyAddedModel
{
Log.Error(
"Failed getting episode information, we may have overloaded Emby's api... Waiting and we will skip this one and go to the next");
Thread.Sleep(1000);
}
}
EmbyContent = t,
EmbyInformation = i,
};
return model;
});
info.Add(item);
}
}
@ -255,6 +251,14 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
AddedAt = DateTime.UtcNow
});
}
foreach (var s in filteredSeries)
{
RecentlyAddedLog.Insert(new RecentlyAddedLog
{
ProviderId = s.ProviderId,
AddedAt = DateTime.UtcNow
});
}
}

@ -121,6 +121,12 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
var filteredSeries = series.Where(x => recentlyAdded.All(c => c.ProviderId != x.ProviderId)).ToList();
var info = new List<PlexRecentlyAddedModel>();
if (test && !filteredMovies.Any())
{
// if this is a test make sure we show something
filteredMovies = movie.Take(5).ToList();
}
foreach (var m in filteredMovies)
{
var i = Api.GetMetadata(plexSettings.PlexAuthToken, plexSettings.FullUri, m.ItemId);
@ -178,6 +184,11 @@ namespace Ombi.Services.Jobs.RecentlyAddedNewsletter
}
else
{
if (test && !filteredSeries.Any())
{
// if this is a test make sure we show something
filteredSeries = series.Take(5).ToList();
}
foreach (var t in filteredSeries)
{
var i = Api.GetMetadata(plexSettings.PlexAuthToken, plexSettings.FullUri, t.ItemId);

@ -48,6 +48,7 @@
<HintPath>..\packages\NLog.4.3.6\lib\net45\NLog.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Polly, Version=4.3.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Security" />

@ -142,8 +142,8 @@ namespace Ombi.UI
pipelines.AfterRequest.AddItemToEndOfPipeline((ctx) =>
{
ctx.Response.WithHeader("Access-Control-Allow-Origin", "*")
.WithHeader("Access-Control-Allow-Methods", "POST,GET")
.WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type");
.WithHeader("Access-Control-Allow-Methods", "POST,GET")
.WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type");
});
base.RequestStartup(container, pipelines, context);

@ -46,6 +46,7 @@ using Ombi.Core;
using Ombi.Core.Models;
using Ombi.Core.Queue;
using Ombi.Core.SettingModels;
using Ombi.Core.Tv;
using Ombi.Helpers;
using Ombi.Helpers.Analytics;
using Ombi.Helpers.Permissions;
@ -1119,10 +1120,12 @@ namespace Ombi.UI.Modules
RequestedUsers = new List<string> { Username },
Issues = IssueState.None,
ImdbId = showInfo.externals?.imdb ?? string.Empty,
SeasonCount = showInfo.Season.Count,
TvDbId = showId.ToString()
TvDbId = showId.ToString(),
ProviderId = showId
};
var totalSeasons = showInfo.Season.GroupBy(x => x.SeasonNumber);
model.SeasonCount = totalSeasons.Count();
var seasonsList = new List<int>();
switch (seasons)
{
@ -1884,7 +1887,8 @@ namespace Ombi.UI.Modules
{
model.Approved = true;
var s = await sonarrSettings;
var sender = new TvSenderOld(SonarrApi, SickrageApi, Cache); // TODO put back
var sender = new TvSenderV2(SonarrApi, SickrageApi, Cache);
//var sender = new TvSenderOld(SonarrApi, SickrageApi, Cache);
if (s.Enabled)
{
var result = await sender.SendToSonarr(s, model);

@ -486,4 +486,7 @@
<data name="Layout_CacherRunning" xml:space="preserve">
<value>En baggrund proces kører i øjeblikket, så der kan være nogle uventede problemer. Dette bør ikke tage for lang tid.</value>
</data>
<data name="Search_ErrorPlexAccountOnly" xml:space="preserve">
<value>Beklager, men denne funktionalitet er i øjeblikket kun for brugere med Plex konti!</value>
</data>
</root>

@ -121,10 +121,10 @@
<value>Anmelden</value>
</data>
<data name="UserLogin_Paragraph" xml:space="preserve">
<value>Möchten Sie einen Film oder eine Serie schauen, die momentan noch nicht auf {0}ist? Dann loggen Sie sich unten ein und fordern Sie das Material an!</value>
<value>Möchten Sie einen Film oder eine Serie schauen, die momentan noch nicht in {0} verfügbar ist? Dann melden Sie sich an und erstellen eine Anfrage!</value>
</data>
<data name="UserLogin_Paragraph_SpanHover" xml:space="preserve">
<value>Deine Login-Daten werden nur zur Authorisierung deines Plex-Konto verwendet.</value>
<value>Deine Anmeldedaten werden nur zur Authorisierung deines Plex-Konto verwendet.</value>
</data>
<data name="UserLogin_Username" xml:space="preserve">
<value>Benutzername</value>
@ -139,7 +139,7 @@
<value>Anmelden</value>
</data>
<data name="Javascript_SomethingWentWrong" xml:space="preserve">
<value>Irgendetwas ist falsch gelaufen</value>
<value>Irgendetwas ist schief gelaufen</value>
</data>
<data name="Javascript_Success" xml:space="preserve">
<value>Erfolg</value>
@ -169,10 +169,10 @@
<value>Passwort ändern</value>
</data>
<data name="Layout_Logout" xml:space="preserve">
<value>Ausloggen</value>
<value>Abmelden</value>
</data>
<data name="Layout_UpdateAvailablePart1" xml:space="preserve">
<value>Es ist ein neues Update verfügbar! Klicke</value>
<value>Aktualisierung verfügbar! Hier klicken</value>
</data>
<data name="Layout_English" xml:space="preserve">
<value>Englisch</value>
@ -211,7 +211,7 @@
<value>Alben</value>
</data>
<data name="Search_Paragraph" xml:space="preserve">
<value>Möchtest Du etwas schauen, das derzeit nicht auf {0} ist?! Kein Problem! Suche einfach unten danach und frage es an!</value>
<value>Möchtest du etwas schauen, das derzeit nicht in {0} verfügbar ist?! Kein Problem! Suche unten einfach danach und frage es an!</value>
</data>
<data name="Search_Title" xml:space="preserve">
<value>Suche</value>
@ -226,7 +226,7 @@
<value>Momentan im Kino</value>
</data>
<data name="Search_SendNotificationText" xml:space="preserve">
<value>Sende mir eine Benachrichtigung, wenn die Serien oder die Filme, die ich angefordert habe, hinzugefügt wurden.</value>
<value>Sende mir eine Benachrichtigung, wenn eine eigene Anfrage erfüllt wurde..</value>
</data>
<data name="Common_Save" xml:space="preserve">
<value>Speichern</value>
@ -235,10 +235,10 @@
<value>Verfügbar</value>
</data>
<data name="Search_Requested" xml:space="preserve">
<value>angefordert</value>
<value>angefragt</value>
</data>
<data name="Search_Request" xml:space="preserve">
<value>Anfordern</value>
<value>Anfragen</value>
</data>
<data name="Search_AllSeasons" xml:space="preserve">
<value>Alle Staffeln</value>
@ -250,7 +250,7 @@
<value>Neueste Staffel</value>
</data>
<data name="Search_SelectSeason" xml:space="preserve">
<value>Auswählen</value>
<value>Staffel auswählen</value>
</data>
<data name="Search_ReportIssue" xml:space="preserve">
<value>Problem melden</value>
@ -265,7 +265,7 @@
<value>Falscher Inhalt</value>
</data>
<data name="Issues_Playback" xml:space="preserve">
<value>Wiedergabe-Probleme</value>
<value>Wiedergabeprobleme</value>
</data>
<data name="Issues_Other" xml:space="preserve">
<value>Sonstiges</value>
@ -283,7 +283,7 @@
<value>Schliessen</value>
</data>
<data name="Issues_Modal_Title" xml:space="preserve">
<value>Fügen ein Problem hinzu</value>
<value>Füge ein Problem hinzu</value>
</data>
<data name="Issues_Modal_Save" xml:space="preserve">
<value>Änderungen speichern</value>
@ -292,13 +292,13 @@
<value>Staffel</value>
</data>
<data name="Layout_Welcome" xml:space="preserve">
<value>Herzlich willkommen</value>
<value>Willkommen</value>
</data>
<data name="Requests_Title" xml:space="preserve">
<value>Anfragen</value>
</data>
<data name="Requests_Paragraph" xml:space="preserve">
<value>Unten befinden sich alle Anfragen aller Benutzer. Hier ist auch der aktuelle Status des beantragten Titels ersichtlich.</value>
<value>Unten befinden sich alle Anfragen aller Benutzer und der Status zu jeder Anfrage..</value>
</data>
<data name="Requests_MoviesTabTitle" xml:space="preserve">
<value>Filme</value>
@ -370,13 +370,13 @@
<value>Veröffentlichung</value>
</data>
<data name="Requests_SeasonsRequested" xml:space="preserve">
<value>Staffeln angefragt</value>
<value>angefragte Staffeln</value>
</data>
<data name="Requests_RequestedBy" xml:space="preserve">
<value>Beantragt von</value>
<value>Angefragt von</value>
</data>
<data name="Requests_RequestedDate" xml:space="preserve">
<value>Angefragt vor</value>
<value>Angefragt am</value>
</data>
<data name="Requests_ToggleDropdown" xml:space="preserve">
<value>Toggle Dropdown</value>
@ -406,37 +406,37 @@
<value>wurde erfolgreich hinzugefügt!</value>
</data>
<data name="Search_AlreadyRequested" xml:space="preserve">
<value>wurde schon angefragt</value>
<value>wurde bereits angefragt!</value>
</data>
<data name="Search_CouldNotCheckPlex" xml:space="preserve">
<value>Wir konnten nicht prüfen ob {0} bereits auf {1}ist. Bist du sicher dass alles richtig installiert ist?</value>
<value>Wir konnten nicht prüfen ob {0} bereits in {1} verfügbar ist. Bist du sicher, dass alles richtig eingerichtet ist?</value>
</data>
<data name="Search_CouchPotatoError" xml:space="preserve">
<value>Etwas ging etwas schief beim Hinzufügen des Filmes zu CouchPotato! Bitte überprüfe deine Einstellungen.</value>
<value>Etwas ging etwas schief beim hinzufügen des Filmes zu CouchPotato! Bitte überprüfe deine Einstellungen.</value>
</data>
<data name="Search_WeeklyRequestLimitMovie" xml:space="preserve">
<value>Du hast dein wöchentliches Anfragekontingent für neue Filme erreicht. Bitte kontaktiere den Administrator.</value>
<value>Limit für wöchentliche Filmanfragen erreicht. Bitte kontaktiere den Administrator.</value>
</data>
<data name="Search_AlreadyInPlex" xml:space="preserve">
<value>ist bereits auf {0}!</value>
<value>Bereits verfügbar in Plex!</value>
</data>
<data name="Search_SickrageError" xml:space="preserve">
<value>Etwas ging etwas schief beim Hinzufügen des Filmes zu SickRage! Bitte überprüfe deine Einstellungen.</value>
<value>Etwas ging etwas schief beim hinzufügen des Filmes zu SickRage! Bitte überprüfe deine Einstellungen.</value>
</data>
<data name="Search_TvNotSetUp" xml:space="preserve">
<value>Das Anfragen für Serien ist momentan nicht richtig konfiguriert. Bitte kontaktiere den Administrator.</value>
<value>Die Anfrage für Serien ist momentan nicht richtig eingerichtet. Bitte kontaktiere den Administrator.</value>
</data>
<data name="Search_WeeklyRequestLimitAlbums" xml:space="preserve">
<value>Du hast dein wöchentliches Anfragekontingent für neue Alben erreicht. Bitte kontaktiere den Administrator.</value>
<value>Limit für wöchentliche Albumanfragen erreicht. Bitte kontaktiere den Administrator.</value>
</data>
<data name="Search_MusicBrainzError" xml:space="preserve">
<value>Wir konnten den Interpreten auf MusicBrainz leider nicht finden. Bitte versuche es später erneut oder kontaktiere den Administrator.</value>
</data>
<data name="Search_WeeklyRequestLimitTVShow" xml:space="preserve">
<value>Du hast dein wöchentliches Anfragekontingent für neue Serien erreicht. Bitte kontaktiere den Administrator.</value>
<value>Limit für wöchentliche Serienanfragen erreicht. Bitte kontaktiere den Administrator.</value>
</data>
<data name="Search_ErrorNotEnabled" xml:space="preserve">
<value>Entschuldige, aber dein Administrator hat diese Funktion noch nicht freigeschaltet.</value>
<value>Entschuldige, der Administrator hat diese Funktion noch nicht freigeschaltet.</value>
</data>
<data name="Search_NotificationError" xml:space="preserve">
<value>Wir konnten diese Meldung nicht entfernen.</value>
@ -448,42 +448,51 @@
<value>Französisch</value>
</data>
<data name="Search_SelectEpisode" xml:space="preserve">
<value>Wähle Episode</value>
<value>Wählen Sie ihre Episode</value>
</data>
<data name="UserLogin_IncorrectUserPass" xml:space="preserve">
<value>Falscher Benutzername oder Passwort</value>
<value>Falscher Benutzer oder Passwort</value>
</data>
<data name="Requests_ReleaseDate_Unavailable" xml:space="preserve">
<value>Es gibt noch keinen Release-Termin.</value>
<value>Es gibt noch keine Informationen zum Veröffentlichsdatum</value>
</data>
<data name="Search_ViewInPlex" xml:space="preserve">
<value>Zeige in Plex</value>
</data>
<data name="Custom_Donation_Default" xml:space="preserve">
<value>Spende zum Serveradministrator</value>
<value>Spenden an Bibliothek Inhaber</value>
</data>
<data name="Search_Available_on_plex" xml:space="preserve">
<value>Verfügbar auf Plex</value>
<value>Verfügbar in Plex</value>
</data>
<data name="Search_Movie_Status" xml:space="preserve">
<value>Filmstatus</value>
<value>Film Status</value>
</data>
<data name="Search_Not_Requested_Yet" xml:space="preserve">
<value>Noch nicht angefragt</value>
<value>Noch nicht veröffentlicht</value>
</data>
<data name="Search_Pending_approval" xml:space="preserve">
<value>Genehmigung ausstehend</value>
</data>
<data name="Search_Processing_Request" xml:space="preserve">
<value>Anfrage wird bearbeitet.</value>
<value>In Bearbeitung</value>
</data>
<data name="Search_Request_denied" xml:space="preserve">
<value>Anfrage verweigert.</value>
<value>Anfrage abgelehnt.</value>
</data>
<data name="Search_TV_Show_Status" xml:space="preserve">
<value>TV-Show-Status</value>
<value>Serien Status</value>
</data>
<data name="Layout_CacherRunning" xml:space="preserve">
<value>Ein Hintergrundprozess läuft gerade, der zu unerwartetem Verhalten führen könnte. Dies sollte nicht allzu lange dauern.</value>
<value>Aufgrund der Indexierung aller verfügbaren Filme und Serien auf dem Plex Server kann es zu unerwarteten Problemen kommen. Dies sollte nicht zu lange dauern.</value>
</data>
<data name="Search_ErrorPlexAccountOnly" xml:space="preserve">
<value>Entschuldige, diese Funktion ist momentan nur für Plex Benutzer freigeschaltet.</value>
</data>
<data name="Layout_Usermanagement" xml:space="preserve">
<value>Benutzerverwaltung</value>
</data>
<data name="UserLogin_AdminUsePassword" xml:space="preserve">
<value>Benutze die andere Anmeldeseite, wenn du ein Adminstrator bist</value>
</data>
</root>
</root>

@ -499,4 +499,7 @@
<data name="Search_Actors" xml:space="preserve">
<value>Actors</value>
</data>
<data name="Search_ErrorPlexAccountOnly" xml:space="preserve">
<value>Sorry, but this functionality is currently only for users with Plex accounts</value>
</data>
</root>

@ -121,13 +121,13 @@
<value>Logga in</value>
</data>
<data name="UserLogin_Paragraph" xml:space="preserve">
<value>Vill du titta på en film eller TV-show, men det är inte närvarande på {0}? Logga in nedan med användarnamn och lösenord !!</value>
<value>Vill du se en film eller serie som för närvarande inte finns på {0}? Logga in här!</value>
</data>
<data name="UserLogin_Paragraph_SpanHover" xml:space="preserve">
<value>Dina inloggningsuppgifter används endast för att autentisera ditt Plex-konto.</value>
</data>
<data name="UserLogin_Username" xml:space="preserve">
<value>Användarnamn</value>
<value>användarnamn</value>
</data>
<data name="UserLogin_Username_Placeholder" xml:space="preserve">
<value>Användarnamn</value>
@ -151,16 +151,16 @@
<value>Sök</value>
</data>
<data name="Layout_Requests" xml:space="preserve">
<value>Begäran</value>
<value>Önsningar</value>
</data>
<data name="Layout_Issues" xml:space="preserve">
<value>Frågor</value>
<value>Problem</value>
</data>
<data name="Layout_Donate" xml:space="preserve">
<value>Donera</value>
</data>
<data name="Layout_Admin" xml:space="preserve">
<value>admin</value>
<value>Admin</value>
</data>
<data name="Layout_Settings" xml:space="preserve">
<value>Inställningar</value>
@ -172,10 +172,10 @@
<value>Logga ut</value>
</data>
<data name="Layout_UpdateAvailablePart1" xml:space="preserve">
<value>Det finns en ny uppdatering tillgänglig! Klick</value>
<value>Det finns en uppdatering! Klicka</value>
</data>
<data name="Layout_English" xml:space="preserve">
<value>Svenska</value>
<value>Engelska</value>
</data>
<data name="Layout_Spanish" xml:space="preserve">
<value>Spanska</value>
@ -196,25 +196,25 @@
<value>Italienska</value>
</data>
<data name="Layout_UpdateAvailablePart2" xml:space="preserve">
<value>Här</value>
<value>här!</value>
</data>
<data name="Layout_Dutch" xml:space="preserve">
<value>dutch</value>
<value>Nederländska</value>
</data>
<data name="Search_Request" xml:space="preserve">
<value>Fråga</value>
<value>Problem</value>
</data>
<data name="Search_Movies" xml:space="preserve">
<value>Filmer</value>
</data>
<data name="Search_TvShows" xml:space="preserve">
<value>Tv program</value>
<value>Serier</value>
</data>
<data name="Search_Albums" xml:space="preserve">
<value>Album</value>
</data>
<data name="Search_Paragraph" xml:space="preserve">
<value>Vill titta på något som inte är närvarande på {0}?! Inga problem! Bara söka efter den nedan och begär det !</value>
<value>Vill du se en film eller serie som för närvarande inte finns på {0}? Inga problem, önska den nedan!</value>
</data>
<data name="Search_Title" xml:space="preserve">
<value>Sök</value>
@ -226,10 +226,10 @@
<value>Kommer snart</value>
</data>
<data name="Search_InTheaters" xml:space="preserve">
<value>Teater</value>
<value>På bio</value>
</data>
<data name="Search_SendNotificationText" xml:space="preserve">
<value>Skicka mig ett meddelande när objekt jag har begärt har lagts till!</value>
<value>Skicka mig ett meddelande när mina önskade objekt finns tillgängliga</value>
</data>
<data name="Common_Save" xml:space="preserve">
<value>Spara</value>
@ -238,7 +238,7 @@
<value>Tillgänglig</value>
</data>
<data name="Search_Requested" xml:space="preserve">
<value>Begärd</value>
<value>Önskad</value>
</data>
<data name="Search_AllSeasons" xml:space="preserve">
<value>Alla säsonger</value>
@ -250,10 +250,10 @@
<value>Senaste säsongen</value>
</data>
<data name="Search_SelectSeason" xml:space="preserve">
<value>Välj</value>
<value>Välj säsong</value>
</data>
<data name="Search_ReportIssue" xml:space="preserve">
<value>Rapporten fråga</value>
<value>Rapportera problem</value>
</data>
<data name="Issues_WrongAudio" xml:space="preserve">
<value>Fel ljud</value>
@ -271,7 +271,7 @@
<value>Annat</value>
</data>
<data name="Search_TrackCount" xml:space="preserve">
<value>Spår räknas</value>
<value>Antal spår</value>
</data>
<data name="Search_Country" xml:space="preserve">
<value>Land</value>
@ -283,28 +283,28 @@
<value>Stäng</value>
</data>
<data name="Issues_Modal_Title" xml:space="preserve">
<value>Lägg till en fråga</value>
<value>Rapportera problem</value>
</data>
<data name="Issues_Modal_Save" xml:space="preserve">
<value>Spara Ändringar</value>
<value>Spara ändringar</value>
</data>
<data name="Search_Season" xml:space="preserve">
<value>Årstid</value>
<value>Säsong</value>
</data>
<data name="Layout_Welcome" xml:space="preserve">
<value>Välkommen</value>
</data>
<data name="Requests_Title" xml:space="preserve">
<value>Begäran</value>
<value>Önskning</value>
</data>
<data name="Requests_Paragraph" xml:space="preserve">
<value>Nedan kan du se din och alla andra förfrågningar, liksom deras nedladdning och godkännandestatus.</value>
<value>Nedan kan du se alla önskningar och följa deras status.</value>
</data>
<data name="Requests_MoviesTabTitle" xml:space="preserve">
<value>Filmer</value>
</data>
<data name="Requests_TvShowTabTitle" xml:space="preserve">
<value>Tv program</value>
<value>Serier</value>
</data>
<data name="Requests_AlbumsTabTitle" xml:space="preserve">
<value>Album</value>
@ -316,10 +316,10 @@
<value>Godkänn filmer</value>
</data>
<data name="Requests_DeleteTVShows" xml:space="preserve">
<value>Radera TV-program</value>
<value>Radera serier</value>
</data>
<data name="Requests_ApproveTvShows" xml:space="preserve">
<value>Godkänna TV-program</value>
<value>Godkänn serier</value>
</data>
<data name="Requests_DeleteMusic" xml:space="preserve">
<value>Radera musik</value>
@ -334,46 +334,46 @@
<value>Godkänd</value>
</data>
<data name="Requests_Filter_NotApproved" xml:space="preserve">
<value>Ej Godkänd</value>
<value>Ej godkänd</value>
</data>
<data name="Requests_Filter_Available" xml:space="preserve">
<value>Tillgänglig</value>
</data>
<data name="Requests_Filter_NotAvailable" xml:space="preserve">
<value>Inte tillgängligt</value>
<value>Ej tillgänglig</value>
</data>
<data name="Requests_Filter_Released" xml:space="preserve">
<value>Släppte ut</value>
<value>Släppt</value>
</data>
<data name="Requests_Filter_NotReleased" xml:space="preserve">
<value>Inte släppt</value>
<value>Ej släppt</value>
</data>
<data name="Requests_Order" xml:space="preserve">
<value>Beställning</value>
<value>Sortera</value>
</data>
<data name="Requests_Filter" xml:space="preserve">
<value>Filter</value>
</data>
<data name="Requests_Order_LatestRequests" xml:space="preserve">
<value>Senaste förfrågningar</value>
<value>Senaste önskningar</value>
</data>
<data name="Requests_Order_OldestRequests" xml:space="preserve">
<value>Äldsta önskemål</value>
<value>Äldsta önskningar</value>
</data>
<data name="Requests_Order_LatestReleases" xml:space="preserve">
<value>Senaste versionerna</value>
<value>Senaste releaser</value>
</data>
<data name="Requests_Order_OldestReleases" xml:space="preserve">
<value>Äldsta meddelanden</value>
<value>Äldsta releaser</value>
</data>
<data name="Requests_ReleaseDate" xml:space="preserve">
<value>Släpptes</value>
<value>Utgivningsdatum</value>
</data>
<data name="Requests_SeasonsRequested" xml:space="preserve">
<value>Säsonger Requested</value>
<value>Säsonger önskade</value>
</data>
<data name="Requests_RequestedBy" xml:space="preserve">
<value>Begärd av</value>
<value>Önskat av</value>
</data>
<data name="Requests_RequestedDate" xml:space="preserve">
<value>Önskat datum</value>
@ -385,13 +385,13 @@
<value>Godkänn</value>
</data>
<data name="Common_Remove" xml:space="preserve">
<value>ta bort</value>
<value>Radera</value>
</data>
<data name="Requests_MarkUnavailable" xml:space="preserve">
<value>Ej tillgänglig</value>
<value>Markera som ej tillgänglig</value>
</data>
<data name="Requests_MarkAvailable" xml:space="preserve">
<value>Tillgänglig</value>
<value>Markera som tillgänglig</value>
</data>
<data name="Common_Approved" xml:space="preserve">
<value>Godkänd</value>
@ -403,46 +403,46 @@
<value>Problem</value>
</data>
<data name="Search_SuccessfullyAdded" xml:space="preserve">
<value>Pall är tillagd korrekt</value>
<value>lades till</value>
</data>
<data name="Search_AlreadyRequested" xml:space="preserve">
<value>har redan begärts</value>
<value>har redan önskats</value>
</data>
<data name="Search_CouldNotCheckPlex" xml:space="preserve">
<value>Vi kunde inte kontrollera om {0} är i {1}, är du säker det är korrekt installation?</value>
<value>Vi kunde inte kontrollera om {0} finns på {1}. Kontrollera att inställningarna är korrekta.</value>
</data>
<data name="Search_CouchPotatoError" xml:space="preserve">
<value>Något gick fel att lägga till filmen i CouchPotato! Kontrollera inställningarna.</value>
<value>Kunde inte lägga till filmen i CouchPotato. Kontrollera att inställningarna är korrekta.</value>
</data>
<data name="Search_WeeklyRequestLimitMovie" xml:space="preserve">
<value>Du har nått din weekly begäran gräns för filmer! Kontakta din admin.</value>
<value>Du har nått din veckoönskningsgräns för filmer. Kontakta din administratör.</value>
</data>
<data name="Search_AlreadyInPlex" xml:space="preserve">
<value>är redan i {0}</value>
<value>finns redan på {0}.</value>
</data>
<data name="Search_SickrageError" xml:space="preserve">
<value>Något gick fel att lägga till filmen i SickRage! Kontrollera inställningarna.</value>
<value>Kunde inte lägga till filmen i SickRage. Kontrollera att inställningarna är korrekta.</value>
</data>
<data name="Search_TvNotSetUp" xml:space="preserve">
<value>Begäran av TV-program är inte korrekt inställd. Kontakta din admin.</value>
<value>Det går för närvarande inte att önska serier. Kontakta din administratör.</value>
</data>
<data name="Search_WeeklyRequestLimitAlbums" xml:space="preserve">
<value>Du har nått din weekly begäran gräns för album! Kontakta din admin.</value>
<value>Du har nått din veckoönskningsgräns för album. Kontakta din administratör.</value>
</data>
<data name="Search_MusicBrainzError" xml:space="preserve">
<value>Vi kunde inte hitta artisten på MusicBrainz. Försök igen senare eller kontakta din admin</value>
<value>Vi kunde inte hitta artisten på MusicBrainz. Kontakta din administratör.</value>
</data>
<data name="Search_WeeklyRequestLimitTVShow" xml:space="preserve">
<value>Du har nått din weekly begäran gräns för TV-program! Kontakta din admin.</value>
<value>Du har nått din veckoönskningsgräns för serier. Kontakta din administratör.</value>
</data>
<data name="Search_ErrorNotEnabled" xml:space="preserve">
<value>Ledsen, men administratören har ännu inte aktiverat denna funktion.</value>
<value>Denna funktion är inte aktiverad.</value>
</data>
<data name="Search_NotificationError" xml:space="preserve">
<value>Vi kunde inte ta bort denna anmälan eftersom du aldrig haft det</value>
<value>Notisen kunde inte tas bort eftersom den inte varit aktiverad.</value>
</data>
<data name="Common_CouldNotSave" xml:space="preserve">
<value>Kunde inte spara, försök igen</value>
<value>Kunde inte spara, försök igen.</value>
</data>
<data name="Layout_French" xml:space="preserve">
<value>Franska</value>
@ -454,36 +454,45 @@
<value>Felaktig användare eller lösenord</value>
</data>
<data name="Requests_ReleaseDate_Unavailable" xml:space="preserve">
<value>Det finns ingen information tillgänglig för release datum</value>
<value>Ingen information om utgivningsdatum finns.</value>
</data>
<data name="Search_ViewInPlex" xml:space="preserve">
<value>Vy I Plex</value>
<value>Visa på Plex</value>
</data>
<data name="Custom_Donation_Default" xml:space="preserve">
<value>Donera till bibliotek Ansvarig</value>
<value>Donera till biblioteksansvarig</value>
</data>
<data name="Search_Available_on_plex" xml:space="preserve">
<value>Tillgänglig den</value>
<value>Tillgänglig </value>
</data>
<data name="Search_Movie_Status" xml:space="preserve">
<value>Film status</value>
<value>Filmstatus</value>
</data>
<data name="Search_Not_Requested_Yet" xml:space="preserve">
<value>Inte Begärd ännu</value>
<value>Ej önskad ännu</value>
</data>
<data name="Search_Pending_approval" xml:space="preserve">
<value>Väntar på godkännande</value>
</data>
<data name="Search_Processing_Request" xml:space="preserve">
<value>Bearbetning förfrågan</value>
<value>Behandlar önskning</value>
</data>
<data name="Search_Request_denied" xml:space="preserve">
<value>Förfrågan nekad</value>
<value>Önskning nekad</value>
</data>
<data name="Search_TV_Show_Status" xml:space="preserve">
<value>Visa status</value>
<value>Seriestatus</value>
</data>
<data name="Layout_CacherRunning" xml:space="preserve">
<value>En bakgrundsprocess är igång, så det kan finnas några oväntade beteende. Detta bör inte ta alltför lång tid.</value>
<value>För närvarande körs bakgrundsindexeringar av innehåller på Plex. Detta kan medföra vissa störningar, men funktionaliteten bör vara återställd inom kort!</value>
</data>
<data name="Search_ErrorPlexAccountOnly" xml:space="preserve">
<value>Denna funktion är tyvärr endast tillgänglig för Plex-användare.</value>
</data>
<data name="Layout_Usermanagement" xml:space="preserve">
<value>Användarhantering</value>
</data>
<data name="UserLogin_AdminUsePassword" xml:space="preserve">
<value>Om du är administratör, vänligen använd den andra inloggningssidan.</value>
</data>
</root>

@ -825,6 +825,15 @@ namespace Ombi.UI.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Sorry, but this functionality is currently only for users with Plex accounts.
/// </summary>
public static string Search_ErrorPlexAccountOnly {
get {
return ResourceManager.GetString("Search_ErrorPlexAccountOnly", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to First Season.
/// </summary>

@ -1,11 +1,11 @@
version: 2.1.{build}
version: 2.2.{build}
configuration: Release
assembly_info:
patch: true
file: '**\AssemblyInfo.*'
assembly_version: '2.1.0'
assembly_version: '2.2.0'
assembly_file_version: '{version}'
assembly_informational_version: '2.1.0'
assembly_informational_version: '2.2.0'
before_build:
- cmd: appveyor-retry nuget restore
build:

Loading…
Cancel
Save