mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-14 02:26:55 -07:00
commit
8afce7ba91
19 changed files with 607 additions and 198 deletions
|
@ -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?
|
302
Ombi.Core/Tv/TvSenderV2.cs
Normal file
302
Ombi.Core/Tv/TvSenderV2.cs
Normal file
|
@ -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);
|
||||
|
||||
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)
|
||||
{
|
||||
existingSeries.EpisodeInformation.Add(episodeInfo.EpisodeInformation);
|
||||
}
|
||||
else
|
||||
{
|
||||
recentlyAddedModel.Add(new EmbyRecentlyAddedModel
|
||||
if (relatedSeries == null)
|
||||
{
|
||||
EmbyInformation = i,
|
||||
EpisodeInformation = new List<EmbyEpisodeInformation>() { episodeInfo.EpisodeInformation },
|
||||
EmbyContent = relatedSeries
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Get series information
|
||||
var i = Api.GetInformation(relatedSeries.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series,
|
||||
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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(() =>
|
||||
{
|
||||
var i = Api.GetInformation(t.EmbyId, Ombi.Api.Models.Emby.EmbyMediaType.Series,
|
||||
embySettings.ApiKey, embySettings.AdministratorId, embySettings.FullUri);
|
||||
var model = new EmbyRecentlyAddedModel
|
||||
{
|
||||
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>
|
||||
</root>
|
||||
<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>
|
|
@ -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 på</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>
|
9
Ombi.UI/Resources/UI1.Designer.cs
generated
9
Ombi.UI/Resources/UI1.Designer.cs
generated
|
@ -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…
Add table
Add a link
Reference in a new issue