Merge pull request #83 from shiitake/dev

Fixes issue #62 and #68
pull/88/head
Jamie 9 years ago
commit 47c0c0daf0

@ -32,9 +32,11 @@ namespace PlexRequests.Api.Interfaces
{
public interface ISickRageApi
{
SickRageTvAdd AddSeries(int tvdbId, bool latest, string quality, string apiKey,
SickRageTvAdd AddSeries(int tvdbId, int seasoncount, int[] seasons, string quality, string apiKey,
Uri baseUrl);
SickRagePing Ping(string apiKey, Uri baseUrl);
SickRageTvAdd AddSeason(int tvdbId, int season, string apiKey, Uri baseUrl);
}
}

@ -36,7 +36,7 @@ namespace PlexRequests.Api.Interfaces
List<SonarrProfile> GetProfiles(string apiKey, Uri baseUrl);
SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath,
bool episodes, string apiKey, Uri baseUrl);
int seasonCount, int[] seasons, string apiKey, Uri baseUrl);
SystemStatus SystemStatus(string apiKey, Uri baseUrl);
}

@ -67,6 +67,7 @@
<Compile Include="Sonarr\SystemStatus.cs" />
<Compile Include="Tv\Authentication.cs" />
<Compile Include="Tv\TvMazeSearch.cs" />
<Compile Include="Tv\TvMazeSeasons.cs" />
<Compile Include="Tv\TVMazeShow.cs" />
<Compile Include="Tv\TvSearchResult.cs" />
<Compile Include="Tv\TvShow.cs" />

@ -23,5 +23,6 @@ namespace PlexRequests.Api.Models.Tv
public string summary { get; set; }
public int updated { get; set; }
public Links _links { get; set; }
public int seasonCount { get; set; }
}
}

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PlexRequests.Api.Models.Tv
{
public class TvMazeSeasons : TvMazeShow
{
public int number { get; set; }
}
}

@ -43,7 +43,7 @@ namespace PlexRequests.Api.Mocks
return obj;
}
public SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, bool episodes,
public SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, int seasonCount, int[] seasons,
string apiKey, Uri baseUrl)
{
var json = MockApiData.Sonarr_AddSeriesResult;

@ -28,9 +28,11 @@
#endregion
using System;
using System.Linq;
using NLog;
using PlexRequests.Api.Interfaces;
using PlexRequests.Api.Models.SickRage;
using PlexRequests.Helpers;
using RestSharp;
namespace PlexRequests.Api
@ -47,13 +49,11 @@ namespace PlexRequests.Api
private ApiRequest Api { get; }
public SickRageTvAdd AddSeries(int tvdbId, bool latest, string quality, string apiKey,
public SickRageTvAdd AddSeries(int tvdbId, int seasonCount, int[] seasons, string quality, string apiKey,
Uri baseUrl)
{
string status;
var futureStatus = SickRageStatus.Wanted;
status = latest ? SickRageStatus.Skipped : SickRageStatus.Wanted;
var futureStatus = seasons.Length > 0 && !seasons.Any(x => x == seasonCount) ? SickRageStatus.Skipped : SickRageStatus.Wanted;
var status = seasons.Length > 0 ? SickRageStatus.Skipped : SickRageStatus.Wanted;
var request = new RestRequest
{
@ -71,6 +71,17 @@ namespace PlexRequests.Api
var obj = Api.Execute<SickRageTvAdd>(request, baseUrl);
if (seasons.Length > 0 && obj.result != "failure")
{
//handle the seasons requested
foreach (int s in seasons)
{
var result = AddSeason(tvdbId, s, apiKey, baseUrl);
Log.Trace("SickRage adding season results: ");
Log.Trace(result.DumpJson());
}
}
return obj;
}
@ -87,5 +98,22 @@ namespace PlexRequests.Api
return obj;
}
public SickRageTvAdd AddSeason(int tvdbId, int season, string apiKey, Uri baseUrl)
{
var request = new RestRequest
{
Resource = "/api/{apiKey}/?cmd=episode.setstatus",
Method = Method.GET
};
request.AddUrlSegment("apiKey", apiKey);
request.AddQueryParameter("tvdbid", tvdbId.ToString());
request.AddQueryParameter("season", season.ToString());
request.AddQueryParameter("status", SickRageStatus.Wanted);
var obj = Api.Execute<SickRageTvAdd>(request, baseUrl);
return obj;
}
}
}

