mirror of
https://github.com/Radarr/Radarr.git
synced 2026-04-17 21:26:22 -04:00
Compare commits
4 Commits
v2.0.0.522
...
0.05
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b278c7db8 | ||
|
|
0b765d10fe | ||
|
|
20dbdfb344 | ||
|
|
426448ed98 |
@@ -1,7 +1,7 @@
|
|||||||
# Sonarr #
|
# Sonarr #
|
||||||
|
|
||||||
|
This fork of Sonarr aims to turn it into something like Couchpotato.
|
||||||
Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.
|
At the moment almost nothing is implemented.
|
||||||
|
|
||||||
## Major Features Include: ##
|
## Major Features Include: ##
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,9 @@ namespace NzbDrone.Core.DecisionEngine
|
|||||||
|
|
||||||
if (remoteEpisode.Series == null)
|
if (remoteEpisode.Series == null)
|
||||||
{
|
{
|
||||||
decision = new DownloadDecision(remoteEpisode, new Rejection("Unknown Series"));
|
//remoteEpisode.DownloadAllowed = true; //Fuck you :)
|
||||||
|
//decision = GetDecisionForReport(remoteEpisode, searchCriteria);
|
||||||
|
decision = new DownloadDecision(remoteEpisode, new Rejection("Unknown release. Movie not Found."));
|
||||||
}
|
}
|
||||||
else if (remoteEpisode.Episodes.Empty())
|
else if (remoteEpisode.Episodes.Empty())
|
||||||
{
|
{
|
||||||
@@ -143,8 +145,9 @@ namespace NzbDrone.Core.DecisionEngine
|
|||||||
{
|
{
|
||||||
e.Data.Add("report", remoteEpisode.Release.ToJson());
|
e.Data.Add("report", remoteEpisode.Release.ToJson());
|
||||||
e.Data.Add("parsed", remoteEpisode.ParsedEpisodeInfo.ToJson());
|
e.Data.Add("parsed", remoteEpisode.ParsedEpisodeInfo.ToJson());
|
||||||
_logger.Error(e, "Couldn't evaluate decision on " + remoteEpisode.Release.Title);
|
_logger.Error(e, "Couldn't evaluate decision on " + remoteEpisode.Release.Title + ", with spec: " + spec.GetType().Name);
|
||||||
return new Rejection(string.Format("{0}: {1}", spec.GetType().Name, e.Message));
|
//return new Rejection(string.Format("{0}: {1}", spec.GetType().Name, e.Message));//TODO UPDATE SPECS!
|
||||||
|
//return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
|
|||||||
if (subject.Episodes.Any(e => !e.AirDateUtc.HasValue || e.AirDateUtc.Value.After(DateTime.UtcNow)))
|
if (subject.Episodes.Any(e => !e.AirDateUtc.HasValue || e.AirDateUtc.Value.After(DateTime.UtcNow)))
|
||||||
{
|
{
|
||||||
_logger.Debug("Full season release {0} rejected. All episodes haven't aired yet.", subject.Release.Title);
|
_logger.Debug("Full season release {0} rejected. All episodes haven't aired yet.", subject.Release.Title);
|
||||||
return Decision.Reject("Full season release rejected. All episodes haven't aired yet.");
|
//return Decision.Reject("Full season release rejected. All episodes haven't aired yet.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.Search
|
|||||||
if (singleEpisodeSpec.SeasonNumber != remoteEpisode.ParsedEpisodeInfo.SeasonNumber)
|
if (singleEpisodeSpec.SeasonNumber != remoteEpisode.ParsedEpisodeInfo.SeasonNumber)
|
||||||
{
|
{
|
||||||
_logger.Debug("Season number does not match searched season number, skipping.");
|
_logger.Debug("Season number does not match searched season number, skipping.");
|
||||||
return Decision.Reject("Wrong season");
|
//return Decision.Reject("Wrong season");
|
||||||
|
//Unnecessary for Movies
|
||||||
}
|
}
|
||||||
|
|
||||||
return Decision.Accept();
|
return Decision.Accept();
|
||||||
|
|||||||
@@ -29,19 +29,19 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.Search
|
|||||||
if (singleEpisodeSpec.SeasonNumber != remoteEpisode.ParsedEpisodeInfo.SeasonNumber)
|
if (singleEpisodeSpec.SeasonNumber != remoteEpisode.ParsedEpisodeInfo.SeasonNumber)
|
||||||
{
|
{
|
||||||
_logger.Debug("Season number does not match searched season number, skipping.");
|
_logger.Debug("Season number does not match searched season number, skipping.");
|
||||||
return Decision.Reject("Wrong season");
|
//return Decision.Reject("Wrong season");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!remoteEpisode.ParsedEpisodeInfo.EpisodeNumbers.Any())
|
if (!remoteEpisode.ParsedEpisodeInfo.EpisodeNumbers.Any())
|
||||||
{
|
{
|
||||||
_logger.Debug("Full season result during single episode search, skipping.");
|
_logger.Debug("Full season result during single episode search, skipping.");
|
||||||
return Decision.Reject("Full season pack");
|
//return Decision.Reject("Full season pack");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!remoteEpisode.ParsedEpisodeInfo.EpisodeNumbers.Contains(singleEpisodeSpec.EpisodeNumber))
|
if (!remoteEpisode.ParsedEpisodeInfo.EpisodeNumbers.Contains(singleEpisodeSpec.EpisodeNumber))
|
||||||
{
|
{
|
||||||
_logger.Debug("Episode number does not match searched episode number, skipping.");
|
_logger.Debug("Episode number does not match searched episode number, skipping.");
|
||||||
return Decision.Reject("Wrong episode");
|
//return Decision.Reject("Wrong episode");
|
||||||
}
|
}
|
||||||
|
|
||||||
return Decision.Accept();
|
return Decision.Accept();
|
||||||
|
|||||||
@@ -88,12 +88,13 @@ namespace NzbDrone.Core.Indexers.Rarbg
|
|||||||
|
|
||||||
if (tvdbId.HasValue)
|
if (tvdbId.HasValue)
|
||||||
{
|
{
|
||||||
requestBuilder.AddQueryParam("search_tvdb", tvdbId.Value);
|
string imdbId = string.Format("tt{0:D7}", tvdbId);
|
||||||
|
requestBuilder.AddQueryParam("search_imdb", imdbId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query.IsNotNullOrWhiteSpace())
|
if (query.IsNotNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
requestBuilder.AddQueryParam("search_string", string.Format(query, args));
|
//requestBuilder.AddQueryParam("search_string", string.Format(query, args));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Settings.RankedOnly)
|
if (!Settings.RankedOnly)
|
||||||
@@ -101,7 +102,7 @@ namespace NzbDrone.Core.Indexers.Rarbg
|
|||||||
requestBuilder.AddQueryParam("ranked", "0");
|
requestBuilder.AddQueryParam("ranked", "0");
|
||||||
}
|
}
|
||||||
|
|
||||||
requestBuilder.AddQueryParam("category", "18;41");
|
requestBuilder.AddQueryParam("category", "movies");
|
||||||
requestBuilder.AddQueryParam("limit", "100");
|
requestBuilder.AddQueryParam("limit", "100");
|
||||||
requestBuilder.AddQueryParam("token", _tokenProvider.GetToken(Settings));
|
requestBuilder.AddQueryParam("token", _tokenProvider.GetToken(Settings));
|
||||||
requestBuilder.AddQueryParam("format", "json_extended");
|
requestBuilder.AddQueryParam("format", "json_extended");
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Specifications
|
|||||||
{
|
{
|
||||||
if (localEpisode.ParsedEpisodeInfo.FullSeason)
|
if (localEpisode.ParsedEpisodeInfo.FullSeason)
|
||||||
{
|
{
|
||||||
_logger.Debug("Single episode file detected as containing all episodes in the season");
|
//_logger.Debug("Single episode file detected as containing all episodes in the season"); //Not needed for Movies mwhahahahah
|
||||||
return Decision.Reject("Single episode file contains all episodes in seasons");
|
//return Decision.Reject("Single episode file contains all episodes in seasons");
|
||||||
}
|
}
|
||||||
|
|
||||||
return Decision.Accept();
|
return Decision.Accept();
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using NzbDrone.Core.Exceptions;
|
|||||||
using NzbDrone.Core.MediaCover;
|
using NzbDrone.Core.MediaCover;
|
||||||
using NzbDrone.Core.MetadataSource.SkyHook.Resource;
|
using NzbDrone.Core.MetadataSource.SkyHook.Resource;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace NzbDrone.Core.MetadataSource.SkyHook
|
namespace NzbDrone.Core.MetadataSource.SkyHook
|
||||||
{
|
{
|
||||||
@@ -37,7 +38,11 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
|
|||||||
httpRequest.AllowAutoRedirect = true;
|
httpRequest.AllowAutoRedirect = true;
|
||||||
httpRequest.SuppressHttpError = true;
|
httpRequest.SuppressHttpError = true;
|
||||||
|
|
||||||
var httpResponse = _httpClient.Get<ShowResource>(httpRequest);
|
string imdbId = string.Format("tt{0:D7}", tvdbSeriesId);
|
||||||
|
|
||||||
|
var imdbRequest = new HttpRequest("http://www.omdbapi.com/?i="+ imdbId + "&plot=full&r=json");
|
||||||
|
|
||||||
|
var httpResponse = _httpClient.Get(imdbRequest);
|
||||||
|
|
||||||
if (httpResponse.HasHttpError)
|
if (httpResponse.HasHttpError)
|
||||||
{
|
{
|
||||||
@@ -51,8 +56,47 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var episodes = httpResponse.Resource.Episodes.Select(MapEpisode);
|
var response = httpResponse.Content;
|
||||||
var series = MapSeries(httpResponse.Resource);
|
|
||||||
|
dynamic json = JsonConvert.DeserializeObject(response);
|
||||||
|
|
||||||
|
var series = new Series();
|
||||||
|
|
||||||
|
series.Title = json.Title;
|
||||||
|
series.TitleSlug = series.Title.ToLower().Replace(" ", "-");
|
||||||
|
series.Overview = json.Plot;
|
||||||
|
series.CleanTitle = Parser.Parser.CleanSeriesTitle(series.Title);
|
||||||
|
series.TvdbId = tvdbSeriesId;
|
||||||
|
string airDateStr = json.Released;
|
||||||
|
DateTime airDate = DateTime.Parse(airDateStr);
|
||||||
|
series.FirstAired = airDate;
|
||||||
|
series.Year = airDate.Year;
|
||||||
|
series.ImdbId = imdbId;
|
||||||
|
series.Images = new List<MediaCover.MediaCover>();
|
||||||
|
string url = json.Poster;
|
||||||
|
var imdbPoster = new MediaCover.MediaCover(MediaCoverTypes.Poster, url);
|
||||||
|
series.Images.Add(imdbPoster);
|
||||||
|
string runtime = json.Runtime;
|
||||||
|
int runtimeNum = 0;
|
||||||
|
int.TryParse(runtime.Replace("min", "").Trim(), out runtimeNum);
|
||||||
|
series.Runtime = runtimeNum;
|
||||||
|
|
||||||
|
var season = new Season();
|
||||||
|
season.SeasonNumber = 1;
|
||||||
|
season.Monitored = true;
|
||||||
|
series.Seasons.Add(season);
|
||||||
|
|
||||||
|
|
||||||
|
var episode = new Episode();
|
||||||
|
|
||||||
|
episode.AirDate = airDate.ToBestDateString();
|
||||||
|
episode.Title = json.Title;
|
||||||
|
episode.SeasonNumber = 1;
|
||||||
|
episode.EpisodeNumber = 1;
|
||||||
|
episode.Overview = series.Overview;
|
||||||
|
episode.AirDate = airDate.ToShortDateString();
|
||||||
|
|
||||||
|
var episodes = new List<Episode> { episode };
|
||||||
|
|
||||||
return new Tuple<Series, List<Episode>>(series, episodes.ToList());
|
return new Tuple<Series, List<Episode>>(series, episodes.ToList());
|
||||||
}
|
}
|
||||||
@@ -89,6 +133,66 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
|
|||||||
.AddQueryParam("term", title.ToLower().Trim())
|
.AddQueryParam("term", title.ToLower().Trim())
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
var searchTerm = lowerTitle.Replace("+", "_").Replace(" ", "_");
|
||||||
|
|
||||||
|
var firstChar = searchTerm.First();
|
||||||
|
|
||||||
|
var imdbRequest = new HttpRequest("https://v2.sg.media-imdb.com/suggests/"+firstChar+"/" + searchTerm + ".json");
|
||||||
|
|
||||||
|
var response = _httpClient.Get(imdbRequest);
|
||||||
|
|
||||||
|
var imdbCallback = "imdb$" + searchTerm + "(";
|
||||||
|
|
||||||
|
var responseCleaned = response.Content.Replace(imdbCallback, "").TrimEnd(")");
|
||||||
|
|
||||||
|
dynamic json = JsonConvert.DeserializeObject(responseCleaned);
|
||||||
|
|
||||||
|
var imdbMovies = new List<Series>();
|
||||||
|
|
||||||
|
foreach (dynamic entry in json.d)
|
||||||
|
{
|
||||||
|
var imdbMovie = new Series();
|
||||||
|
imdbMovie.ImdbId = entry.id;
|
||||||
|
string noTT = imdbMovie.ImdbId.Replace("tt", "");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
imdbMovie.TvdbId = (int)Double.Parse(noTT);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
imdbMovie.TvdbId = 0;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
imdbMovie.SortTitle = entry.l;
|
||||||
|
imdbMovie.Title = entry.l;
|
||||||
|
string titleSlug = entry.l;
|
||||||
|
imdbMovie.TitleSlug = titleSlug.ToLower().Replace(" ", "-");
|
||||||
|
imdbMovie.Year = entry.y;
|
||||||
|
imdbMovie.Images = new List<MediaCover.MediaCover>();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string url = entry.i[0];
|
||||||
|
var imdbPoster = new MediaCover.MediaCover(MediaCoverTypes.Poster, url);
|
||||||
|
imdbMovie.Images.Add(imdbPoster);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.Debug(entry);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
imdbMovies.Add(imdbMovie);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return imdbMovies;
|
||||||
|
|
||||||
var httpResponse = _httpClient.Get<List<ShowResource>>(httpRequest);
|
var httpResponse = _httpClient.Get<List<ShowResource>>(httpRequest);
|
||||||
|
|
||||||
return httpResponse.Resource.SelectList(MapSeries);
|
return httpResponse.Resource.SelectList(MapSeries);
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ namespace NzbDrone.Core.Parser
|
|||||||
new Regex(@"^(?:\W*S?(?<season>(?<!\d+)(?:\d{1,2}|\d{4})(?!\d+))(?:(?:[ex]){1,2}(?<episode>\d{1,3}(?!\d+)))+){2,}",
|
new Regex(@"^(?:\W*S?(?<season>(?<!\d+)(?:\d{1,2}|\d{4})(?!\d+))(?:(?:[ex]){1,2}(?<episode>\d{1,3}(?!\d+)))+){2,}",
|
||||||
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
||||||
|
|
||||||
|
//Matches Movie name with AirYear
|
||||||
|
new Regex(@"^(?<title>.+?)?(?:(?:[-_\W](?<![()\[!]))*(?<year>(?<!e|x)\d{4}(?!p|i|\d+|\)|\]|\W\d+)))+(\W+|_|$)(?!\\)",
|
||||||
|
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
||||||
|
|
||||||
//Episodes without a title, Single (S01E05, 1x05) AND Multi (S01E04E05, 1x04x05, etc)
|
//Episodes without a title, Single (S01E05, 1x05) AND Multi (S01E04E05, 1x04x05, etc)
|
||||||
new Regex(@"^(?:S?(?<season>(?<!\d+)(?:\d{1,2}|\d{4})(?!\d+))(?:(?:\-|[ex]|\W[ex]|_){1,2}(?<episode>\d{2,3}(?!\d+)))+)",
|
new Regex(@"^(?:S?(?<season>(?<!\d+)(?:\d{1,2}|\d{4})(?!\d+))(?:(?:\-|[ex]|\W[ex]|_){1,2}(?<episode>\d{2,3}(?!\d+)))+)",
|
||||||
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
||||||
@@ -296,6 +300,8 @@ namespace NzbDrone.Core.Parser
|
|||||||
|
|
||||||
public static ParsedEpisodeInfo ParseTitle(string title)
|
public static ParsedEpisodeInfo ParseTitle(string title)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
ParsedEpisodeInfo realResult = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!ValidateBeforeParsing(title)) return null;
|
if (!ValidateBeforeParsing(title)) return null;
|
||||||
@@ -342,6 +348,8 @@ namespace NzbDrone.Core.Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var regex in ReportTitleRegex)
|
foreach (var regex in ReportTitleRegex)
|
||||||
{
|
{
|
||||||
var match = regex.Matches(simpleTitle);
|
var match = regex.Matches(simpleTitle);
|
||||||
@@ -383,6 +391,8 @@ namespace NzbDrone.Core.Parser
|
|||||||
Logger.Debug("Release Hash parsed: {0}", result.ReleaseHash);
|
Logger.Debug("Release Hash parsed: {0}", result.ReleaseHash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
realResult = result;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -401,7 +411,7 @@ namespace NzbDrone.Core.Parser
|
|||||||
}
|
}
|
||||||
|
|
||||||
Logger.Debug("Unable to parse {0}", title);
|
Logger.Debug("Unable to parse {0}", title);
|
||||||
return null;
|
return realResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string ParseSeriesName(string title)
|
public static string ParseSeriesName(string title)
|
||||||
@@ -525,6 +535,7 @@ namespace NzbDrone.Core.Parser
|
|||||||
|
|
||||||
int airYear;
|
int airYear;
|
||||||
int.TryParse(matchCollection[0].Groups["airyear"].Value, out airYear);
|
int.TryParse(matchCollection[0].Groups["airyear"].Value, out airYear);
|
||||||
|
//int.TryParse(matchCollection[0].Groups["year"].Value, out airYear);
|
||||||
|
|
||||||
ParsedEpisodeInfo result;
|
ParsedEpisodeInfo result;
|
||||||
|
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ namespace NzbDrone.Core.Parser
|
|||||||
|
|
||||||
if (parsedEpisodeInfo == null)
|
if (parsedEpisodeInfo == null)
|
||||||
{
|
{
|
||||||
return _seriesService.FindByTitle(title);
|
return _seriesService.FindByTitle(title); //Here we have a problem since it is not possible for movies to find a scene mapping, so these releases are always rejected :(
|
||||||
}
|
}
|
||||||
|
|
||||||
var series = _seriesService.FindByTitle(parsedEpisodeInfo.SeriesTitle);
|
var series = _seriesService.FindByTitle(parsedEpisodeInfo.SeriesTitle);
|
||||||
@@ -252,10 +252,12 @@ namespace NzbDrone.Core.Parser
|
|||||||
{
|
{
|
||||||
Series series = null;
|
Series series = null;
|
||||||
|
|
||||||
|
/*var localEpisode = _seriesService.FindByTitle(parsedEpisodeInfo.SeriesTitle);
|
||||||
|
|
||||||
var sceneMappingTvdbId = _sceneMappingService.FindTvdbId(parsedEpisodeInfo.SeriesTitle);
|
var sceneMappingTvdbId = _sceneMappingService.FindTvdbId(parsedEpisodeInfo.SeriesTitle);
|
||||||
if (sceneMappingTvdbId.HasValue)
|
if (localEpisode != null)
|
||||||
{
|
{
|
||||||
if (searchCriteria != null && searchCriteria.Series.TvdbId == sceneMappingTvdbId.Value)
|
if (searchCriteria != null && searchCriteria.Series.TvdbId == localEpisode.TvdbId)
|
||||||
{
|
{
|
||||||
return searchCriteria.Series;
|
return searchCriteria.Series;
|
||||||
}
|
}
|
||||||
@@ -269,7 +271,7 @@ namespace NzbDrone.Core.Parser
|
|||||||
}
|
}
|
||||||
|
|
||||||
return series;
|
return series;
|
||||||
}
|
}*/ //This is only to find scene mapping should not be necessary for movies.
|
||||||
|
|
||||||
if (searchCriteria != null)
|
if (searchCriteria != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ namespace NzbDrone.Core.Qualities
|
|||||||
new QualityDefinition(Quality.WEBDL720p) { Weight = 8, MinSize = 0, MaxSize = 100 },
|
new QualityDefinition(Quality.WEBDL720p) { Weight = 8, MinSize = 0, MaxSize = 100 },
|
||||||
new QualityDefinition(Quality.Bluray720p) { Weight = 9, MinSize = 0, MaxSize = 100 },
|
new QualityDefinition(Quality.Bluray720p) { Weight = 9, MinSize = 0, MaxSize = 100 },
|
||||||
new QualityDefinition(Quality.WEBDL1080p) { Weight = 10, MinSize = 0, MaxSize = 100 },
|
new QualityDefinition(Quality.WEBDL1080p) { Weight = 10, MinSize = 0, MaxSize = 100 },
|
||||||
new QualityDefinition(Quality.Bluray1080p) { Weight = 11, MinSize = 0, MaxSize = 100 },
|
new QualityDefinition(Quality.Bluray1080p) { Weight = 11, MinSize = 0, MaxSize = null },
|
||||||
new QualityDefinition(Quality.HDTV2160p) { Weight = 12, MinSize = 0, MaxSize = null },
|
new QualityDefinition(Quality.HDTV2160p) { Weight = 12, MinSize = 0, MaxSize = null },
|
||||||
new QualityDefinition(Quality.WEBDL2160p) { Weight = 13, MinSize = 0, MaxSize = null },
|
new QualityDefinition(Quality.WEBDL2160p) { Weight = 13, MinSize = 0, MaxSize = null },
|
||||||
new QualityDefinition(Quality.Bluray2160p) { Weight = 14, MinSize = 0, MaxSize = null },
|
new QualityDefinition(Quality.Bluray2160p) { Weight = 14, MinSize = 0, MaxSize = null },
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<i class="icon-sonarr-hdd"/>
|
<i class="icon-sonarr-hdd"/>
|
||||||
Import existing series on disk
|
Import existing series on disk
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-default col-md-2 col-xs-4 x-add-new"><i class="icon-sonarr-active hidden-xs"></i> Add New Series</button>
|
<button class="btn btn-default col-md-2 col-xs-4 x-add-new"><i class="icon-sonarr-active hidden-xs"></i> Add New Movie</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -14,4 +14,3 @@
|
|||||||
<div id="add-series-workspace"></div>
|
<div id="add-series-workspace"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
{{#if folder}}
|
{{#if folder}}
|
||||||
<input type="text" class="form-control x-series-search" value="{{folder.name}}">
|
<input type="text" class="form-control x-series-search" value="{{folder.name}}">
|
||||||
{{else}}
|
{{else}}
|
||||||
<input type="text" class="form-control x-series-search" placeholder="Start typing the name of series you want to add ...">
|
<input type="text" class="form-control x-series-search" placeholder="Start typing the name of the movie you want to add ...">
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -35,10 +35,11 @@ module.exports = NzbDroneCell.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_manualSearch : function() {
|
_manualSearch : function() {
|
||||||
|
console.warn(this.cellValue);
|
||||||
vent.trigger(vent.Commands.ShowEpisodeDetails, {
|
vent.trigger(vent.Commands.ShowEpisodeDetails, {
|
||||||
episode : this.cellValue,
|
episode : this.cellValue,
|
||||||
hideSeriesLink : true,
|
hideSeriesLink : true,
|
||||||
openingTab : 'search'
|
openingTab : 'search'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ var SeriesEditorLayout = require('./Series/Editor/SeriesEditorLayout');
|
|||||||
|
|
||||||
module.exports = NzbDroneController.extend({
|
module.exports = NzbDroneController.extend({
|
||||||
addSeries : function(action) {
|
addSeries : function(action) {
|
||||||
this.setTitle('Add Series');
|
this.setTitle('Add Movie');
|
||||||
this.showMainRegion(new AddSeriesLayout({ action : action }));
|
this.showMainRegion(new AddSeriesLayout({ action : action }));
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -56,4 +56,4 @@ module.exports = NzbDroneController.extend({
|
|||||||
this.setTitle('Series Editor');
|
this.setTitle('Series Editor');
|
||||||
this.showMainRegion(new SeriesEditorLayout());
|
this.showMainRegion(new SeriesEditorLayout());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Handlebars.registerHelper('poster', function() {
|
|||||||
if (!poster[0].url.match(/^https?:\/\//)) {
|
if (!poster[0].url.match(/^https?:\/\//)) {
|
||||||
return new Handlebars.SafeString('<img class="series-poster x-series-poster" {0}>'.format(Handlebars.helpers.defaultImg.call(null, poster[0].url, 250)));
|
return new Handlebars.SafeString('<img class="series-poster x-series-poster" {0}>'.format(Handlebars.helpers.defaultImg.call(null, poster[0].url, 250)));
|
||||||
} else {
|
} else {
|
||||||
var url = poster[0].url.replace(/^https?\:/, '');
|
var url = poster[0].url.replace(/^https?\:/, 'https://'); //IMDb posters need https to work, k?
|
||||||
return new Handlebars.SafeString('<img class="series-poster x-series-poster" {0}>'.format(Handlebars.helpers.defaultImg.call(null, url)));
|
return new Handlebars.SafeString('<img class="series-poster x-series-poster" {0}>'.format(Handlebars.helpers.defaultImg.call(null, url)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -28,7 +28,7 @@ Handlebars.registerHelper('imdbUrl', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Handlebars.registerHelper('tvdbUrl', function() {
|
Handlebars.registerHelper('tvdbUrl', function() {
|
||||||
return 'http://www.thetvdb.com/?tab=series&id=' + this.tvdbId;
|
return 'http://imdb.com/title/tt' + this.tvdbId;
|
||||||
});
|
});
|
||||||
|
|
||||||
Handlebars.registerHelper('tvRageUrl', function() {
|
Handlebars.registerHelper('tvRageUrl', function() {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="navbar-collapse collapse x-navbar-collapse">
|
<div class="navbar-collapse collapse x-navbar-collapse">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li><a href="{{UrlBase}}/" class="x-series-nav"><i class="icon-sonarr-navbar-icon icon-sonarr-navbar-series"></i> Series</a></li>
|
<li><a href="{{UrlBase}}/" class="x-series-nav"><i class="icon-sonarr-navbar-icon icon-sonarr-navbar-series"></i> Movies</a></li>
|
||||||
<li><a href="{{UrlBase}}/calendar" class="x-calendar-nav"><i class="icon-sonarr-navbar-icon icon-sonarr-navbar-calendar"></i> Calendar</a></li>
|
<li><a href="{{UrlBase}}/calendar" class="x-calendar-nav"><i class="icon-sonarr-navbar-icon icon-sonarr-navbar-calendar"></i> Calendar</a></li>
|
||||||
<li><a href="{{UrlBase}}/activity" class="x-activity-nav"><i class="icon-sonarr-navbar-icon icon-sonarr-navbar-activity"></i> Activity<span id="x-queue-count" class="navbar-info"></span></a></li>
|
<li><a href="{{UrlBase}}/activity" class="x-activity-nav"><i class="icon-sonarr-navbar-icon icon-sonarr-navbar-activity"></i> Activity<span id="x-queue-count" class="navbar-info"></span></a></li>
|
||||||
<li><a href="{{UrlBase}}/wanted" class="x-wanted-nav"><i class="icon-sonarr-navbar-icon icon-sonarr-navbar-wanted"></i> Wanted</a></li>
|
<li><a href="{{UrlBase}}/wanted" class="x-wanted-nav"><i class="icon-sonarr-navbar-icon icon-sonarr-navbar-wanted"></i> Wanted</a></li>
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
<div class="col-md-6 col-md-offset-3">
|
<div class="col-md-6 col-md-offset-3">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-addon"><i class="fa fa-search"></i></span>
|
<span class="input-group-addon"><i class="fa fa-search"></i></span>
|
||||||
<input type="text" class="col-md-6 form-control x-series-search" placeholder="Search the series in your library">
|
<input type="text" class="col-md-6 form-control x-series-search" placeholder="Search the movies in your library">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -29,9 +29,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<span class="series-info-links">
|
<span class="series-info-links">
|
||||||
<a href="{{traktUrl}}" class="label label-info">Trakt</a>
|
<!--<a href="{{traktUrl}}" class="label label-info">Trakt</a>
|
||||||
|
|
||||||
<a href="{{tvdbUrl}}" class="label label-info">The TVDB</a>
|
<a href="{{tvdbUrl}}" class="label label-info">The TVDB</a>-->
|
||||||
|
|
||||||
{{#if imdbId}}
|
{{#if imdbId}}
|
||||||
<a href="{{imdbUrl}}" class="label label-info">IMDB</a>
|
<a href="{{imdbUrl}}" class="label label-info">IMDB</a>
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ module.exports = Marionette.Layout.extend({
|
|||||||
refresh : '.x-refresh',
|
refresh : '.x-refresh',
|
||||||
rename : '.x-rename',
|
rename : '.x-rename',
|
||||||
search : '.x-search',
|
search : '.x-search',
|
||||||
poster : '.x-series-poster'
|
poster : '.x-series-poster',
|
||||||
|
manualSearch : '.x-manual-search'
|
||||||
},
|
},
|
||||||
|
|
||||||
events : {
|
events : {
|
||||||
@@ -41,7 +42,8 @@ module.exports = Marionette.Layout.extend({
|
|||||||
'click .x-edit' : '_editSeries',
|
'click .x-edit' : '_editSeries',
|
||||||
'click .x-refresh' : '_refreshSeries',
|
'click .x-refresh' : '_refreshSeries',
|
||||||
'click .x-rename' : '_renameSeries',
|
'click .x-rename' : '_renameSeries',
|
||||||
'click .x-search' : '_seriesSearch'
|
'click .x-search' : '_seriesSearch',
|
||||||
|
'click .x-manual-search' : '_manualSearchM'
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize : function() {
|
initialize : function() {
|
||||||
@@ -178,11 +180,11 @@ module.exports = Marionette.Layout.extend({
|
|||||||
if (self.model.get('id') !== seriesId) {
|
if (self.model.get('id') !== seriesId) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sceneSeasonNumber === undefined) {
|
if (sceneSeasonNumber === undefined) {
|
||||||
sceneSeasonNumber = seasonNumber;
|
sceneSeasonNumber = seasonNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _.where(self.model.get('alternateTitles'),
|
return _.where(self.model.get('alternateTitles'),
|
||||||
function(alt) {
|
function(alt) {
|
||||||
return alt.sceneSeasonNumber === sceneSeasonNumber || alt.seasonNumber === seasonNumber;
|
return alt.sceneSeasonNumber === sceneSeasonNumber || alt.seasonNumber === seasonNumber;
|
||||||
@@ -254,5 +256,17 @@ module.exports = Marionette.Layout.extend({
|
|||||||
} else {
|
} else {
|
||||||
$('body').removeClass('backdrop');
|
$('body').removeClass('backdrop');
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_manualSearchM : function() {
|
||||||
|
console.warn("Manual Search started");
|
||||||
|
console.warn(this.model.get("seriesId"));
|
||||||
|
console.warn(this.model)
|
||||||
|
console.warn(this.episodeCollection);
|
||||||
|
vent.trigger(vent.Commands.ShowEpisodeDetails, {
|
||||||
|
episode : this.episodeCollection.models[0],
|
||||||
|
hideSeriesLink : true,
|
||||||
|
openingTab : 'search'
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,23 +5,26 @@
|
|||||||
<div class="col-md-12 col-lg-10">
|
<div class="col-md-12 col-lg-10">
|
||||||
<div>
|
<div>
|
||||||
<h1 class="header-text">
|
<h1 class="header-text">
|
||||||
<i class="x-monitored" title="Toggle monitored state for entire series"/>
|
<i class="x-monitored" title="Toggle monitored state for movie"/>
|
||||||
{{title}}
|
{{title}}
|
||||||
<div class="series-actions pull-right">
|
<div class="series-actions pull-right">
|
||||||
<div class="x-episode-file-editor">
|
<div class="x-episode-file-editor">
|
||||||
<i class="icon-sonarr-episode-file" title="Modify episode files for series"/>
|
<i class="icon-sonarr-episode-file" title="Modify episode files for movie"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="x-refresh">
|
<div class="x-refresh">
|
||||||
<i class="icon-sonarr-refresh icon-can-spin" title="Update series info and scan disk"/>
|
<i class="icon-sonarr-refresh icon-can-spin" title="Update movie info and scan disk"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="x-rename">
|
<div class="x-rename">
|
||||||
<i class="icon-sonarr-rename" title="Preview rename for all episodes"/>
|
<i class="icon-sonarr-rename" title="Preview rename for all episodes"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="x-search">
|
<div class="x-search">
|
||||||
<i class="icon-sonarr-search" title="Search for monitored episodes in this series"/>
|
<i class="icon-sonarr-search" title="Search for movie"/>
|
||||||
|
</div>
|
||||||
|
<div class="x-manual-search">
|
||||||
|
<i class="icon-sonarr-search-manual" title="Manual Search"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="x-edit">
|
<div class="x-edit">
|
||||||
<i class="icon-sonarr-edit" title="Edit series"/>
|
<i class="icon-sonarr-edit" title="Edit movie"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</h1>
|
</h1>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<div class="col-md-4 col-md-offset-4">
|
<div class="col-md-4 col-md-offset-4">
|
||||||
<a href="/addseries" class='btn btn-lg btn-block btn-success x-add-series'>
|
<a href="/addseries" class='btn btn-lg btn-block btn-success x-add-series'>
|
||||||
<i class='icon-sonarr-add'></i>
|
<i class='icon-sonarr-add'></i>
|
||||||
Add Series
|
Add Movie
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ module.exports = Marionette.Layout.extend({
|
|||||||
collapse : true,
|
collapse : true,
|
||||||
items : [
|
items : [
|
||||||
{
|
{
|
||||||
title : 'Add Series',
|
title : 'Add Movie',
|
||||||
icon : 'icon-sonarr-add',
|
icon : 'icon-sonarr-add',
|
||||||
route : 'addseries'
|
route : 'addseries'
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user