1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-24 17:25:22 -04:00

Compare commits

...

43 Commits

Author SHA1 Message Date
vertigo235
487c5e22ce Moviefile, what movie file? (#466)
Send the moviefile object.
2017-01-26 21:46:55 +01:00
vertigo235
6efd63a292 Remove mofilefile id for now (#464) 2017-01-26 21:13:27 +01:00
Devin Buhl
5ebd035b1c Merge pull request #460 from vertigo235/notifications
Download Movie Quality & Formatting
2017-01-25 21:36:25 -05:00
vertigo235
d50514f8bc Download Movie Quality & Formatting
Fix downloaded movie quality and add space between movie name and quality.
2017-01-25 21:19:59 -05:00
Devin Buhl
a417ac2716 Merge pull request #459 from jrdnlc/develop
Update GeneralViewTemplate.hbs
2017-01-25 19:59:50 -05:00
Jordan
a89e662721 Update GeneralViewTemplate.hbs
Updated Wiki link to Radarr
2017-01-25 16:34:35 -08:00
Devin Buhl
4b1e4eecfb Merge pull request #456 from Radarr/patch/lang
Change lang in UI to what profile / lang they choose when they add a …
2017-01-25 18:07:26 -05:00
Devin Buhl
8e452f8b6d Change lang in UI to what profile / lang they choose when they add a movie 2017-01-25 18:00:46 -05:00
Devin Buhl
7e6db89eff Merge pull request #454 from vertigo235/notifications
Custom Script Fix: Parse movie not episode
2017-01-25 17:02:33 -05:00
vertigo235
16214e666b Custom Script Fix: Parse movie not episode 2017-01-25 16:55:36 -05:00
Devin Buhl
2b25ce237f Merge pull request #448 from hotio/patch-1
Fixes issue #447 (Notification Icon for Join)
2017-01-25 11:55:31 -05:00
Devin Buhl
f0a9955447 Merge pull request #450 from Radarr/patch/ahd
only use internal for RSS Sync
2017-01-25 11:55:19 -05:00
Devin Buhl
d0439296fe only use internal for RSS Sync 2017-01-25 11:40:04 -05:00
Devin Buhl
bc3fdb0f80 Merge pull request #449 from Radarr/patch/ahd
include only internal for AHD
2017-01-25 11:31:04 -05:00
Devin Buhl
186b2ada36 include only internal for AHD 2017-01-25 11:24:20 -05:00
Devin Buhl
577125f345 Merge pull request #435 from vertigo235/notifications
Notification Fixes/Updates
2017-01-25 10:56:11 -05:00
hotio
687dd8a05f Update JoinProxy.cs 2017-01-25 16:54:57 +01:00
hotio
81861c6121 Fixes issue #447 (Notification Icon for Join) 2017-01-25 16:50:38 +01:00
Devin Buhl
302462f48c Merge pull request #441 from schumi2004/rss-sync
fix new rss-sync threshold
2017-01-25 06:22:48 -05:00
schumi2004
d132f55830 fix new rss-sync threshold 2017-01-25 10:52:29 +01:00
vertigo235
6bbd64e59a Update Plex Movie Sections 2017-01-24 21:32:20 -05:00
vertigo235
290c4e1f2e Update slack for movies. 2017-01-24 17:56:10 -05:00
Devin Buhl
1112616514 Merge pull request #434 from Radarr/patch/dumb-metadata-erros
"fixed" error message
2017-01-24 17:35:27 -05:00
Devin Buhl
7fddbca4b7 "fixed" error message 2017-01-24 17:29:07 -05:00
Tim Turner
692841478c Add link to Activity -> History Tab (#408)
Fixes #365
2017-01-24 16:12:58 -05:00
Tim Turner
23232b9830 Allow renaming of movies that don't have an "Edition" (#432)
Fixes #405
2017-01-24 16:08:06 -05:00
Leonardo Galli
b886566b25 Update README.md 2017-01-24 21:30:24 +01:00
Devin Buhl
2c56d60678 #292 - Allow longer threshold for RSS Sync (#428)
* #292 - Allow longer threshold for RSS Sync

Update RSS Sync interval default to 60 minutes, and don't allow values below 60 or higher than 720 minutes (12 hours)

* allow minimum of 10 mintes
2017-01-24 21:26:51 +01:00
hotio
a0c8127ecf Update to favicon section, according to (#416)
* Update to favicon section, according to

http://realfavicongenerator.net/

* Windows start not as expected

* re-add msapplication-navbutton-color
2017-01-24 21:23:42 +01:00
Devin Buhl
05f61df59e update default sort order (#429)
#426
2017-01-24 21:16:22 +01:00
Devin Buhl
a0b80ad41a Add year to search (#425)
#417
2017-01-24 20:17:35 +01:00
vertigo235
9e7cb708bf Initial Notification Updates and Support (#401)
* Bare bones of notifications working.

* Add MovieDownload event handler

To allow Download notificaitons

* Update pushover text to indicate movie

* Initial Notification Support

On Download and On Grab notifications should work.

* Telegram Notification Text

* Update Custom Script For Movies

* Update PP script WiKi page

Also added wiki page to Radarr wiki.
2017-01-24 20:17:24 +01:00
Leonardo Galli
1ad4006819 Fixes an issue where movies with (year) at the beginning were recognized with a title of "(" 2017-01-24 10:02:20 +01:00
Leonardo Galli
5339f8efdc Blind fix to support seperator in movie tags. 2017-01-23 22:34:16 +01:00
Leonardo Galli
b273bfb10e Fix issue with certain audio streams. Should fix #404 2017-01-23 22:04:49 +01:00
Leonardo Galli
b2317ada1f Add {Tags} to renaming options 2017-01-23 18:52:27 +01:00
Leonardo Galli
336aee7fda Fix when libgdiplus isn't present. 2017-01-23 18:42:05 +01:00
Leonardo Galli
9e7468d723 Merged branch develop into develop 2017-01-23 16:09:19 +01:00
Leonardo Galli
f05ee13206 Fix issue where monitored movies were still downloaded. Fixes #326 2017-01-23 16:09:11 +01:00
Devin Buhl
2b579eb0d3 Merge pull request #385 from hotio/ui-logos
Ui logos
2017-01-22 23:21:23 -05:00
hotio
791121fa06 Proper ico and favicon 2017-01-22 23:32:01 +01:00
hotio
cc3c2533fa Updated ico files 2017-01-22 21:31:20 +01:00
hotio
f8162b34f2 Update UI logos 2017-01-22 21:07:12 +01:00
110 changed files with 628 additions and 140 deletions

View File

@@ -61,6 +61,8 @@ To connect to the UI, fire up your browser and open <http://localhost:7878> or <
* Importing movies from various online sources, such as IMDb Watchlists (A complete list can be found [here](https://github.com/Radarr/Radarr/issues/114))
* Full integration with Kodi, Plex (notification, library update, metadata)
##Feature Requests
[![Feature Requests](http://feathub.com/Radarr/Radarr?format=svg)](http://feathub.com/Radarr/Radarr)
## Configuring Development Environment

View File

@@ -5,7 +5,7 @@ namespace NzbDrone.Api.Validation
public class RssSyncIntervalValidator : PropertyValidator
{
public RssSyncIntervalValidator()
: base("Must be between 10 and 120 or 0 to disable")
: base("Must be between 10 and 720 or 0 to disable")
{
}
@@ -23,7 +23,7 @@ namespace NzbDrone.Api.Validation
return true;
}
if (value >= 10 && value <= 120)
if (value >= 10 && value <= 720)
{
return true;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View File

@@ -32,7 +32,7 @@ namespace NzbDrone.Core.Test.Configuration
[Test]
public void Get_value_should_return_default_when_no_value()
{
Subject.RssSyncInterval.Should().Be(15);
Subject.RssSyncInterval.Should().Be(60);
}
[Test]
@@ -47,7 +47,7 @@ namespace NzbDrone.Core.Test.Configuration
public void get_value_with_out_persist_should_not_store_default_value()
{
var interval = Subject.RssSyncInterval;
interval.Should().Be(15);
interval.Should().Be(60);
Mocker.GetMock<IConfigRepository>().Verify(c => c.Insert(It.IsAny<Config>()), Times.Never());
}

View File

@@ -100,7 +100,7 @@ namespace NzbDrone.Core.Configuration
public int RssSyncInterval
{
get { return GetValueInt("RssSyncInterval", 15); }
get { return GetValueInt("RssSyncInterval", 60); }
set { SetValue("RssSyncInterval", value); }
}

View File

@@ -19,7 +19,21 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
public Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
{
throw new NotImplementedException();
if (searchCriteria != null)
{
if (searchCriteria.UserInvokedSearch)
{
_logger.Debug("Skipping monitored check during search");
return Decision.Accept();
}
}
if (!subject.Movie.Monitored)
{
return Decision.Reject("Movie is not monitored");
}
return Decision.Accept();
}
public virtual Decision IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria)

View File

@@ -102,13 +102,13 @@ namespace NzbDrone.Core.Extras
public void Handle(MediaCoversUpdatedEvent message)
{
var series = message.Series;
var episodeFiles = GetEpisodeFiles(series.Id);
//var series = message.Series;
//var episodeFiles = GetEpisodeFiles(series.Id);
foreach (var extraFileManager in _extraFileManagers)
{
extraFileManager.CreateAfterSeriesScan(series, episodeFiles);
}
//foreach (var extraFileManager in _extraFileManagers)
//{
// extraFileManager.CreateAfterSeriesScan(series, episodeFiles);
//}
}
//TODO: Implementing this will fix a lot of our warning exceptions

View File

@@ -54,13 +54,19 @@ namespace NzbDrone.Core.Indexers.AwesomeHD
private IEnumerable<IndexerRequest> GetRequest(string searchParameters)
{
var onlyInternal = "";
if (Settings.Internal)
{
onlyInternal = "&internal=true";
}
if (searchParameters != null)
{
yield return new IndexerRequest(string.Format("{0}/searchapi.php?action=imdbsearch&passkey={1}&imdb={2}", Settings.BaseUrl.Trim().TrimEnd('/'), Settings.Passkey.Trim(), searchParameters), HttpAccept.Rss);
yield return new IndexerRequest($"{Settings.BaseUrl.Trim().TrimEnd('/')}/searchapi.php?action=imdbsearch&passkey={Settings.Passkey.Trim()}&imdb={searchParameters}", HttpAccept.Rss);
}
else
{
yield return new IndexerRequest(string.Format("{0}/searchapi.php?action=latestmovies&passkey={1}", Settings.BaseUrl.Trim().TrimEnd('/'), Settings.Passkey.Trim()), HttpAccept.Rss);
yield return new IndexerRequest($"{Settings.BaseUrl.Trim().TrimEnd('/')}/searchapi.php?action=latestmovies&passkey={Settings.Passkey.Trim()}{onlyInternal}", HttpAccept.Rss);
}
}

View File

@@ -29,6 +29,9 @@ namespace NzbDrone.Core.Indexers.AwesomeHD
[FieldDefinition(1, Label = "Passkey")]
public string Passkey { get; set; }
[FieldDefinition(2, Type = FieldType.Checkbox, Label = "Require Internal", HelpText = "Will only include internal releases for RSS Sync.")]
public bool Internal { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));

View File

@@ -46,11 +46,18 @@ namespace NzbDrone.Core.MediaCover
{
try
{
GdiPlusInterop.CheckGdiPlus();
using (var bmp = new Bitmap(filename))
{
}
return true;
}
catch (DllNotFoundException ex)
{
_logger.Error(ex, "Could not find libgdiplus. Cannot test if image is corrupt.");
return true;
}
catch (Exception ex)
{
_logger.Debug(ex, "Corrupted image found at: {0}. Redownloading...", filename);

View File

@@ -49,7 +49,7 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
}
return
AudioChannelPositions.Replace(" / ", "$")
AudioChannelPositions.Replace("Object Based /", "").Replace(" / ", "$")
.Split('$')
.First()
.Split('/')

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NzbDrone.Core.Profiles;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.MetadataSource
@@ -7,6 +8,6 @@ namespace NzbDrone.Core.MetadataSource
public interface IProvideMovieInfo
{
Movie GetMovieInfo(string ImdbId);
Movie GetMovieInfo(int TmdbId);
Movie GetMovieInfo(int TmdbId, Profile profile);
}
}

View File

@@ -14,6 +14,8 @@ using NzbDrone.Core.Tv;
using Newtonsoft.Json;
using System.Text.RegularExpressions;
using System.Text;
using NzbDrone.Core.Parser;
using NzbDrone.Core.Profiles;
namespace NzbDrone.Core.MetadataSource.SkyHook
{
@@ -67,25 +69,39 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
return new Tuple<Series, List<Episode>>(series, episodes.ToList());
}
public Movie GetMovieInfo(int TmdbId)
public Movie GetMovieInfo(int TmdbId, Profile profile = null)
{
var langCode = profile != null ? IsoLanguages.Get(profile.Language).TwoLetterCode : "us";
var request = _movieBuilder.Create()
.SetSegment("route", "movie")
.SetSegment("id", TmdbId.ToString())
.SetSegment("secondaryRoute", "")
.AddQueryParam("append_to_response", "alternative_titles,release_dates,videos")
.AddQueryParam("country", "US")
.AddQueryParam("language", langCode.ToUpper())
// .AddQueryParam("country", "US")
.Build();
request.AllowAutoRedirect = true;
request.SuppressHttpError = true;
var response = _httpClient.Get<MovieResourceRoot>(request);
var resource = response.Resource;
var movie = new Movie();
foreach (var alternativeTitle in resource.alternative_titles.titles)
{
if (alternativeTitle.iso_3166_1.ToLower() == langCode)
{
movie.AlternativeTitles.Add(alternativeTitle.title);
}
else if (alternativeTitle.iso_3166_1.ToLower() == "us")
{
movie.AlternativeTitles.Add(alternativeTitle.title);
}
}
movie.TmdbId = TmdbId;
movie.ImdbId = resource.imdb_id;
movie.Title = resource.title;
@@ -106,10 +122,10 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
movie.Images.Add(_configService.GetCoverForURL(resource.backdrop_path, MediaCoverTypes.Banner));
movie.Runtime = resource.runtime;
foreach(Title title in resource.alternative_titles.titles)
{
movie.AlternativeTitles.Add(title.title);
}
//foreach(Title title in resource.alternative_titles.titles)
//{
// movie.AlternativeTitles.Add(title.title);
//}
foreach(ReleaseDates releaseDates in resource.release_dates.results)
{
@@ -149,7 +165,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
{
movie.Status = MovieStatusType.Announced;
}
if (resource.videos != null)
{
foreach (Video video in resource.videos.results)

View File

@@ -18,18 +18,22 @@ namespace NzbDrone.Core.Notifications.Boxcar
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Episode Grabbed";
const string title = "Movie Grabbed";
_proxy.SendNotification(title, grabMessage.Message, Settings);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Episode Downloaded";
const string title = "Movie Downloaded";
_proxy.SendNotification(title, message.Message, Settings);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
@@ -24,75 +25,65 @@ namespace NzbDrone.Core.Notifications.CustomScript
_logger = logger;
}
public override string Link => "https://github.com/Sonarr/Sonarr/wiki/Custom-Post-Processing-Scripts";
public override string Link => "https://github.com/Radarr/Radarr/wiki/Custom-Post-Processing-Scripts";
public override void OnGrab(GrabMessage message)
{
var series = message.Series;
var remoteEpisode = message.Episode;
var releaseGroup = remoteEpisode.ParsedEpisodeInfo.ReleaseGroup;
var movie = message.Movie;
var remoteMovie = message.RemoteMovie;
var releaseGroup = remoteMovie.ParsedMovieInfo.ReleaseGroup;
var environmentVariables = new StringDictionary();
environmentVariables.Add("Sonarr_EventType", "Grab");
environmentVariables.Add("Sonarr_Series_Id", series.Id.ToString());
environmentVariables.Add("Sonarr_Series_Title", series.Title);
environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString());
environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString());
environmentVariables.Add("Sonarr_Release_EpisodeCount", remoteEpisode.Episodes.Count.ToString());
environmentVariables.Add("Sonarr_Release_SeasonNumber", remoteEpisode.ParsedEpisodeInfo.SeasonNumber.ToString());
environmentVariables.Add("Sonarr_Release_EpisodeNumbers", string.Join(",", remoteEpisode.Episodes.Select(e => e.EpisodeNumber)));
environmentVariables.Add("Sonarr_Release_Title", remoteEpisode.Release.Title);
environmentVariables.Add("Sonarr_Release_Indexer", remoteEpisode.Release.Indexer);
environmentVariables.Add("Sonarr_Release_Size", remoteEpisode.Release.Size.ToString());
environmentVariables.Add("Sonarr_Release_ReleaseGroup", releaseGroup);
environmentVariables.Add("Radarr_EventType", "Grab");
environmentVariables.Add("Radarr_Movie_Id", movie.Id.ToString());
environmentVariables.Add("Radarr_Movie_Title", movie.Title);
environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId.ToString());
environmentVariables.Add("Radarr_Release_Title", remoteMovie.Release.Title);
environmentVariables.Add("Radarr_Release_Indexer", remoteMovie.Release.Indexer);
environmentVariables.Add("Radarr_Release_Size", remoteMovie.Release.Size.ToString());
environmentVariables.Add("Radarr_Release_ReleaseGroup", releaseGroup);
ExecuteScript(environmentVariables);
}
public override void OnDownload(DownloadMessage message)
{
var series = message.Series;
var episodeFile = message.EpisodeFile;
var movie = message.Movie;
var movieFile = message.MovieFile;
var sourcePath = message.SourcePath;
var environmentVariables = new StringDictionary();
environmentVariables.Add("Sonarr_EventType", "Download");
environmentVariables.Add("Sonarr_Series_Id", series.Id.ToString());
environmentVariables.Add("Sonarr_Series_Title", series.Title);
environmentVariables.Add("Sonarr_Series_Path", series.Path);
environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString());
environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString());
environmentVariables.Add("Sonarr_EpisodeFile_Id", episodeFile.Id.ToString());
environmentVariables.Add("Sonarr_EpisodeFile_EpisodeCount", episodeFile.Episodes.Value.Count.ToString());
environmentVariables.Add("Sonarr_EpisodeFile_RelativePath", episodeFile.RelativePath);
environmentVariables.Add("Sonarr_EpisodeFile_Path", Path.Combine(series.Path, episodeFile.RelativePath));
environmentVariables.Add("Sonarr_EpisodeFile_SeasonNumber", episodeFile.SeasonNumber.ToString());
environmentVariables.Add("Sonarr_EpisodeFile_EpisodeNumbers", string.Join(",", episodeFile.Episodes.Value.Select(e => e.EpisodeNumber)));
environmentVariables.Add("Sonarr_EpisodeFile_EpisodeAirDates", string.Join(",", episodeFile.Episodes.Value.Select(e => e.AirDate)));
environmentVariables.Add("Sonarr_EpisodeFile_EpisodeAirDatesUtc", string.Join(",", episodeFile.Episodes.Value.Select(e => e.AirDateUtc)));
environmentVariables.Add("Sonarr_EpisodeFile_EpisodeTitles", string.Join("|", episodeFile.Episodes.Value.Select(e => e.Title)));
environmentVariables.Add("Sonarr_EpisodeFile_Quality", episodeFile.Quality.Quality.Name);
environmentVariables.Add("Sonarr_EpisodeFile_QualityVersion", episodeFile.Quality.Revision.Version.ToString());
environmentVariables.Add("Sonarr_EpisodeFile_ReleaseGroup", episodeFile.ReleaseGroup ?? string.Empty);
environmentVariables.Add("Sonarr_EpisodeFile_SceneName", episodeFile.SceneName ?? string.Empty);
environmentVariables.Add("Sonarr_EpisodeFile_SourcePath", sourcePath);
environmentVariables.Add("Sonarr_EpisodeFile_SourceFolder", Path.GetDirectoryName(sourcePath));
environmentVariables.Add("Radarr_EventType", "Download");
environmentVariables.Add("Radarr_Movie_Id", movie.Id.ToString());
environmentVariables.Add("Radarr_Movie_Title", movie.Title);
environmentVariables.Add("Radarr_Movie_ImdbId", movie.ImdbId.ToString());
environmentVariables.Add("Radarr_MovieFile_Id", movieFile.Id.ToString());
environmentVariables.Add("Radarr_MovieFile_RelativePath", movieFile.RelativePath);
environmentVariables.Add("Radarr_MovieFile_Path", Path.Combine(movie.Path, movieFile.RelativePath));
environmentVariables.Add("Radarr_MovieFile_Quality", movieFile.Quality.Quality.Name);
environmentVariables.Add("Radarr_MovieFile_QualityVersion", movieFile.Quality.Revision.Version.ToString());
environmentVariables.Add("Radarr_MovieFile_ReleaseGroup", movieFile.ReleaseGroup ?? string.Empty);
environmentVariables.Add("Radarr_MovieFile_SceneName", movieFile.SceneName ?? string.Empty);
environmentVariables.Add("Radarr_MovieFile_SourcePath", sourcePath);
environmentVariables.Add("Radarr_MovieFile_SourceFolder", Path.GetDirectoryName(sourcePath));
ExecuteScript(environmentVariables);
}
public override void OnMovieRename(Movie movie)
{
var environmentVariables = new StringDictionary();
environmentVariables.Add("Radarr_EventType", "Rename");
environmentVariables.Add("Radarr_Movie_Id", movie.Id.ToString());
environmentVariables.Add("Radarr_Movie_Title", movie.Title);
environmentVariables.Add("Radarr_Movie_Path", movie.Path);
environmentVariables.Add("Radarr_Movie_TvdbId", movie.ImdbId.ToString());
ExecuteScript(environmentVariables);
}
public override void OnRename(Series series)
{
var environmentVariables = new StringDictionary();
environmentVariables.Add("Sonarr_EventType", "Rename");
environmentVariables.Add("Sonarr_Series_Id", series.Id.ToString());
environmentVariables.Add("Sonarr_Series_Title", series.Title);
environmentVariables.Add("Sonarr_Series_Path", series.Path);
environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString());
environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString());
ExecuteScript(environmentVariables);
}
public override string Name => "Custom Script";

View File

@@ -8,8 +8,11 @@ namespace NzbDrone.Core.Notifications
{
public string Message { get; set; }
public Series Series { get; set; }
public Movie Movie { get; set; }
public EpisodeFile EpisodeFile { get; set; }
public List<EpisodeFile> OldFiles { get; set; }
public MovieFile MovieFile { get; set; }
public List<MovieFile> OldMovieFiles { get; set; }
public string SourcePath { get; set; }
public override string ToString()

View File

@@ -18,7 +18,7 @@ namespace NzbDrone.Core.Notifications.Email
public override void OnGrab(GrabMessage grabMessage)
{
const string subject = "Radarr [TV] - Grabbed";
const string subject = "Radarr [Movie] - Grabbed";
var body = string.Format("{0} sent to queue.", grabMessage.Message);
_emailService.SendEmail(Settings, subject, body);
@@ -26,12 +26,16 @@ namespace NzbDrone.Core.Notifications.Email
public override void OnDownload(DownloadMessage message)
{
const string subject = "Radarr [TV] - Downloaded";
const string subject = "Radarr [Movie] - Downloaded";
var body = string.Format("{0} Downloaded and sorted.", message.Message);
_emailService.SendEmail(Settings, subject, body);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -8,6 +8,8 @@ namespace NzbDrone.Core.Notifications
{
public string Message { get; set; }
public Series Series { get; set; }
public Movie Movie { get; set; }
public RemoteMovie RemoteMovie { get; set; }
public RemoteEpisode Episode { get; set; }
public QualityModel Quality { get; set; }

View File

@@ -18,18 +18,22 @@ namespace NzbDrone.Core.Notifications.Growl
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Episode Grabbed";
const string title = "Movie Grabbed";
_growlService.SendNotification(title, grabMessage.Message, "GRAB", Settings.Host, Settings.Port, Settings.Password);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Episode Downloaded";
const string title = "Movie Downloaded";
_growlService.SendNotification(title, message.Message, "DOWNLOAD", Settings.Host, Settings.Port, Settings.Password);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -10,6 +10,7 @@ namespace NzbDrone.Core.Notifications
void OnGrab(GrabMessage grabMessage);
void OnDownload(DownloadMessage message);
void OnRename(Series series);
void OnMovieRename(Movie movie);
bool SupportsOnGrab { get; }
bool SupportsOnDownload { get; }
bool SupportsOnUpgrade { get; }

View File

@@ -18,18 +18,22 @@ namespace NzbDrone.Core.Notifications.Join
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Radarr - Episode Grabbed";
const string title = "Radarr - Movie Grabbed";
_proxy.SendNotification(title, grabMessage.Message, Settings);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Radarr - Episode Downloaded";
const string title = "Radarr - Movie Downloaded";
_proxy.SendNotification(title, message.Message, Settings);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -87,7 +87,7 @@ namespace NzbDrone.Core.Notifications.Join
request.AddParameter("apikey", settings.ApiKey);
request.AddParameter("title", title);
request.AddParameter("text", message);
request.AddParameter("icon", "https://cdn.rawgit.com/Sonarr/Sonarr/develop/Logo/256.png"); // Use the Sonarr logo.
request.AddParameter("icon", "https://cdn.rawgit.com/Radarr/Radarr/develop/Logo/256.png"); // Use the Radarr logo.
var response = client.ExecuteAndValidate(request);
var res = Json.Deserialize<JoinResponseModel>(response.Content);

View File

@@ -18,7 +18,7 @@ namespace NzbDrone.Core.Notifications.MediaBrowser
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Radarr - Grabbed";
const string title = "Radarr - Movie Grabbed";
if (Settings.Notify)
{
@@ -28,7 +28,7 @@ namespace NzbDrone.Core.Notifications.MediaBrowser
public override void OnDownload(DownloadMessage message)
{
const string title = "Radarr - Downloaded";
const string title = "Radarr - Movie Downloaded";
if (Settings.Notify)
{
@@ -41,6 +41,10 @@ namespace NzbDrone.Core.Notifications.MediaBrowser
}
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
if (Settings.UpdateLibrary)

View File

@@ -24,6 +24,7 @@ namespace NzbDrone.Core.Notifications
public abstract void OnGrab(GrabMessage grabMessage);
public abstract void OnDownload(DownloadMessage message);
public abstract void OnRename(Series series);
public abstract void OnMovieRename(Movie movie);
public virtual bool SupportsOnGrab => true;
public virtual bool SupportsOnDownload => true;

View File

@@ -15,7 +15,11 @@ namespace NzbDrone.Core.Notifications
public class NotificationService
: IHandle<EpisodeGrabbedEvent>,
IHandle<EpisodeDownloadedEvent>,
IHandle<SeriesRenamedEvent>
IHandle<SeriesRenamedEvent>,
IHandle<MovieRenamedEvent>,
IHandle<MovieGrabbedEvent>,
IHandle<MovieDownloadedEvent>
{
private readonly INotificationFactory _notificationFactory;
private readonly Logger _logger;
@@ -67,6 +71,41 @@ namespace NzbDrone.Core.Notifications
qualityString);
}
private string GetMessage(Movie movie, QualityModel quality)
{
var qualityString = quality.Quality.ToString();
if (quality.Revision.Version > 1)
{
qualityString += " Proper";
}
return string.Format("{0} [{1}]",
movie.Title,
qualityString);
}
private bool ShouldHandleMovie(ProviderDefinition definition, Movie movie)
{
var notificationDefinition = (NotificationDefinition)definition;
if (notificationDefinition.Tags.Empty())
{
_logger.Debug("No tags set for this notification.");
return true;
}
if (notificationDefinition.Tags.Intersect(movie.Tags).Any())
{
_logger.Debug("Notification and series have one or more matching tags.");
return true;
}
//TODO: this message could be more clear
_logger.Debug("{0} does not have any tags that match {1}'s tags", notificationDefinition.Name, movie.Title);
return false;
}
private bool ShouldHandleSeries(ProviderDefinition definition, Series series)
{
var notificationDefinition = (NotificationDefinition) definition;
@@ -112,6 +151,33 @@ namespace NzbDrone.Core.Notifications
}
}
public void Handle(MovieGrabbedEvent message)
{
var grabMessage = new GrabMessage
{
Message = GetMessage(message.Movie.Movie, message.Movie.ParsedMovieInfo.Quality),
Series = null,
Quality = message.Movie.ParsedMovieInfo.Quality,
Episode = null,
Movie = message.Movie.Movie,
RemoteMovie = message.Movie
};
foreach (var notification in _notificationFactory.OnGrabEnabled())
{
try
{
if (!ShouldHandleMovie(notification.Definition, message.Movie.Movie)) continue;
notification.OnGrab(grabMessage);
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send OnGrab notification to: " + notification.Definition.Name);
}
}
}
public void Handle(EpisodeDownloadedEvent message)
{
var downloadMessage = new DownloadMessage();
@@ -141,6 +207,38 @@ namespace NzbDrone.Core.Notifications
}
}
public void Handle(MovieDownloadedEvent message)
{
var downloadMessage = new DownloadMessage();
downloadMessage.Message = GetMessage(message.Movie.Movie, message.Movie.Quality);
downloadMessage.Series = null;
downloadMessage.EpisodeFile = null;
downloadMessage.MovieFile = message.MovieFile;
downloadMessage.Movie = message.Movie.Movie;
downloadMessage.OldFiles = null;
downloadMessage.OldMovieFiles = message.OldFiles;
downloadMessage.SourcePath = message.Movie.Path;
foreach (var notification in _notificationFactory.OnDownloadEnabled())
{
try
{
if (ShouldHandleMovie(notification.Definition, message.Movie.Movie))
{
if (downloadMessage.OldMovieFiles.Empty() || ((NotificationDefinition)notification.Definition).OnUpgrade)
{
notification.OnDownload(downloadMessage);
}
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to send OnDownload notification to: " + notification.Definition.Name);
}
}
}
public void Handle(SeriesRenamedEvent message)
{
foreach (var notification in _notificationFactory.OnRenameEnabled())
@@ -159,5 +257,24 @@ namespace NzbDrone.Core.Notifications
}
}
}
public void Handle(MovieRenamedEvent message)
{
foreach (var notification in _notificationFactory.OnRenameEnabled())
{
try
{
if (ShouldHandleMovie(notification.Definition, message.Movie))
{
notification.OnMovieRename(message.Movie);
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to send OnRename notification to: " + notification.Definition.Name);
}
}
}
}
}

View File

@@ -19,18 +19,22 @@ namespace NzbDrone.Core.Notifications.NotifyMyAndroid
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Episode Grabbed";
const string title = "Movie Grabbed";
_proxy.SendNotification(title, grabMessage.Message, Settings.ApiKey, (NotifyMyAndroidPriority)Settings.Priority);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Episode Downloaded";
const string title = "Movie Downloaded";
_proxy.SendNotification(title, message.Message, Settings.ApiKey, (NotifyMyAndroidPriority)Settings.Priority);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -28,6 +28,10 @@ namespace NzbDrone.Core.Notifications.Plex
_plexClientService.Notify(Settings, header, message.Message);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -35,6 +35,10 @@ namespace NzbDrone.Core.Notifications.Plex
Notify(Settings, header, message.Message);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{

View File

@@ -22,19 +22,24 @@ namespace NzbDrone.Core.Notifications.Plex
public override void OnDownload(DownloadMessage message)
{
UpdateIfEnabled(message.Series);
UpdateIfEnabled(message.Movie);
}
public override void OnMovieRename(Movie movie)
{
UpdateIfEnabled(movie);
}
public override void OnRename(Series series)
{
UpdateIfEnabled(series);
//UpdateIfEnabled(movie);
}
private void UpdateIfEnabled(Series series)
private void UpdateIfEnabled(Movie movie)
{
if (Settings.UpdateLibrary)
{
_plexServerService.UpdateLibrary(series, Settings);
_plexServerService.UpdateMovieSections(movie, Settings);
}
}

View File

@@ -17,6 +17,7 @@ namespace NzbDrone.Core.Notifications.Plex
public interface IPlexServerProxy
{
List<PlexSection> GetTvSections(PlexServerSettings settings);
List<PlexSection> GetMovieSections(PlexServerSettings settings);
void Update(int sectionId, PlexServerSettings settings);
void UpdateSeries(int metadataId, PlexServerSettings settings);
string Version(PlexServerSettings settings);
@@ -66,6 +67,37 @@ namespace NzbDrone.Core.Notifications.Plex
.ToList();
}
public List<PlexSection> GetMovieSections(PlexServerSettings settings)
{
var request = GetPlexServerRequest("library/sections", Method.GET, settings);
var client = GetPlexServerClient(settings);
var response = client.Execute(request);
_logger.Trace("Sections response: {0}", response.Content);
CheckForError(response, settings);
if (response.Content.Contains("_children"))
{
return Json.Deserialize<PlexMediaContainerLegacy>(response.Content)
.Sections
.Where(d => d.Type == "movie")
.Select(s => new PlexSection
{
Id = s.Id,
Language = s.Language,
Locations = s.Locations,
Type = s.Type
})
.ToList();
}
return Json.Deserialize<PlexResponse<PlexSectionsContainer>>(response.Content)
.MediaContainer
.Sections
.Where(d => d.Type == "movie")
.ToList();
}
public void Update(int sectionId, PlexServerSettings settings)
{
var resource = string.Format("library/sections/{0}/refresh", sectionId);

View File

@@ -14,6 +14,7 @@ namespace NzbDrone.Core.Notifications.Plex
public interface IPlexServerService
{
void UpdateLibrary(Series series, PlexServerSettings settings);
void UpdateMovieSections(Movie movie, PlexServerSettings settings);
ValidationFailure Test(PlexServerSettings settings);
}
@@ -62,11 +63,43 @@ namespace NzbDrone.Core.Notifications.Plex
}
}
public void UpdateMovieSections(Movie movie, PlexServerSettings settings)
{
try
{
_logger.Debug("Sending Update Request to Plex Server");
var version = _versionCache.Get(settings.Host, () => GetVersion(settings), TimeSpan.FromHours(2));
ValidateVersion(version);
var sections = GetSections(settings);
var partialUpdates = _partialUpdateCache.Get(settings.Host, () => PartialUpdatesAllowed(settings, version), TimeSpan.FromHours(2));
// TODO: Investiate partial updates later, for now just update all movie sections...
//if (partialUpdates)
//{
// UpdatePartialSection(series, sections, settings);
//}
//else
//{
sections.ForEach(s => UpdateSection(s.Id, settings));
//}
}
catch (Exception ex)
{
_logger.Warn(ex, "Failed to Update Plex host: " + settings.Host);
throw;
}
}
private List<PlexSection> GetSections(PlexServerSettings settings)
{
_logger.Debug("Getting sections from Plex host: {0}", settings.Host);
return _plexServerProxy.GetTvSections(settings).ToList();
return _plexServerProxy.GetMovieSections(settings).ToList();
}
private bool PartialUpdatesAllowed(PlexServerSettings settings, Version version)

View File

@@ -19,18 +19,22 @@ namespace NzbDrone.Core.Notifications.Prowl
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Episode Grabbed";
const string title = "Movie Grabbed";
_prowlService.SendNotification(title, grabMessage.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Episode Downloaded";
const string title = "Movie Downloaded";
_prowlService.SendNotification(title, message.Message, Settings.ApiKey, (NotificationPriority)Settings.Priority);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -18,18 +18,22 @@ namespace NzbDrone.Core.Notifications.PushBullet
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Radarr - Episode Grabbed";
const string title = "Radarr - Movie Grabbed";
_proxy.SendNotification(title, grabMessage.Message, Settings);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Radarr - Episode Downloaded";
const string title = "Radarr - Movie Downloaded";
_proxy.SendNotification(title, message.Message, Settings);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -18,18 +18,22 @@ namespace NzbDrone.Core.Notifications.Pushalot
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Episode Grabbed";
const string title = "Movie Grabbed";
_proxy.SendNotification(title, grabMessage.Message, Settings);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Episode Downloaded";
const string title = "Movie Downloaded";
_proxy.SendNotification(title, message.Message, Settings);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -18,18 +18,22 @@ namespace NzbDrone.Core.Notifications.Pushover
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Episode Grabbed";
const string title = "Movie Grabbed";
_proxy.SendNotification(title, grabMessage.Message, Settings);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Episode Downloaded";
const string title = "Movie Downloaded";
_proxy.SendNotification(title, message.Message, Settings);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -37,7 +37,7 @@ namespace NzbDrone.Core.Notifications.Slack
new Attachment
{
Fallback = message.Message,
Title = message.Series.Title,
Title = message.Movie.Title,
Text = message.Message,
Color = "warning"
}
@@ -59,7 +59,7 @@ namespace NzbDrone.Core.Notifications.Slack
new Attachment
{
Fallback = message.Message,
Title = message.Series.Title,
Title = message.Movie.Title,
Text = message.Message,
Color = "good"
}
@@ -69,6 +69,25 @@ namespace NzbDrone.Core.Notifications.Slack
NotifySlack(payload);
}
public override void OnMovieRename(Movie movie)
{
var payload = new SlackPayload
{
IconEmoji = Settings.Icon,
Username = Settings.Username,
Text = "Renamed",
Attachments = new List<Attachment>
{
new Attachment
{
Title = movie.Title,
}
}
};
NotifySlack(payload);
}
public override void OnRename(Series series)
{
var payload = new SlackPayload

View File

@@ -42,6 +42,10 @@ namespace NzbDrone.Core.Notifications.Synology
}
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
if (Settings.UpdateLibrary)

View File

@@ -18,18 +18,22 @@ namespace NzbDrone.Core.Notifications.Telegram
public override void OnGrab(GrabMessage grabMessage)
{
const string title = "Episode Grabbed";
const string title = "Movie Grabbed";
_proxy.SendNotification(title, grabMessage.Message, Settings);
}
public override void OnDownload(DownloadMessage message)
{
const string title = "Episode Downloaded";
const string title = "Movie Downloaded";
_proxy.SendNotification(title, message.Message, Settings);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -29,6 +29,10 @@ namespace NzbDrone.Core.Notifications.Twitter
_twitterService.SendNotification($"Imported: {message.Message}", Settings);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
}

View File

@@ -27,6 +27,10 @@ namespace NzbDrone.Core.Notifications.Webhook
_service.OnDownload(message.Series, message.EpisodeFile, Settings);
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
_service.OnRename(series, Settings);

View File

@@ -36,6 +36,10 @@ namespace NzbDrone.Core.Notifications.Xbmc
UpdateAndClean(message.Series, message.OldFiles.Any());
}
public override void OnMovieRename(Movie movie)
{
}
public override void OnRename(Series series)
{
UpdateAndClean(series);

View File

@@ -41,6 +41,9 @@ namespace NzbDrone.Core.Organizer
private static readonly Regex EpisodeRegex = new Regex(@"(?<episode>\{episode(?:\:0+)?})",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex TagsRegex = new Regex(@"(?<tags>\{tags(?:\:0+)?})",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex SeasonRegex = new Regex(@"(?<season>\{season(?:\:0+)?})",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
@@ -165,6 +168,7 @@ namespace NzbDrone.Core.Organizer
AddQualityTokens(tokenHandlers, movie, movieFile);
AddMediaInfoTokens(tokenHandlers, movieFile);
AddMovieFileTokens(tokenHandlers, movieFile);
AddTagsTokens(tokenHandlers, movieFile);
var fileName = ReplaceTokens(pattern, tokenHandlers, namingConfig).Trim();
fileName = FileNameCleanupRegex.Replace(fileName, match => match.Captures[0].Value[0].ToString());
@@ -491,6 +495,14 @@ namespace NzbDrone.Core.Organizer
tokenHandlers["{Movie Title The}"] = m => TitleThe(movie.Title);
}
private void AddTagsTokens(Dictionary<string, Func<TokenMatch, string>> tokenHandlers, MovieFile movieFile)
{
if (movieFile.Edition.IsNotNullOrWhiteSpace())
{
tokenHandlers["{Edition Tags}"] = m => CultureInfo.CurrentCulture.TextInfo.ToTitleCase(movieFile.Edition.ToLower());
}
}
private void AddReleaseDateTokens(Dictionary<string, Func<TokenMatch, string>> tokenHandlers, int releaseYear)
{
tokenHandlers["{Release Year}"] = m => string.Format("{0}", releaseYear.ToString()); //Do I need m.CustomFormat?

View File

@@ -125,7 +125,8 @@ namespace NzbDrone.Core.Organizer
RelativePath = "Movie.Title.2010.1080p.BluRay.DTS.x264-EVOLVE.mkv",
SceneName = "Movie.Title.2010.1080p.BluRay.DTS.x264-EVOLVE",
ReleaseGroup = "RlsGrp",
MediaInfo = mediaInfo
MediaInfo = mediaInfo,
Edition = "Ultimate extended edition",
};
_singleEpisodeFile = new EpisodeFile

View File

@@ -12,5 +12,6 @@
ThreeLetterCode = threeLetterCode;
Language = language;
}
}
}

View File

@@ -18,20 +18,20 @@ namespace NzbDrone.Core.Parser
private static readonly Regex[] ReportMovieTitleRegex = new[]
{
//Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.Special.Edition.2011
new Regex(@"^(?<title>.+?)?(?:(?:[-_\W](?<![)\[!]))*(?<edition>(\.?((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized).(Cut|Edition|Version)|Extended|Uncensored|Remastered|Unrated|Uncut|IMAX)))\.(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)",
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<edition>(\.?((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized).(Cut|Edition|Version)|Extended|Uncensored|Remastered|Unrated|Uncut|IMAX)))\.(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
//Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.2011.Special.Edition //TODO: Seems to slow down parsing heavily!
new Regex(@"^(?<title>.+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)(?<edition>((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized).(Cut|Edition|Version)|Extended|Uncensored|Remastered|Unrated|Uncut|IMAX))",
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)(?<edition>((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized).(Cut|Edition|Version)|Extended|Uncensored|Remastered|Unrated|Uncut|IMAX))",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
//Normal movie format, e.g: Mission.Impossible.3.2011
new Regex(@"^(?<title>.+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)",
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
//PassThePopcorn Torrent names: Star.Wars[PassThePopcorn]
new Regex(@"^(?<title>.+?)?(?:(?:[-_\W](?<![()\[!]))*(?<year>(\[\w *\])))+(\W+|_|$)(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
//That did not work? Maybe some tool uses [] for years. Who would do that?
new Regex(@"^(?<title>.+?)?(?:(?:[-_\W](?<![)!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\W\d+)))+(\W+|_|$)(?!\\)",
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\W\d+)))+(\W+|_|$)(?!\\)",
RegexOptions.IgnoreCase | RegexOptions.Compiled),
};
@@ -696,6 +696,12 @@ namespace NzbDrone.Core.Parser
private static ParsedMovieInfo ParseMovieMatchCollection(MatchCollection matchCollection)
{
if (!matchCollection[0].Groups["title"].Success)
{
return null;
}
var seriesName = matchCollection[0].Groups["title"].Value.Replace('.', ' ').Replace('_', ' ');
seriesName = RequestInfoRegex.Replace(seriesName, "").Trim(' ');

View File

@@ -396,9 +396,15 @@ namespace NzbDrone.Core.Parser
if (searchCriteria == null)
{
movie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle); //Todo: same as above!
if (parsedEpisodeInfo.Year > 1900)
{
movie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle, parsedEpisodeInfo.Year);
//Todo: same as above!
}
else
{
movie = _movieService.FindByTitle(parsedEpisodeInfo.MovieTitle); //Todo: same as above!
}
return movie;
}

View File

@@ -51,7 +51,7 @@ namespace NzbDrone.Core.Tv
try
{
movieInfo = _movieInfo.GetMovieInfo(movie.TmdbId);
movieInfo = _movieInfo.GetMovieInfo(movie.TmdbId, movie.Profile);
}
catch (MovieNotFoundException)
{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View File

@@ -1,7 +1,7 @@
var Marionette = require('marionette');
var Backgrid = require('backgrid');
var QueueCollection = require('./QueueCollection');
var SeriesTitleCell = require('../../Cells/MovieTitleCell');
var MovieTitleCell = require('../../Cells/MovieTitleCell');
var EpisodeNumberCell = require('../../Cells/EpisodeNumberCell');
var EpisodeTitleCell = require('../../Cells/EpisodeTitleCell');
var QualityCell = require('../../Cells/QualityCell');
@@ -30,7 +30,7 @@ module.exports = Marionette.Layout.extend({
{
name : 'movie',
label : 'Movie',
cell : SeriesTitleCell
cell : MovieTitleCell
},
/*{
name : 'episode',

View File

@@ -6,9 +6,7 @@ module.exports = TemplatedCell.extend({
render : function() {
this.$el.html(this.model.get("movie").get("title")); //Hack, but somehow handlebar helper does not work.
debugger;
this.$el.html('<a href="movies/' + this.model.get("movie").get("titleSlug") +'">' + this.model.get("movie").get("title") + '</a>'); //Hack, but somehow handlebar helper does not work.
return this;
}
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1018 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 971 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src="/Content/Images/favicon/mstile-70x70.png"/>
<square150x150logo src="/Content/Images/favicon/mstile-150x150.png"/>
<square310x310logo src="/Content/Images/favicon/mstile-310x310.png"/>
<wide310x150logo src="/Content/Images/favicon/mstile-310x150.png"/>
<TileColor>#272727</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,53 @@
{
"name": "Radarr",
"icons": [
{
"src": "/Content/Images/favicon/android-chrome-36x36.png",
"sizes": "36x36",
"type": "image/png"
},
{
"src": "/Content/Images/favicon/android-chrome-48x48.png",
"sizes": "48x48",
"type": "image/png"
},
{
"src": "/Content/Images/favicon/android-chrome-72x72.png",
"sizes": "72x72",
"type": "image/png"
},
{
"src": "/Content/Images/favicon/android-chrome-96x96.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src": "/Content/Images/favicon/android-chrome-144x144.png",
"sizes": "144x144",
"type": "image/png"
},
{
"src": "/Content/Images/favicon/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/Content/Images/favicon/android-chrome-256x256.png",
"sizes": "256x256",
"type": "image/png"
},
{
"src": "/Content/Images/favicon/android-chrome-384x384.png",
"sizes": "384x384",
"type": "image/png"
},
{
"src": "/Content/Images/favicon/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#272727",
"background_color": "#272727",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="16.000000pt" height="16.000000pt" viewBox="0 0 16.000000 16.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,16.000000) scale(0.002286,-0.002286)"
fill="#000000" stroke="none">
<path d="M3298 6995 c-1 -1 -45 -5 -97 -9 -51 -3 -96 -8 -100 -10 -3 -2 -40
-7 -80 -10 -41 -4 -78 -9 -81 -11 -3 -2 -24 -6 -46 -9 -51 -8 -81 -14 -102
-20 -9 -3 -33 -8 -52 -11 -96 -16 -424 -116 -527 -161 -18 -8 -48 -21 -67 -29
-19 -8 -37 -15 -40 -15 -9 0 -274 -132 -332 -166 -127 -73 -278 -174 -388
-257 -67 -50 -123 -94 -126 -98 -3 -4 -25 -23 -50 -44 -71 -58 -236 -221 -326
-323 -316 -355 -553 -766 -705 -1223 -26 -81 -51 -158 -53 -170 -3 -13 -12
-51 -21 -84 -8 -33 -18 -76 -21 -95 -3 -19 -7 -37 -9 -40 -5 -7 -34 -174 -41
-232 -3 -24 -7 -59 -10 -78 -12 -85 -18 -209 -18 -395 -1 -318 12 -441 89
-815 2 -8 9 -35 16 -60 7 -25 13 -51 15 -58 9 -48 85 -270 131 -382 189 -466
458 -863 823 -1215 66 -63 101 -95 210 -189 33 -28 204 -154 255 -188 140 -91
198 -126 312 -186 115 -60 166 -85 298 -142 40 -18 102 -41 206 -78 185 -67
485 -138 664 -157 28 -3 56 -8 64 -11 74 -25 640 -25 821 1 14 2 48 6 75 10
43 6 184 31 280 50 62 12 224 58 338 96 791 262 1462 798 1894 1515 61 99 157
284 208 399 98 220 209 585 239 791 4 22 9 51 11 64 3 14 13 84 22 155 24 188
23 692 -2 810 -2 11 -7 39 -9 63 -41 338 -165 738 -335 1082 -456 919 -1301
1595 -2301 1839 -121 29 -308 63 -420 76 -30 4 -68 8 -85 11 -35 5 -522 14
-527 9z m-1674 -897 c59 -62 246 -254 415 -427 168 -173 343 -353 389 -400
141 -145 335 -341 338 -341 2 0 29 12 61 26 61 28 283 105 283 99 0 -2 14 0
32 5 30 9 52 13 168 30 72 11 320 10 390 -1 30 -5 69 -11 85 -13 106 -17 243
-62 426 -138 28 -12 31 -8 464 437 59 61 236 243 394 405 159 162 318 326 354
364 l66 69 43 -34 c204 -157 437 -383 581 -564 291 -364 508 -782 624 -1205
37 -134 72 -300 88 -415 3 -22 8 -51 10 -65 3 -14 7 -56 10 -95 3 -38 8 -90
11 -115 7 -65 7 -363 -1 -445 -18 -202 -24 -248 -51 -390 -13 -71 -36 -173
-50 -225 -13 -52 -27 -104 -29 -115 -22 -98 -137 -384 -225 -560 -167 -330
-349 -582 -615 -850 -141 -142 -199 -194 -328 -294 l-70 -55 -170 175 c-93 96
-306 314 -472 484 -166 171 -372 381 -456 468 l-154 158 -75 -34 c-113 -52
-204 -81 -350 -112 -184 -39 -449 -39 -625 0 -144 31 -288 79 -381 125 l-39
19 -140 -144 c-249 -255 -735 -753 -924 -947 -101 -103 -187 -188 -191 -188
-3 0 -15 8 -26 18 -10 9 -42 34 -69 55 -256 196 -597 573 -750 829 -5 9 -34
56 -63 105 -129 214 -277 560 -338 790 -9 32 -17 65 -20 73 -16 56 -72 347
-78 400 -3 36 -8 81 -11 100 -15 125 -22 460 -11 560 2 19 7 73 11 120 4 46 8
87 10 90 1 3 6 32 10 65 3 32 8 62 11 66 2 3 6 31 10 60 3 30 8 57 11 62 2 4
7 20 9 35 26 150 117 429 206 632 128 294 310 584 523 836 114 134 339 350
479 459 21 17 48 38 60 47 12 10 23 17 26 18 3 0 54 -51 114 -112z"/>
<path d="M1403 5507 c-251 -260 -468 -600 -603 -942 -59 -148 -133 -395 -146
-485 -2 -14 -6 -36 -9 -50 -27 -128 -48 -349 -48 -515 -1 -94 12 -334 17 -344
2 -3 7 -35 10 -70 21 -197 115 -543 203 -741 45 -101 120 -251 150 -298 18
-29 33 -55 33 -58 0 -7 160 -247 169 -254 3 -3 31 -36 62 -75 89 -110 195
-225 208 -225 3 0 311 306 684 679 373 374 687 687 697 696 19 17 21 16 58
-17 227 -205 561 -282 862 -198 132 37 274 116 367 203 32 30 33 30 52 13 11
-10 321 -319 688 -687 367 -369 676 -674 685 -679 17 -10 30 1 146 129 93 102
255 329 329 461 180 319 293 637 347 970 23 147 25 160 32 271 17 253 7 429
-41 744 -10 64 -64 272 -96 370 -134 403 -362 786 -654 1093 l-50 53 -701
-701 -701 -700 -27 25 c-174 161 -398 246 -636 240 -149 -4 -180 -9 -284 -44
-122 -42 -244 -113 -336 -198 l-24 -22 -698 697 c-384 383 -700 698 -701 699
-2 1 -21 -17 -44 -40z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Some files were not shown because too many files have changed in this diff Show More