@ -26,7 +26,7 @@
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using NLog;
using PlexRequests.Api.Interfaces;
using PlexRequests.Api.Models.Sonarr;
@ -54,7 +54,7 @@ namespace PlexRequests.Api
return obj;
}
public SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, bool episodes, string apiKey, Uri baseUrl)
public SonarrAddSeries AddSeries(int tvdbId, string title, int qualityId, bool seasonFolders, string rootPath, int seasonCount, int[] seasons, string apiKey, Uri baseUrl)
{
var request = new RestRequest
@ -64,24 +64,28 @@ namespace PlexRequests.Api
};
var options = new SonarrAddSeries();
if (episodes)
{
options.addOptions = new AddOptions
{
ignoreEpisodesWithFiles = true,
ignoreEpisodesWithoutFiles = true,
searchForMissingEpisodes = false
};
}
else
{
options.addOptions = new AddOptions
{
ignoreEpisodesWithFiles = false,
searchForMissingEpisodes = true,
ignoreEpisodesWithoutFiles = false
};
}
//I'm fairly certain we won't need this logic anymore since we're manually adding the seasons
//if (seasons.Length == 0)
//{
// options.addOptions = new AddOptions
// {
// ignoreEpisodesWithFiles = true,
// ignoreEpisodesWithoutFiles = true,
// searchForMissingEpisodes = false
// };
//}
//else
//{
// options.addOptions = new AddOptions
// {
// ignoreEpisodesWithFiles = false,
// ignoreEpisodesWithoutFiles = false,
// searchForMissingEpisodes = true
// };
//}
options.seasonFolder = seasonFolders;
options.title = title;
options.qualityProfileId = qualityId;
@ -90,6 +94,15 @@ namespace PlexRequests.Api
options.seasons = new List<Season>();
options.rootFolderPath = rootPath;
for (var i = 1; i <= seasonCount; i++)
{
var season = new Season
{
seasonNumber = i,
monitored = seasons.Length == 0 || seasons.Any(x => x == i)
};
options.seasons.Add(season);
}
request.AddHeader("X-Api-Key", apiKey);
request.AddJsonBody(options);

@ -26,7 +26,7 @@
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using NLog;
using PlexRequests.Api.Models.Tv;
@ -79,7 +79,25 @@ namespace PlexRequests.Api
request.AddUrlSegment("id", theTvDbId.ToString());
request.AddHeader("Content-Type", "application/json");
return Api.Execute<TvMazeShow>(request, new Uri(Uri));
var obj = Api.Execute<TvMazeShow>(request, new Uri(Uri));
obj.seasonCount = GetSeasonCount(obj.id);
return obj;
}
public int GetSeasonCount(int id)
{
var request = new RestRequest
{
Method = Method.GET,
Resource = "shows/{id}/seasons"
};
request.AddUrlSegment("id", id.ToString());
request.AddHeader("Content-Type", "application/json");
var obj = Api.Execute<List<TvMazeSeasons>>(request, new Uri(Uri));
var seasons = obj.Select(x => x.number > 0);
return seasons.Count();
}
}

@ -110,7 +110,6 @@ namespace PlexRequests.Core
Available = r.Available,
ImdbId = show.externals.imdb,
Issues = r.Issues,
LatestTv = r.LatestTv,
OtherMessage = r.OtherMessage,
Overview = show.summary.RemoveHtml(),
RequestedBy = r.RequestedBy,

@ -23,8 +23,9 @@ namespace PlexRequests.Store
public bool Available { get; set; }
public IssueState Issues { get; set; }
public string OtherMessage { get; set; }
public bool LatestTv { get; set; }
public string AdminNote { get; set; }
public int[] SeasonList { get; set; }
public int SeasonCount { get; set; }
}
public enum RequestType

@ -39,9 +39,14 @@ $(document).on("click", ".dropdownTv", function (e) {
var $form = $('#form' + buttonId);
var data = $form.serialize();
var seasons = $(this).attr("season-select");
if (seasons === "1") {
if (seasons === "2") {
// Send over the latest
data = data + "&latest=true";
data = data + "&seasons=latest";
}
if (seasons === "1") {
// Send over the first season
data = data + "&seasons=first";
}
var type = $form.prop('method');

@ -54,7 +54,7 @@ namespace PlexRequests.UI.Helpers
int qualityProfile;
int.TryParse(sonarrSettings.QualityProfile, out qualityProfile);
var result = SonarrApi.AddSeries(model.ProviderId, model.Title, qualityProfile,
sonarrSettings.SeasonFolders, sonarrSettings.RootPath, model.LatestTv, sonarrSettings.ApiKey,
sonarrSettings.SeasonFolders, sonarrSettings.RootPath, model.SeasonCount, model.SeasonList, sonarrSettings.ApiKey,
sonarrSettings.FullUri);
Log.Trace("Sonarr Add Result: ");
@ -65,7 +65,7 @@ namespace PlexRequests.UI.Helpers
public SickRageTvAdd SendToSickRage(SickRageSettings sickRageSettings, RequestedModel model)
{
var result = SickrageApi.AddSeries(model.ProviderId, model.LatestTv, sickRageSettings.QualityProfile,
var result = SickrageApi.AddSeries(model.ProviderId, model.SeasonCount, model.SeasonList, sickRageSettings.QualityProfile,
sickRageSettings.ApiKey, sickRageSettings.FullUri);
Log.Trace("SickRage Add Result: ");

@ -79,7 +79,7 @@ namespace PlexRequests.UI.Modules
Get["movie/playing"] = parameters => CurrentlyPlayingMovies();
Post["request/movie"] = parameters => RequestMovie((int)Request.Form.movieId);
Post["request/tv"] = parameters => RequestTvShow((int)Request.Form.tvId, (bool)Request.Form.latest);
Post["request/tv"] = parameters => RequestTvShow((int)Request.Form.tvId, (string)Request.Form.seasons);
}
private TheMovieDbApi MovieApi { get; }
private INotificationService NotificationService { get; }
@ -263,7 +263,7 @@ namespace PlexRequests.UI.Modules
/// <param name="showId">The show identifier.</param>
/// <param name="latest">if set to <c>true</c> [latest].</param>
/// <returns></returns>
private Response RequestTvShow(int showId, bool latest)
private Response RequestTvShow(int showId, string seasons)
{
if (RequestService.CheckRequest(showId))
{
@ -289,7 +289,6 @@ namespace PlexRequests.UI.Modules
DateTime firstAir;
DateTime.TryParse(showInfo.premiered, out firstAir);
var model = new RequestedModel
{
ProviderId = showInfo.externals?.thetvdb ?? 0,
@ -303,10 +302,21 @@ namespace PlexRequests.UI.Modules
Approved = false,
RequestedBy = Session[SessionKeys.UsernameKey].ToString(),
Issues = IssueState.None,
LatestTv = latest,
ImdbId = showInfo.externals?.imdb ?? string.Empty
ImdbId = showInfo.externals?.imdb ?? string.Empty,
SeasonCount = showInfo.seasonCount
};
var seasonsList = new List<int>();
switch (seasons)
{
case "first":
seasonsList.Add(1);
break;
case "latest":
seasonsList.Add(model.SeasonCount);
break;
}
model.SeasonList = seasonsList.ToArray();
var settings = PrService.GetSettings();
if (!settings.RequireApproval)
@ -361,23 +371,23 @@ namespace PlexRequests.UI.Modules
return result;
}
private Response SendToSickRage(SickRageSettings sickRageSettings, RequestedModel model)
{
var result = SickrageApi.AddSeries(model.ProviderId, model.LatestTv, sickRageSettings.QualityProfile,
sickRageSettings.ApiKey, sickRageSettings.FullUri);
//private Response SendToSickRage(SickRageSettings sickRageSettings, RequestedModel model)
//{
// var result = SickrageApi.AddSeries(model.ProviderId, model.SeasonCount, model.SeasonList, sickRageSettings.QualityProfile,
// sickRageSettings.ApiKey, sickRageSettings.FullUri);
Log.Trace("SickRage Result: ");
Log.Trace(result.DumpJson());
// Log.Trace("SickRage Result: ");
// Log.Trace(result.DumpJson());
if (result?.result == "success")
{
model.Approved = true;
Log.Debug("Adding tv to database requests (No approval required & SickRage)");
RequestService.AddRequest(model);
// if (result?.result == "success")
// {
// model.Approved = true;
// Log.Debug("Adding tv to database requests (No approval required & SickRage)");
// RequestService.AddRequest(model);
return Response.AsJson(new JsonResponseModel { Result = true });
}
return Response.AsJson(new JsonResponseModel { Result = false, Message = "Something went wrong adding the movie to SickRage! Please check your settings." });
}
// return Response.AsJson(new JsonResponseModel { Result = true });
// }
// return Response.AsJson(new JsonResponseModel { Result = false, Message = "Something went wrong adding the movie to SickRage! Please check your settings." });
//}
}
}

@ -84,7 +84,7 @@
</div>
<div class="col-sm-2 col-sm-push-3">
<form method="POST" action="/search/request/{{type}}" id="form{{id}}">
<input name="{{type}}Id" type="text" value="{{id}}" hidden="hidden" />
<input name="{{type}}Id" type="text" value="{{id}}" hidden="hidden" />
{{#if_eq type "movie"}}
<button id="{{id}}" style="text-align: right" class="btn btn-primary-outline requestMovie" type="submit"><i class="fa fa-plus"></i> Request</button>
{{/if_eq}}
@ -96,7 +96,8 @@
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
<li><a id="{{id}}" season-select="0" class="dropdownTv " href="#">All Seasons</a></li>
<li><a id="{{id}}" season-select="1" class="dropdownTv" href="#">Latest Season</a></li>
<li><a id="{{id}}" season-select="1" class="dropdownTv" href="#">First Season</a></li>
<li><a id="{{id}}" season-select="2" class="dropdownTv" href="#">Latest Season</a></li>
</ul>
</div>
{{/if_eq}}

Loading…
Cancel
Save