mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-15 01:32:55 -07:00
Merge branch 'dev' into master
This commit is contained in:
commit
f817953ba3
209 changed files with 7250 additions and 993 deletions
|
@ -50,9 +50,11 @@ using Ombi.Helpers;
|
|||
using Ombi.Helpers.Analytics;
|
||||
using Ombi.Helpers.Permissions;
|
||||
using Ombi.Services.Interfaces;
|
||||
using Ombi.Services.Jobs;
|
||||
using Ombi.Services.Notification;
|
||||
using Ombi.Store;
|
||||
using Ombi.Store.Models;
|
||||
using Ombi.Store.Models.Emby;
|
||||
using Ombi.Store.Models.Plex;
|
||||
using Ombi.Store.Repository;
|
||||
using Ombi.UI.Helpers;
|
||||
|
@ -67,8 +69,8 @@ namespace Ombi.UI.Modules
|
|||
{
|
||||
public class SearchModule : BaseAuthModule
|
||||
{
|
||||
public SearchModule(ICacheProvider cache,
|
||||
ISettingsService<PlexRequestSettings> prSettings, IAvailabilityChecker checker,
|
||||
public SearchModule(ICacheProvider cache,
|
||||
ISettingsService<PlexRequestSettings> prSettings, IAvailabilityChecker plexChecker,
|
||||
IRequestService request, ISonarrApi sonarrApi, ISettingsService<SonarrSettings> sonarrSettings,
|
||||
ISettingsService<SickRageSettings> sickRageService, ISickRageApi srApi,
|
||||
INotificationService notify, IMusicBrainzApi mbApi, IHeadphonesApi hpApi,
|
||||
|
@ -77,7 +79,8 @@ namespace Ombi.UI.Modules
|
|||
ISettingsService<PlexSettings> plexService, ISettingsService<AuthenticationSettings> auth,
|
||||
IRepository<UsersToNotify> u, ISettingsService<EmailNotificationSettings> email,
|
||||
IIssueService issue, IAnalytics a, IRepository<RequestLimit> rl, ITransientFaultQueue tfQueue, IRepository<PlexContent> content,
|
||||
ISecurityExtensions security, IMovieSender movieSender, IRadarrCacher radarrCacher, ITraktApi traktApi, ISettingsService<CustomizationSettings> cus)
|
||||
ISecurityExtensions security, IMovieSender movieSender, IRadarrCacher radarrCacher, ITraktApi traktApi, ISettingsService<CustomizationSettings> cus,
|
||||
IEmbyAvailabilityChecker embyChecker, IRepository<EmbyContent> embyContent, ISettingsService<EmbySettings> embySettings)
|
||||
: base("search", prSettings, security)
|
||||
{
|
||||
Auth = auth;
|
||||
|
@ -86,7 +89,7 @@ namespace Ombi.UI.Modules
|
|||
PrService = prSettings;
|
||||
MovieApi = new TheMovieDbApi();
|
||||
Cache = cache;
|
||||
Checker = checker;
|
||||
PlexChecker = plexChecker;
|
||||
CpCacher = cpCacher;
|
||||
SonarrCacher = sonarrCacher;
|
||||
SickRageCacher = sickRageCacher;
|
||||
|
@ -112,6 +115,9 @@ namespace Ombi.UI.Modules
|
|||
RadarrCacher = radarrCacher;
|
||||
TraktApi = traktApi;
|
||||
CustomizationSettings = cus;
|
||||
EmbyChecker = embyChecker;
|
||||
EmbyContentRepository = embyContent;
|
||||
EmbySettings = embySettings;
|
||||
|
||||
Get["SearchIndex", "/", true] = async (x, ct) => await RequestLoad();
|
||||
|
||||
|
@ -137,7 +143,7 @@ namespace Ombi.UI.Modules
|
|||
async (x, ct) => await RequestTvShow((int)Request.Form.tvId, (string)Request.Form.seasons);
|
||||
Post["request/tvEpisodes", true] = async (x, ct) => await RequestTvShow(0, "episode");
|
||||
Post["request/album", true] = async (x, ct) => await RequestAlbum((string)Request.Form.albumId);
|
||||
|
||||
|
||||
Get["/seasons"] = x => GetSeasons();
|
||||
Get["/episodes", true] = async (x, ct) => await GetEpisodes();
|
||||
}
|
||||
|
@ -145,6 +151,7 @@ namespace Ombi.UI.Modules
|
|||
private IWatcherCacher WatcherCacher { get; }
|
||||
private IMovieSender MovieSender { get; }
|
||||
private IRepository<PlexContent> PlexContentRepository { get; }
|
||||
private IRepository<EmbyContent> EmbyContentRepository { get; }
|
||||
private TvMazeApi TvApi { get; }
|
||||
private IPlexApi PlexApi { get; }
|
||||
private TheMovieDbApi MovieApi { get; }
|
||||
|
@ -154,13 +161,15 @@ namespace Ombi.UI.Modules
|
|||
private IRequestService RequestService { get; }
|
||||
private ICacheProvider Cache { get; }
|
||||
private ISettingsService<AuthenticationSettings> Auth { get; }
|
||||
private ISettingsService<EmbySettings> EmbySettings { get; }
|
||||
private ISettingsService<PlexSettings> PlexService { get; }
|
||||
private ISettingsService<PlexRequestSettings> PrService { get; }
|
||||
private ISettingsService<SonarrSettings> SonarrService { get; }
|
||||
private ISettingsService<SickRageSettings> SickRageService { get; }
|
||||
private ISettingsService<HeadphonesSettings> HeadphonesService { get; }
|
||||
private ISettingsService<EmailNotificationSettings> EmailNotificationSettings { get; }
|
||||
private IAvailabilityChecker Checker { get; }
|
||||
private IAvailabilityChecker PlexChecker { get; }
|
||||
private IEmbyAvailabilityChecker EmbyChecker { get; }
|
||||
private ICouchPotatoCacher CpCacher { get; }
|
||||
private ISonarrCacher SonarrCacher { get; }
|
||||
private ISickRageCacher SickRageCacher { get; }
|
||||
|
@ -182,10 +191,14 @@ namespace Ombi.UI.Modules
|
|||
|
||||
var settings = await PrService.GetSettingsAsync();
|
||||
var custom = await CustomizationSettings.GetSettingsAsync();
|
||||
var emby = await EmbySettings.GetSettingsAsync();
|
||||
var plex = await PlexService.GetSettingsAsync();
|
||||
var searchViewModel = new SearchLoadViewModel
|
||||
{
|
||||
Settings = settings,
|
||||
CustomizationSettings = custom
|
||||
CustomizationSettings = custom,
|
||||
Emby = emby.Enable,
|
||||
Plex = plex.Enable
|
||||
};
|
||||
|
||||
|
||||
|
@ -362,7 +375,6 @@ namespace Ombi.UI.Modules
|
|||
VoteCount = movie.VoteCount
|
||||
};
|
||||
|
||||
var imdbId = string.Empty;
|
||||
if (counter <= 5) // Let's only do it for the first 5 items
|
||||
{
|
||||
var movieInfo = MovieApi.GetMovieInformationWithVideos(movie.Id);
|
||||
|
@ -382,12 +394,35 @@ namespace Ombi.UI.Modules
|
|||
counter++;
|
||||
}
|
||||
|
||||
var canSee = CanUserSeeThisRequest(viewMovie.Id, Security.HasPermissions(User, Permissions.UsersCanViewOnlyOwnRequests), await requestedMovies());
|
||||
var plexMovie = Checker.GetMovie(plexMovies(), movie.Title, movie.ReleaseDate?.Year.ToString(), imdbId);
|
||||
if (plexMovie != null)
|
||||
var canSee = CanUserSeeThisRequest(viewMovie.Id, Security.HasPermissions(User, Permissions.UsersCanViewOnlyOwnRequests), dbMovies);
|
||||
|
||||
var plexSettings = await PlexService.GetSettingsAsync();
|
||||
var embySettings = await EmbySettings.GetSettingsAsync();
|
||||
if (plexSettings.Enable)
|
||||
{
|
||||
viewMovie.Available = true;
|
||||
viewMovie.PlexUrl = plexMovie.Url;
|
||||
var content = PlexContentRepository.GetAll();
|
||||
var plexMovies = PlexChecker.GetPlexMovies(content);
|
||||
|
||||
var plexMovie = PlexChecker.GetMovie(plexMovies.ToArray(), movie.Title,
|
||||
movie.ReleaseDate?.Year.ToString(),
|
||||
viewMovie.ImdbId);
|
||||
if (plexMovie != null)
|
||||
{
|
||||
viewMovie.Available = true;
|
||||
viewMovie.PlexUrl = plexMovie.Url;
|
||||
}
|
||||
}
|
||||
if (embySettings.Enable)
|
||||
{
|
||||
var embyContent = EmbyContentRepository.GetAll();
|
||||
var embyMovies = EmbyChecker.GetEmbyMovies(embyContent);
|
||||
|
||||
var embyMovie = EmbyChecker.GetMovie(embyMovies.ToArray(), movie.Title,
|
||||
movie.ReleaseDate?.Year.ToString(), viewMovie.ImdbId);
|
||||
if (embyMovie != null)
|
||||
{
|
||||
viewMovie.Available = true;
|
||||
}
|
||||
}
|
||||
else if (dbMovies.ContainsKey(movie.Id) && canSee) // compare to the requests db
|
||||
{
|
||||
|
@ -443,11 +478,11 @@ namespace Ombi.UI.Modules
|
|||
case ShowSearchType.Popular:
|
||||
Analytics.TrackEventAsync(Category.Search, Action.TvShow, "Popular", Username, CookieHelper.GetAnalyticClientId(Cookies));
|
||||
var popularShows = await TraktApi.GetPopularShows();
|
||||
|
||||
|
||||
foreach (var popularShow in popularShows)
|
||||
{
|
||||
var theTvDbId = int.Parse(popularShow.Ids.Tvdb.ToString());
|
||||
|
||||
|
||||
var model = new SearchTvShowViewModel
|
||||
{
|
||||
FirstAired = popularShow.FirstAired?.ToString("yyyy-MM-ddTHH:mm:ss"),
|
||||
|
@ -476,6 +511,11 @@ namespace Ombi.UI.Modules
|
|||
{
|
||||
var show = anticipatedShow.Show;
|
||||
var theTvDbId = int.Parse(show.Ids.Tvdb.ToString());
|
||||
var result = TvApi.ShowLookupByTheTvDbId(theTvDbId);
|
||||
if (result == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var model = new SearchTvShowViewModel
|
||||
{
|
||||
|
@ -505,6 +545,12 @@ namespace Ombi.UI.Modules
|
|||
{
|
||||
var show = watched.Show;
|
||||
var theTvDbId = int.Parse(show.Ids.Tvdb.ToString());
|
||||
var result = TvApi.ShowLookupByTheTvDbId(theTvDbId);
|
||||
if (result == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var model = new SearchTvShowViewModel
|
||||
{
|
||||
FirstAired = show.FirstAired?.ToString("yyyy-MM-ddTHH:mm:ss"),
|
||||
|
@ -533,6 +579,12 @@ namespace Ombi.UI.Modules
|
|||
{
|
||||
var show = watched.Show;
|
||||
var theTvDbId = int.Parse(show.Ids.Tvdb.ToString());
|
||||
var result = TvApi.ShowLookupByTheTvDbId(theTvDbId);
|
||||
if (result == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var model = new SearchTvShowViewModel
|
||||
{
|
||||
FirstAired = show.FirstAired?.ToString("yyyy-MM-ddTHH:mm:ss"),
|
||||
|
@ -564,51 +616,55 @@ namespace Ombi.UI.Modules
|
|||
|
||||
private async Task<List<SearchTvShowViewModel>> MapToTvModel(List<SearchTvShowViewModel> shows, PlexRequestSettings prSettings)
|
||||
{
|
||||
|
||||
var plexSettings = await PlexService.GetSettingsAsync();
|
||||
var embySettings = await EmbySettings.GetSettingsAsync();
|
||||
|
||||
var providerId = string.Empty;
|
||||
// Get the requests
|
||||
var allResults = await RequestService.GetAllAsync();
|
||||
allResults = allResults.Where(x => x.Type == RequestType.TvShow);
|
||||
var distinctResults = allResults.DistinctBy(x => x.ProviderId);
|
||||
var dbTv = distinctResults.ToDictionary(x => x.ProviderId);
|
||||
|
||||
// Check the external applications
|
||||
var sonarrCached = SonarrCacher.QueuedIds().ToList();
|
||||
var sickRageCache = SickRageCacher.QueuedIds(); // consider just merging sonarr/sickrage arrays
|
||||
var dbTv = distinctResults.ToDictionary(x => x.ImdbId);
|
||||
|
||||
var content = PlexContentRepository.GetAll();
|
||||
var plexTvShows = Checker.GetPlexTvShows(content).ToList();
|
||||
var plexTvShows = PlexChecker.GetPlexTvShows(content);
|
||||
var embyContent = EmbyContentRepository.GetAll();
|
||||
var embyCached = EmbyChecker.GetEmbyTvShows(embyContent).ToList();
|
||||
|
||||
foreach (var show in shows)
|
||||
{
|
||||
if (plexSettings.AdvancedSearch)
|
||||
|
||||
var providerId = show.Id.ToString();
|
||||
|
||||
if (embySettings.Enable)
|
||||
{
|
||||
providerId = show.Id.ToString();
|
||||
var embyShow = EmbyChecker.GetTvShow(embyCached.ToArray(), show.SeriesName, show.FirstAired?.Substring(0, 4), providerId);
|
||||
if (embyShow != null)
|
||||
{
|
||||
show.Available = true;
|
||||
}
|
||||
}
|
||||
if (plexSettings.Enable)
|
||||
{
|
||||
var plexShow = PlexChecker.GetTvShow(plexTvShows.ToArray(), show.SeriesName, show.FirstAired?.Substring(0, 4),
|
||||
providerId);
|
||||
if (plexShow != null)
|
||||
{
|
||||
show.Available = true;
|
||||
show.PlexUrl = plexShow.Url;
|
||||
}
|
||||
}
|
||||
|
||||
var plexShow = Checker.GetTvShow(plexTvShows.ToArray(), show.SeriesName, show.FirstAired?.Substring(0, 4),
|
||||
providerId);
|
||||
if (plexShow != null)
|
||||
if (show.ImdbId != null && !show.Available)
|
||||
{
|
||||
show.Available = true;
|
||||
show.PlexUrl = plexShow.Url;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dbTv.ContainsKey(show.Id))
|
||||
var imdbId = show.ImdbId;
|
||||
if (dbTv.ContainsKey(imdbId))
|
||||
{
|
||||
var dbt = dbTv[show.Id];
|
||||
var dbt = dbTv[imdbId];
|
||||
|
||||
show.Requested = true;
|
||||
show.Episodes = dbt.Episodes.ToList();
|
||||
show.Approved = dbt.Approved;
|
||||
}
|
||||
if (sonarrCached.Select(x => x.TvdbId).Contains(show.Id) || sickRageCache.Contains(show.Id))
|
||||
// compare to the sonarr/sickrage db
|
||||
{
|
||||
show.Requested = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return shows;
|
||||
|
@ -620,6 +676,7 @@ namespace Ombi.UI.Modules
|
|||
Analytics.TrackEventAsync(Category.Search, Action.TvShow, searchTerm, Username,
|
||||
CookieHelper.GetAnalyticClientId(Cookies));
|
||||
var plexSettings = await PlexService.GetSettingsAsync();
|
||||
var embySettings = await EmbySettings.GetSettingsAsync();
|
||||
var prSettings = await PrService.GetSettingsAsync();
|
||||
var providerId = string.Empty;
|
||||
|
||||
|
@ -642,7 +699,9 @@ namespace Ombi.UI.Modules
|
|||
var sonarrCached = SonarrCacher.QueuedIds();
|
||||
var sickRageCache = SickRageCacher.QueuedIds(); // consider just merging sonarr/sickrage arrays
|
||||
var content = PlexContentRepository.GetAll();
|
||||
var plexTvShows = Checker.GetPlexTvShows(content);
|
||||
var plexTvShows = PlexChecker.GetPlexTvShows(content);
|
||||
var embyContent = EmbyContentRepository.GetAll();
|
||||
var embyCached = EmbyChecker.GetEmbyTvShows(embyContent);
|
||||
|
||||
var viewTv = new List<SearchTvShowViewModel>();
|
||||
foreach (var t in apiTv)
|
||||
|
@ -676,20 +735,28 @@ namespace Ombi.UI.Modules
|
|||
EnableTvRequestsForOnlySeries = (prSettings.DisableTvRequestsByEpisode && prSettings.DisableTvRequestsBySeason)
|
||||
};
|
||||
|
||||
providerId = viewT.Id.ToString();
|
||||
|
||||
if (plexSettings.AdvancedSearch)
|
||||
if (embySettings.Enable)
|
||||
{
|
||||
providerId = viewT.Id.ToString();
|
||||
var embyShow = EmbyChecker.GetTvShow(embyCached.ToArray(), t.show.name, t.show.premiered?.Substring(0, 4), providerId);
|
||||
if (embyShow != null)
|
||||
{
|
||||
viewT.Available = true;
|
||||
}
|
||||
}
|
||||
|
||||
var plexShow = Checker.GetTvShow(plexTvShows.ToArray(), t.show.name, t.show.premiered?.Substring(0, 4),
|
||||
if (plexSettings.Enable)
|
||||
{
|
||||
var plexShow = PlexChecker.GetTvShow(plexTvShows.ToArray(), t.show.name, t.show.premiered?.Substring(0, 4),
|
||||
providerId);
|
||||
if (plexShow != null)
|
||||
{
|
||||
viewT.Available = true;
|
||||
viewT.PlexUrl = plexShow.Url;
|
||||
if (plexShow != null)
|
||||
{
|
||||
viewT.Available = true;
|
||||
viewT.PlexUrl = plexShow.Url;
|
||||
}
|
||||
}
|
||||
else if (t.show?.externals?.thetvdb != null)
|
||||
|
||||
if (t.show?.externals?.thetvdb != null && !viewT.Available)
|
||||
{
|
||||
var tvdbid = (int)t.show.externals.thetvdb;
|
||||
if (dbTv.ContainsKey(tvdbid))
|
||||
|
@ -729,7 +796,7 @@ namespace Ombi.UI.Modules
|
|||
var dbAlbum = allResults.ToDictionary(x => x.MusicBrainzId);
|
||||
|
||||
var content = PlexContentRepository.GetAll();
|
||||
var plexAlbums = Checker.GetPlexAlbums(content);
|
||||
var plexAlbums = PlexChecker.GetPlexAlbums(content);
|
||||
|
||||
var viewAlbum = new List<SearchMusicViewModel>();
|
||||
foreach (var a in apiAlbums)
|
||||
|
@ -749,7 +816,7 @@ namespace Ombi.UI.Modules
|
|||
DateTime release;
|
||||
DateTimeHelper.CustomParse(a.ReleaseEvents?.FirstOrDefault()?.date, out release);
|
||||
var artist = a.ArtistCredit?.FirstOrDefault()?.artist;
|
||||
var plexAlbum = Checker.GetAlbum(plexAlbums.ToArray(), a.title, release.ToString("yyyy"), artist?.name);
|
||||
var plexAlbum = PlexChecker.GetAlbum(plexAlbums.ToArray(), a.title, release.ToString("yyyy"), artist?.name);
|
||||
if (plexAlbum != null)
|
||||
{
|
||||
viewA.Available = true;
|
||||
|
@ -790,7 +857,7 @@ namespace Ombi.UI.Modules
|
|||
Message = "You have reached your weekly request limit for Movies! Please contact your admin."
|
||||
});
|
||||
}
|
||||
|
||||
var embySettings = await EmbySettings.GetSettingsAsync();
|
||||
Analytics.TrackEventAsync(Category.Search, Action.Request, "Movie", Username,
|
||||
CookieHelper.GetAnalyticClientId(Cookies));
|
||||
var movieInfo = await MovieApi.GetMovieInformation(movieId);
|
||||
|
@ -831,8 +898,8 @@ namespace Ombi.UI.Modules
|
|||
{
|
||||
|
||||
var content = PlexContentRepository.GetAll();
|
||||
var movies = Checker.GetPlexMovies(content);
|
||||
if (Checker.IsMovieAvailable(movies.ToArray(), movieInfo.Title, movieInfo.ReleaseDate?.Year.ToString()))
|
||||
var movies = PlexChecker.GetPlexMovies(content);
|
||||
if (PlexChecker.IsMovieAvailable(movies.ToArray(), movieInfo.Title, movieInfo.ReleaseDate?.Year.ToString()))
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
|
@ -849,7 +916,7 @@ namespace Ombi.UI.Modules
|
|||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message = string.Format(Resources.UI.Search_CouldNotCheckPlex, fullMovieName)
|
||||
Message = string.Format(Resources.UI.Search_CouldNotCheckPlex, fullMovieName,GetMediaServerName())
|
||||
});
|
||||
}
|
||||
//#endif
|
||||
|
@ -894,7 +961,7 @@ namespace Ombi.UI.Modules
|
|||
}
|
||||
if (!result.MovieSendingEnabled)
|
||||
{
|
||||
|
||||
|
||||
return await AddRequest(model, settings, $"{fullMovieName} {Resources.UI.Search_SuccessfullyAdded}");
|
||||
}
|
||||
|
||||
|
@ -989,7 +1056,7 @@ namespace Ombi.UI.Modules
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
var embySettings = await EmbySettings.GetSettingsAsync();
|
||||
var showInfo = TvApi.ShowLookupByTheTvDbId(showId);
|
||||
DateTime firstAir;
|
||||
DateTime.TryParse(showInfo.premiered, out firstAir);
|
||||
|
@ -1096,7 +1163,7 @@ namespace Ombi.UI.Modules
|
|||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message = $"{fullShowName} {Resources.UI.Search_AlreadyInPlex}"
|
||||
Message = $"{fullShowName} {string.Format(Resources.UI.Search_AlreadyInPlex,embySettings.Enable ? "Emby" : "Plex")}"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1114,66 +1181,134 @@ namespace Ombi.UI.Modules
|
|||
try
|
||||
{
|
||||
|
||||
var content = PlexContentRepository.GetAll();
|
||||
var shows = Checker.GetPlexTvShows(content);
|
||||
var providerId = string.Empty;
|
||||
var plexSettings = await PlexService.GetSettingsAsync();
|
||||
if (plexSettings.AdvancedSearch)
|
||||
if (plexSettings.Enable)
|
||||
{
|
||||
providerId = showId.ToString();
|
||||
}
|
||||
if (episodeRequest)
|
||||
{
|
||||
var cachedEpisodesTask = await Checker.GetEpisodes();
|
||||
var cachedEpisodes = cachedEpisodesTask.ToList();
|
||||
foreach (var d in difference) // difference is from an existing request
|
||||
{
|
||||
if (
|
||||
cachedEpisodes.Any(
|
||||
x =>
|
||||
x.SeasonNumber == d.SeasonNumber && x.EpisodeNumber == d.EpisodeNumber &&
|
||||
x.ProviderId == providerId))
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message =
|
||||
$"{fullShowName} {d.SeasonNumber} - {d.EpisodeNumber} {Resources.UI.Search_AlreadyInPlex}"
|
||||
});
|
||||
}
|
||||
}
|
||||
var content = PlexContentRepository.GetAll();
|
||||
var shows = PlexChecker.GetPlexTvShows(content);
|
||||
|
||||
var diff = await GetEpisodeRequestDifference(showId, model);
|
||||
model.Episodes = diff.ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (plexSettings.EnableTvEpisodeSearching)
|
||||
var providerId = string.Empty;
|
||||
if (plexSettings.AdvancedSearch)
|
||||
{
|
||||
foreach (var s in showInfo.Season)
|
||||
providerId = showId.ToString();
|
||||
}
|
||||
if (episodeRequest)
|
||||
{
|
||||
var cachedEpisodesTask = await PlexChecker.GetEpisodes();
|
||||
var cachedEpisodes = cachedEpisodesTask.ToList();
|
||||
foreach (var d in difference) // difference is from an existing request
|
||||
{
|
||||
var result = Checker.IsEpisodeAvailable(showId.ToString(), s.SeasonNumber, s.EpisodeNumber);
|
||||
if (result)
|
||||
if (
|
||||
cachedEpisodes.Any(
|
||||
x =>
|
||||
x.SeasonNumber == d.SeasonNumber && x.EpisodeNumber == d.EpisodeNumber &&
|
||||
x.ProviderId == providerId))
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message = $"{fullShowName} {Resources.UI.Search_AlreadyInPlex}"
|
||||
Message =
|
||||
$"{fullShowName} {d.SeasonNumber} - {d.EpisodeNumber} {string.Format(Resources.UI.Search_AlreadyInPlex,GetMediaServerName())}"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var diff = await GetEpisodeRequestDifference(showId, model);
|
||||
model.Episodes = diff.ToList();
|
||||
}
|
||||
else if (Checker.IsTvShowAvailable(shows.ToArray(), showInfo.name, showInfo.premiered?.Substring(0, 4),
|
||||
providerId, model.SeasonList))
|
||||
else
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
if (plexSettings.EnableTvEpisodeSearching)
|
||||
{
|
||||
foreach (var s in showInfo.Season)
|
||||
{
|
||||
Result = false,
|
||||
Message = $"{fullShowName} {Resources.UI.Search_AlreadyInPlex}"
|
||||
});
|
||||
var result = PlexChecker.IsEpisodeAvailable(showId.ToString(), s.SeasonNumber,
|
||||
s.EpisodeNumber);
|
||||
if (result)
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message = $"{fullShowName} {string.Format(Resources.UI.Search_AlreadyInPlex,GetMediaServerName())}"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (PlexChecker.IsTvShowAvailable(shows.ToArray(), showInfo.name,
|
||||
showInfo.premiered?.Substring(0, 4),
|
||||
providerId, model.SeasonList))
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message = $"{fullShowName} {string.Format(Resources.UI.Search_AlreadyInPlex,GetMediaServerName())}"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
if (embySettings.Enable)
|
||||
{
|
||||
var embyContent = EmbyContentRepository.GetAll();
|
||||
var embyMovies = EmbyChecker.GetEmbyTvShows(embyContent);
|
||||
var providerId = showId.ToString();
|
||||
if (episodeRequest)
|
||||
{
|
||||
var cachedEpisodesTask = await EmbyChecker.GetEpisodes();
|
||||
var cachedEpisodes = cachedEpisodesTask.ToList();
|
||||
foreach (var d in difference) // difference is from an existing request
|
||||
{
|
||||
if (
|
||||
cachedEpisodes.Any(
|
||||
x =>
|
||||
x.SeasonNumber == d.SeasonNumber && x.EpisodeNumber == d.EpisodeNumber &&
|
||||
x.ProviderId == providerId))
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message =
|
||||
$"{fullShowName} {d.SeasonNumber} - {d.EpisodeNumber} {string.Format(Resources.UI.Search_AlreadyInPlex,GetMediaServerName())}"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var diff = await GetEpisodeRequestDifference(showId, model);
|
||||
model.Episodes = diff.ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (embySettings.EnableEpisodeSearching)
|
||||
{
|
||||
foreach (var s in showInfo.Season)
|
||||
{
|
||||
var result = EmbyChecker.IsEpisodeAvailable(showId.ToString(), s.SeasonNumber,
|
||||
s.EpisodeNumber);
|
||||
if (result)
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message = $"{fullShowName} is already in Emby!"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (EmbyChecker.IsTvShowAvailable(embyMovies.ToArray(), showInfo.name,
|
||||
showInfo.premiered?.Substring(0, 4),
|
||||
providerId, model.SeasonList))
|
||||
{
|
||||
return
|
||||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message = $"{fullShowName} is already in Emby!"
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1183,7 +1318,7 @@ namespace Ombi.UI.Modules
|
|||
Response.AsJson(new JsonResponseModel
|
||||
{
|
||||
Result = false,
|
||||
Message = string.Format(Resources.UI.Search_CouldNotCheckPlex, fullShowName)
|
||||
Message = string.Format(Resources.UI.Search_CouldNotCheckPlex, fullShowName,GetMediaServerName())
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1332,8 +1467,8 @@ namespace Ombi.UI.Modules
|
|||
|
||||
|
||||
var content = PlexContentRepository.GetAll();
|
||||
var albums = Checker.GetPlexAlbums(content);
|
||||
var alreadyInPlex = Checker.IsAlbumAvailable(albums.ToArray(), albumInfo.title, release.ToString("yyyy"),
|
||||
var albums = PlexChecker.GetPlexAlbums(content);
|
||||
var alreadyInPlex = PlexChecker.IsAlbumAvailable(albums.ToArray(), albumInfo.title, release.ToString("yyyy"),
|
||||
artist.name);
|
||||
|
||||
if (alreadyInPlex)
|
||||
|
@ -1419,7 +1554,7 @@ namespace Ombi.UI.Modules
|
|||
|
||||
return img;
|
||||
}
|
||||
|
||||
|
||||
private Response GetSeasons()
|
||||
{
|
||||
var seriesId = (int)Request.Query.tvId;
|
||||
|
@ -1461,7 +1596,8 @@ namespace Ombi.UI.Modules
|
|||
|
||||
var existingRequest = requests.FirstOrDefault(x => x.Type == RequestType.TvShow && x.TvDbId == providerId.ToString());
|
||||
var show = await Task.Run(() => TvApi.ShowLookupByTheTvDbId(providerId));
|
||||
var tvMaxeEpisodes = await Task.Run(() => TvApi.EpisodeLookup(show.id));
|
||||
var tvMazeEpisodesTask = await Task.Run(() => TvApi.EpisodeLookup(show.id));
|
||||
var tvMazeEpisodes = tvMazeEpisodesTask.ToList();
|
||||
|
||||
var sonarrEpisodes = new List<SonarrEpisodes>();
|
||||
if (sonarrEnabled)
|
||||
|
@ -1471,26 +1607,59 @@ namespace Ombi.UI.Modules
|
|||
sonarrEpisodes = sonarrEp?.ToList() ?? new List<SonarrEpisodes>();
|
||||
}
|
||||
|
||||
var plexCacheTask = await Checker.GetEpisodes(providerId);
|
||||
var plexCache = plexCacheTask.ToList();
|
||||
foreach (var ep in tvMaxeEpisodes)
|
||||
var plexSettings = await PlexService.GetSettingsAsync();
|
||||
if (plexSettings.Enable)
|
||||
{
|
||||
var requested = existingRequest?.Episodes
|
||||
.Any(episodesModel =>
|
||||
ep.number == episodesModel.EpisodeNumber && ep.season == episodesModel.SeasonNumber) ?? false;
|
||||
|
||||
var alreadyInPlex = plexCache.Any(x => x.EpisodeNumber == ep.number && x.SeasonNumber == ep.season);
|
||||
var inSonarr = sonarrEpisodes.Any(x => x.seasonNumber == ep.season && x.episodeNumber == ep.number && x.hasFile);
|
||||
|
||||
model.Add(new EpisodeListViewModel
|
||||
var plexCacheTask = await PlexChecker.GetEpisodes(providerId);
|
||||
var plexCache = plexCacheTask.ToList();
|
||||
foreach (var ep in tvMazeEpisodes)
|
||||
{
|
||||
Id = show.id,
|
||||
SeasonNumber = ep.season,
|
||||
EpisodeNumber = ep.number,
|
||||
Requested = requested || alreadyInPlex || inSonarr,
|
||||
Name = ep.name,
|
||||
EpisodeId = ep.id
|
||||
});
|
||||
var requested = existingRequest?.Episodes
|
||||
.Any(episodesModel =>
|
||||
ep.number == episodesModel.EpisodeNumber &&
|
||||
ep.season == episodesModel.SeasonNumber) ?? false;
|
||||
|
||||
var alreadyInPlex = plexCache.Any(x => x.EpisodeNumber == ep.number && x.SeasonNumber == ep.season);
|
||||
var inSonarr =
|
||||
sonarrEpisodes.Any(x => x.seasonNumber == ep.season && x.episodeNumber == ep.number && x.hasFile);
|
||||
|
||||
model.Add(new EpisodeListViewModel
|
||||
{
|
||||
Id = show.id,
|
||||
SeasonNumber = ep.season,
|
||||
EpisodeNumber = ep.number,
|
||||
Requested = requested || alreadyInPlex || inSonarr,
|
||||
Name = ep.name,
|
||||
EpisodeId = ep.id
|
||||
});
|
||||
}
|
||||
}
|
||||
var embySettings = await EmbySettings.GetSettingsAsync();
|
||||
if (embySettings.Enable)
|
||||
{
|
||||
var embyCacheTask = await EmbyChecker.GetEpisodes(providerId);
|
||||
var cache = embyCacheTask.ToList();
|
||||
foreach (var ep in tvMazeEpisodes)
|
||||
{
|
||||
var requested = existingRequest?.Episodes
|
||||
.Any(episodesModel =>
|
||||
ep.number == episodesModel.EpisodeNumber &&
|
||||
ep.season == episodesModel.SeasonNumber) ?? false;
|
||||
|
||||
var alreadyInEmby = cache.Any(x => x.EpisodeNumber == ep.number && x.SeasonNumber == ep.season);
|
||||
var inSonarr =
|
||||
sonarrEpisodes.Any(x => x.seasonNumber == ep.season && x.episodeNumber == ep.number && x.hasFile);
|
||||
|
||||
model.Add(new EpisodeListViewModel
|
||||
{
|
||||
Id = show.id,
|
||||
SeasonNumber = ep.season,
|
||||
EpisodeNumber = ep.number,
|
||||
Requested = requested || alreadyInEmby || inSonarr,
|
||||
Name = ep.name,
|
||||
EpisodeId = ep.id
|
||||
});
|
||||
}
|
||||
}
|
||||
return model;
|
||||
|
||||
|
@ -1720,5 +1889,12 @@ namespace Ombi.UI.Modules
|
|||
return
|
||||
Response.AsJson(new JsonResponseModel { Result = false, Message = Resources.UI.Search_TvNotSetUp });
|
||||
}
|
||||
|
||||
private string GetMediaServerName()
|
||||
{
|
||||
var e = EmbySettings.GetSettings();
|
||||
return e.Enable ? "Emby" : "Plex";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue