From d42165a93a25685d1f0245f6ea34fe56c81306d2 Mon Sep 17 00:00:00 2001 From: Tim Turner Date: Wed, 11 Jan 2017 15:03:55 -0500 Subject: [PATCH 01/71] Clean up basic movie naming Fixes #132 --- .../Naming/Basic/BasicNamingViewTemplate.hbs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/UI/Settings/MediaManagement/Naming/Basic/BasicNamingViewTemplate.hbs b/src/UI/Settings/MediaManagement/Naming/Basic/BasicNamingViewTemplate.hbs index 06429a722..0b6e7f0b5 100644 --- a/src/UI/Settings/MediaManagement/Naming/Basic/BasicNamingViewTemplate.hbs +++ b/src/UI/Settings/MediaManagement/Naming/Basic/BasicNamingViewTemplate.hbs @@ -1,5 +1,5 @@
- + {{!--
@@ -36,7 +36,7 @@
-
+--}}
@@ -88,7 +88,7 @@
-
+{{!--
@@ -99,4 +99,4 @@
-
+
--}} From 5eddcc1660d98e0e043b3ca8508621d6fa5b3b6d Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Wed, 11 Jan 2017 15:48:19 -0500 Subject: [PATCH 02/71] Problem with Avatar (2009) #168 --- .../MetadataSource/SkyHook/Resource/TMDBResources.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs index 80e1b42cf..c0987e04f 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook.Resource public Production_Companies[] production_companies { get; set; } public Production_Countries[] production_countries { get; set; } public string release_date { get; set; } - public int revenue { get; set; } + public long revenue { get; set; } public int runtime { get; set; } public Spoken_Languages[] spoken_languages { get; set; } public string status { get; set; } From 8e8c4ff49786e6d5f04a72f586b08baa74b7ce5f Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Wed, 11 Jan 2017 21:49:59 +0100 Subject: [PATCH 03/71] Update parser to recognize [] and year at the beginning. Fixes #155, fixes #137 and fixes #136. --- .../DecisionEngine/DownloadDecisionMaker.cs | 1 - .../MetadataSource/SkyHook/SkyHookProxy.cs | 2 +- src/NzbDrone.Core/Parser/Parser.cs | 22 ++++++++++++++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/DecisionEngine/DownloadDecisionMaker.cs b/src/NzbDrone.Core/DecisionEngine/DownloadDecisionMaker.cs index 5e3b0d824..ec7513482 100644 --- a/src/NzbDrone.Core/DecisionEngine/DownloadDecisionMaker.cs +++ b/src/NzbDrone.Core/DecisionEngine/DownloadDecisionMaker.cs @@ -265,7 +265,6 @@ namespace NzbDrone.Core.DecisionEngine e.Data.Add("parsed", remoteEpisode.ParsedEpisodeInfo.ToJson()); _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));//TODO UPDATE SPECS! - return null; } return null; diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 478b6dd13..4eb97e1ab 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -189,7 +189,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { var lowerTitle = title.ToLower(); - var parserResult = Parser.Parser.ParseMovieTitle(title); + var parserResult = Parser.Parser.ParseMovieTitle(title, true); var yearTerm = ""; diff --git a/src/NzbDrone.Core/Parser/Parser.cs b/src/NzbDrone.Core/Parser/Parser.cs index 2120c3add..f807a1be6 100644 --- a/src/NzbDrone.Core/Parser/Parser.cs +++ b/src/NzbDrone.Core/Parser/Parser.cs @@ -36,6 +36,15 @@ namespace NzbDrone.Core.Parser //PassThePopcorn Torrent names: Star.Wars[PassThePopcorn] new Regex(@"^(?.+?)?(?:(?:[-_\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+|_|$)(?!\\)", + RegexOptions.IgnoreCase | RegexOptions.Compiled), + }; + + private static readonly Regex[] ReportMovieTitleFolderRegex = new[] + { + //When year comes first. + new Regex(@"^(?:(?:[-_\W](?<![)!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\W\d+)))+(\W+|_|$)(?<title>.+?)?$") }; private static readonly Regex[] ReportTitleRegex = new[] @@ -327,7 +336,7 @@ namespace NzbDrone.Core.Parser { var fileInfo = new FileInfo(path); - var result = ParseMovieTitle(fileInfo.Name); + var result = ParseMovieTitle(fileInfo.Name, true); if (result == null) { @@ -345,7 +354,7 @@ namespace NzbDrone.Core.Parser } - public static ParsedMovieInfo ParseMovieTitle(string title) + public static ParsedMovieInfo ParseMovieTitle(string title, bool isDir = false) { ParsedMovieInfo realResult = null; @@ -376,7 +385,14 @@ namespace NzbDrone.Core.Parser simpleTitle = CleanTorrentSuffixRegex.Replace(simpleTitle, string.Empty); - foreach (var regex in ReportMovieTitleRegex) + var allRegexes = ReportMovieTitleRegex.ToList(); + + if (isDir) + { + allRegexes.AddRange(ReportMovieTitleFolderRegex); + } + + foreach (var regex in allRegexes) { var match = regex.Matches(simpleTitle); From 2cbe17151decc02f0be0165957277940bb81c6ec Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Wed, 11 Jan 2017 22:02:24 +0100 Subject: [PATCH 04/71] Correctly check if inCinemas date is present. Creates issue with sorting, but eh. Fixes 140. --- src/UI/Cells/InCinemasCell.js | 16 +++++++++++----- src/UI/Handlebars/Helpers/Series.js | 11 +++++++---- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/UI/Cells/InCinemasCell.js b/src/UI/Cells/InCinemasCell.js index a49690f61..ae4c337ed 100644 --- a/src/UI/Cells/InCinemasCell.js +++ b/src/UI/Cells/InCinemasCell.js @@ -7,10 +7,16 @@ module.exports = TemplatedCell.extend({ var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; - var cinemasDate = new Date(this.model.get("inCinemas")); - var year = cinemasDate.getFullYear(); - var month = monthNames[cinemasDate.getMonth()]; - this.$el.html(month + " " + year); //Hack, but somehow handlebar helper does not work. - return this; + + this.$el.html("To be announced"); + + if (this.model.get("inCinemas")) { + var cinemasDate = new Date(this.model.get("inCinemas")); + var year = cinemasDate.getFullYear(); + var month = monthNames[cinemasDate.getMonth()]; + this.$el.html(month + " " + year); //Hack, but somehow handlebar helper does not work. + } + + return this; } }); diff --git a/src/UI/Handlebars/Helpers/Series.js b/src/UI/Handlebars/Helpers/Series.js index b33e192b0..5f5cce2ed 100644 --- a/src/UI/Handlebars/Helpers/Series.js +++ b/src/UI/Handlebars/Helpers/Series.js @@ -181,10 +181,13 @@ Handlebars.registerHelper('inCinemas', function() { var year = d.getFullYear(); return "Available: " + day + ". " + month + " " + year; } - var cinemasDate = new Date(this.inCinemas); - var year = cinemasDate.getFullYear(); - var month = monthNames[cinemasDate.getMonth()]; - return "In Cinemas: " + month + " " + year; + if (this.inCinemas) { + var cinemasDate = new Date(this.inCinemas); + var year = cinemasDate.getFullYear(); + var month = monthNames[cinemasDate.getMonth()]; + return "In Cinemas: " + month + " " + year; + } + return "To be announced"; }); Handlebars.registerHelper('tvRageUrl', function() { From 5e8b617625a5716a9b07c77cff504e8f84da19cc Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Wed, 11 Jan 2017 22:27:37 +0100 Subject: [PATCH 05/71] Sorting now working according to quality in release collection. Fixes #85. --- src/NzbDrone.Api/Indexers/ReleaseResource.cs | 2 +- src/UI/Cells/QualityCell.js | 6 ++++-- src/UI/Movies/Search/ManualLayout.js | 4 ++-- src/UI/Movies/Search/ManualLayoutTemplate.hbs | 1 - src/UI/Release/ReleaseCollection.js | 5 ++++- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Api/Indexers/ReleaseResource.cs b/src/NzbDrone.Api/Indexers/ReleaseResource.cs index fea1ee353..2be0acbb9 100644 --- a/src/NzbDrone.Api/Indexers/ReleaseResource.cs +++ b/src/NzbDrone.Api/Indexers/ReleaseResource.cs @@ -97,7 +97,7 @@ namespace NzbDrone.Api.Indexers { Guid = releaseInfo.Guid, Quality = parsedMovieInfo.Quality, - //QualityWeight + QualityWeight = parsedMovieInfo.Quality.Quality.Id, //Id kinda hacky for wheight, but what you gonna do? TODO: Fix this shit! Age = releaseInfo.Age, AgeHours = releaseInfo.AgeHours, AgeMinutes = releaseInfo.AgeMinutes, diff --git a/src/UI/Cells/QualityCell.js b/src/UI/Cells/QualityCell.js index 962bd2ab4..947eb4e91 100644 --- a/src/UI/Cells/QualityCell.js +++ b/src/UI/Cells/QualityCell.js @@ -4,5 +4,7 @@ var QualityCellEditor = require('./Edit/QualityCellEditor'); module.exports = TemplatedCell.extend({ className : 'quality-cell', template : 'Cells/QualityCellTemplate', - editor : QualityCellEditor -}); \ No newline at end of file + editor : QualityCellEditor, + + +}); diff --git a/src/UI/Movies/Search/ManualLayout.js b/src/UI/Movies/Search/ManualLayout.js index af5413779..304b08911 100644 --- a/src/UI/Movies/Search/ManualLayout.js +++ b/src/UI/Movies/Search/ManualLayout.js @@ -37,7 +37,7 @@ module.exports = Marionette.Layout.extend({ name : 'edition', label : 'Edition', cell : EditionCell, - title : "Edition" + title : "Edition", }, { name : 'indexer', @@ -57,7 +57,7 @@ module.exports = Marionette.Layout.extend({ { name : 'quality', label : 'Quality', - cell : QualityCell + cell : QualityCell, }, { name : 'rejections', diff --git a/src/UI/Movies/Search/ManualLayoutTemplate.hbs b/src/UI/Movies/Search/ManualLayoutTemplate.hbs index 1797eb289..3a5f59438 100644 --- a/src/UI/Movies/Search/ManualLayoutTemplate.hbs +++ b/src/UI/Movies/Search/ManualLayoutTemplate.hbs @@ -1,2 +1 @@ <div id="episode-release-grid" class="table-responsive"></div> -<button class="btn x-search-back">Back</button> \ No newline at end of file diff --git a/src/UI/Release/ReleaseCollection.js b/src/UI/Release/ReleaseCollection.js index 1e67296be..2b810982a 100644 --- a/src/UI/Release/ReleaseCollection.js +++ b/src/UI/Release/ReleaseCollection.js @@ -16,7 +16,7 @@ var Collection = PagableCollection.extend({ sortMappings : { 'quality' : { - sortKey : 'qualityWeight' + sortKey : "qualityWeight" }, 'rejections' : { sortValue : function(model) { @@ -30,6 +30,9 @@ var Collection = PagableCollection.extend({ return releaseWeight; } }, + "edition" : { + sortKey : "edition" + }, 'download' : { sortKey : 'releaseWeight' }, From 92e9dc6ee1f33d8fc6361d00862778ab6711b032 Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Wed, 11 Jan 2017 22:39:07 +0100 Subject: [PATCH 06/71] Fix sorting of unkown release date. --- src/UI/Cells/InCinemasCell.js | 2 +- src/UI/Movies/MoviesCollection.js | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/UI/Cells/InCinemasCell.js b/src/UI/Cells/InCinemasCell.js index ae4c337ed..9f1cb2d57 100644 --- a/src/UI/Cells/InCinemasCell.js +++ b/src/UI/Cells/InCinemasCell.js @@ -8,7 +8,7 @@ module.exports = TemplatedCell.extend({ "July", "August", "September", "October", "November", "December" ]; - this.$el.html("To be announced"); + this.$el.html(""); if (this.model.get("inCinemas")) { var cinemasDate = new Date(this.model.get("inCinemas")); diff --git a/src/UI/Movies/MoviesCollection.js b/src/UI/Movies/MoviesCollection.js index 16d50298f..44957debd 100644 --- a/src/UI/Movies/MoviesCollection.js +++ b/src/UI/Movies/MoviesCollection.js @@ -100,7 +100,18 @@ var Collection = PageableCollection.extend({ return percentOfEpisodes + episodeCount / 1000000; } }, - + inCinemas : { + + sortValue : function(model, attr) { + var monthNames = ["January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + ]; + if (model.get("inCinemas")) { + return model.get("inCinemas"); + } + return "2100-01-01"; + } + }, path : { sortValue : function(model) { var path = model.get('path'); From 81ebbcad700eccea1f6d68cbb58a292b269bf0d5 Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Wed, 11 Jan 2017 23:05:11 +0100 Subject: [PATCH 07/71] Now hidden files are ignored :). Fixes #166. --- src/NzbDrone.Core/RootFolders/RootFolderService.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index f1a1145e9..bf4d06972 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -149,7 +149,11 @@ namespace NzbDrone.Core.RootFolders foreach (string unmappedFolder in unmappedFolders) { var di = new DirectoryInfo(unmappedFolder.Normalize()); - results.Add(new UnmappedFolder { Name = di.Name, Path = di.FullName }); + if (!di.Attributes.HasFlag(FileAttributes.System) && !di.Attributes.HasFlag(FileAttributes.Hidden)) + { + results.Add(new UnmappedFolder { Name = di.Name, Path = di.FullName }); + } + } var setToRemove = SpecialFolders; From d5504043c59dce152274a9f7406ac3259f26c588 Mon Sep 17 00:00:00 2001 From: Devin Buhl <devin.kray@gmail.com> Date: Wed, 11 Jan 2017 19:06:08 -0500 Subject: [PATCH 08/71] Movies in list don't sort correctly #174 --- .../Migration/115_update_movie_sorttitle.cs | 45 +++++++++++++++++++ .../MetadataSource/SkyHook/SkyHookProxy.cs | 2 +- src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + src/UI/Movies/MoviesCollection.js | 6 +-- 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/115_update_movie_sorttitle.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/115_update_movie_sorttitle.cs b/src/NzbDrone.Core/Datastore/Migration/115_update_movie_sorttitle.cs new file mode 100644 index 000000000..593665455 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/115_update_movie_sorttitle.cs @@ -0,0 +1,45 @@ +using System.Data; +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(115)] + public class update_movie_sorttitle : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + // Create.Column("SortTitle").OnTable("Series").AsString().Nullable(); + Execute.WithConnection(SetSortTitles); + } + + private void SetSortTitles(IDbConnection conn, IDbTransaction tran) + { + using (IDbCommand getSeriesCmd = conn.CreateCommand()) + { + getSeriesCmd.Transaction = tran; + getSeriesCmd.CommandText = @"SELECT Id, Title FROM Movies"; + using (IDataReader seriesReader = getSeriesCmd.ExecuteReader()) + { + while (seriesReader.Read()) + { + var id = seriesReader.GetInt32(0); + var title = seriesReader.GetString(1); + + var sortTitle = Parser.Parser.NormalizeTitle(title).ToLower(); + + using (IDbCommand updateCmd = conn.CreateCommand()) + { + updateCmd.Transaction = tran; + updateCmd.CommandText = "UPDATE Movies SET SortTitle = ? WHERE Id = ?"; + updateCmd.AddParameter(sortTitle); + updateCmd.AddParameter(id); + + updateCmd.ExecuteNonQuery(); + } + } + } + } + } + } +} diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 4eb97e1ab..2d8248638 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -327,7 +327,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook imdbMovie.TmdbId = result.id; try { - imdbMovie.SortTitle = result.title; + imdbMovie.SortTitle = Parser.Parser.NormalizeTitle(result.title); imdbMovie.Title = result.title; string titleSlug = result.title; imdbMovie.TitleSlug = titleSlug.ToLower().Replace(" ", "-"); diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 3ea6a0a76..cd482bd90 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -183,6 +183,7 @@ <Compile Include="Datastore\Migration\002_remove_tvrage_imdb_unique_constraint.cs" /> <Compile Include="Datastore\Migration\003_remove_clean_title_from_scene_mapping.cs" /> <Compile Include="Datastore\Migration\004_updated_history.cs" /> + <Compile Include="Datastore\Migration\115_update_movie_sorttitle.cs" /> <Compile Include="Datastore\Migration\111_remove_bitmetv.cs" /> <Compile Include="Datastore\Migration\112_remove_torrentleech.cs" /> <Compile Include="Datastore\Migration\114_remove_fanzub.cs" /> diff --git a/src/UI/Movies/MoviesCollection.js b/src/UI/Movies/MoviesCollection.js index 44957debd..bc97e360d 100644 --- a/src/UI/Movies/MoviesCollection.js +++ b/src/UI/Movies/MoviesCollection.js @@ -15,10 +15,10 @@ var Collection = PageableCollection.extend({ tableName : 'movie', state : { - sortKey : 'title', + sortKey : 'sortTitle', order : 1, pageSize : 100000, - secondarySortKey : 'title', + secondarySortKey : 'sortTitle', secondarySortOrder : -1 }, @@ -73,7 +73,7 @@ var Collection = PageableCollection.extend({ sortMappings : { title : { - sortKey : 'title' + sortKey : 'sortTitle' }, nextAiring : { From b4782da1d1075ac8ac7e7d3a12909d96cc11ef97 Mon Sep 17 00:00:00 2001 From: Tim Turner <timdturner@gmail.com> Date: Wed, 11 Jan 2017 19:29:18 -0500 Subject: [PATCH 09/71] Update sortValue when selecting movie for manual import --- src/UI/ManualImport/Movie/SelectMovieLayout.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UI/ManualImport/Movie/SelectMovieLayout.js b/src/UI/ManualImport/Movie/SelectMovieLayout.js index 55799a2c5..ecde63b54 100644 --- a/src/UI/ManualImport/Movie/SelectMovieLayout.js +++ b/src/UI/ManualImport/Movie/SelectMovieLayout.js @@ -21,7 +21,7 @@ module.exports = Marionette.Layout.extend({ name : 'title', label : 'Title', cell : 'String', - sortValue : 'sortTitle' + sortValue : 'title' } ], From 604cea00f6fc999ebb6db2ebc1d6d423d4b3533e Mon Sep 17 00:00:00 2001 From: William Comartin <wcomartin@fullcircletms.com> Date: Wed, 11 Jan 2017 21:42:47 -0500 Subject: [PATCH 10/71] Replace Sonarr With Radarr in UI Directory --- .../Activity/History/Details/HistoryDetailsViewTemplate.hbs | 2 +- src/UI/Calendar/CalendarFeedViewTemplate.hbs | 2 +- src/UI/Navbar/NavbarLayoutTemplate.hbs | 4 ++-- src/UI/Series/Edit/EditSeriesViewTemplate.hbs | 2 +- .../RemotePathMapping/RemotePathMappingEditViewTemplate.hbs | 4 ++-- src/UI/Settings/General/GeneralViewTemplate.hbs | 6 +++--- .../Indexers/Add/IndexerAddCollectionViewTemplate.hbs | 2 +- .../FileManagement/FileManagementViewTemplate.hbs | 2 +- .../MediaManagement/Permissions/PermissionsViewTemplate.hbs | 4 ++-- src/UI/Settings/Profile/Edit/EditProfileViewTemplate.hbs | 2 +- src/UI/index.html | 2 +- src/UI/login.html | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/UI/Activity/History/Details/HistoryDetailsViewTemplate.hbs b/src/UI/Activity/History/Details/HistoryDetailsViewTemplate.hbs index 89a757660..090c46978 100644 --- a/src/UI/Activity/History/Details/HistoryDetailsViewTemplate.hbs +++ b/src/UI/Activity/History/Details/HistoryDetailsViewTemplate.hbs @@ -91,7 +91,7 @@ {{/if_eq}} {{#if_eq reason compare="MissingFromDisk"}} - Sonarr was unable to find the file on disk so it was removed + Radarr was unable to find the file on disk so it was removed {{/if_eq}} {{#if_eq reason compare="Upgrade"}} diff --git a/src/UI/Calendar/CalendarFeedViewTemplate.hbs b/src/UI/Calendar/CalendarFeedViewTemplate.hbs index c192c740d..8d8e3c7be 100644 --- a/src/UI/Calendar/CalendarFeedViewTemplate.hbs +++ b/src/UI/Calendar/CalendarFeedViewTemplate.hbs @@ -1,7 +1,7 @@ <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> - <h3>Sonarr Calendar feed</h3> + <h3>Radarr Calendar feed</h3> </div> <div class="modal-body edit-series-modal"> <div class="form-horizontal"> diff --git a/src/UI/Navbar/NavbarLayoutTemplate.hbs b/src/UI/Navbar/NavbarLayoutTemplate.hbs index 6009587df..1665c6838 100644 --- a/src/UI/Navbar/NavbarLayoutTemplate.hbs +++ b/src/UI/Navbar/NavbarLayoutTemplate.hbs @@ -7,12 +7,12 @@ <span class="icon-sonarr-navbar-collapsed fa-lg"></span> </button> <a class="navbar-brand" href="{{UrlBase}}/"> - <!--<img src="{{UrlBase}}/Content/Images/logo.png?v=2" alt="Sonarr">--> + <!--<img src="{{UrlBase}}/Content/Images/logo.png?v=2" alt="Radarr">--> <img src="{{UrlBase}}/Content/Images/logos/128.png" class="visible-lg"/> <img src="{{UrlBase}}/Content/Images/logos/64.png" class="visible-md visible-sm"/> <span class="visible-xs"> <img src="{{UrlBase}}/Content/Images/logos/32.png"/> - <span class="logo-text">sonarr</span> + <span class="logo-text">Radarr</span> </span> </a> diff --git a/src/UI/Series/Edit/EditSeriesViewTemplate.hbs b/src/UI/Series/Edit/EditSeriesViewTemplate.hbs index 746504cc9..baeab579b 100644 --- a/src/UI/Series/Edit/EditSeriesViewTemplate.hbs +++ b/src/UI/Series/Edit/EditSeriesViewTemplate.hbs @@ -27,7 +27,7 @@ </label> <span class="help-inline-checkbox"> - <i class="icon-sonarr-form-info" title="Should Sonarr download episodes for this series?"/> + <i class="icon-sonarr-form-info" title="Should Radarr download episodes for this series?"/> </span> </div> </div> diff --git a/src/UI/Settings/DownloadClient/RemotePathMapping/RemotePathMappingEditViewTemplate.hbs b/src/UI/Settings/DownloadClient/RemotePathMapping/RemotePathMappingEditViewTemplate.hbs index bc7926439..f5f08a591 100644 --- a/src/UI/Settings/DownloadClient/RemotePathMapping/RemotePathMappingEditViewTemplate.hbs +++ b/src/UI/Settings/DownloadClient/RemotePathMapping/RemotePathMappingEditViewTemplate.hbs @@ -10,7 +10,7 @@ <div class="modal-body remotepath-mapping-modal"> <div class="form-horizontal"> <div> - <p>Use this feature if you have a remotely running Download Client. Sonarr will use the information provided to translate the paths provided by the Download Client API to something Sonarr can access and import.</p> + <p>Use this feature if you have a remotely running Download Client. Radarr will use the information provided to translate the paths provided by the Download Client API to something Radarr can access and import.</p> </div> <div class="form-group"> <label class="col-sm-3 control-label">Host</label> @@ -40,7 +40,7 @@ <label class="col-sm-3 control-label">Local Path</label> <div class="col-sm-1 col-sm-push-5 help-inline"> - <i class="icon-sonarr-form-info" title="Path that Sonarr should use to access the same directory remotely." /> + <i class="icon-sonarr-form-info" title="Path that Radarr should use to access the same directory remotely." /> </div> <div class="col-sm-5 col-sm-pull-1"> diff --git a/src/UI/Settings/General/GeneralViewTemplate.hbs b/src/UI/Settings/General/GeneralViewTemplate.hbs index a8493cd8e..e4b3e6b59 100644 --- a/src/UI/Settings/General/GeneralViewTemplate.hbs +++ b/src/UI/Settings/General/GeneralViewTemplate.hbs @@ -100,7 +100,7 @@ </label> <span class="help-inline-checkbox"> - <i class="icon-sonarr-form-info" title="Open a web browser and navigate to Sonarr homepage on app start. Has no effect if installed as a windows service"/> + <i class="icon-sonarr-form-info" title="Open a web browser and navigate to Radarr homepage on app start. Has no effect if installed as a windows service"/> </span> </div> </div> @@ -114,7 +114,7 @@ <div class="col-sm-1 col-sm-push-4 help-inline"> <i class="icon-sonarr-form-warning" title="Requires restart to take effect"/> - <i class="icon-sonarr-form-info" title="Require Username and Password to access Sonarr"/> + <i class="icon-sonarr-form-info" title="Require Username and Password to access Radarr"/> </div> <div class="col-sm-4 col-sm-pull-1"> @@ -308,7 +308,7 @@ </label> <span class="help-inline-checkbox"> - <i class="icon-sonarr-form-info" title="Send anonymous information about your browser and which parts of the web interface you use to Sonarr servers. We use this information to prioritize features and browser support. We will NEVER include any personal information or any information that could identify you."/> + <i class="icon-sonarr-form-info" title="Send anonymous information about your browser and which parts of the web interface you use to Radarr servers. We use this information to prioritize features and browser support. We will NEVER include any personal information or any information that could identify you."/> <i class="icon-sonarr-form-warning" title="Requires restart to take effect"/> </span> </div> diff --git a/src/UI/Settings/Indexers/Add/IndexerAddCollectionViewTemplate.hbs b/src/UI/Settings/Indexers/Add/IndexerAddCollectionViewTemplate.hbs index 16bc741ad..3d581b5e4 100644 --- a/src/UI/Settings/Indexers/Add/IndexerAddCollectionViewTemplate.hbs +++ b/src/UI/Settings/Indexers/Add/IndexerAddCollectionViewTemplate.hbs @@ -5,7 +5,7 @@ </div> <div class="modal-body"> <div class="alert alert-info"> - Sonarr supports any indexer that uses the Newznab standard, as well as other indexers listed below.<br/> + Radarr supports any indexer that uses the Newznab standard, as well as other indexers listed below.<br/> For more information on the individual indexers, click on the info buttons. </div> <div class="add-indexer add-thingies"> diff --git a/src/UI/Settings/MediaManagement/FileManagement/FileManagementViewTemplate.hbs b/src/UI/Settings/MediaManagement/FileManagement/FileManagementViewTemplate.hbs index 9fd640ec0..bee701a07 100644 --- a/src/UI/Settings/MediaManagement/FileManagement/FileManagementViewTemplate.hbs +++ b/src/UI/Settings/MediaManagement/FileManagement/FileManagementViewTemplate.hbs @@ -61,7 +61,7 @@ </label> <span class="help-inline-checkbox"> - <i class="icon-sonarr-form-info" title="Extract video information such as resolution, runtime and codec information from files. This requires Sonarr to read parts of the file which may cause high disk or network activity during scans."/> + <i class="icon-sonarr-form-info" title="Extract video information such as resolution, runtime and codec information from files. This requires Radarr to read parts of the file which may cause high disk or network activity during scans."/> </span> </div> </div> diff --git a/src/UI/Settings/MediaManagement/Permissions/PermissionsViewTemplate.hbs b/src/UI/Settings/MediaManagement/Permissions/PermissionsViewTemplate.hbs index 2d870c1ae..6342dae47 100644 --- a/src/UI/Settings/MediaManagement/Permissions/PermissionsViewTemplate.hbs +++ b/src/UI/Settings/MediaManagement/Permissions/PermissionsViewTemplate.hbs @@ -28,7 +28,7 @@ <label class="col-sm-3 control-label">File chmod mask</label> <div class="col-sm-1 col-sm-push-4 help-inline"> - <i class="icon-sonarr-form-info" title="Octal, applied to media files when imported/renamed by Sonarr"/> + <i class="icon-sonarr-form-info" title="Octal, applied to media files when imported/renamed by Radarr"/> </div> <div class="col-sm-4 col-sm-pull-1"> @@ -40,7 +40,7 @@ <label class="col-sm-3 control-label">Folder chmod mask</label> <div class="col-sm-1 col-sm-push-4 help-inline"> - <i class="icon-sonarr-form-info" title="Octal, applied to series/season folders created by Sonarr"/> + <i class="icon-sonarr-form-info" title="Octal, applied to series/season folders created by Radarr"/> </div> <div class="col-sm-4 col-sm-pull-1"> diff --git a/src/UI/Settings/Profile/Edit/EditProfileViewTemplate.hbs b/src/UI/Settings/Profile/Edit/EditProfileViewTemplate.hbs index cae0f2447..c19d10e5c 100644 --- a/src/UI/Settings/Profile/Edit/EditProfileViewTemplate.hbs +++ b/src/UI/Settings/Profile/Edit/EditProfileViewTemplate.hbs @@ -40,6 +40,6 @@ </div> <div class="col-sm-1 help-inline"> - <i class="icon-sonarr-form-info" title="Once this quality is reached Sonarr will no longer download episodes"/> + <i class="icon-sonarr-form-info" title="Once this quality is reached Radarr will no longer download episodes"/> </div> </div> diff --git a/src/UI/index.html b/src/UI/index.html index 64fb75f03..10e77adef 100644 --- a/src/UI/index.html +++ b/src/UI/index.html @@ -40,7 +40,7 @@ <link rel="mask-icon" href="/Content/Images/safari/logo.svg" color="#35c5f4"> <link rel="icon" type="image/ico" href="/Content/Images/favicon.ico"/> - <link rel="alternate" type="text/calendar" title="iCalendar feed for Sonarr" href="/feed/calendar/NzbDrone.ics"/> + <link rel="alternate" type="text/calendar" title="iCalendar feed for Radarr" href="/feed/calendar/NzbDrone.ics"/> </head> <body> <div class="container"> diff --git a/src/UI/login.html b/src/UI/login.html index 7818bd690..e956bbd4c 100644 --- a/src/UI/login.html +++ b/src/UI/login.html @@ -27,7 +27,7 @@ <div class="container-fluid main-region" id="main-region"> <div class="col-md-2 col-md-offset-5"> <form name="login" id="login" class="login" method="POST"> - <h2><img src="/Content/Images/logos/32.png" alt=""/> Sonarr</h2> + <h2><img src="/Content/Images/logos/32.png" alt=""/> Radarr</h2> <div class="form-group"> <label for="username" class="sr-only">Email address</label> <input type="text" id="username" name="username" class="form-control" placeholder="Username" required autofocus> From c9e6835d7b1459ad9d207c0c1adf4c47c7e69fd2 Mon Sep 17 00:00:00 2001 From: William Comartin <wcomartin@fullcircletms.com> Date: Wed, 11 Jan 2017 21:59:13 -0500 Subject: [PATCH 11/71] Change Sonarr to Radarr in Help Text, and in Notification Text Change sonarr log files to radarr log files --- src/NzbDrone.Api/Calendar/CalendarFeedModule.cs | 1 + src/NzbDrone.Common/ConsoleService.cs | 2 +- .../Instrumentation/NzbDroneLogger.cs | 6 +++--- .../Clients/Blackhole/TorrentBlackholeSettings.cs | 6 +++--- .../Clients/Blackhole/UsenetBlackholeSettings.cs | 4 ++-- src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs | 2 +- .../Download/Clients/NzbVortex/NzbVortexSettings.cs | 2 +- src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs | 2 +- .../Download/Clients/Nzbget/NzbgetSettings.cs | 2 +- .../Download/Clients/Sabnzbd/Sabnzbd.cs | 12 ++++++------ .../Download/Clients/Sabnzbd/SabnzbdSettings.cs | 2 +- .../Clients/Transmission/TransmissionBase.cs | 2 +- .../Clients/Transmission/TransmissionSettings.cs | 2 +- .../Download/Clients/rTorrent/RTorrentSettings.cs | 2 +- .../Download/Clients/uTorrent/UTorrentSettings.cs | 2 +- src/NzbDrone.Core/Download/FailedDownloadService.cs | 2 +- src/NzbDrone.Core/Notifications/Email/Email.cs | 4 ++-- .../Notifications/Email/EmailService.cs | 2 +- src/NzbDrone.Core/Notifications/Join/Join.cs | 4 ++-- .../Notifications/MediaBrowser/MediaBrowser.cs | 4 ++-- src/NzbDrone.Core/Notifications/Plex/PlexClient.cs | 4 ++-- .../Notifications/Plex/PlexHomeTheater.cs | 4 ++-- .../Notifications/Plex/PlexServerService.cs | 2 +- .../Notifications/PushBullet/PushBullet.cs | 4 ++-- .../Notifications/PushBullet/PushBulletProxy.cs | 2 +- .../Notifications/Pushalot/PushalotSettings.cs | 2 +- src/NzbDrone.Core/Notifications/Slack/Slack.cs | 2 +- .../Notifications/Twitter/TwitterService.cs | 2 +- src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs | 4 ++-- src/NzbDrone.Host/Bootstrap.cs | 2 +- 30 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/NzbDrone.Api/Calendar/CalendarFeedModule.cs b/src/NzbDrone.Api/Calendar/CalendarFeedModule.cs index 0e62517f9..685c5cf16 100644 --- a/src/NzbDrone.Api/Calendar/CalendarFeedModule.cs +++ b/src/NzbDrone.Api/Calendar/CalendarFeedModule.cs @@ -27,6 +27,7 @@ namespace NzbDrone.Api.Calendar Get["/NzbDrone.ics"] = options => GetCalendarFeed(); Get["/Sonarr.ics"] = options => GetCalendarFeed(); + Get["/Radarr.ics"] = options => GetCalendarFeed(); } private Response GetCalendarFeed() diff --git a/src/NzbDrone.Common/ConsoleService.cs b/src/NzbDrone.Common/ConsoleService.cs index 321831277..8a16c352b 100644 --- a/src/NzbDrone.Common/ConsoleService.cs +++ b/src/NzbDrone.Common/ConsoleService.cs @@ -23,7 +23,7 @@ namespace NzbDrone.Common Console.WriteLine(" Commands:"); Console.WriteLine(" /{0} Install the application as a Windows Service ({1}).", StartupContext.INSTALL_SERVICE, ServiceProvider.NZBDRONE_SERVICE_NAME); Console.WriteLine(" /{0} Uninstall already installed Windows Service ({1}).", StartupContext.UNINSTALL_SERVICE, ServiceProvider.NZBDRONE_SERVICE_NAME); - Console.WriteLine(" /{0} Don't open Sonarr in a browser", StartupContext.NO_BROWSER); + Console.WriteLine(" /{0} Don't open Radarr in a browser", StartupContext.NO_BROWSER); Console.WriteLine(" <No Arguments> Run application in console mode."); } diff --git a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs index 7c672f725..39febd26c 100644 --- a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs +++ b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs @@ -103,9 +103,9 @@ namespace NzbDrone.Common.Instrumentation private static void RegisterAppFile(IAppFolderInfo appFolderInfo) { - RegisterAppFile(appFolderInfo, "appFileInfo", "sonarr.txt", 5, LogLevel.Info); - RegisterAppFile(appFolderInfo, "appFileDebug", "sonarr.debug.txt", 50, LogLevel.Off); - RegisterAppFile(appFolderInfo, "appFileTrace", "sonarr.trace.txt", 50, LogLevel.Off); + RegisterAppFile(appFolderInfo, "appFileInfo", "radarr.txt", 5, LogLevel.Info); + RegisterAppFile(appFolderInfo, "appFileDebug", "radarr.debug.txt", 50, LogLevel.Off); + RegisterAppFile(appFolderInfo, "appFileTrace", "radarr.trace.txt", 50, LogLevel.Off); } private static LoggingRule RegisterAppFile(IAppFolderInfo appFolderInfo, string name, string fileName, int maxArchiveFiles, LogLevel minLogLevel) diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs index d05ee7f22..a716a3b8d 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/TorrentBlackholeSettings.cs @@ -26,10 +26,10 @@ namespace NzbDrone.Core.Download.Clients.Blackhole private static readonly TorrentBlackholeSettingsValidator Validator = new TorrentBlackholeSettingsValidator(); - [FieldDefinition(0, Label = "Torrent Folder", Type = FieldType.Path, HelpText = "Folder in which Sonarr will store the .torrent file")] + [FieldDefinition(0, Label = "Torrent Folder", Type = FieldType.Path, HelpText = "Folder in which Radarr will store the .torrent file")] public string TorrentFolder { get; set; } - [FieldDefinition(1, Label = "Watch Folder", Type = FieldType.Path, HelpText = "Folder from which Sonarr should import completed downloads")] + [FieldDefinition(1, Label = "Watch Folder", Type = FieldType.Path, HelpText = "Folder from which Radarr should import completed downloads")] public string WatchFolder { get; set; } [DefaultValue(false)] @@ -39,7 +39,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole [DefaultValue(false)] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] - [FieldDefinition(3, Label = "Read Only", Type = FieldType.Checkbox, HelpText = "Instead of moving files this will instruct Sonarr to Copy or Hardlink (depending on settings/system configuration)")] + [FieldDefinition(3, Label = "Read Only", Type = FieldType.Checkbox, HelpText = "Instead of moving files this will instruct Radarr to Copy or Hardlink (depending on settings/system configuration)")] public bool ReadOnly { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackholeSettings.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackholeSettings.cs index b2ff88149..59a8e6a0f 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackholeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/UsenetBlackholeSettings.cs @@ -19,10 +19,10 @@ namespace NzbDrone.Core.Download.Clients.Blackhole { private static readonly UsenetBlackholeSettingsValidator Validator = new UsenetBlackholeSettingsValidator(); - [FieldDefinition(0, Label = "Nzb Folder", Type = FieldType.Path, HelpText = "Folder in which Sonarr will store the .nzb file")] + [FieldDefinition(0, Label = "Nzb Folder", Type = FieldType.Path, HelpText = "Folder in which Radarr will store the .nzb file")] public string NzbFolder { get; set; } - [FieldDefinition(1, Label = "Watch Folder", Type = FieldType.Path, HelpText = "Folder from which Sonarr should import completed downloads")] + [FieldDefinition(1, Label = "Watch Folder", Type = FieldType.Path, HelpText = "Folder from which Radarr should import completed downloads")] public string WatchFolder { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs index 6312672a6..810fa3f8c 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs @@ -306,7 +306,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge { return new NzbDroneValidationFailure("TvCategory", "Configuration of label failed") { - DetailedDescription = "Sonarr as unable to add the label to Deluge." + DetailedDescription = "Radarr as unable to add the label to Deluge." }; } } diff --git a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs index 411624c9d..749ef9d04 100644 --- a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs @@ -43,7 +43,7 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex [FieldDefinition(2, Label = "API Key", Type = FieldType.Textbox)] public string ApiKey { get; set; } - [FieldDefinition(3, Label = "Group", Type = FieldType.Textbox, HelpText = "Adding a category specific to Sonarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(3, Label = "Group", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional")] public string TvCategory { get; set; } [FieldDefinition(4, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(NzbVortexPriority), HelpText = "Priority to use when grabbing episodes that aired within the last 14 days")] diff --git a/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs b/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs index c358040f2..754e67abd 100644 --- a/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs +++ b/src/NzbDrone.Core/Download/Clients/Nzbget/Nzbget.cs @@ -337,7 +337,7 @@ namespace NzbDrone.Core.Download.Clients.Nzbget return new NzbDroneValidationFailure(string.Empty, "NzbGet setting KeepHistory should be greater than 0") { InfoLink = string.Format("http://{0}:{1}/", Settings.Host, Settings.Port), - DetailedDescription = "NzbGet setting KeepHistory is set to 0. Which prevents Sonarr from seeing completed downloads." + DetailedDescription = "NzbGet setting KeepHistory is set to 0. Which prevents Radarr from seeing completed downloads." }; } diff --git a/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs b/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs index 5aeef86b4..3321c7671 100644 --- a/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs @@ -45,7 +45,7 @@ namespace NzbDrone.Core.Download.Clients.Nzbget [FieldDefinition(3, Label = "Password", Type = FieldType.Password)] public string Password { get; set; } - [FieldDefinition(4, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Sonarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(4, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional")] public string TvCategory { get; set; } [FieldDefinition(5, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(NzbgetPriority), HelpText = "Priority to use when grabbing episodes that aired within the last 14 days")] diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs index bc32aedb1..f542ae1a9 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs @@ -372,7 +372,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd return new NzbDroneValidationFailure("Version", "Sabnzbd develop version, assuming version 1.1.0 or higher.") { IsWarning = true, - DetailedDescription = "Sonarr may not be able to support new features added to SABnzbd when running develop versions." + DetailedDescription = "Radarr may not be able to support new features added to SABnzbd when running develop versions." }; } @@ -431,7 +431,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd return new NzbDroneValidationFailure("", "Disable 'Check before download' option in Sabnbzd") { InfoLink = string.Format("http://{0}:{1}/sabnzbd/config/switches/", Settings.Host, Settings.Port), - DetailedDescription = "Using Check before download affects Sonarr ability to track new downloads. Also Sabnzbd recommends 'Abort jobs that cannot be completed' instead since it's more effective." + DetailedDescription = "Using Check before download affects Radarr ability to track new downloads. Also Sabnzbd recommends 'Abort jobs that cannot be completed' instead since it's more effective." }; } @@ -450,7 +450,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd return new NzbDroneValidationFailure("TvCategory", "Enable Job folders") { InfoLink = string.Format("http://{0}:{1}/sabnzbd/config/categories/", Settings.Host, Settings.Port), - DetailedDescription = "Sonarr prefers each download to have a separate folder. With * appended to the Folder/Path Sabnzbd will not create these job folders. Go to Sabnzbd to fix it." + DetailedDescription = "Radarr prefers each download to have a separate folder. With * appended to the Folder/Path Sabnzbd will not create these job folders. Go to Sabnzbd to fix it." }; } } @@ -475,7 +475,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd return new NzbDroneValidationFailure("TvCategory", "Disable TV Sorting") { InfoLink = string.Format("http://{0}:{1}/sabnzbd/config/sorting/", Settings.Host, Settings.Port), - DetailedDescription = "You must disable Sabnzbd TV Sorting for the category Sonarr uses to prevent import issues. Go to Sabnzbd to fix it." + DetailedDescription = "You must disable Sabnzbd TV Sorting for the category Radarr uses to prevent import issues. Go to Sabnzbd to fix it." }; } } @@ -489,7 +489,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd return new NzbDroneValidationFailure("TvCategory", "Disable Movie Sorting") { InfoLink = string.Format("http://{0}:{1}/sabnzbd/config/sorting/", Settings.Host, Settings.Port), - DetailedDescription = "You must disable Sabnzbd Movie Sorting for the category Sonarr uses to prevent import issues. Go to Sabnzbd to fix it." + DetailedDescription = "You must disable Sabnzbd Movie Sorting for the category Radarr uses to prevent import issues. Go to Sabnzbd to fix it." }; } } @@ -503,7 +503,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd return new NzbDroneValidationFailure("TvCategory", "Disable Date Sorting") { InfoLink = string.Format("http://{0}:{1}/sabnzbd/config/sorting/", Settings.Host, Settings.Port), - DetailedDescription = "You must disable Sabnzbd Date Sorting for the category Sonarr uses to prevent import issues. Go to Sabnzbd to fix it." + DetailedDescription = "You must disable Sabnzbd Date Sorting for the category Radarr uses to prevent import issues. Go to Sabnzbd to fix it." }; } } diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs index 22a3389bf..0c1dc8221 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs @@ -58,7 +58,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd [FieldDefinition(4, Label = "Password", Type = FieldType.Password)] public string Password { get; set; } - [FieldDefinition(5, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Sonarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(5, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional")] public string TvCategory { get; set; } [FieldDefinition(6, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(SabnzbdPriority), HelpText = "Priority to use when grabbing episodes that aired within the last 14 days")] diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs index da62e6bcb..2f9b77159 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs @@ -232,7 +232,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission _logger.Error(ex, ex.Message); return new NzbDroneValidationFailure("Username", "Authentication failure") { - DetailedDescription = string.Format("Please verify your username and password. Also verify if the host running Sonarr isn't blocked from accessing {0} by WhiteList limitations in the {0} configuration.", Name) + DetailedDescription = string.Format("Please verify your username and password. Also verify if the host running Radarr isn't blocked from accessing {0} by WhiteList limitations in the {0} configuration.", Name) }; } catch (WebException ex) diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs index 893705bda..e1783fe48 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs @@ -50,7 +50,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission [FieldDefinition(4, Label = "Password", Type = FieldType.Password)] public string Password { get; set; } - [FieldDefinition(5, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Sonarr avoids conflicts with unrelated downloads, but it's optional. Creates a [category] subdirectory in the output directory.")] + [FieldDefinition(5, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional. Creates a [category] subdirectory in the output directory.")] public string TvCategory { get; set; } [FieldDefinition(6, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Transmission location")] diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs index 570392395..dc5c02053 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs @@ -49,7 +49,7 @@ namespace NzbDrone.Core.Download.Clients.RTorrent [FieldDefinition(5, Label = "Password", Type = FieldType.Password)] public string Password { get; set; } - [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Sonarr avoids conflicts with unrelated downloads, but it's optional.")] + [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional.")] public string TvCategory { get; set; } [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default rTorrent location")] diff --git a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs index a5e5b006f..394fc53b4 100644 --- a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs @@ -38,7 +38,7 @@ namespace NzbDrone.Core.Download.Clients.UTorrent [FieldDefinition(3, Label = "Password", Type = FieldType.Password)] public string Password { get; set; } - [FieldDefinition(4, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Sonarr avoids conflicts with unrelated downloads, but it's optional")] + [FieldDefinition(4, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional")] public string TvCategory { get; set; } [FieldDefinition(5, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(UTorrentPriority), HelpText = "Priority to use when grabbing episodes that aired within the last 14 days")] diff --git a/src/NzbDrone.Core/Download/FailedDownloadService.cs b/src/NzbDrone.Core/Download/FailedDownloadService.cs index e084f2c3b..4168e0451 100644 --- a/src/NzbDrone.Core/Download/FailedDownloadService.cs +++ b/src/NzbDrone.Core/Download/FailedDownloadService.cs @@ -72,7 +72,7 @@ namespace NzbDrone.Core.Download if (grabbedItems.Empty()) { - trackedDownload.Warn("Download wasn't grabbed by sonarr, skipping"); + trackedDownload.Warn("Download wasn't grabbed by Radarr, skipping"); return; } diff --git a/src/NzbDrone.Core/Notifications/Email/Email.cs b/src/NzbDrone.Core/Notifications/Email/Email.cs index 71bb9130c..27e991332 100644 --- a/src/NzbDrone.Core/Notifications/Email/Email.cs +++ b/src/NzbDrone.Core/Notifications/Email/Email.cs @@ -18,7 +18,7 @@ namespace NzbDrone.Core.Notifications.Email public override void OnGrab(GrabMessage grabMessage) { - const string subject = "Sonarr [TV] - Grabbed"; + const string subject = "Radarr [TV] - Grabbed"; var body = string.Format("{0} sent to queue.", grabMessage.Message); _emailService.SendEmail(Settings, subject, body); @@ -26,7 +26,7 @@ namespace NzbDrone.Core.Notifications.Email public override void OnDownload(DownloadMessage message) { - const string subject = "Sonarr [TV] - Downloaded"; + const string subject = "Radarr [TV] - Downloaded"; var body = string.Format("{0} Downloaded and sorted.", message.Message); _emailService.SendEmail(Settings, subject, body); diff --git a/src/NzbDrone.Core/Notifications/Email/EmailService.cs b/src/NzbDrone.Core/Notifications/Email/EmailService.cs index f1469d2e9..84d1ed298 100644 --- a/src/NzbDrone.Core/Notifications/Email/EmailService.cs +++ b/src/NzbDrone.Core/Notifications/Email/EmailService.cs @@ -64,7 +64,7 @@ namespace NzbDrone.Core.Notifications.Email try { - SendEmail(settings, "Sonarr - Test Notification", body); + SendEmail(settings, "Radarr - Test Notification", body); } catch (Exception ex) { diff --git a/src/NzbDrone.Core/Notifications/Join/Join.cs b/src/NzbDrone.Core/Notifications/Join/Join.cs index 747a141e1..4e1f81105 100644 --- a/src/NzbDrone.Core/Notifications/Join/Join.cs +++ b/src/NzbDrone.Core/Notifications/Join/Join.cs @@ -18,14 +18,14 @@ namespace NzbDrone.Core.Notifications.Join public override void OnGrab(GrabMessage grabMessage) { - const string title = "Sonarr - Episode Grabbed"; + const string title = "Radarr - Episode Grabbed"; _proxy.SendNotification(title, grabMessage.Message, Settings); } public override void OnDownload(DownloadMessage message) { - const string title = "Sonarr - Episode Downloaded"; + const string title = "Radarr - Episode Downloaded"; _proxy.SendNotification(title, message.Message, Settings); } diff --git a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs index 795095c44..7c68fc306 100644 --- a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs +++ b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs @@ -18,7 +18,7 @@ namespace NzbDrone.Core.Notifications.MediaBrowser public override void OnGrab(GrabMessage grabMessage) { - const string title = "Sonarr - Grabbed"; + const string title = "Radarr - Grabbed"; if (Settings.Notify) { @@ -28,7 +28,7 @@ namespace NzbDrone.Core.Notifications.MediaBrowser public override void OnDownload(DownloadMessage message) { - const string title = "Sonarr - Downloaded"; + const string title = "Radarr - Downloaded"; if (Settings.Notify) { diff --git a/src/NzbDrone.Core/Notifications/Plex/PlexClient.cs b/src/NzbDrone.Core/Notifications/Plex/PlexClient.cs index 844b3bb0a..e38e87f96 100644 --- a/src/NzbDrone.Core/Notifications/Plex/PlexClient.cs +++ b/src/NzbDrone.Core/Notifications/Plex/PlexClient.cs @@ -18,13 +18,13 @@ namespace NzbDrone.Core.Notifications.Plex public override void OnGrab(GrabMessage grabMessage) { - const string header = "Sonarr [TV] - Grabbed"; + const string header = "Radarr [TV] - Grabbed"; _plexClientService.Notify(Settings, header, grabMessage.Message); } public override void OnDownload(DownloadMessage message) { - const string header = "Sonarr [TV] - Downloaded"; + const string header = "Radarr [TV] - Downloaded"; _plexClientService.Notify(Settings, header, message.Message); } diff --git a/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheater.cs b/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheater.cs index 63affad8d..e96c2c4f2 100644 --- a/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheater.cs +++ b/src/NzbDrone.Core/Notifications/Plex/PlexHomeTheater.cs @@ -23,14 +23,14 @@ namespace NzbDrone.Core.Notifications.Plex public override void OnGrab(GrabMessage grabMessage) { - const string header = "Sonarr - Grabbed"; + const string header = "Radarr - Grabbed"; Notify(Settings, header, grabMessage.Message); } public override void OnDownload(DownloadMessage message) { - const string header = "Sonarr - Downloaded"; + const string header = "Radarr - Downloaded"; Notify(Settings, header, message.Message); } diff --git a/src/NzbDrone.Core/Notifications/Plex/PlexServerService.cs b/src/NzbDrone.Core/Notifications/Plex/PlexServerService.cs index 727c63e35..67b8efe23 100644 --- a/src/NzbDrone.Core/Notifications/Plex/PlexServerService.cs +++ b/src/NzbDrone.Core/Notifications/Plex/PlexServerService.cs @@ -98,7 +98,7 @@ namespace NzbDrone.Core.Notifications.Plex { if (version >= new Version(1, 3, 0) && version < new Version(1, 3, 1)) { - throw new PlexVersionException("Found version {0}, upgrade to PMS 1.3.1 to fix library updating and then restart Sonarr", version); + throw new PlexVersionException("Found version {0}, upgrade to PMS 1.3.1 to fix library updating and then restart Radarr", version); } } diff --git a/src/NzbDrone.Core/Notifications/PushBullet/PushBullet.cs b/src/NzbDrone.Core/Notifications/PushBullet/PushBullet.cs index 684ff702b..be2afe912 100644 --- a/src/NzbDrone.Core/Notifications/PushBullet/PushBullet.cs +++ b/src/NzbDrone.Core/Notifications/PushBullet/PushBullet.cs @@ -18,14 +18,14 @@ namespace NzbDrone.Core.Notifications.PushBullet public override void OnGrab(GrabMessage grabMessage) { - const string title = "Sonarr - Episode Grabbed"; + const string title = "Radarr - Episode Grabbed"; _proxy.SendNotification(title, grabMessage.Message, Settings); } public override void OnDownload(DownloadMessage message) { - const string title = "Sonarr - Episode Downloaded"; + const string title = "Radarr - Episode Downloaded"; _proxy.SendNotification(title, message.Message, Settings); } diff --git a/src/NzbDrone.Core/Notifications/PushBullet/PushBulletProxy.cs b/src/NzbDrone.Core/Notifications/PushBullet/PushBulletProxy.cs index b7406d981..ad3f23c9d 100644 --- a/src/NzbDrone.Core/Notifications/PushBullet/PushBulletProxy.cs +++ b/src/NzbDrone.Core/Notifications/PushBullet/PushBulletProxy.cs @@ -92,7 +92,7 @@ namespace NzbDrone.Core.Notifications.PushBullet { try { - const string title = "Sonarr - Test Notification"; + const string title = "Radarr - Test Notification"; const string body = "This is a test message from Radarr"; SendNotification(title, body, settings); diff --git a/src/NzbDrone.Core/Notifications/Pushalot/PushalotSettings.cs b/src/NzbDrone.Core/Notifications/Pushalot/PushalotSettings.cs index a0fbd08e1..de3ebb1ff 100644 --- a/src/NzbDrone.Core/Notifications/Pushalot/PushalotSettings.cs +++ b/src/NzbDrone.Core/Notifications/Pushalot/PushalotSettings.cs @@ -28,7 +28,7 @@ namespace NzbDrone.Core.Notifications.Pushalot [FieldDefinition(1, Label = "Priority", Type = FieldType.Select, SelectOptions = typeof(PushalotPriority))] public int Priority { get; set; } - [FieldDefinition(2, Label = "Image", Type = FieldType.Checkbox, HelpText = "Include Sonarr logo with notifications")] + [FieldDefinition(2, Label = "Image", Type = FieldType.Checkbox, HelpText = "Include Radarr logo with notifications")] public bool Image { get; set; } public bool IsValid => !string.IsNullOrWhiteSpace(AuthToken); diff --git a/src/NzbDrone.Core/Notifications/Slack/Slack.cs b/src/NzbDrone.Core/Notifications/Slack/Slack.cs index 498d17349..5e581a25f 100644 --- a/src/NzbDrone.Core/Notifications/Slack/Slack.cs +++ b/src/NzbDrone.Core/Notifications/Slack/Slack.cs @@ -101,7 +101,7 @@ namespace NzbDrone.Core.Notifications.Slack { try { - var message = $"Test message from Sonarr posted at {DateTime.Now}"; + var message = $"Test message from Radarr posted at {DateTime.Now}"; var payload = new SlackPayload { IconEmoji = Settings.Icon, diff --git a/src/NzbDrone.Core/Notifications/Twitter/TwitterService.cs b/src/NzbDrone.Core/Notifications/Twitter/TwitterService.cs index 6c894b228..f6e334194 100644 --- a/src/NzbDrone.Core/Notifications/Twitter/TwitterService.cs +++ b/src/NzbDrone.Core/Notifications/Twitter/TwitterService.cs @@ -125,7 +125,7 @@ namespace NzbDrone.Core.Notifications.Twitter { try { - var body = "Sonarr: Test Message @ " + DateTime.Now; + var body = "Radarr: Test Message @ " + DateTime.Now; SendNotification(body, settings); } diff --git a/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs b/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs index c6a0c82df..08fdbfaa4 100644 --- a/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs +++ b/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs @@ -23,14 +23,14 @@ namespace NzbDrone.Core.Notifications.Xbmc public override void OnGrab(GrabMessage grabMessage) { - const string header = "Sonarr - Grabbed"; + const string header = "Radarr - Grabbed"; Notify(Settings, header, grabMessage.Message); } public override void OnDownload(DownloadMessage message) { - const string header = "Sonarr - Downloaded"; + const string header = "Radarr - Downloaded"; Notify(Settings, header, message.Message); UpdateAndClean(message.Series, message.OldFiles.Any()); diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index ec3e7a32a..5fdb487de 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -24,7 +24,7 @@ namespace Radarr.Host SecurityProtocolPolicy.Register(); X509CertificateValidationPolicy.Register(); - Logger.Info("Starting Sonarr - {0} - Version {1}", Assembly.GetCallingAssembly().Location, Assembly.GetExecutingAssembly().GetName().Version); + Logger.Info("Starting Radarr - {0} - Version {1}", Assembly.GetCallingAssembly().Location, Assembly.GetExecutingAssembly().GetName().Version); if (!PlatformValidation.IsValidate(userAlert)) { From 5ef1e40403152b0010ce0f4a76a58638462512c0 Mon Sep 17 00:00:00 2001 From: William Comartin <wcomartin@fullcircletms.com> Date: Wed, 11 Jan 2017 22:02:54 -0500 Subject: [PATCH 12/71] Change Sonarr to Radarr in CLA.md and CONTRIBUTING.md --- CLA.md | 4 ++-- CONTRIBUTING.md | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CLA.md b/CLA.md index 40adac7f6..05ce7890d 100644 --- a/CLA.md +++ b/CLA.md @@ -1,6 +1,6 @@ -# Sonarr Individual Contributor License Agreement # +# Radarr Individual Contributor License Agreement # -Thank you for your interest in contributing to Sonarr ("We" or "Us"). +Thank you for your interest in contributing to Radarr ("We" or "Us"). This contributor agreement ("Agreement") documents the rights granted by contributors to Us. To make this document effective, please complete the form below. This is a legally binding document, so please read it carefully before agreeing to it. The Agreement may cover more than one software project managed by Us. ## 1. Definitions ## diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ab945cb0c..3ae50843d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # How to Contribute # -We're always looking for people to help make Sonarr even better, there are a number of ways to contribute. +We're always looking for people to help make Radarr even better, there are a number of ways to contribute. ## Documentation ## Setup guides, FAQ, the more information we have on the wiki the better. @@ -15,7 +15,7 @@ Setup guides, FAQ, the more information we have on the wiki the better. ### Getting started ### -1. Fork Sonarr +1. Fork Radarr 2. Clone (develop branch) *you may need pull in submodules separately if you client doesn't clone them automatically (CurlSharp)* 3. Run `npm install` 4. Run `npm start` - Used to compile the UI components and copy them. @@ -24,8 +24,8 @@ Setup guides, FAQ, the more information we have on the wiki the better. 5. Compile in Visual Studio ### Contributing Code ### -- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Sonarr/Sonarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first) -- Rebase from Sonarr's develop branch, don't merge +- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Radarr/Radarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first) +- Rebase from Radarr's develop branch, don't merge - Make meaningful commits, or squash them - Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements - Reach out to us on the forums or on IRC if you have any questions From c06a6dc988083397d3b6afa78b6f7e8506cb8f58 Mon Sep 17 00:00:00 2001 From: Devin Buhl <devin.kray@gmail.com> Date: Thu, 12 Jan 2017 12:53:09 -0500 Subject: [PATCH 13/71] Add UHD to default movie categories for newsnab providers --- src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs index 472776df4..ac10d3a73 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs @@ -60,7 +60,7 @@ namespace NzbDrone.Core.Indexers.Newznab public NewznabSettings() { - Categories = new[] { 2030, 2035, 2040, 2050 }; + Categories = new[] { 2030, 2035, 2040, 2045, 2050 }; AnimeCategories = Enumerable.Empty<int>(); } From 1b035f865799957dd54baddd217c22fda5662998 Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Thu, 12 Jan 2017 19:21:09 +0100 Subject: [PATCH 14/71] Update Parser to support large array of Extended, Director, Collectors, ... Cut, Edition, etc. Fixes #192 --- src/NzbDrone.Core/Parser/Parser.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Parser/Parser.cs b/src/NzbDrone.Core/Parser/Parser.cs index f807a1be6..d133f4e86 100644 --- a/src/NzbDrone.Core/Parser/Parser.cs +++ b/src/NzbDrone.Core/Parser/Parser.cs @@ -18,16 +18,10 @@ 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>(\w+\.?edition))\.(?<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>((\w+\.?){1,3}edition))", - RegexOptions.IgnoreCase | RegexOptions.Compiled), - //Cut Movies, e.g: Mission.Impossible.3.Directors.Cut.2011 - new Regex(@"^(?<title>.+?)?(?:(?:[-_\W](?<![)\[!]))*(?<edition>(\w+\.?cut))\.(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)", - RegexOptions.IgnoreCase | RegexOptions.Compiled), - //Cut Movies, e.g: Mission.Impossible.3.2011.Directors.Cut - new Regex(@"^(?<title>.+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)(?<edition>((\w+\.?){1,3}cut))", + 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 From b1b947ae7f1729f86e2b9e022805a4e278337722 Mon Sep 17 00:00:00 2001 From: Devin Buhl <onedr0p@users.noreply.github.com> Date: Thu, 12 Jan 2017 15:41:56 -0500 Subject: [PATCH 15/71] Update UserAgentBuilder.cs Make user-agent Radarr --- src/NzbDrone.Common/Http/UserAgentBuilder.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Common/Http/UserAgentBuilder.cs b/src/NzbDrone.Common/Http/UserAgentBuilder.cs index fa99d03f4..f0cff30e9 100644 --- a/src/NzbDrone.Common/Http/UserAgentBuilder.cs +++ b/src/NzbDrone.Common/Http/UserAgentBuilder.cs @@ -9,12 +9,12 @@ namespace NzbDrone.Common.Http static UserAgentBuilder() { - UserAgent = string.Format("Sonarr/{0} ({1} {2})", + UserAgent = string.Format("Radarr/{0} ({1} {2})", BuildInfo.Version, OsInfo.Os, OsInfo.Version.ToString(2)); - UserAgentSimplified = string.Format("Sonarr/{0}", + UserAgentSimplified = string.Format("Radarr/{0}", BuildInfo.Version.ToString(2)); } } -} \ No newline at end of file +} From 84112dc85b5960a97f52af8c1ee8e2515065d1ba Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Thu, 12 Jan 2017 21:48:02 +0100 Subject: [PATCH 16/71] Should fix queueService failed while processing (#178) --- src/NzbDrone.Core/Download/CompletedDownloadService.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index a70bdca20..2a68c80d2 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -109,7 +109,11 @@ namespace NzbDrone.Core.Download if (movie == null) { - movie = _movieService.GetMovie(historyItem.MovieId); + if (historyItem != null) + { + movie = _movieService.GetMovie(historyItem.MovieId); + } + if (movie == null) { From 0b70a5c31584441a3f0891b61c558a2f8a981e68 Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Thu, 12 Jan 2017 22:12:32 +0100 Subject: [PATCH 17/71] Should fix ordering of releases. Fixes #147 (hopefully) --- .../DownloadDecisionComparer.cs | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs b/src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs index 882105a9d..67117ca85 100644 --- a/src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs +++ b/src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs @@ -24,8 +24,6 @@ namespace NzbDrone.Core.DecisionEngine { CompareQuality, CompareProtocol, - CompareEpisodeCount, - CompareEpisodeNumber, ComparePeersIfTorrent, CompareAgeIfUsenet, CompareSize @@ -56,6 +54,12 @@ namespace NzbDrone.Core.DecisionEngine private int CompareQuality(DownloadDecision x, DownloadDecision y) { + if (x.IsForMovie && y.IsForMovie) + { + return CompareAll(CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => remoteEpisode.Movie.Profile.Value.Items.FindIndex(v => v.Quality == remoteEpisode.ParsedMovieInfo.Quality.Quality)), + CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => remoteEpisode.ParsedMovieInfo.Quality.Revision.Real), + CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => remoteEpisode.ParsedMovieInfo.Quality.Revision.Version)); + } return CompareAll(CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.Series.Profile.Value.Items.FindIndex(v => v.Quality == remoteEpisode.ParsedEpisodeInfo.Quality.Quality)), CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Real), CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Version)); @@ -63,6 +67,7 @@ namespace NzbDrone.Core.DecisionEngine private int CompareProtocol(DownloadDecision x, DownloadDecision y) { + var result = CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => { var delayProfile = _delayProfileService.BestForTags(remoteEpisode.Series.Tags); @@ -70,13 +75,22 @@ namespace NzbDrone.Core.DecisionEngine return downloadProtocol == delayProfile.PreferredProtocol; }); + if (x.IsForMovie) + { + result = CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => + { + var delayProfile = _delayProfileService.BestForTags(remoteEpisode.Movie.Tags); + var downloadProtocol = remoteEpisode.Release.DownloadProtocol; + return downloadProtocol == delayProfile.PreferredProtocol; + }); + } + return result; } private int CompareEpisodeCount(DownloadDecision x, DownloadDecision y) { - return CompareAll(CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.FullSeason), - CompareByReverse(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.Episodes.Count)); + return 0; } private int CompareEpisodeNumber(DownloadDecision x, DownloadDecision y) @@ -88,20 +102,20 @@ namespace NzbDrone.Core.DecisionEngine { // Different protocols should get caught when checking the preferred protocol, // since we're dealing with the same series in our comparisions - if (x.RemoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent || - y.RemoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent) + if (x.RemoteMovie.Release.DownloadProtocol != DownloadProtocol.Torrent || + y.RemoteMovie.Release.DownloadProtocol != DownloadProtocol.Torrent) { return 0; } return CompareAll( - CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => + CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => { var seeders = TorrentInfo.GetSeeders(remoteEpisode.Release); return seeders.HasValue && seeders.Value > 0 ? Math.Round(Math.Log10(seeders.Value)) : 0; }), - CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => + CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => { var peers = TorrentInfo.GetPeers(remoteEpisode.Release); @@ -117,7 +131,7 @@ namespace NzbDrone.Core.DecisionEngine return 0; } - return CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => + return CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => { var ageHours = remoteEpisode.Release.AgeHours; var age = remoteEpisode.Release.Age; @@ -145,7 +159,7 @@ namespace NzbDrone.Core.DecisionEngine { // TODO: Is smaller better? Smaller for usenet could mean no par2 files. - return CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.Release.Size.Round(200.Megabytes())); + return CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => remoteEpisode.Release.Size.Round(200.Megabytes())); } } } From 5a8d9443972cb98f42a2ed944bfc3eee43c83d11 Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Thu, 12 Jan 2017 23:07:09 +0100 Subject: [PATCH 18/71] Fixed sorting in movie list view. Also added new downloaded quality column. Fixes #128 --- src/UI/Cells/DownloadedQualityCell.js | 34 ++++++++++++++++++++++++ src/UI/Cells/MovieDownloadStatusCell.js | 4 +++ src/UI/Movies/Index/MoviesIndexLayout.js | 15 ++++++++++- src/UI/Movies/MovieModel.js | 26 ++++++++++++++++++ src/UI/Movies/MoviesCollection.js | 29 +++++++++++++++++++- 5 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/UI/Cells/DownloadedQualityCell.js diff --git a/src/UI/Cells/DownloadedQualityCell.js b/src/UI/Cells/DownloadedQualityCell.js new file mode 100644 index 000000000..0cf40c21c --- /dev/null +++ b/src/UI/Cells/DownloadedQualityCell.js @@ -0,0 +1,34 @@ +var Backgrid = require('backgrid'); +var ProfileCollection = require('../Profile/ProfileCollection'); +var _ = require('underscore'); + +module.exports = Backgrid.Cell.extend({ + className : 'profile-cell', + + _originalInit : Backgrid.Cell.prototype.initialize, + + initialize : function () { + this._originalInit.apply(this, arguments); + + this.listenTo(ProfileCollection, 'sync', this.render); + }, + + render : function() { + + this.$el.empty(); + if (this.model.get("movieFile")) { + var profileId = this.model.get("movieFile").quality.quality.id; + + var profile = _.findWhere(ProfileCollection.models, { id : profileId }); + + if (profile) { + this.$el.html(profile.get('name')); + } else { + this.$el.html(this.model.get("movieFile").quality.quality.name); + } + } + + + return this; + } +}); diff --git a/src/UI/Cells/MovieDownloadStatusCell.js b/src/UI/Cells/MovieDownloadStatusCell.js index ba35657b4..7cb154374 100644 --- a/src/UI/Cells/MovieDownloadStatusCell.js +++ b/src/UI/Cells/MovieDownloadStatusCell.js @@ -3,4 +3,8 @@ var TemplatedCell = require('./TemplatedCell'); module.exports = TemplatedCell.extend({ className : 'movie-title-cell', template : 'Cells/MovieDownloadStatusTemplate', + sortKey : function(model) { + debugger; + return 0; + } }); diff --git a/src/UI/Movies/Index/MoviesIndexLayout.js b/src/UI/Movies/Index/MoviesIndexLayout.js index 3b12a36e0..a4db4c892 100644 --- a/src/UI/Movies/Index/MoviesIndexLayout.js +++ b/src/UI/Movies/Index/MoviesIndexLayout.js @@ -13,6 +13,7 @@ var MovieLinksCell = require('../../Cells/MovieLinksCell'); var MovieActionCell = require('../../Cells/MovieActionCell'); var MovieStatusCell = require('../../Cells/MovieStatusCell'); var MovieDownloadStatusCell = require('../../Cells/MovieDownloadStatusCell'); +var DownloadedQualityCell = require('../../Cells/DownloadedQualityCell'); var FooterView = require('./FooterView'); var FooterModel = require('./FooterModel'); var ToolbarLayout = require('../../Shared/Toolbar/ToolbarLayout'); @@ -40,6 +41,11 @@ module.exports = Marionette.Layout.extend({ cell : MovieTitleCell, cellValue : 'this', }, + { + name : "downloadedQuality", + label : "Downloaded", + cell : DownloadedQualityCell, + }, { name : 'profileId', label : 'Profile', @@ -54,12 +60,19 @@ module.exports = Marionette.Layout.extend({ name : 'this', label : 'Links', cell : MovieLinksCell, - className : "movie-links-cell" + className : "movie-links-cell", + sortable : false, }, { name : "this", label : "Status", cell : MovieDownloadStatusCell, + sortValue : function(m, k) { + if (m.get("downloaded")) { + return -1; + } + return 0; + } }, { name : 'this', diff --git a/src/UI/Movies/MovieModel.js b/src/UI/Movies/MovieModel.js index a3e0d5a35..5c8538271 100644 --- a/src/UI/Movies/MovieModel.js +++ b/src/UI/Movies/MovieModel.js @@ -9,5 +9,31 @@ module.exports = Backbone.Model.extend({ episodeCount : 0, isExisting : false, status : 0 + }, + + getStatus : function() { + var monitored = this.get("monitored"); + var status = this.get("status"); + var inCinemas = this.get("inCinemas"); + var date = new Date(inCinemas); + var timeSince = new Date().getTime() - date.getTime(); + var numOfMonths = timeSince / 1000 / 60 / 60 / 24 / 30; + + if (status === "announced") { + return "announced" + } + + if (numOfMonths < 3 && numOfMonths > 0) { + + return "inCinemas"; + } + + if (status === 'released') { + return "released"; + } + + if (numOfMonths > 3) { + return "released";//TODO: Update for PreDB.me + } } }); diff --git a/src/UI/Movies/MoviesCollection.js b/src/UI/Movies/MoviesCollection.js index bc97e360d..594305ba0 100644 --- a/src/UI/Movies/MoviesCollection.js +++ b/src/UI/Movies/MoviesCollection.js @@ -75,7 +75,26 @@ var Collection = PageableCollection.extend({ title : { sortKey : 'sortTitle' }, + statusWeight : { + sortValue : function(model, attr) { + if (model.getStatus() == "released") { + return 1; + } + if (model.getStatus() == "inCinemas") { + return 0; + } + return -1; + } + }, + downloadedQuality : { + sortValue : function(model, attr) { + if (model.get("movieFile")) { + return 1000-model.get("movieFile").quality.quality.id; + } + return -1; + } + }, nextAiring : { sortValue : function(model, attr, order) { var nextAiring = model.get(attr); @@ -91,7 +110,15 @@ var Collection = PageableCollection.extend({ return Number.MAX_VALUE; } }, - + status: { + sortValue : function(model, attr) { + debugger; + if (model.get("downloaded")) { + return -1; + } + return 0; + } + }, percentOfEpisodes : { sortValue : function(model, attr) { var percentOfEpisodes = model.get(attr); From a060335bbc47b06b259145c62c8c42c3553dd313 Mon Sep 17 00:00:00 2001 From: Leonardo Galli <leonardo.galli@bluewin.ch> Date: Fri, 13 Jan 2017 00:15:27 +0100 Subject: [PATCH 19/71] Update readme.md --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index 2c26ccb3e..86665c6fd 100644 --- a/readme.md +++ b/readme.md @@ -26,6 +26,8 @@ This fork of Sonarr aims to turn it into something like Couchpotato. ## Download The latest precompiled binary versions can be found here: https://github.com/galli-leo/Radarr/releases. +To connect to the UI, fire up your browser and open localhost:7878 or your-ip:7878. + Docker containers from [linuxserver.io](https://linuxserver.io) can be found here. * [Radarr (x64)](https://hub.docker.com/r/linuxserver/radarr/) * [Radarr (armhf)](https://hub.docker.com/r/lsioarmhf/radarr/) From 774c85f06b901a5f6ad4996de3f407699fd03b49 Mon Sep 17 00:00:00 2001 From: Devin Buhl <devin.kray@gmail.com> Date: Thu, 12 Jan 2017 18:44:05 -0500 Subject: [PATCH 20/71] improved categories, added Nzb-Tortuga as a preset --- src/NzbDrone.Core/Indexers/Newznab/Newznab.cs | 5 +++-- src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs index 307ed0021..88984e7c5 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs @@ -41,12 +41,13 @@ namespace NzbDrone.Core.Indexers.Newznab { yield return GetDefinition("Dognzb.cr", GetSettings("https://api.dognzb.cr")); yield return GetDefinition("DrunkenSlug", GetSettings("https://api.drunkenslug.com")); + yield return GetDefinition("Nzb-Tortuga", GetSettings("https://www.nzb-tortuga.com")); yield return GetDefinition("Nzb.su", GetSettings("https://api.nzb.su")); yield return GetDefinition("NZBCat", GetSettings("https://nzb.cat")); - yield return GetDefinition("NZBFinder.ws", GetSettings("https://nzbfinder.ws", 5010, 5030, 5040, 5045)); + yield return GetDefinition("NZBFinder.ws", GetSettings("https://nzbfinder.ws")); yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info")); yield return GetDefinition("nzbplanet.net", GetSettings("https://api.nzbplanet.net")); - yield return GetDefinition("Nzbs.org", GetSettings("http://nzbs.org", 2000)); + yield return GetDefinition("Nzbs.org", GetSettings("http://nzbs.org")); yield return GetDefinition("OZnzb.com", GetSettings("https://api.oznzb.com")); yield return GetDefinition("PFmonkey", GetSettings("https://www.pfmonkey.com")); yield return GetDefinition("SimplyNZBs", GetSettings("https://simplynzbs.com")); diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs index ac10d3a73..125391f57 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabSettings.cs @@ -60,7 +60,7 @@ namespace NzbDrone.Core.Indexers.Newznab public NewznabSettings() { - Categories = new[] { 2030, 2035, 2040, 2045, 2050 }; + Categories = new[] { 2000, 2010, 2020, 2030, 2035, 2040, 2045, 2050, 2060 }; AnimeCategories = Enumerable.Empty<int>(); } From d61b9ab207cda7588a0bce99645c99b596c0d0dc Mon Sep 17 00:00:00 2001 From: Tim Schindler <tim.schindler@gmail.com> Date: Thu, 12 Jan 2017 21:02:27 -0500 Subject: [PATCH 21/71] omgwtfnzbs: fixed parsing of GetInfoUrl and updated tests --- .../Files/Indexers/Omgwtfnzbs/Omgwtfnzbs.xml | 1880 ++++++++--------- .../OmgwtfnzbsTests/OmgwtfnzbsFixture.cs | 10 +- .../Omgwtfnzbs/OmgwtfnzbsRssParser.cs | 2 +- 3 files changed, 945 insertions(+), 947 deletions(-) diff --git a/src/NzbDrone.Core.Test/Files/Indexers/Omgwtfnzbs/Omgwtfnzbs.xml b/src/NzbDrone.Core.Test/Files/Indexers/Omgwtfnzbs/Omgwtfnzbs.xml index d11fe2a1b..93dc7ce13 100644 --- a/src/NzbDrone.Core.Test/Files/Indexers/Omgwtfnzbs/Omgwtfnzbs.xml +++ b/src/NzbDrone.Core.Test/Files/Indexers/Omgwtfnzbs/Omgwtfnzbs.xml @@ -1,1212 +1,1210 @@ <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"> <channel> - <generator>omgwtfnzbs.org rss feeds generator</generator> + <generator>omgwtfnzbs.me rss feeds generator</generator> <language>en-us</language> - <title>Search NZB Download Feed - http://rss.omgwtfnzbs.org - auto-dl feed for omgwtfnzbs.org - 2010 - 2012 omgwtfnzbs - - Mon, 17 Dec 2012 23:30:16 +0000 - - - Stephen.Fry.Gadget.Man.S01E05.HDTV.x264-C4TV - Mon, 17 Dec 2012 23:30:13 +0000 - http://api.omgwtfnzbs.org/sn.php?id=OAl4g&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=OAl4g&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 225.85 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 23:30:04
Added to usenet: 17/12/2012 23:30:13
Weblink: http://www.tvrage.com/shows/id-33431
View NZB: http://omgwtfnzbs.org/details.php?id=OAl4g]]>
- TV: STD - tv.sd - 19 - -
- - - Never.Mind.The.Buzzcocks.UK.S26E12.720p.HDTV.x264-FTP - Mon, 17 Dec 2012 23:27:23 +0000 - http://api.omgwtfnzbs.org/sn.php?id=3whQL&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=3whQL&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 660.51 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 23:26:53
Added to usenet: 17/12/2012 23:27:23
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=3whQL]]>
- TV: HD - tv.hd - 20 - -
- - - Bad.Santas.S01E01.HDTV.x264-W4F - Mon, 17 Dec 2012 23:23:02 +0000 - http://api.omgwtfnzbs.org/sn.php?id=YXPhW&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=YXPhW&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 437.29 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 23:22:39
Added to usenet: 17/12/2012 23:23:02
Weblink: http://thetvdb.com/?tab=series&id=264930&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=YXPhW]]>
- TV: STD - tv.sd - 19 - -
- - - Chainsaw.Gang.S01E06.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 23:10:55 +0000 - http://api.omgwtfnzbs.org/sn.php?id=387yh&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=387yh&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 218.8 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 23:16:58
Added to usenet: 17/12/2012 23:10:55
Weblink: http://thetvdb.com/?tab=series&id=263322&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=387yh]]>
- TV: STD - tv.sd - 19 - -
- - - NFL.2012.12.16.Buccaneers.vs.Saints.720p.HDTV.x264-BAJSKORV - Mon, 17 Dec 2012 23:10:23 +0000 - http://api.omgwtfnzbs.org/sn.php?id=oUgMb&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=oUgMb&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 6.76 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 23:07:16
Added to usenet: 17/12/2012 23:10:23
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=oUgMb]]>
- TV: HD - tv.hd - 20 - -
- - - Never.Mind.The.Buzzcocks.UK.S26E12.HDTV.x264-FTP - Mon, 17 Dec 2012 23:10:22 +0000 - http://api.omgwtfnzbs.org/sn.php?id=CAxYY&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=CAxYY&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 220.87 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 23:09:59
Added to usenet: 17/12/2012 23:10:22
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=CAxYY]]>
- TV: STD - tv.sd - 19 - -
- - - Sloth.Bear.HDTV.x264-TERRA - Mon, 17 Dec 2012 23:02:13 +0000 - http://api.omgwtfnzbs.org/sn.php?id=LDn8P&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=LDn8P&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 452 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 23:02:00
Added to usenet: 17/12/2012 23:02:13
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=LDn8P]]>
- TV: STD - tv.sd - 19 - -
- - - Panorama.S60E49.HDTV.x264-BARGE - Mon, 17 Dec 2012 22:55:30 +0000 - http://api.omgwtfnzbs.org/sn.php?id=6aLWJ&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=6aLWJ&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 250.86 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:55:18
Added to usenet: 17/12/2012 22:55:30
Weblink: http://thetvdb.com/?tab=series&id=80748&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=6aLWJ]]>
- TV: STD - tv.sd - 19 - -
- - - Chainsaw.Gang.S01E05.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 22:51:26 +0000 - http://api.omgwtfnzbs.org/sn.php?id=FdB6A&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=FdB6A&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 165.75 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 22:57:31
Added to usenet: 17/12/2012 22:51:26
Weblink: http://thetvdb.com/?tab=series&id=263322&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=FdB6A]]>
- TV: STD - tv.sd - 19 - + omgwtfnzbs.me - Latest NZB Download Feed + https://rss.omgwtfnzbs.me/ + omgwtfnzbs.me - NZB Download Feed (false) + 2010 - 2014 omgwtfnzbs + + + Un.Petit.Boulot.2016.FRENCH.720p.BluRay.DTS.x264-LOST + Mon, 09 Jan 2017 02:16:54 +0200 + https://api.omgwtfnzbs.me/nzb/?id=8a2Bw&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=8a2Bw&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 4.99 GB
Group: alt.binaries.boneless
Added to index: 01/01/2017 22:49:30
Added to usenet: 09/01/2017 02:16:54
View NZB: https://omgwtfnzbs.me/details.php?id=8a2Bw]]>
+ Movies: HD + movies.hd + 16 + +
+ + + Death.Race.2050.2017.1080p.BluRay.x264-ROVERS + Mon, 09 Jan 2017 01:40:12 +0200 + https://api.omgwtfnzbs.me/nzb/?id=2Aqi3&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=2Aqi3&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 8.8 GB
Group: alt.binaries.moovee
Added to index: 09/01/2017 00:37:45
Added to usenet: 09/01/2017 01:40:12
View NZB: https://omgwtfnzbs.me/details.php?id=2Aqi3]]>
+ Movies: HD + movies.hd + 16 + +
+ + + Death.Race.2050.2017.BDRip.x264-ROVERS + Mon, 09 Jan 2017 01:17:52 +0200 + https://api.omgwtfnzbs.me/nzb/?id=dg04S&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=dg04S&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 1.1 GB
Group: alt.binaries.moovee
Added to index: 09/01/2017 00:14:52
Added to usenet: 09/01/2017 01:17:52
View NZB: https://omgwtfnzbs.me/details.php?id=dg04S]]>
+ Movies: STD + movies.sd + 15 + +
+ + + Floored.2009.1080p.BluRay.x264-THUGLiNE + Sun, 08 Jan 2017 23:34:46 +0200 + https://api.omgwtfnzbs.me/nzb/?id=c2rBA&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=c2rBA&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.33 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 22:31:47
Added to usenet: 08/01/2017 23:34:46
View NZB: https://omgwtfnzbs.me/details.php?id=c2rBA]]>
+ Movies: HD + movies.hd + 16 + +
+ + + Floored.2009.720p.BluRay.x264-THUGLiNE + Sun, 08 Jan 2017 23:31:06 +0200 + https://api.omgwtfnzbs.me/nzb/?id=fV4im&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=fV4im&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.73 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 22:27:10
Added to usenet: 08/01/2017 23:31:06
View NZB: https://omgwtfnzbs.me/details.php?id=fV4im]]>
+ Movies: HD + movies.hd + 16 + +
+ + + Live.Flesh.1997.1080p.BluRay.FLAC2.0.x264-DON + Sun, 08 Jan 2017 20:19:06 +0200 + https://api.omgwtfnzbs.me/nzb/?id=BnTZ0&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=BnTZ0&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 16.85 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 19:16:44
Added to usenet: 08/01/2017 20:19:06
View NZB: https://omgwtfnzbs.me/details.php?id=BnTZ0]]>
+ Movies: HD + movies.hd + 16 + +
+ + + Sex.By.Advertisement.1968.DVDRip.x264-FiCO + Sun, 08 Jan 2017 18:02:53 +0200 + https://api.omgwtfnzbs.me/nzb/?id=yMSuc&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=yMSuc&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 862.74 MB
Group: alt.binaries.moovee
Added to index: 08/01/2017 17:00:47
Added to usenet: 08/01/2017 18:02:53
View NZB: https://omgwtfnzbs.me/details.php?id=yMSuc]]>
+ Movies: STD + movies.sd + 15 + +
+ + + Super.Rhino.2009.1080p.BluRay.x264-FLAME + Sun, 08 Jan 2017 13:17:06 +0200 + https://api.omgwtfnzbs.me/nzb/?id=b43Ej&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=b43Ej&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 502.14 MB
Group: alt.binaries.moovee
Added to index: 08/01/2017 12:15:19
Added to usenet: 08/01/2017 13:17:06
View NZB: https://omgwtfnzbs.me/details.php?id=b43Ej]]>
+ Movies: HD + movies.hd + 16 + +
+ + + Super.Rhino.2009.720p.BluRay.x264-FLAME + Sun, 08 Jan 2017 13:15:26 +0200 + https://api.omgwtfnzbs.me/nzb/?id=k6soa&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=k6soa&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 266.62 MB
Group: alt.binaries.moovee
Added to index: 08/01/2017 12:13:35
Added to usenet: 08/01/2017 13:15:26
View NZB: https://omgwtfnzbs.me/details.php?id=k6soa]]>
+ Movies: HD + movies.hd + 16 +
- Inside.Claridges.S01E03.HDTV.x264-FTP - Mon, 17 Dec 2012 22:48:24 +0000 - http://api.omgwtfnzbs.org/sn.php?id=0zjU4&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=0zjU4&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 448.38 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:48:04
Added to usenet: 17/12/2012 22:48:24
Weblink: http://thetvdb.com/?tab=series&id=264600&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=0zjU4]]>
- TV: STD - tv.sd - 19 - + San.Andreas.2015.TRUEFRENCH.720p.BluRay.x264-AiRLiNE + Sun, 08 Jan 2017 13:03:23 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Yvek6&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Yvek6&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.05 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 06:25:10
Added to usenet: 08/01/2017 13:03:23
View NZB: https://omgwtfnzbs.me/details.php?id=Yvek6]]>
+ Movies: HD + movies.hd + 16 +
- Royal.Pains.S04E15.Off-Season.Greetings.Pt.1.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 22:47:52 +0000 - http://api.omgwtfnzbs.org/sn.php?id=mMHry&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=mMHry&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 277.66 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 22:53:52
Added to usenet: 17/12/2012 22:47:52
Weblink: http://thetvdb.com/?tab=series&id=92411&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=mMHry]]>
- TV: STD - tv.sd - 19 - + San.Andreas.2015.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 13:02:45 +0200 + https://api.omgwtfnzbs.me/nzb/?id=wbvw3&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=wbvw3&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.09 GB
Group: alt.binaries.felfelida
Added to index: 11/12/2016 01:52:51
Added to usenet: 08/01/2017 13:02:45
View NZB: https://omgwtfnzbs.me/details.php?id=wbvw3]]>
+ Movies: HD + movies.hd + 16 +
- The.Poison.Tree.S01E02.720p.HDTV.x264-TLA - Mon, 17 Dec 2012 22:44:57 +0000 - http://api.omgwtfnzbs.org/sn.php?id=XiqFs&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=XiqFs&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 868.42 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:44:21
Added to usenet: 17/12/2012 22:44:57
Weblink: http://thetvdb.com/?tab=series&id=264796&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=XiqFs]]>
- TV: HD - tv.hd - 20 - + Saints.And.Soldiers.2003.STV.FRENCH.720p.BluRay.x264-MUxHD + Sun, 08 Jan 2017 13:02:12 +0200 + https://api.omgwtfnzbs.me/nzb/?id=KID80&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=KID80&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.12 GB
Group: alt.binaries.movies.french
Added to index: 01/12/2016 22:58:21
Added to usenet: 08/01/2017 13:02:12
View NZB: https://omgwtfnzbs.me/details.php?id=KID80]]>
+ Movies: HD + movies.hd + 16 +
- The.Poison.Tree.S01E02.HDTV.x264-RiVER - Mon, 17 Dec 2012 22:37:44 +0000 - http://api.omgwtfnzbs.org/sn.php?id=S8EDd&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=S8EDd&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 331.56 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:37:28
Added to usenet: 17/12/2012 22:37:44
Weblink: http://thetvdb.com/?tab=series&id=264796&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=S8EDd]]>
- TV: STD - tv.sd - 19 - + Risen.2016.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 13:01:49 +0200 + https://api.omgwtfnzbs.me/nzb/?id=hyUJx&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=hyUJx&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.4 GB
Group: alt.binaries.felfelida
Added to index: 29/11/2016 23:02:11
Added to usenet: 08/01/2017 13:01:49
View NZB: https://omgwtfnzbs.me/details.php?id=hyUJx]]>
+ Movies: HD + movies.hd + 16 +
- Inside.Claridges.S01E03.720p.HDTV.x264-FTP - Mon, 17 Dec 2012 22:29:51 +0000 - http://api.omgwtfnzbs.org/sn.php?id=edHL6&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=edHL6&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.18 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:29:43
Added to usenet: 17/12/2012 22:29:51
Weblink: http://thetvdb.com/?tab=series&id=264600&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=edHL6]]>
- TV: HD - tv.hd - 20 - + Ran.1985.REMASTERED.FRENCH.720p.BluRay.x264-ULSHD + Sun, 08 Jan 2017 13:01:24 +0200 + https://api.omgwtfnzbs.me/nzb/?id=5elVu&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=5elVu&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 10.18 GB
Group: alt.binaries.movies.french
Added to index: 03/12/2016 22:56:51
Added to usenet: 08/01/2017 13:01:24
View NZB: https://omgwtfnzbs.me/details.php?id=5elVu]]>
+ Movies: HD + movies.hd + 16 +
- Tron.Uprising.S01E13.The.Stranger.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 22:28:47 +0000 - http://api.omgwtfnzbs.org/sn.php?id=BMO6u&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=BMO6u&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 163.45 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 22:32:56
Added to usenet: 17/12/2012 22:28:47
Weblink: http://thetvdb.com/?tab=series&id=258480&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=BMO6u]]>
- TV: STD - tv.sd - 19 - + Pride.and.Prejudice.and.Zombies.2016.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 13:00:41 +0200 + https://api.omgwtfnzbs.me/nzb/?id=TL2hr&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=TL2hr&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.06 GB
Group: alt.binaries.felfelida
Added to index: 02/12/2016 05:19:32
Added to usenet: 08/01/2017 13:00:41
View NZB: https://omgwtfnzbs.me/details.php?id=TL2hr]]>
+ Movies: HD + movies.hd + 16 +
- NFL.2012.12.16.Vikings.vs.Rams.720p.HDTV.x264-BAJSKORV - Mon, 17 Dec 2012 22:26:54 +0000 - http://api.omgwtfnzbs.org/sn.php?id=Z2fIr&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=Z2fIr&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 6.24 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:20:07
Added to usenet: 17/12/2012 22:26:54
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=Z2fIr]]>
- TV: HD - tv.hd - 20 - + Precious.Cargo.2016.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 13:00:21 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Ehb5l&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Ehb5l&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.84 GB
Group: alt.binaries.felfelida
Added to index: 15/12/2016 06:20:31
Added to usenet: 08/01/2017 13:00:21
View NZB: https://omgwtfnzbs.me/details.php?id=Ehb5l]]>
+ Movies: HD + movies.hd + 16 +
- The.Gadget.Show.World.Tour.S02E07.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 22:23:04 +0000 - http://api.omgwtfnzbs.org/sn.php?id=NrREN&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=NrREN&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 341.1 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 22:29:02
Added to usenet: 17/12/2012 22:23:04
Weblink: http://thetvdb.com/?tab=series&id=258440&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=NrREN]]>
- TV: STD - tv.sd - 19 - + Pina.2011.DOC.PROPER.FRENCH.1080p.BluRay.x264-FiDELiO + Sun, 08 Jan 2017 13:00:05 +0200 + https://api.omgwtfnzbs.me/nzb/?id=cNsHi&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=cNsHi&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 8.98 GB
Group: alt.binaries.documentaries.french
Added to index: 01/12/2016 23:03:07
Added to usenet: 08/01/2017 13:00:05
View NZB: https://omgwtfnzbs.me/details.php?id=cNsHi]]>
+ Movies: HD + movies.hd + 16 +
- Redneck.Island.S02E06.HDTV.x264-YesTV - Mon, 17 Dec 2012 22:16:37 +0000 - http://api.omgwtfnzbs.org/sn.php?id=75b7e&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=75b7e&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 440.67 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:16:12
Added to usenet: 17/12/2012 22:16:37
Weblink: http://thetvdb.com/?tab=series&id=259570&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=75b7e]]>
- TV: STD - tv.sd - 19 - + Paranormal.Activity.The.Ghost.Dimension.2015.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:59:36 +0200 + https://api.omgwtfnzbs.me/nzb/?id=uTXRQ&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=uTXRQ&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.05 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 06:39:37
Added to usenet: 08/01/2017 12:59:36
View NZB: https://omgwtfnzbs.me/details.php?id=uTXRQ]]>
+ Movies: HD + movies.hd + 16 +
- Chainsaw.Gang.S01E06.HDTV.x264-YesTV - Mon, 17 Dec 2012 22:15:52 +0000 - http://api.omgwtfnzbs.org/sn.php?id=G8QhV&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=G8QhV&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 259.24 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:15:38
Added to usenet: 17/12/2012 22:15:52
Weblink: http://thetvdb.com/?tab=series&id=263322&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=G8QhV]]>
- TV: STD - tv.sd - 19 - + Paper.Towns.2015.TRUEFRENCH.720p.BluRay.x264-MELBA + Sun, 08 Jan 2017 12:59:10 +0200 + https://api.omgwtfnzbs.me/nzb/?id=fq5pK&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=fq5pK&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.09 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 05:25:16
Added to usenet: 08/01/2017 12:59:10
View NZB: https://omgwtfnzbs.me/details.php?id=fq5pK]]>
+ Movies: HD + movies.hd + 16 +
- VH1.Divas.2012.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 22:15:23 +0000 - http://api.omgwtfnzbs.org/sn.php?id=dohtS&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=dohtS&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 1.16 GB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 22:20:56
Added to usenet: 17/12/2012 22:15:23
Weblink: http://lookpic.com/O/i2/227/bkl5VFGu.jpeg[/IMG
View NZB: http://omgwtfnzbs.org/details.php?id=dohtS]]>
- TV: STD - tv.sd - 19 - + Papa.Ou.Maman.2015.RERIP.FRENCH.DVDRip.x264-Ryotox + Sun, 08 Jan 2017 12:58:10 +0200 + https://api.omgwtfnzbs.me/nzb/?id=3WN1H&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=3WN1H&user=nzbdrone&api=nzbdrone + Category: Movies: DVD
Size: 585.4 MB
Group: alt.binaries.movies.french
Added to index: 12/12/2016 00:21:27
Added to usenet: 08/01/2017 12:58:10
View NZB: https://omgwtfnzbs.me/details.php?id=3WN1H]]>
+ Movies: DVD + movies.dvd + 17 +
- Chainsaw.Gang.S01E05.HDTV.x264-YesTV - Mon, 17 Dec 2012 22:14:57 +0000 - http://api.omgwtfnzbs.org/sn.php?id=PBGHM&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=PBGHM&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 196.5 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:14:43
Added to usenet: 17/12/2012 22:14:57
Weblink: http://thetvdb.com/?tab=series&id=263322&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=PBGHM]]>
- TV: STD - tv.sd - 19 - + Pan.2015.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:57:29 +0200 + https://api.omgwtfnzbs.me/nzb/?id=RCeDE&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=RCeDE&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.08 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 05:27:53
Added to usenet: 08/01/2017 12:57:29
View NZB: https://omgwtfnzbs.me/details.php?id=RCeDE]]>
+ Movies: HD + movies.hd + 16 +
- Bad.Girls.S03E16.DVDRiP.XViD-PiX - Mon, 17 Dec 2012 22:10:30 +0000 - http://api.omgwtfnzbs.org/sn.php?id=JaeF7&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=JaeF7&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 397.05 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:10:16
Added to usenet: 17/12/2012 22:10:30
Weblink: http://thetvdb.com/?tab=series&id=75328&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=JaeF7]]>
- TV: STD - tv.sd - 19 - + Now.You.See.Me.2.2016.TRUEFRENCH.720p.BluRay.x264-PKPTRS + Sun, 08 Jan 2017 12:56:08 +0200 + https://api.omgwtfnzbs.me/nzb/?id=aFTn5&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=aFTn5&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.36 GB
Group: alt.binaries.felfelida
Added to index: 10/12/2016 10:15:44
Added to usenet: 08/01/2017 12:56:08
View NZB: https://omgwtfnzbs.me/details.php?id=aFTn5]]>
+ Movies: HD + movies.hd + 16 +
- Royal.Pains.S04E16.720p.WEB-DL.DD5.1.H.264-NTb - Mon, 17 Dec 2012 22:06:00 +0000 - http://api.omgwtfnzbs.org/sn.php?id=tlyYX&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=tlyYX&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.61 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 22:05:19
Added to usenet: 17/12/2012 22:06:00
Weblink: http://thetvdb.com/?tab=series&id=92411&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=tlyYX]]>
- TV: HD - tv.hd - 20 - + Now.You.See.Me.2.2016.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 12:55:45 +0200 + https://api.omgwtfnzbs.me/nzb/?id=xvkz2&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=xvkz2&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.11 GB
Group: alt.binaries.felfelida
Added to index: 03/12/2016 09:20:25
Added to usenet: 08/01/2017 12:55:45
View NZB: https://omgwtfnzbs.me/details.php?id=xvkz2]]>
+ Movies: HD + movies.hd + 16 +
- Royal.Pains.S04E15.720p.WEB-DL.DD5.1.H.264-NTb - Mon, 17 Dec 2012 21:57:55 +0000 - http://api.omgwtfnzbs.org/sn.php?id=FJrFr&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=FJrFr&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.59 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 21:57:32
Added to usenet: 17/12/2012 21:57:55
Weblink: http://thetvdb.com/?tab=series&id=92411&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=FJrFr]]>
- TV: HD - tv.hd - 20 - + Morgan.2016.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:55:10 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Lc2Az&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Lc2Az&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.83 GB
Group: alt.binaries.felfelida
Added to index: 10/12/2016 10:18:39
Added to usenet: 08/01/2017 12:55:10
View NZB: https://omgwtfnzbs.me/details.php?id=Lc2Az]]>
+ Movies: HD + movies.hd + 16 +
- Chainsaw.Gang.S01E06.720p.HDTV.x264-YesTV - Mon, 17 Dec 2012 21:54:29 +0000 - http://api.omgwtfnzbs.org/sn.php?id=OMgpi&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=OMgpi&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 874.25 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 21:54:04
Added to usenet: 17/12/2012 21:54:29
Weblink: http://thetvdb.com/?tab=series&id=263322&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=OMgpi]]>
- TV: HD - tv.hd - 20 - + Moms.Night.Out.2014.MULTi.1080p.BluRay.x264-LOST + Sun, 08 Jan 2017 12:54:52 +0200 + https://api.omgwtfnzbs.me/nzb/?id=jIJMw&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=jIJMw&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 9.28 GB
Group: alt.binaries.felfelida
Added to index: 01/12/2016 06:30:43
Added to usenet: 08/01/2017 12:54:52
View NZB: https://omgwtfnzbs.me/details.php?id=jIJMw]]>
+ Movies: HD + movies.hd + 16 +
- Chainsaw.Gang.S01E05.720p.HDTV.x264-YesTV - Mon, 17 Dec 2012 21:53:07 +0000 - http://api.omgwtfnzbs.org/sn.php?id=9jFDc&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=9jFDc&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 646.35 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 21:52:35
Added to usenet: 17/12/2012 21:53:07
Weblink: http://thetvdb.com/?tab=series&id=263322&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=9jFDc]]>
- TV: HD - tv.hd - 20 - + Career.Bed.1969.DVDRip.x264-FiCO + Sun, 08 Jan 2017 12:54:28 +0200 + https://api.omgwtfnzbs.me/nzb/?id=6yaYt&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=6yaYt&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 902.56 MB
Group: alt.binaries.moovee
Added to index: 08/01/2017 11:52:16
Added to usenet: 08/01/2017 12:54:28
View NZB: https://omgwtfnzbs.me/details.php?id=6yaYt]]>
+ Movies: STD + movies.sd + 15 +
- Redneck.Island.S02E06.720p.HDTV.x264-YesTV - Mon, 17 Dec 2012 21:51:58 +0000 - http://api.omgwtfnzbs.org/sn.php?id=48dBN&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=48dBN&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.38 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 21:50:34
Added to usenet: 17/12/2012 21:51:58
Weblink: http://thetvdb.com/?tab=series&id=259570&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=48dBN]]>
- TV: HD - tv.hd - 20 - + Mission.Impossible.Rogue.Nation.2015.TrueHD.Atmos.AC3.MULTISUBS.1080p.BluRay.x264.HQ-TUSAHD + Sun, 08 Jan 2017 12:54:06 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Uerkq&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Uerkq&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 16.69 GB
Group: alt.binaries.felfelida
Added to index: 03/12/2016 04:44:07
Added to usenet: 08/01/2017 12:54:06
View NZB: https://omgwtfnzbs.me/details.php?id=Uerkq]]>
+ Movies: HD + movies.hd + 16 +
- Drugs.Inc.S03E07.Hollywood.High.720p.HDTV.x264-YesTV - Mon, 17 Dec 2012 21:49:53 +0000 - http://api.omgwtfnzbs.org/sn.php?id=yY198&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=yY198&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.46 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 21:47:58
Added to usenet: 17/12/2012 21:49:53
Weblink: http://thetvdb.com/?tab=series&id=174501&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=yY198]]>
- TV: HD - tv.hd - 20 - + Miss.Peregrines.Home.for.Peculiar.Children.2016.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:53:12 +0200 + https://api.omgwtfnzbs.me/nzb/?id=sL8wn&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=sL8wn&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.34 GB
Group: alt.binaries.felfelida
Added to index: 10/12/2016 10:09:56
Added to usenet: 08/01/2017 12:53:12
View NZB: https://omgwtfnzbs.me/details.php?id=sL8wn]]>
+ Movies: HD + movies.hd + 16 +
- Drugs.Inc.S03E07.Hollywood.High.HDTV.x264-YesTV - Mon, 17 Dec 2012 21:45:17 +0000 - http://api.omgwtfnzbs.org/sn.php?id=VH7uw&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=VH7uw&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 476.18 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 21:44:51
Added to usenet: 17/12/2012 21:45:17
Weblink: http://thetvdb.com/?tab=series&id=174501&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=VH7uw]]>
- TV: STD - tv.sd - 19 - + Miracles.from.Heaven.2016.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:52:40 +0200 + https://api.omgwtfnzbs.me/nzb/?id=G1Q8k&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=G1Q8k&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.09 GB
Group: alt.binaries.felfelida
Added to index: 02/12/2016 05:21:58
Added to usenet: 08/01/2017 12:52:40
View NZB: https://omgwtfnzbs.me/details.php?id=G1Q8k]]>
+ Movies: HD + movies.hd + 16 +
- Tron.Uprising.S01E13.720p.WEB-DL.H.264.DD5.1-iT00NZ - Mon, 17 Dec 2012 21:44:59 +0000 - http://api.omgwtfnzbs.org/sn.php?id=eJxUn&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=eJxUn&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 807.76 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 21:44:13
Added to usenet: 17/12/2012 21:44:59
Weblink: http://thetvdb.com/?tab=series&id=258480&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=eJxUn]]>
- TV: HD - tv.hd - 20 - + Miles.Ahead.2015.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:51:15 +0200 + https://api.omgwtfnzbs.me/nzb/?id=vnMUP&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=vnMUP&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.06 GB
Group: alt.binaries.felfelida
Added to index: 02/12/2016 05:17:15
Added to usenet: 08/01/2017 12:51:15
View NZB: https://omgwtfnzbs.me/details.php?id=vnMUP]]>
+ Movies: HD + movies.hd + 16 +
- The.Gadget.Show.World.Tour.S02E07.720p.HDTV.x264-FTP - Mon, 17 Dec 2012 21:27:34 +0000 - http://api.omgwtfnzbs.org/sn.php?id=Wawxv&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=Wawxv&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.28 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 21:27:23
Added to usenet: 17/12/2012 21:27:34
Weblink: http://thetvdb.com/?tab=series&id=258440&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=Wawxv]]>
- TV: HD - tv.hd - 20 - + Mike.and.Dave.Need.Wedding.Dates.2016.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:50:54 +0200 + https://api.omgwtfnzbs.me/nzb/?id=JTdgM&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=JTdgM&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 04/12/2016 06:25:11
Added to usenet: 08/01/2017 12:50:54
View NZB: https://omgwtfnzbs.me/details.php?id=JTdgM]]>
+ Movies: HD + movies.hd + 16 +
- VH1.Divas.2012.720p.HDTV.x264-2HD - Mon, 17 Dec 2012 20:57:15 +0000 - http://api.omgwtfnzbs.org/sn.php?id=Tdz1e&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=Tdz1e&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 3.3 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 20:56:27
Added to usenet: 17/12/2012 20:57:15
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=Tdz1e]]>
- TV: HD - tv.hd - 20 - + Mia.Madre.2015.FRENCH.720p.BluRay.x264-DEAL + Sun, 08 Jan 2017 12:50:30 +0200 + https://api.omgwtfnzbs.me/nzb/?id=h9usJ&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=h9usJ&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.08 GB
Group: alt.binaries.felfelida
Added to index: 15/12/2016 05:54:50
Added to usenet: 08/01/2017 12:50:30
View NZB: https://omgwtfnzbs.me/details.php?id=h9usJ]]>
+ Movies: HD + movies.hd + 16 +
- Bamazon.S01E02.Heart.of.Darkness.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 20:25:17 +0000 - http://api.omgwtfnzbs.org/sn.php?id=hSrC6&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=hSrC6&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 599.56 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 20:31:05
Added to usenet: 17/12/2012 20:25:17
Weblink: http://thetvdb.com/?tab=series&id=263659&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=hSrC6]]>
- TV: STD - tv.sd - 19 - + Mechanic.Resurrection.2016.RERiP.FRENCH.720p.BluRay.x264-ZEST + Sun, 08 Jan 2017 12:50:08 +0200 + https://api.omgwtfnzbs.me/nzb/?id=4qC4G&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=4qC4G&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.82 GB
Group: alt.binaries.felfelida
Added to index: 10/12/2016 07:00:11
Added to usenet: 08/01/2017 12:50:08
View NZB: https://omgwtfnzbs.me/details.php?id=4qC4G]]>
+ Movies: HD + movies.hd + 16 +
- Bamazon.S01E02.Heart.of.Darkness.720p.HDTV.x264-DHD - Mon, 17 Dec 2012 19:35:19 +0000 - http://api.omgwtfnzbs.org/sn.php?id=Iy0YV&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=Iy0YV&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.93 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 19:33:31
Added to usenet: 17/12/2012 19:35:19
Weblink: http://thetvdb.com/?tab=series&id=263659&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=Iy0YV]]>
- TV: HD - tv.hd - 20 - + Maze.Runner.The.Scorch.Trials.2015.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:49:48 +0200 + https://api.omgwtfnzbs.me/nzb/?id=SWTGD&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=SWTGD&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.36 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 05:29:53
Added to usenet: 08/01/2017 12:49:48
View NZB: https://omgwtfnzbs.me/details.php?id=SWTGD]]>
+ Movies: HD + movies.hd + 16 +
- Tron.Uprising.S01E13.1080p.WEB-DL.H.264.DD5.1-iT00NZ - Mon, 17 Dec 2012 19:34:42 +0000 - http://api.omgwtfnzbs.org/sn.php?id=S0q8M&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=S0q8M&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.02 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 19:33:44
Added to usenet: 17/12/2012 19:34:42
Weblink: http://thetvdb.com/?tab=series&id=258480&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=S0q8M]]>
- TV: HD - tv.hd - 20 - + Marauders.2016.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 12:49:26 +0200 + https://api.omgwtfnzbs.me/nzb/?id=qCkSA&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=qCkSA&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 03/12/2016 06:33:57
Added to usenet: 08/01/2017 12:49:26
View NZB: https://omgwtfnzbs.me/details.php?id=qCkSA]]>
+ Movies: HD + movies.hd + 16 +
- Robot.Chicken.S06E13.1080p.WEB-DL.H.264.AAC2.0-iT00NZ - Mon, 17 Dec 2012 19:31:14 +0000 - http://api.omgwtfnzbs.org/sn.php?id=MQE67&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=MQE67&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 485.75 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 19:31:08
Added to usenet: 17/12/2012 19:31:14
Weblink: http://thetvdb.com/?tab=series&id=75734&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=MQE67]]>
- TV: HD - tv.hd - 20 - + Maggie.2015.TRUEFRENCH.720p.BluRay.x264-Ryotox + Sun, 08 Jan 2017 12:48:44 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Dt1e7&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Dt1e7&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.09 GB
Group: alt.binaries.felfelida
Added to index: 10/12/2016 22:13:04
Added to usenet: 08/01/2017 12:48:44
View NZB: https://omgwtfnzbs.me/details.php?id=Dt1e7]]>
+ Movies: HD + movies.hd + 16 +
- Teenage.Mutant.Ninja.Turtles.2012.S01E12.It.Came.From.the.Depths.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 19:31:12 +0000 - http://api.omgwtfnzbs.org/sn.php?id=k6VI4&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=k6VI4&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 141.12 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 19:37:18
Added to usenet: 17/12/2012 19:31:12
Weblink: http://thetvdb.com/?tab=series&id=261451&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=k6VI4]]>
- TV: STD - tv.sd - 19 - + Mad.Max.Fury.Road.2015.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 12:46:53 +0200 + https://api.omgwtfnzbs.me/nzb/?id=zFa21&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=zFa21&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.12 GB
Group: alt.binaries.felfelida
Added to index: 11/12/2016 01:26:53
Added to usenet: 08/01/2017 12:46:53
View NZB: https://omgwtfnzbs.me/details.php?id=zFa21]]>
+ Movies: HD + movies.hd + 16 +
- Teenage.Mutant.Ninja.Turtles.2012.S01E12.1080p.WEB-DL.H.264.AAC2.0-iT00NZ - Mon, 17 Dec 2012 19:30:55 +0000 - http://api.omgwtfnzbs.org/sn.php?id=7mmU1&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=7mmU1&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 980.75 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 19:30:42
Added to usenet: 17/12/2012 19:30:55
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=7mmU1]]>
- TV: HD - tv.hd - 20 - + London.Has.Fallen.2016.TRUEFRENCH.720p.BluRay.x264-AiRLiNE + Sun, 08 Jan 2017 12:46:22 +0200 + https://api.omgwtfnzbs.me/nzb/?id=MvrDy&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=MvrDy&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.12 GB
Group: alt.binaries.felfelida
Added to index: 01/12/2016 23:06:45
Added to usenet: 08/01/2017 12:46:22
View NZB: https://omgwtfnzbs.me/details.php?id=MvrDy]]>
+ Movies: HD + movies.hd + 16 +
- Bamazon.S01E02.HDTV.x264-KILLERS - Mon, 17 Dec 2012 19:29:18 +0000 - http://api.omgwtfnzbs.org/sn.php?id=eVtFp&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=eVtFp&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 666.34 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 19:29:11
Added to usenet: 17/12/2012 19:29:18
Weblink: http://thetvdb.com/?tab=series&id=263659&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=eVtFp]]>
- TV: STD - tv.sd - 19 - + Life.On.The.Line.2015.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 12:45:59 +0200 + https://api.omgwtfnzbs.me/nzb/?id=kc8Pv&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=kc8Pv&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.12 GB
Group: alt.binaries.felfelida
Added to index: 01/12/2016 06:33:01
Added to usenet: 08/01/2017 12:45:59
View NZB: https://omgwtfnzbs.me/details.php?id=kc8Pv]]>
+ Movies: HD + movies.hd + 16 +
- Cross.Country.Skiing.World.Cup.2012.12.16.Canmore.Womens.Skiathlon.720p.HDTV.x264-SKIS - Mon, 17 Dec 2012 19:28:43 +0000 - http://api.omgwtfnzbs.org/sn.php?id=PsRdj&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=PsRdj&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.84 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 19:28:15
Added to usenet: 17/12/2012 19:28:43
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=PsRdj]]>
- TV: HD - tv.hd - 20 - + Le.Corps.De.Mon.Ennemi.1976.FRENCH.720p.BluRay.x264-DuSS + Sun, 08 Jan 2017 12:45:38 +0200 + https://api.omgwtfnzbs.me/nzb/?id=8IPbs&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=8IPbs&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.38 GB
Group: alt.binaries.movies.french
Added to index: 10/12/2016 08:00:35
Added to usenet: 08/01/2017 12:45:38
View NZB: https://omgwtfnzbs.me/details.php?id=8IPbs]]>
+ Movies: HD + movies.hd + 16 +
- Robot.Chicken.S06E13.Robot.Chickens.Atm.Christmas.Special.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 19:17:22 +0000 - http://api.omgwtfnzbs.org/sn.php?id=cNUlC&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=cNUlC&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 109.35 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 19:23:28
Added to usenet: 17/12/2012 19:17:22
Weblink: http://thetvdb.com/?tab=series&id=75734&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=cNUlC]]>
- TV: STD - tv.sd - 19 - + Last.Knights.2015.TRUEFRENCH.720p.BluRay.x264-AiRLiNE + Sun, 08 Jan 2017 12:45:11 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Vygnp&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Vygnp&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 27/12/2016 10:06:24
Added to usenet: 08/01/2017 12:45:11
View NZB: https://omgwtfnzbs.me/details.php?id=Vygnp]]>
+ Movies: HD + movies.hd + 16 +
- Bobs.Burgers.S03E09.God.Rest.Ye.Merry.Gentle-Mannequins.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 19:04:10 +0000 - http://api.omgwtfnzbs.org/sn.php?id=LbeeT&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=LbeeT&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 101.75 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 19:10:14
Added to usenet: 17/12/2012 19:04:10
Weblink: http://thetvdb.com/?tab=series&id=194031&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=LbeeT]]>
- TV: STD - tv.sd - 19 - + La.Vallee.1972.FRENCH.720p.BluRay.x264-FiDELiO + Sun, 08 Jan 2017 12:44:43 +0200 + https://api.omgwtfnzbs.me/nzb/?id=texzm&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=texzm&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.11 GB
Group: alt.binaries.movies.french
Added to index: 11/12/2016 23:55:30
Added to usenet: 08/01/2017 12:44:43
View NZB: https://omgwtfnzbs.me/details.php?id=texzm]]>
+ Movies: HD + movies.hd + 16 +
- Ax.Men.S06E02.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 19:01:22 +0000 - http://api.omgwtfnzbs.org/sn.php?id=UeUEK&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=UeUEK&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 730.17 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 19:07:05
Added to usenet: 17/12/2012 19:01:22
Weblink: http://thetvdb.com/?tab=series&id=81578&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=UeUEK]]>
- TV: STD - tv.sd - 19 - + Kind.Hearts.and.Coronets.1949.FRENCH.720p.BluRay.x264-FiDELiO + Sun, 08 Jan 2017 12:44:04 +0200 + https://api.omgwtfnzbs.me/nzb/?id=HLFBj&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=HLFBj&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.09 GB
Group: alt.binaries.movies.french
Added to index: 04/12/2016 02:58:43
Added to usenet: 08/01/2017 12:44:04
View NZB: https://omgwtfnzbs.me/details.php?id=HLFBj]]>
+ Movies: HD + movies.hd + 16 +
- Teenage.Mutant.Ninja.Turtles.2012.S01E12.720p.WEB-DL.H.264.AAC2.0-iT00NZ - Mon, 17 Dec 2012 17:06:46 +0000 - http://api.omgwtfnzbs.org/sn.php?id=BkFcy&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=BkFcy&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 802.96 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 17:06:05
Added to usenet: 17/12/2012 17:06:46
Weblink: http://thetvdb.com/?tab=series&id=261451&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=BkFcy]]>
- TV: HD - tv.hd - 20 - + Kill.Command.2016.FRENCH.720p.BluRay.x264-ZEST + Sun, 08 Jan 2017 12:43:12 +0200 + https://api.omgwtfnzbs.me/nzb/?id=f1WNg&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=f1WNg&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 29/11/2016 07:31:47
Added to usenet: 08/01/2017 12:43:12
View NZB: https://omgwtfnzbs.me/details.php?id=f1WNg]]>
+ Movies: HD + movies.hd + 16 +
- Robot.Chicken.S06E13.720p.WEB-DL.H.264.AAC2.0-iT00NZ - Mon, 17 Dec 2012 16:41:36 +0000 - http://api.omgwtfnzbs.org/sn.php?id=69daj&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=69daj&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 382.44 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 16:41:30
Added to usenet: 17/12/2012 16:41:36
Weblink: http://thetvdb.com/?tab=series&id=75734&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=69daj]]>
- TV: HD - tv.hd - 20 - + Joy.2015.FRENCH.720p.BluRay.x264-PiNKPANTERS + Sun, 08 Jan 2017 12:42:45 +0200 + https://api.omgwtfnzbs.me/nzb/?id=2hnZd&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=2hnZd&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.14 GB
Group: alt.binaries.felfelida
Added to index: 04/12/2016 06:40:26
Added to usenet: 08/01/2017 12:42:45
View NZB: https://omgwtfnzbs.me/details.php?id=2hnZd]]>
+ Movies: HD + movies.hd + 16 +
- Last.Man.Standing.2011.S02E07.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 16:39:12 +0000 - http://api.omgwtfnzbs.org/sn.php?id=rWByd&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=rWByd&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 129.91 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 16:45:18
Added to usenet: 17/12/2012 16:39:12
Weblink: http://thetvdb.com/?tab=series&id=248834&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=rWByd]]>
- TV: STD - tv.sd - 19 - + Jean.de.Florette.1985.720p.BluRay.x264-PFa + Sun, 08 Jan 2017 12:42:23 +0200 + https://api.omgwtfnzbs.me/nzb/?id=QO4la&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=QO4la&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.32 GB
Group: alt.binaries.movies.french
Added to index: 06/12/2016 09:19:17
Added to usenet: 08/01/2017 12:42:23
View NZB: https://omgwtfnzbs.me/details.php?id=QO4la]]>
+ Movies: HD + movies.hd + 16 +
- WWE.Tables.Ladders.and.Chairs.2012.PPV.HDTV.x264-KYR - Mon, 17 Dec 2012 16:28:06 +0000 - http://api.omgwtfnzbs.org/sn.php?id=cskMX&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=cskMX&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 2.34 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 16:25:20
Added to usenet: 17/12/2012 16:28:06
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=cskMX]]>
- TV: STD - tv.sd - 19 - + Jaws.3.1983.FRENCH.720p.BluRay.x264-ULSHD + Sun, 08 Jan 2017 12:41:58 +0200 + https://api.omgwtfnzbs.me/nzb/?id=o4LxX&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=o4LxX&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.movies.french
Added to index: 08/12/2016 23:03:02
Added to usenet: 08/01/2017 12:41:58
View NZB: https://omgwtfnzbs.me/details.php?id=o4LxX]]>
+ Movies: HD + movies.hd + 16 +
- Damages.S05E03.Failure.Is.Failure.720p.WEB-DL.DD5.1.H.264-BS - Mon, 17 Dec 2012 16:19:22 +0000 - http://api.omgwtfnzbs.org/sn.php?id=OFIkR&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=OFIkR&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 2.05 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 16:17:32
Added to usenet: 17/12/2012 16:19:22
Weblink: http://thetvdb.com/?tab=series&id=80367&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=OFIkR]]>
- TV: HD - tv.hd - 20 - + Jaws.2.1978.FRENCH.720p.BluRay.x264-ULSHD + Sun, 08 Jan 2017 12:41:29 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Bkd9U&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Bkd9U&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.09 GB
Group: alt.binaries.movies.french
Added to index: 10/12/2016 22:34:02
Added to usenet: 08/01/2017 12:41:29
View NZB: https://omgwtfnzbs.me/details.php?id=Bkd9U]]>
+ Movies: HD + movies.hd + 16 +
- CSI.S13E10.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 16:17:48 +0000 - http://api.omgwtfnzbs.org/sn.php?id=XI8KI&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=XI8KI&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 274.77 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 16:23:46
Added to usenet: 17/12/2012 16:17:48
Weblink: http://thetvdb.com/?tab=series&id=233851&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=XI8KI]]>
- TV: STD - tv.sd - 19 - + In.the.Heart.of.the.Sea.2015.TRUEFRENCH.720p.BluRay.x264-AiRLiNE + Sun, 08 Jan 2017 12:40:42 +0200 + https://api.omgwtfnzbs.me/nzb/?id=ZQuLR&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=ZQuLR&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.08 GB
Group: alt.binaries.felfelida
Added to index: 29/11/2016 23:05:34
Added to usenet: 08/01/2017 12:40:42
View NZB: https://omgwtfnzbs.me/details.php?id=ZQuLR]]>
+ Movies: HD + movies.hd + 16 +
- Damages.S05E02.Have.You.Met.the.Eel.Yet.720p.WEB-DL.DD5.1.H.264-BS - Mon, 17 Dec 2012 16:17:23 +0000 - http://api.omgwtfnzbs.org/sn.php?id=uyPWF&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=uyPWF&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.63 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 16:16:43
Added to usenet: 17/12/2012 16:17:23
Weblink: http://thetvdb.com/?tab=series&id=80367&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=uyPWF]]>
- TV: HD - tv.hd - 20 - + Ils.Sont.Partout.2016.FRENCH.1080p.WEB.H264-SiGeRiS + Sun, 08 Jan 2017 12:39:57 +0200 + https://api.omgwtfnzbs.me/nzb/?id=FCqh6&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=FCqh6&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 4.22 GB
Group: alt.binaries.movies.french
Added to index: 29/11/2016 22:56:32
Added to usenet: 08/01/2017 12:39:57
View NZB: https://omgwtfnzbs.me/details.php?id=FCqh6]]>
+ Movies: HD + movies.hd + 16 +
- Damages.S05E01.You.Want.to.End.This.Once.and.for.All.720p.WEB-DL.DD5.1.H.264-BS - Mon, 17 Dec 2012 16:14:47 +0000 - http://api.omgwtfnzbs.org/sn.php?id=41F66&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=41F66&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.75 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 16:13:48
Added to usenet: 17/12/2012 16:14:47
Weblink: http://thetvdb.com/?tab=series&id=80367&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=41F66]]>
- TV: HD - tv.hd - 20 - + I.Saw.the.Light.2015.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:38:44 +0200 + https://api.omgwtfnzbs.me/nzb/?id=ct7t3&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=ct7t3&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.36 GB
Group: alt.binaries.felfelida
Added to index: 01/12/2016 06:28:23
Added to usenet: 08/01/2017 12:38:44
View NZB: https://omgwtfnzbs.me/details.php?id=ct7t3]]>
+ Movies: HD + movies.hd + 16 +
- Damages.S05.720p.WEB-DL.DD5.1.H.264 - Mon, 17 Dec 2012 15:44:20 +0000 - http://api.omgwtfnzbs.org/sn.php?id=1sqbT&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=1sqbT&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 18.76 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 15:26:02
Added to usenet: 17/12/2012 15:44:20
Weblink: http://thetvdb.com/?tab=series&id=80367&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=1sqbT]]>
- TV: HD - tv.hd - 20 - + Hoosiers.1986.FRENCH.720p.BluRay.x264-DuSS + Sun, 08 Jan 2017 12:37:43 +0200 + https://api.omgwtfnzbs.me/nzb/?id=OFgGx&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=OFgGx&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.movies.french
Added to index: 08/12/2016 23:07:15
Added to usenet: 08/01/2017 12:37:43
View NZB: https://omgwtfnzbs.me/details.php?id=OFgGx]]>
+ Movies: HD + movies.hd + 16 +
- Criminal.Minds.S08E11.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 15:21:48 +0000 - http://api.omgwtfnzbs.org/sn.php?id=Hq7GY&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=Hq7GY&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 243.65 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 15:27:51
Added to usenet: 17/12/2012 15:21:48
Weblink: http://thetvdb.com/?tab=series&id=75710&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=Hq7GY]]>
- TV: STD - tv.sd - 19 - + Home.On.The.Range.2004.FRENCH.720p.BluRay.x264.DTS-MUxHD + Sun, 08 Jan 2017 12:37:22 +0200 + https://api.omgwtfnzbs.me/nzb/?id=9cEer&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=9cEer&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 2.56 GB
Group: alt.binaries.movies.french
Added to index: 04/12/2016 02:59:32
Added to usenet: 08/01/2017 12:37:22
View NZB: https://omgwtfnzbs.me/details.php?id=9cEer]]>
+ Movies: HD + movies.hd + 16 +
- Ax.Men.S06E02.720p.HDTV.x264-KILLERS - Mon, 17 Dec 2012 15:21:40 +0000 - http://api.omgwtfnzbs.org/sn.php?id=fWOSV&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=fWOSV&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 2.93 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 15:19:52
Added to usenet: 17/12/2012 15:21:40
Weblink: http://thetvdb.com/?tab=series&id=81578&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=fWOSV]]>
- TV: HD - tv.hd - 20 - + Hitman.Agent.47.2015.TRUEFRENCH.720p.BluRay.x264-MELBA + Sun, 08 Jan 2017 12:37:07 +0200 + https://api.omgwtfnzbs.me/nzb/?id=XIVqo&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=XIVqo&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.82 GB
Group: alt.binaries.felfelida
Added to index: 27/12/2016 12:26:04
Added to usenet: 08/01/2017 12:37:07
View NZB: https://omgwtfnzbs.me/details.php?id=XIVqo]]>
+ Movies: HD + movies.hd + 16 +
- Last.Man.Standing.2011.S02E07.720p.WEB-DL.DD5.1.h.264-pcsyndicate - Mon, 17 Dec 2012 15:09:28 +0000 - http://api.omgwtfnzbs.org/sn.php?id=dNzxs&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=dNzxs&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 778.83 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 15:09:10
Added to usenet: 17/12/2012 15:09:28
Weblink: http://thetvdb.com/?tab=series&id=248834&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=dNzxs]]>
- TV: HD - tv.hd - 20 - + Hitman.Agent.47.2015.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:36:51 +0200 + https://api.omgwtfnzbs.me/nzb/?id=If4Ei&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=If4Ei&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.08 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 05:35:11
Added to usenet: 08/01/2017 12:36:51
View NZB: https://omgwtfnzbs.me/details.php?id=If4Ei]]>
+ Movies: HD + movies.hd + 16 +
- Last.Man.Standing.2011.S02E06.720p.WEB-DL.DD5.1.h.264-pcsyndicate - Mon, 17 Dec 2012 15:08:45 +0000 - http://api.omgwtfnzbs.org/sn.php?id=mQpXj&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=mQpXj&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 788.79 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 15:08:33
Added to usenet: 17/12/2012 15:08:45
Weblink: http://thetvdb.com/?tab=series&id=248834&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=mQpXj]]>
- TV: HD - tv.hd - 20 - + Hibou.2016.FRENCH.1080p.WEB.h264-TiMELiNE + Sun, 08 Jan 2017 12:36:24 +0200 + https://api.omgwtfnzbs.me/nzb/?id=gLLQf&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=gLLQf&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.58 GB
Group: alt.binaries.movies.french
Added to index: 10/12/2016 07:42:56
Added to usenet: 08/01/2017 12:36:24
View NZB: https://omgwtfnzbs.me/details.php?id=gLLQf]]>
+ Movies: HD + movies.hd + 16 +
- Last.Man.Standing.2011.S02E05.720p.WEB-DL.DD5.1.h.264-pcsyndicate - Mon, 17 Dec 2012 15:08:03 +0000 - http://api.omgwtfnzbs.org/sn.php?id=XnNvd&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=XnNvd&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 791.55 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 15:07:40
Added to usenet: 17/12/2012 15:08:03
Weblink: http://thetvdb.com/?tab=series&id=248834&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=XnNvd]]>
- TV: HD - tv.hd - 20 - + Hello.My.Name.Is.Doris.2015.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 12:35:49 +0200 + https://api.omgwtfnzbs.me/nzb/?id=D4SCT&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=D4SCT&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 01/12/2016 06:56:54
Added to usenet: 08/01/2017 12:35:49
View NZB: https://omgwtfnzbs.me/details.php?id=D4SCT]]>
+ Movies: HD + movies.hd + 16 +
- Last.Man.Standing.2011.S02E04.720p.WEB-DL.DD5.1.h.264-pcsyndicate - Mon, 17 Dec 2012 15:07:27 +0000 - http://api.omgwtfnzbs.org/sn.php?id=J9wJX&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=J9wJX&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 782.39 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 15:07:19
Added to usenet: 17/12/2012 15:07:27
Weblink: http://thetvdb.com/?tab=series&id=248834&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=J9wJX]]>
- TV: HD - tv.hd - 20 - + Hell.or.High.Water.2016.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 12:34:49 +0200 + https://api.omgwtfnzbs.me/nzb/?id=akjOQ&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=akjOQ&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 01/12/2016 06:16:27
Added to usenet: 08/01/2017 12:34:49
View NZB: https://omgwtfnzbs.me/details.php?id=akjOQ]]>
+ Movies: HD + movies.hd + 16 +
- CSI.S13E10.1080p.WEB-DL.DD5.1.H.264-NFHD - Mon, 17 Dec 2012 15:03:32 +0000 - http://api.omgwtfnzbs.org/sn.php?id=pt35L&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=pt35L&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.88 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 15:02:42
Added to usenet: 17/12/2012 15:03:32
Weblink: http://thetvdb.com/?tab=series&id=233851&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=pt35L]]>
- TV: HD - tv.hd - 20 - + Heist.2015.LIMITED.FRENCH.720p.BluRay.x264-AiRLiNE + Sun, 08 Jan 2017 12:34:29 +0200 + https://api.omgwtfnzbs.me/nzb/?id=yR0aN&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=yR0aN&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 05:42:58
Added to usenet: 08/01/2017 12:34:29
View NZB: https://omgwtfnzbs.me/details.php?id=yR0aN]]>
+ Movies: HD + movies.hd + 16 +
- CSI.S13E10.720p.WEB-DL.DD5.1.H.264-NFHD - Mon, 17 Dec 2012 14:55:24 +0000 - http://api.omgwtfnzbs.org/sn.php?id=2O6Co&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=2O6Co&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.49 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 14:54:47
Added to usenet: 17/12/2012 14:55:24
Weblink: http://thetvdb.com/?tab=series&id=233851&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=2O6Co]]>
- TV: HD - tv.hd - 20 - + Hail.Caesar.2016.FRENCH.720p.BluRay.x264-MELBA + Sun, 08 Jan 2017 12:33:57 +0200 + https://api.omgwtfnzbs.me/nzb/?id=jnYyH&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=jnYyH&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.09 GB
Group: alt.binaries.felfelida
Added to index: 15/12/2016 05:51:34
Added to usenet: 08/01/2017 12:33:57
View NZB: https://omgwtfnzbs.me/details.php?id=jnYyH]]>
+ Movies: HD + movies.hd + 16 +
- Criminal.Minds.S08E11.1080p.WEB-DL.DD5.1.H264-NFHD - Mon, 17 Dec 2012 14:54:32 +0000 - http://api.omgwtfnzbs.org/sn.php?id=nkeai&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=nkeai&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.84 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 14:54:24
Added to usenet: 17/12/2012 14:54:32
Weblink: http://thetvdb.com/?tab=series&id=75710&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=nkeai]]>
- TV: HD - tv.hd - 20 - + Ghostbusters.2016.EXTENDED.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 12:33:15 +0200 + https://api.omgwtfnzbs.me/nzb/?id=VA7MB&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=VA7MB&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.08 GB
Group: alt.binaries.felfelida
Added to index: 03/12/2016 23:02:06
Added to usenet: 08/01/2017 12:33:15
View NZB: https://omgwtfnzbs.me/details.php?id=VA7MB]]>
+ Movies: HD + movies.hd + 16 +
- Criminal.Minds.S08E11.720p.WEB-DL.DD5.1.H264-NFHD - Mon, 17 Dec 2012 14:53:29 +0000 - http://api.omgwtfnzbs.org/sn.php?id=wnUAZ&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=wnUAZ&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.44 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 14:52:56
Added to usenet: 17/12/2012 14:53:29
Weblink: http://thetvdb.com/?tab=series&id=75710&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=wnUAZ]]>
- TV: HD - tv.hd - 20 - + 13.Minutes.2015.SUBFRENCH.720p.BluRay.x264-DuSS + Sun, 08 Jan 2017 12:32:22 +0200 + https://api.omgwtfnzbs.me/nzb/?id=1tE7z&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=1tE7z&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.38 GB
Group: alt.binaries.movies.french
Added to index: 04/12/2016 06:09:35
Added to usenet: 08/01/2017 12:32:22
View NZB: https://omgwtfnzbs.me/details.php?id=1tE7z]]>
+ Movies: HD + movies.hd + 16 +
- Ax.Men.S06E02.HDTV.x264-KILLERS - Mon, 17 Dec 2012 14:45:18 +0000 - http://api.omgwtfnzbs.org/sn.php?id=rCs8K&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=rCs8K&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 908.3 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 14:45:11
Added to usenet: 17/12/2012 14:45:18
Weblink: http://thetvdb.com/?tab=series&id=81578&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=rCs8K]]>
- TV: STD - tv.sd - 19 - + George.Harrison.Living.in.the.Material.World.2011.Part1.SUBFRENCH.720p.BluRay.x264-FiDELiO + Sun, 08 Jan 2017 12:30:49 +0200 + https://api.omgwtfnzbs.me/nzb/?id=hfATe&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=hfATe&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.2 GB
Group: alt.binaries.movies.french
Added to index: 01/12/2016 06:58:06
Added to usenet: 08/01/2017 12:30:49
View NZB: https://omgwtfnzbs.me/details.php?id=hfATe]]>
+ Movies: HD + movies.hd + 16 +
- Two.and.a.Half.Men.S10E11.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 14:37:12 +0000 - http://api.omgwtfnzbs.org/sn.php?id=cZQWE&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=cZQWE&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 150.91 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 14:43:18
Added to usenet: 17/12/2012 14:37:12
Weblink: http://thetvdb.com/?tab=series&id=72227&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=cZQWE]]>
- TV: STD - tv.sd - 19 - + Fantastic.Four.2015.TRUEFRENCH.720p.BluRay.x264-Goatlove + Sun, 08 Jan 2017 12:29:06 +0200 + https://api.omgwtfnzbs.me/nzb/?id=5LRfb&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=5LRfb&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.07 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 05:47:13
Added to usenet: 08/01/2017 12:29:06
View NZB: https://omgwtfnzbs.me/details.php?id=5LRfb]]>
+ Movies: HD + movies.hd + 16 +
- Two.and.a.Half.Men.S10E11.1080p.WEB-DL.DD5.1.H.264-NFHD - Mon, 17 Dec 2012 14:28:06 +0000 - http://api.omgwtfnzbs.org/sn.php?id=lcG65&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=lcG65&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 997 MB
Group: alt.binaries.etc
Added to index: 17/12/2012 14:27:39
Added to usenet: 17/12/2012 14:28:06
Weblink: http://thetvdb.com/?tab=series&id=72227&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=lcG65]]>
- TV: HD - tv.hd - 20 - + En.Busca.De.Marsupilami.2012.SPANiSH.MULTi.1080p.BluRay.x264-TORO + Sun, 08 Jan 2017 11:57:24 +0200 + https://api.omgwtfnzbs.me/nzb/?id=A7UGC&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=A7UGC&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 10.27 GB
Group: alt.binaries.movies.french
Added to index: 16/12/2016 22:56:11
Added to usenet: 08/01/2017 11:57:24
View NZB: https://omgwtfnzbs.me/details.php?id=A7UGC]]>
+ Movies: HD + movies.hd + 16 +
- EPL.2012.12.15.Queens.Park.Rangers.Vs.Fulham.720p.HDTV.x264-W4F - Mon, 17 Dec 2012 14:26:25 +0000 - http://api.omgwtfnzbs.org/sn.php?id=WyoTz&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=WyoTz&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 2.76 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 14:26:04
Added to usenet: 17/12/2012 14:26:25
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=WyoTz]]>
- TV: HD - tv.hd - 20 - + En.Busca.De.Marsupilami.2012.SPANiSH.MULTi.720p.BluRay.x264-TORO + Sun, 08 Jan 2017 11:56:17 +0200 + https://api.omgwtfnzbs.me/nzb/?id=JAJq3&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=JAJq3&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.43 GB
Group: alt.binaries.movies.french
Added to index: 14/12/2016 23:24:51
Added to usenet: 08/01/2017 11:56:17
View NZB: https://omgwtfnzbs.me/details.php?id=JAJq3]]>
+ Movies: HD + movies.hd + 16 +
- Two.and.a.Half.Men.S10E11.720p.WEB-DL.DD5.1.H.264-NFHD - Mon, 17 Dec 2012 14:24:01 +0000 - http://api.omgwtfnzbs.org/sn.php?id=ILMrt&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=ILMrt&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 814.36 MB
Group: alt.binaries.etc
Added to index: 17/12/2012 14:23:31
Added to usenet: 17/12/2012 14:24:01
Weblink: http://thetvdb.com/?tab=series&id=72227&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=ILMrt]]>
- TV: HD - tv.hd - 20 - + Eddie.the.Eagle.2016.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 11:51:32 +0200 + https://api.omgwtfnzbs.me/nzb/?id=bFyzl&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=bFyzl&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 15/12/2016 05:49:10
Added to usenet: 08/01/2017 11:51:32
View NZB: https://omgwtfnzbs.me/details.php?id=bFyzl]]>
+ Movies: HD + movies.hd + 16 +
- Dont.Trust.The.B----.In.Apartment.23.S02E06.1080p.WEB-DL.DD5.1.H.264-NFHD - Mon, 17 Dec 2012 14:15:40 +0000 - http://api.omgwtfnzbs.org/sn.php?id=ROCRk&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=ROCRk&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 948.82 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 14:15:24
Added to usenet: 17/12/2012 14:15:40
Weblink: http://thetvdb.com/?tab=series&id=248812&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=ROCRk]]>
- TV: HD - tv.hd - 20 - + Dont.Breathe.2016.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 11:51:00 +0200 + https://api.omgwtfnzbs.me/nzb/?id=ywGBi&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=ywGBi&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.82 GB
Group: alt.binaries.felfelida
Added to index: 04/12/2016 01:49:16
Added to usenet: 08/01/2017 11:51:00
View NZB: https://omgwtfnzbs.me/details.php?id=ywGBi]]>
+ Movies: HD + movies.hd + 16 +
- Dont.Trust.The.B----.In.Apartment.23.S02E06.720p.WEB-DL.DD5.1.H.264-NFHD - Mon, 17 Dec 2012 14:11:29 +0000 - http://api.omgwtfnzbs.org/sn.php?id=y7JDY&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=y7JDY&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 800.34 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 14:10:37
Added to usenet: 17/12/2012 14:11:29
Weblink: http://thetvdb.com/?tab=series&id=248812&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=y7JDY]]>
- TV: HD - tv.hd - 20 - + Dirty.Grandpa.2016.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 11:50:04 +0200 + https://api.omgwtfnzbs.me/nzb/?id=eiCXN&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=eiCXN&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.11 GB
Group: alt.binaries.felfelida
Added to index: 29/11/2016 08:48:32
Added to usenet: 08/01/2017 11:50:04
View NZB: https://omgwtfnzbs.me/details.php?id=eiCXN]]>
+ Movies: HD + movies.hd + 16 +
- WWE.Tables.Ladders.and.Chairs.2012.PPV.720p.HDTV.x264-KYR - Mon, 17 Dec 2012 13:42:12 +0000 - http://api.omgwtfnzbs.org/sn.php?id=1ZWlA&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=1ZWlA&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 6.51 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 13:40:11
Added to usenet: 17/12/2012 13:42:12
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=1ZWlA]]>
- TV: HD - tv.hd - 20 - + Debarquement.Immediat.2016.FRENCH.1080p.WEB.h264-TiMELiNE + Sun, 08 Jan 2017 11:47:55 +0200 + https://api.omgwtfnzbs.me/nzb/?id=nl27E&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=nl27E&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.92 GB
Group: alt.binaries.movies.french
Added to index: 10/12/2016 06:18:33
Added to usenet: 08/01/2017 11:47:55
View NZB: https://omgwtfnzbs.me/details.php?id=nl27E]]>
+ Movies: HD + movies.hd + 16 +
- Ben.10.Omniverse.S01E14.Blukic.and.Driba.Go.To.Mr.Smooth.480p.WEB-DL.x264-mSD - Mon, 17 Dec 2012 13:29:42 +0000 - http://api.omgwtfnzbs.org/sn.php?id=51kIm&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=51kIm&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 115.21 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 13:35:47
Added to usenet: 17/12/2012 13:29:42
Weblink: http://thetvdb.com/?tab=series&id=260995&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=51kIm]]>
- TV: STD - tv.sd - 19 - + Daddys.Home.2015.TRUEFRENCH.720p.BluRay.x264-PiNKPANTERS + Sun, 08 Jan 2017 11:47:24 +0200 + https://api.omgwtfnzbs.me/nzb/?id=BRJJB&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=BRJJB&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.82 GB
Group: alt.binaries.felfelida
Added to index: 29/11/2016 23:20:30
Added to usenet: 08/01/2017 11:47:24
View NZB: https://omgwtfnzbs.me/details.php?id=BRJJB]]>
+ Movies: HD + movies.hd + 16 +
- The.Horses.of.McBride.2012.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 13:07:12 +0000 - http://api.omgwtfnzbs.org/sn.php?id=tqWEI&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=tqWEI&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 517.24 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 13:13:05
Added to usenet: 17/12/2012 13:07:12
Weblink: http://lookpic.com/O/i2/395/Vl9n9DEY.jpeg[/IMG
View NZB: http://omgwtfnzbs.org/details.php?id=tqWEI]]>
- TV: STD - tv.sd - 19 - + Confirmation.2016.FRENCH.720p.BluRay.x264-VENUE + Sun, 08 Jan 2017 11:47:03 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Z7aV8&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Z7aV8&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.32 GB
Group: alt.binaries.felfelida
Added to index: 02/12/2016 05:13:09
Added to usenet: 08/01/2017 11:47:03
View NZB: https://omgwtfnzbs.me/details.php?id=Z7aV8]]>
+ Movies: HD + movies.hd + 16 +
- Royal.Pains.S04E15E16.PROPER.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 12:38:32 +0000 - http://api.omgwtfnzbs.org/sn.php?id=OREVT&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=OREVT&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 449.31 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 12:44:26
Added to usenet: 17/12/2012 12:38:32
Weblink: http://thetvdb.com/?tab=series&id=92411&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=OREVT]]>
- TV: STD - tv.sd - 19 - + Ben.Hur.2016.TRUEFRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 11:43:55 +0200 + https://api.omgwtfnzbs.me/nzb/?id=wnrh5&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=wnrh5&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.12 GB
Group: alt.binaries.felfelida
Added to index: 04/12/2016 01:47:16
Added to usenet: 08/01/2017 11:43:55
View NZB: https://omgwtfnzbs.me/details.php?id=wnrh5]]>
+ Movies: HD + movies.hd + 16 +
- The.Bachelorette.Special.Ashley.and.J.Ps.Wedding.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 12:03:56 +0000 - http://api.omgwtfnzbs.org/sn.php?id=MIq0q&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=MIq0q&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 660.6 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 12:09:44
Added to usenet: 17/12/2012 12:03:56
Weblink: http://lookpic.com/O/i2/871/MNxJjwjR.jpeg[/IMG
View NZB: http://omgwtfnzbs.org/details.php?id=MIq0q]]>
- TV: STD - tv.sd - 19 - + Bastille.Day.2016.FRENCH.720p.BluRay.x264-AiRLiNE + Sun, 08 Jan 2017 11:43:05 +0200 + https://api.omgwtfnzbs.me/nzb/?id=5qhGw&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=5qhGw&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.1 GB
Group: alt.binaries.felfelida
Added to index: 24/10/2016 08:48:11
Added to usenet: 08/01/2017 11:43:05
View NZB: https://omgwtfnzbs.me/details.php?id=5qhGw]]>
+ Movies: HD + movies.hd + 16 +
- Finding.Bigfoot.S03E06.Bigfoot.and.Wolverines.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 11:43:23 +0000 - http://api.omgwtfnzbs.org/sn.php?id=3ObPU&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=3ObPU&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 329.13 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 11:49:20
Added to usenet: 17/12/2012 11:43:23
Weblink: http://thetvdb.com/?tab=series&id=249235&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=3ObPU]]>
- TV: STD - tv.sd - 19 - + American.Ultra.2015.FRENCH.720p.BluRay.x264-LOST + Sun, 08 Jan 2017 11:42:18 +0200 + https://api.omgwtfnzbs.me/nzb/?id=0G5Eh&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=0G5Eh&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.78 GB
Group: alt.binaries.felfelida
Added to index: 06/12/2016 09:18:28
Added to usenet: 08/01/2017 11:42:18
View NZB: https://omgwtfnzbs.me/details.php?id=0G5Eh]]>
+ Movies: HD + movies.hd + 16 +
- Oliver.Stones.Untold.History.Of.The.United.States.S01E04.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 11:35:52 +0000 - http://api.omgwtfnzbs.org/sn.php?id=CRQzL&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=CRQzL&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 466.2 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 11:41:44
Added to usenet: 17/12/2012 11:35:52
Weblink: http://thetvdb.com/?tab=series&id=263532&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=CRQzL]]>
- TV: STD - tv.sd - 19 - + Alvin.and.the.Chipmunks.The.Road.Chip.2015.TRUEFRENCH.720p.BluRay.x264-PiNKPANTERS + Sun, 08 Jan 2017 11:41:16 +0200 + https://api.omgwtfnzbs.me/nzb/?id=NwMQe&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=NwMQe&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.83 GB
Group: alt.binaries.felfelida
Added to index: 15/12/2016 05:42:04
Added to usenet: 08/01/2017 11:41:16
View NZB: https://omgwtfnzbs.me/details.php?id=NwMQe]]>
+ Movies: HD + movies.hd + 16 +
- The.Fith.Estate.2012.11.16.Left.For.Dead.720p.HDTV.x264-TWG - Mon, 17 Dec 2012 11:32:54 +0000 - http://api.omgwtfnzbs.org/sn.php?id=LUGZC&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=LUGZC&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.04 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 11:29:30
Added to usenet: 17/12/2012 11:32:54
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=LUGZC]]>
- TV: HD - tv.hd - 20 - + Destroy.All.Monsters.1968.1080p.BluRay.x264-SADPANDA + Sun, 08 Jan 2017 08:19:34 +0200 + https://api.omgwtfnzbs.me/nzb/?id=0xGb4&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=0xGb4&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 8.7 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 07:12:46
Added to usenet: 08/01/2017 08:19:34
View NZB: https://omgwtfnzbs.me/details.php?id=0xGb4]]>
+ Movies: HD + movies.hd + 16 +
- The.Fith.Estate.2012.11.23.Lance.Armstrong.Master.Of.Spin.720p.HDTV.x264-TWG - Mon, 17 Dec 2012 11:32:13 +0000 - http://api.omgwtfnzbs.org/sn.php?id=jAXl9&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=jAXl9&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.27 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 11:31:22
Added to usenet: 17/12/2012 11:32:13
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=jAXl9]]>
- TV: HD - tv.hd - 20 - + Distance.Between.Dreams.2016.iNTERNAL.1080p.WEBRip.x264-13 + Sun, 08 Jan 2017 07:27:03 +0200 + https://api.omgwtfnzbs.me/nzb/?id=UjPQb&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=UjPQb&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.84 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 06:24:20
Added to usenet: 08/01/2017 07:27:03
View NZB: https://omgwtfnzbs.me/details.php?id=UjPQb]]>
+ Movies: HD + movies.hd + 16 +
- Curiosity.S02E10.What.Destroyed.the.Hindenburg.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 11:24:42 +0000 - http://api.omgwtfnzbs.org/sn.php?id=dZviu&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=dZviu&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 315.97 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 11:26:21
Added to usenet: 17/12/2012 11:24:42
Weblink: http://thetvdb.com/?tab=series&id=250572&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=dZviu]]>
- TV: STD - tv.sd - 19 - + Distance.Between.Dreams.2016.iNTERNAL.720p.WEBRip.x264-13 + Sun, 08 Jan 2017 07:13:18 +0200 + https://api.omgwtfnzbs.me/nzb/?id=Sb0vy&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=Sb0vy&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.22 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 06:10:17
Added to usenet: 08/01/2017 07:13:18
View NZB: https://omgwtfnzbs.me/details.php?id=Sb0vy]]>
+ Movies: HD + movies.hd + 16 +
- The.Horses.of.McBride.2012.720p.HDTV.x264-2HD - Mon, 17 Dec 2012 11:24:42 +0000 - http://api.omgwtfnzbs.org/sn.php?id=1GCur&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=1GCur&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 2.59 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 11:23:11
Added to usenet: 17/12/2012 11:24:42
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=1GCur]]>
- TV: HD - tv.hd - 20 - + Distance.Between.Dreams.2016.iNTERNAL.WEBRip.x264-13 + Sun, 08 Jan 2017 06:59:47 +0200 + https://api.omgwtfnzbs.me/nzb/?id=QScRL&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=QScRL&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 1.05 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 05:57:24
Added to usenet: 08/01/2017 06:59:47
View NZB: https://omgwtfnzbs.me/details.php?id=QScRL]]>
+ Movies: STD + movies.sd + 15 +
- Peep.Show.S08E04.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 11:16:50 +0000 - http://api.omgwtfnzbs.org/sn.php?id=VqvC2&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=VqvC2&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 133.76 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 11:22:54
Added to usenet: 17/12/2012 11:16:50
Weblink: http://thetvdb.com/?tab=series&id=71656&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=VqvC2]]>
- TV: STD - tv.sd - 19 - + Destroy.All.Monsters.1968.REAL.READNFO.BDRip.x264-VoMiT + Sun, 08 Jan 2017 06:32:49 +0200 + https://api.omgwtfnzbs.me/nzb/?id=apH4B&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=apH4B&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 885.99 MB
Group: alt.binaries.moovee
Added to index: 08/01/2017 05:30:51
Added to usenet: 08/01/2017 06:32:49
View NZB: https://omgwtfnzbs.me/details.php?id=apH4B]]>
+ Movies: STD + movies.sd + 15 +
- Royal.Pains.S04E15E16.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 11:13:38 +0000 - http://api.omgwtfnzbs.org/sn.php?id=BcrXh&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=BcrXh&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 474.45 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 11:19:31
Added to usenet: 17/12/2012 11:13:38
Weblink: http://thetvdb.com/?tab=series&id=92411&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=BcrXh]]>
- TV: STD - tv.sd - 19 - + Destroy.All.Monsters.1968.720p.BluRay.x264-SADPANDA + Sun, 08 Jan 2017 06:27:17 +0200 + https://api.omgwtfnzbs.me/nzb/?id=yVYG8&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=yVYG8&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 3.72 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 05:23:58
Added to usenet: 08/01/2017 06:27:17
View NZB: https://omgwtfnzbs.me/details.php?id=yVYG8]]>
+ Movies: HD + movies.hd + 16 +
- Strictly.Come.Dancing.S10E22.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 11:02:01 +0000 - http://api.omgwtfnzbs.org/sn.php?id=TiWhP&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=TiWhP&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 1 GB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 11:07:22
Added to usenet: 17/12/2012 11:02:01
Weblink: http://thetvdb.com/?tab=series&id=83127&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=TiWhP]]>
- TV: STD - tv.sd - 19 - + The.Brain.That.Wouldnt.Die.1962.OAR.BDRip.x264-VoMiT + Sun, 08 Jan 2017 06:18:27 +0200 + https://api.omgwtfnzbs.me/nzb/?id=YgsZY&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=YgsZY&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 993.5 MB
Group: alt.binaries.moovee
Added to index: 08/01/2017 05:16:32
Added to usenet: 08/01/2017 06:18:27
View NZB: https://omgwtfnzbs.me/details.php?id=YgsZY]]>
+ Movies: STD + movies.sd + 15 +
- Survivor.S25E15.Reunion.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 10:38:13 +0000 - http://api.omgwtfnzbs.org/sn.php?id=hXOrr&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=hXOrr&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 216.49 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 10:44:14
Added to usenet: 17/12/2012 10:38:13
Weblink: http://thetvdb.com/?tab=series&id=76733&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=hXOrr]]>
- TV: STD - tv.sd - 19 - + Coin.Heist.2017.WEBRip.X264-DEFLATE + Sun, 08 Jan 2017 06:04:01 +0200 + https://api.omgwtfnzbs.me/nzb/?id=NVeV4&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=NVeV4&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 779.85 MB
Group: alt.binaries.moovee
Added to index: 08/01/2017 05:01:51
Added to usenet: 08/01/2017 06:04:01
View NZB: https://omgwtfnzbs.me/details.php?id=NVeV4]]>
+ Movies: STD + movies.sd + 15 +
- Strictly.Come.Dancing.S10E23.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 10:32:15 +0000 - http://api.omgwtfnzbs.org/sn.php?id=bwmpc&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=bwmpc&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 413.76 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 10:38:10
Added to usenet: 17/12/2012 10:32:15
Weblink: http://thetvdb.com/?tab=series&id=83127&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=bwmpc]]>
- TV: STD - tv.sd - 19 - + Keeping.Up.With.The.Joneses.2016.REAL.REPACK.1080p.BluRay.x264-DRONES + Sun, 08 Jan 2017 04:33:31 +0200 + https://api.omgwtfnzbs.me/nzb/?id=aVxDs&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=aVxDs&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 8.82 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 03:30:47
Added to usenet: 08/01/2017 04:33:31
View NZB: https://omgwtfnzbs.me/details.php?id=aVxDs]]>
+ Movies: HD + movies.hd + 16 +
- Tron.Uprising.S01E13.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 10:22:39 +0000 - http://api.omgwtfnzbs.org/sn.php?id=u2RzK&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=u2RzK&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 152.83 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 10:28:43
Added to usenet: 17/12/2012 10:22:39
Weblink: http://thetvdb.com/?tab=series&id=258480&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=u2RzK]]>
- TV: STD - tv.sd - 19 - + Keeping.Up.With.The.Joneses.2016.REAL.REPACK.720p.BluRay.x264-DRONES + Sun, 08 Jan 2017 03:51:11 +0200 + https://api.omgwtfnzbs.me/nzb/?id=4I63P&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=4I63P&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.29 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 02:48:06
Added to usenet: 08/01/2017 03:51:11
View NZB: https://omgwtfnzbs.me/details.php?id=4I63P]]>
+ Movies: HD + movies.hd + 16 +
- The.Rolling.Stones.Live.One.More.Shot.PPV.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 10:18:56 +0000 - http://api.omgwtfnzbs.org/sn.php?id=oRpx5&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=oRpx5&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 1.88 GB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 10:13:24
Added to usenet: 17/12/2012 10:18:56
Weblink: http://lookpic.com/O/i2/1911/mc9I2FoX.jpeg[/IMG
View NZB: http://omgwtfnzbs.org/details.php?id=oRpx5]]>
- TV: STD - tv.sd - 19 - + Keeping.Up.With.The.Joneses.2016.REAL.REPACK.BDRip.x264-DRONES + Sun, 08 Jan 2017 03:39:16 +0200 + https://api.omgwtfnzbs.me/nzb/?id=YsoKa&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=YsoKa&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 798.64 MB
Group: alt.binaries.moovee
Added to index: 08/01/2017 02:37:32
Added to usenet: 08/01/2017 03:39:16
View NZB: https://omgwtfnzbs.me/details.php?id=YsoKa]]>
+ Movies: STD + movies.sd + 15 +
- The.Bachelorette.Special.Ashley.and.J.Ps.Wedding.720p.HDTV.x264-2HD - Mon, 17 Dec 2012 10:16:15 +0000 - http://api.omgwtfnzbs.org/sn.php?id=6XV6n&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=6XV6n&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 3.09 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 10:14:43
Added to usenet: 17/12/2012 10:16:15
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=6XV6n]]>
- TV: HD - tv.hd - 20 - + USS.Indianapolis.Men.of.Courage.2016.1080p.BluRay.x264-EiDER + Sun, 08 Jan 2017 03:00:29 +0200 + https://api.omgwtfnzbs.me/nzb/?id=kZI0P&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=kZI0P&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 10.04 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 01:56:21
Added to usenet: 08/01/2017 03:00:29
View NZB: https://omgwtfnzbs.me/details.php?id=kZI0P]]>
+ Movies: HD + movies.hd + 16 +
- Finding.Bigfoot.S03E06.Bigfoot.and.Wolverines.720p.HDTV.x264-DHD - Mon, 17 Dec 2012 10:01:45 +0000 - http://api.omgwtfnzbs.org/sn.php?id=OdAGV&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=OdAGV&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.27 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 09:59:38
Added to usenet: 17/12/2012 10:01:45
Weblink: http://thetvdb.com/?tab=series&id=249235&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=OdAGV]]>
- TV: HD - tv.hd - 20 - + The.Front.Page.1931.1080p.BluRay.x264-CiNEFiLE + Sun, 08 Jan 2017 02:56:25 +0200 + https://api.omgwtfnzbs.me/nzb/?id=8FZCM&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=8FZCM&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 9.2 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 01:53:40
Added to usenet: 08/01/2017 02:56:25
View NZB: https://omgwtfnzbs.me/details.php?id=8FZCM]]>
+ Movies: HD + movies.hd + 16 +
- VH1.Divas.2012.HDTV.x264-2HD - Mon, 17 Dec 2012 09:39:00 +0000 - http://api.omgwtfnzbs.org/sn.php?id=S5No7&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=S5No7&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 1.21 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 09:37:21
Added to usenet: 17/12/2012 09:39:00
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=S5No7]]>
- TV: STD - tv.sd - 19 - + The.Front.Page.1931.720p.BluRay.x264-CiNEFiLE + Sun, 08 Jan 2017 02:48:44 +0200 + https://api.omgwtfnzbs.me/nzb/?id=o1VY1&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=o1VY1&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 5.09 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 01:46:38
Added to usenet: 08/01/2017 02:48:44
View NZB: https://omgwtfnzbs.me/details.php?id=o1VY1]]>
+ Movies: HD + movies.hd + 16 +
- Match.Of.The.Day.Two.2012.12.16.480p.HDTV.x264-mSD - Mon, 17 Dec 2012 09:36:29 +0000 - http://api.omgwtfnzbs.org/sn.php?id=DRwC1&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=DRwC1&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 610.31 MB
Group: alt.binaries.multimedia
Added to index: 17/12/2012 09:42:34
Added to usenet: 17/12/2012 09:36:29
Weblink: http://lookpic.com/O/i2/1718/8EOt9D9x.jpeg[/IMG
View NZB: http://omgwtfnzbs.org/details.php?id=DRwC1]]>
- TV: STD - tv.sd - 19 - + Battleground.1949.1080p.BluRay.x264-SiNNERS + Sun, 08 Jan 2017 02:32:20 +0200 + https://api.omgwtfnzbs.me/nzb/?id=TnRtg&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=TnRtg&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 13.82 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 01:26:16
Added to usenet: 08/01/2017 02:32:20
View NZB: https://omgwtfnzbs.me/details.php?id=TnRtg]]>
+ Movies: HD + movies.hd + 16 +
- The.Horses.of.McBride.2012.HDTV.x264-2HD - Mon, 17 Dec 2012 09:13:27 +0000 - http://api.omgwtfnzbs.org/sn.php?id=b8DNy&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=b8DNy&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 913.02 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 09:11:30
Added to usenet: 17/12/2012 09:13:27
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=b8DNy]]>
- TV: STD - tv.sd - 19 - -
+ Battleground.1949.720p.BluRay.x264-SiNNERS + Sun, 08 Jan 2017 02:24:46 +0200 + https://api.omgwtfnzbs.me/nzb/?id=9ZOFL&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=9ZOFL&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 7.55 GB
Group: alt.binaries.moovee
Added to index: 08/01/2017 01:21:45
Added to usenet: 08/01/2017 02:24:46
View NZB: https://omgwtfnzbs.me/details.php?id=9ZOFL]]>
+ Movies: HD + movies.hd + 16 + +
- Homeland.S02E12.720p.WEB-DL.DD5.1.H.264-DON - Mon, 17 Dec 2012 08:33:56 +0000 - http://api.omgwtfnzbs.org/sn.php?id=kB2xp&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=kB2xp&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 2.3 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 08:33:22
Added to usenet: 17/12/2012 08:33:56
Weblink: http://thetvdb.com/?tab=series&id=247897&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=kB2xp]]>
- TV: HD - tv.hd - 20 - -
+ Children.of.Men.2006.iNTERNAL.1080p.BluRay.x264-LiBRARiANS + Sun, 08 Jan 2017 00:28:33 +0200 + https://api.omgwtfnzbs.me/nzb/?id=4zHPm&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=4zHPm&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 12.88 GB
Group: alt.binaries.moovee
Added to index: 07/01/2017 23:21:55
Added to usenet: 08/01/2017 00:28:33
View NZB: https://omgwtfnzbs.me/details.php?id=4zHPm]]>
+ Movies: HD + movies.hd + 16 + + - Tron.Uprising.S01E13.720p.HDTV.x264-2HD - Mon, 17 Dec 2012 08:25:53 +0000 - http://api.omgwtfnzbs.org/sn.php?id=YzotL&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=YzotL&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 975.2 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 08:25:16
Added to usenet: 17/12/2012 08:25:53
Weblink: http://thetvdb.com/?tab=series&id=258480&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=YzotL]]>
- TV: HD - tv.hd - 20 - -
+ Children.of.Men.2006.iNTERNAL.BDRip.x264-LiBRARiANS + Sun, 08 Jan 2017 00:17:59 +0200 + https://api.omgwtfnzbs.me/nzb/?id=klDlR&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=klDlR&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 1.37 GB
Group: alt.binaries.moovee
Added to index: 07/01/2017 23:15:28
Added to usenet: 08/01/2017 00:17:59
View NZB: https://omgwtfnzbs.me/details.php?id=klDlR]]>
+ Movies: STD + movies.sd + 15 + + - Tron.Uprising.S01E13.HDTV.x264-2HD - Mon, 17 Dec 2012 08:24:55 +0000 - http://api.omgwtfnzbs.org/sn.php?id=i2eTC&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=i2eTC&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 269.56 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 08:24:23
Added to usenet: 17/12/2012 08:24:55
Weblink: http://thetvdb.com/?tab=series&id=258480&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=i2eTC]]>
- TV: STD - tv.sd - 19 - -
+ Children.of.Men.2006.PROPER.720p.BluRay.x264-SADPANDA + Sat, 07 Jan 2017 22:20:51 +0200 + https://api.omgwtfnzbs.me/nzb/?id=sAuS0&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=sAuS0&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.29 GB
Group: alt.binaries.moovee
Added to index: 07/01/2017 21:18:21
Added to usenet: 07/01/2017 22:20:51
View NZB: https://omgwtfnzbs.me/details.php?id=sAuS0]]>
+ Movies: HD + movies.hd + 16 + + - Homeland.S02E12.The.Choice.720p.WEB-DL.DD5.1.H.264-DON - Mon, 17 Dec 2012 08:03:24 +0000 - http://api.omgwtfnzbs.org/sn.php?id=WrQOi&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=WrQOi&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 2.41 GB
Group: alt.binaries.tv
Added to index: 17/12/2012 07:11:03
Added to usenet: 17/12/2012 08:03:24
Weblink: http://thetvdb.com/?tab=series&id=247897&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=WrQOi]]>
- TV: HD - tv.hd - 20 - -
+ Camino.2008.1080p.BluRay.DD5.1.x264-DON + Sat, 07 Jan 2017 21:09:01 +0200 + https://api.omgwtfnzbs.me/nzb/?id=PPGp9&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=PPGp9&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 18.69 GB
Group: alt.binaries.moovee
Added to index: 07/01/2017 20:03:14
Added to usenet: 07/01/2017 21:09:01
View NZB: https://omgwtfnzbs.me/details.php?id=PPGp9]]>
+ Movies: HD + movies.hd + 16 + + - T.I.and.Tiny.The.Family.Hustle.S02E16.HDTV.x264-CRiMSON - Mon, 17 Dec 2012 07:38:05 +0000 - http://api.omgwtfnzbs.org/sn.php?id=aJdwK&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=aJdwK&user=nzbdrone&api=nzbdrone - Category: TV: STD
Size: 222.29 MB
Group: alt.binaries.teevee
Added to index: 17/12/2012 07:37:25
Added to usenet: 17/12/2012 07:38:05
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=aJdwK]]>
- TV: STD - tv.sd - 19 - -
+ Charlie.St.Cloud.2010.1080p.BluRay.DD5.1.x264-DON + Sat, 07 Jan 2017 20:38:12 +0200 + https://api.omgwtfnzbs.me/nzb/?id=fMXUE&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=fMXUE&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 13.13 GB
Group: alt.binaries.moovee
Added to index: 07/01/2017 19:33:26
Added to usenet: 07/01/2017 20:38:12
View NZB: https://omgwtfnzbs.me/details.php?id=fMXUE]]>
+ Movies: HD + movies.hd + 16 + + - Curiosity.S02E10.What.Destroyed.the.Hindenburg.720p.HDTV.x264-DHD - Mon, 17 Dec 2012 07:38:05 +0000 - http://api.omgwtfnzbs.org/sn.php?id=CdMkN&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=CdMkN&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 1.18 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 07:36:22
Added to usenet: 17/12/2012 07:38:05
Weblink: http://thetvdb.com/?tab=series&id=250572&lid=7
View NZB: http://omgwtfnzbs.org/details.php?id=CdMkN]]>
- TV: HD - tv.hd - 20 - -
+ USS.Indianapolis.Men.of.Courage.2016.720p.BluRay.x264-EiDER + Sat, 07 Jan 2017 19:03:29 +0200 + https://api.omgwtfnzbs.me/nzb/?id=fYTFG&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=fYTFG&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 6.26 GB
Group: alt.binaries.moovee
Added to index: 07/01/2017 18:00:32
Added to usenet: 07/01/2017 19:03:29
View NZB: https://omgwtfnzbs.me/details.php?id=fYTFG]]>
+ Movies: HD + movies.hd + 16 + + - EPL.2012.12.16.West.Bromwich.Albion.Vs.West.Ham.United.720p.HDTV.x264-FAIRPLAY - Mon, 17 Dec 2012 07:29:04 +0000 - http://api.omgwtfnzbs.org/sn.php?id=LgCKE&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=LgCKE&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 3.62 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 07:28:35
Added to usenet: 17/12/2012 07:29:04
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=LgCKE]]>
- TV: HD - tv.hd - 20 - -
+ USS.Indianapolis.Men.of.Courage.2016.BDRip.x264-EiDER + Sat, 07 Jan 2017 18:52:00 +0200 + https://api.omgwtfnzbs.me/nzb/?id=6gxyp&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=6gxyp&user=nzbdrone&api=nzbdrone + Category: Movies: STD
Size: 1.27 GB
Group: alt.binaries.moovee
Added to index: 07/01/2017 17:50:00
Added to usenet: 07/01/2017 18:52:00
View NZB: https://omgwtfnzbs.me/details.php?id=6gxyp]]>
+ Movies: STD + movies.sd + 15 + + - NFL.2012.12.16.Broncos.vs.Ravens.720p.HDTV.x264-BAJSKORV - Mon, 17 Dec 2012 07:26:56 +0000 - http://api.omgwtfnzbs.org/sn.php?id=jMTWB&user=nzbdrone&api=nzbdrone - http://api.omgwtfnzbs.org/sn.php?id=jMTWB&user=nzbdrone&api=nzbdrone - Category: TV: HD
Size: 5.93 GB
Group: alt.binaries.teevee
Added to index: 17/12/2012 07:25:16
Added to usenet: 17/12/2012 07:26:56
Weblink: N/A
View NZB: http://omgwtfnzbs.org/details.php?id=jMTWB]]>
- TV: HD - tv.hd - 20 - + End.of.a.Gun.2016.1080p.BluRay.DD5.1.x264-TayTO + Sat, 07 Jan 2017 18:24:21 +0200 + https://api.omgwtfnzbs.me/nzb/?id=tNLPi&user=nzbdrone&api=nzbdrone + https://api.omgwtfnzbs.me/nzb/?id=tNLPi&user=nzbdrone&api=nzbdrone + Category: Movies: HD
Size: 10.96 GB
Group: alt.binaries.moovee
Added to index: 07/01/2017 17:20:34
Added to usenet: 07/01/2017 18:24:21
View NZB: https://omgwtfnzbs.me/details.php?id=tNLPi]]>
+ Movies: HD + movies.hd + 16 +
diff --git a/src/NzbDrone.Core.Test/IndexerTests/OmgwtfnzbsTests/OmgwtfnzbsFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/OmgwtfnzbsTests/OmgwtfnzbsFixture.cs index c5542b943..d79a61236 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/OmgwtfnzbsTests/OmgwtfnzbsFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/OmgwtfnzbsTests/OmgwtfnzbsFixture.cs @@ -42,14 +42,14 @@ namespace NzbDrone.Core.Test.IndexerTests.OmgwtfnzbsTests var releaseInfo = releases.First(); - releaseInfo.Title.Should().Be("Stephen.Fry.Gadget.Man.S01E05.HDTV.x264-C4TV"); + releaseInfo.Title.Should().Be("Un.Petit.Boulot.2016.FRENCH.720p.BluRay.DTS.x264-LOST"); releaseInfo.DownloadProtocol.Should().Be(DownloadProtocol.Usenet); - releaseInfo.DownloadUrl.Should().Be("http://api.omgwtfnzbs.org/sn.php?id=OAl4g&user=nzbdrone&api=nzbdrone"); - releaseInfo.InfoUrl.Should().Be("http://omgwtfnzbs.org/details.php?id=OAl4g"); + releaseInfo.DownloadUrl.Should().Be("https://api.omgwtfnzbs.me/nzb/?id=8a2Bw&user=nzbdrone&api=nzbdrone"); + releaseInfo.InfoUrl.Should().Be("https://omgwtfnzbs.me/details.php?id=8a2Bw"); releaseInfo.CommentUrl.Should().BeNullOrEmpty(); releaseInfo.Indexer.Should().Be(Subject.Definition.Name); - releaseInfo.PublishDate.Should().Be(DateTime.Parse("2012/12/17 23:30:13")); - releaseInfo.Size.Should().Be(236822906); + releaseInfo.PublishDate.Should().Be(DateTime.Parse("2017/01/09 00:16:54")); + releaseInfo.Size.Should().Be(5354909355); } } } diff --git a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRssParser.cs b/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRssParser.cs index a5946e5ff..644fff382 100644 --- a/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRssParser.cs +++ b/src/NzbDrone.Core/Indexers/Omgwtfnzbs/OmgwtfnzbsRssParser.cs @@ -29,7 +29,7 @@ namespace NzbDrone.Core.Indexers.Omgwtfnzbs protected override string GetInfoUrl(XElement item) { //Todo: Me thinks I need to parse details to get this... - var match = Regex.Match(item.Description(), @"(?:\View NZB\:\<\/b\>\s\.+)(?:\""\starget)", + var match = Regex.Match(item.Description(), @"(?:\View NZB\:\<\/b\>\s\.+)(?:\"")", RegexOptions.IgnoreCase | RegexOptions.Compiled); if (match.Success) From b93a9719feea6e50feb7a84a8df83af2c072461b Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Thu, 12 Jan 2017 23:06:26 -0500 Subject: [PATCH 22/71] initial awesomeHD support --- .../Indexers/AwesomeHD/AwesomeHD.cs | 30 ++++++ .../Indexers/AwesomeHD/AwesomeHDApi.cs | 80 ++++++++++++++++ .../AwesomeHD/AwesomeHDRequestGenerator.cs | 61 ++++++++++++ .../Indexers/AwesomeHD/AwesomeHDRssParser.cs | 92 +++++++++++++++++++ .../Indexers/AwesomeHD/AwesomeHDSettings.cs | 37 ++++++++ src/NzbDrone.Core/NzbDrone.Core.csproj | 5 + 6 files changed, 305 insertions(+) create mode 100644 src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs create mode 100644 src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDApi.cs create mode 100644 src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs create mode 100644 src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRssParser.cs create mode 100644 src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDSettings.cs diff --git a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs new file mode 100644 index 000000000..2ecb61b84 --- /dev/null +++ b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs @@ -0,0 +1,30 @@ +using NLog; +using NzbDrone.Common.Http; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.Parser; + +namespace NzbDrone.Core.Indexers.AwesomeHD +{ + public class AwesomeHD : HttpIndexerBase + { + public override string Name => "AwesomeHD"; + public override DownloadProtocol Protocol => DownloadProtocol.Torrent; + public override bool SupportsRss => false; + public override bool SupportsSearch => true; + public override int PageSize => 50; + + public AwesomeHD(IHttpClient httpClient, IIndexerStatusService indexerStatusService, IConfigService configService, IParsingService parsingService, Logger logger) + : base(httpClient, indexerStatusService, configService, parsingService, logger) + { } + + public override IIndexerRequestGenerator GetRequestGenerator() + { + return new AwesomeHDRequestGenerator() { Settings = Settings }; + } + + public override IParseIndexerResponse GetParser() + { + return new AwesomeHDRssParser(Settings); + } + } +} diff --git a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDApi.cs b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDApi.cs new file mode 100644 index 000000000..77744b4ac --- /dev/null +++ b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDApi.cs @@ -0,0 +1,80 @@ +using System; +using Newtonsoft.Json; + +using System.Xml.Serialization; +using System.Collections.Generic; + +namespace NzbDrone.Core.Indexers.AwesomeHD +{ + public class Torrent + { + [XmlElement(ElementName = "id")] + public string Id { get; set; } + [XmlElement(ElementName = "groupid")] + public string GroupId { get; set; } + [XmlElement(ElementName = "time")] + public DateTime Time { get; set; } + [XmlElement(ElementName = "userid")] + public string Userid { get; set; } + [XmlElement(ElementName = "size")] + public long Size { get; set; } + [XmlElement(ElementName = "snatched")] + public string Snatched { get; set; } + [XmlElement(ElementName = "seeders")] + public string Seeders { get; set; } + [XmlElement(ElementName = "leechers")] + public string Leechers { get; set; } + [XmlElement(ElementName = "releasegroup")] + public string Releasegroup { get; set; } + [XmlElement(ElementName = "resolution")] + public string Resolution { get; set; } + [XmlElement(ElementName = "media")] + public string Media { get; set; } + [XmlElement(ElementName = "format")] + public string Format { get; set; } + [XmlElement(ElementName = "encoding")] + public string Encoding { get; set; } + [XmlElement(ElementName = "audioformat")] + public string Audioformat { get; set; } + [XmlElement(ElementName = "audiobitrate")] + public string Audiobitrate { get; set; } + [XmlElement(ElementName = "audiochannels")] + public string Audiochannels { get; set; } + [XmlElement(ElementName = "subtitles")] + public string Subtitles { get; set; } + [XmlElement(ElementName = "encodestatus")] + public string Encodestatus { get; set; } + [XmlElement(ElementName = "freeleech")] + public string Freeleech { get; set; } + [XmlElement(ElementName = "cover")] + public string Cover { get; set; } + [XmlElement(ElementName = "smallcover")] + public string Smallcover { get; set; } + [XmlElement(ElementName = "year")] + public string Year { get; set; } + [XmlElement(ElementName = "name")] + public string Name { get; set; } + [XmlElement(ElementName = "imdb")] + public string Imdb { get; set; } + [XmlElement(ElementName = "type")] + public string Type { get; set; } + [XmlElement(ElementName = "plotoutline")] + public string Plotoutline { get; set; } + } + + public class SearchResults + { + [XmlElement(ElementName = "authkey")] + public string AuthKey { get; set; } + [XmlElement(ElementName = "torrent")] + public List Torrent { get; set; } + } + + public class AwesomeHDSearchResponse + { + [XmlElement(ElementName = "?xml")] + public string Xml { get; set; } + [XmlElement(ElementName = "searchresults")] + public SearchResults SearchResults { get; set; } + } +} diff --git a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs new file mode 100644 index 000000000..7e42f9ad6 --- /dev/null +++ b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NzbDrone.Common.Http; +using NzbDrone.Common.Serializer; +using NzbDrone.Core.IndexerSearch.Definitions; + +namespace NzbDrone.Core.Indexers.AwesomeHD +{ + public class AwesomeHDRequestGenerator : IIndexerRequestGenerator + { + public AwesomeHDSettings Settings { get; set; } + + public virtual IndexerPageableRequestChain GetRecentRequests() + { + var pageableRequests = new IndexerPageableRequestChain(); + + pageableRequests.Add(GetRequest("tt2488496")); + + return pageableRequests; + } + + public virtual IndexerPageableRequestChain GetSearchRequests(SingleEpisodeSearchCriteria searchCriteria) + { + return new IndexerPageableRequestChain(); + } + + public virtual IndexerPageableRequestChain GetSearchRequests(AnimeEpisodeSearchCriteria searchCriteria) + { + return new IndexerPageableRequestChain(); + } + + public virtual IndexerPageableRequestChain GetSearchRequests(SpecialEpisodeSearchCriteria searchCriteria) + { + return new IndexerPageableRequestChain(); + } + + public virtual IndexerPageableRequestChain GetSearchRequests(DailyEpisodeSearchCriteria searchCriteria) + { + return new IndexerPageableRequestChain(); + } + + public virtual IndexerPageableRequestChain GetSearchRequests(SeasonSearchCriteria searchCriteria) + { + return new IndexerPageableRequestChain(); + } + + public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria) + { + var pageableRequests = new IndexerPageableRequestChain(); + pageableRequests.Add(GetRequest(searchCriteria.Movie.ImdbId)); + return pageableRequests; + } + + private IEnumerable GetRequest(string searchParameters) + { + var request = 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 request; + } + } +} diff --git a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRssParser.cs b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRssParser.cs new file mode 100644 index 000000000..e7a2632a0 --- /dev/null +++ b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRssParser.cs @@ -0,0 +1,92 @@ +using System.Collections.Generic; +using System.Net; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NzbDrone.Common.Http; +using NzbDrone.Core.Indexers.Exceptions; +using NzbDrone.Core.Parser.Model; +using System; +using System.Linq; +using System.Xml; + +namespace NzbDrone.Core.Indexers.AwesomeHD +{ + public class AwesomeHDRssParser : IParseIndexerResponse + { + private readonly AwesomeHDSettings _settings; + + public AwesomeHDRssParser(AwesomeHDSettings settings) + { + _settings = settings; + } + + public IList ParseResponse(IndexerResponse indexerResponse) + { + var torrentInfos = new List(); + + if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) + { + throw new IndexerException(indexerResponse, + "Unexpected response status {0} code from API request", + indexerResponse.HttpResponse.StatusCode); + } + + // Hacky ¯\_(ツ)_/¯ + XmlDocument doc = new XmlDocument(); + doc.LoadXml(indexerResponse.Content); + + var json = JsonConvert.SerializeXmlNode(doc); + + Console.WriteLine(json); + + var jsonResponse = JsonConvert.DeserializeObject(json); + + if (jsonResponse == null) + { + throw new IndexerException(indexerResponse, "Unexpected response from request"); + } + + foreach (var torrent in jsonResponse.SearchResults.Torrent) + { + var id = torrent.Id; + var title = $"{torrent.Name}.{torrent.Year}.{torrent.Resolution}.{torrent.Media}.{torrent.Encoding}.{torrent.Audioformat}-{torrent.Releasegroup}"; + + torrentInfos.Add(new TorrentInfo() + { + Guid = string.Format("AwesomeHD-{0}", id), + Title = title, + Size = torrent.Size, + DownloadUrl = GetDownloadUrl(id, jsonResponse.SearchResults.AuthKey, _settings.Passkey), + InfoUrl = GetInfoUrl(torrent.GroupId, id), + Seeders = int.Parse(torrent.Seeders), + Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), + PublishDate = torrent.Time.ToUniversalTime() + }); + } + + return torrentInfos.OrderByDescending(o => ((dynamic)o).Seeders).ToArray(); + } + + private string GetDownloadUrl(string torrentId, string authKey, string passKey) + { + var url = new HttpUri(_settings.BaseUrl) + .CombinePath("/torrents.php") + .AddQueryParam("action", "download") + .AddQueryParam("id", torrentId) + .AddQueryParam("authkey", authKey) + .AddQueryParam("torrent_pass", passKey); + + return url.FullUri; + } + + private string GetInfoUrl(string groupId, string torrentId) + { + var url = new HttpUri(_settings.BaseUrl) + .CombinePath("/torrents.php") + .AddQueryParam("id", groupId) + .AddQueryParam("torrentid", torrentId); + + return url.FullUri; + } + } +} diff --git a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDSettings.cs b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDSettings.cs new file mode 100644 index 000000000..3c6f525c4 --- /dev/null +++ b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDSettings.cs @@ -0,0 +1,37 @@ +using FluentValidation; +using NzbDrone.Core.Annotations; +using NzbDrone.Core.ThingiProvider; +using NzbDrone.Core.Validation; + +namespace NzbDrone.Core.Indexers.AwesomeHD +{ + public class AwesomeHDSettingsValidator : AbstractValidator + { + public AwesomeHDSettingsValidator() + { + RuleFor(c => c.BaseUrl).ValidRootUrl(); + RuleFor(c => c.Passkey).NotEmpty(); + } + } + + public class AwesomeHDSettings : IProviderConfig + { + private static readonly AwesomeHDSettingsValidator Validator = new AwesomeHDSettingsValidator(); + + public AwesomeHDSettings() + { + BaseUrl = "https://awesome-hd.me"; + } + + [FieldDefinition(0, Label = "API URL", Advanced = true, HelpText = "Do not change this unless you know what you're doing. Since you Passkey will be sent to that host.")] + public string BaseUrl { get; set; } + + [FieldDefinition(1, Label = "Passkey")] + public string Passkey { get; set; } + + public NzbDroneValidationResult Validate() + { + return new NzbDroneValidationResult(Validator.Validate(this)); + } + } +} diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index cd482bd90..9dfb29ec2 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -578,6 +578,7 @@ + @@ -585,6 +586,10 @@ + + + + From 7f3ca85953bd6ce1c46fbae86e28353587d90b5a Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 13 Jan 2017 06:15:38 +0100 Subject: [PATCH 23/71] Stop incrementing version for pull requests. --- appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 47e6519de..b529317ee 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,6 +36,9 @@ artifacts: cache: - '%USERPROFILE%\.nuget\packages' - node_modules + +pull_requests: + do_not_increment_build_number: true only_commits: files: From 4038ce18c332a79f556d81edb8982730237bc415 Mon Sep 17 00:00:00 2001 From: vertigo235 Date: Fri, 13 Jan 2017 10:08:24 -0500 Subject: [PATCH 24/71] update movie monitor tooltip (#223) --- .../AddMovies/MonitoringTooltipTemplate.hbs | 20 ++++--------------- src/UI/AddMovies/SearchResultView.js | 2 +- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/UI/AddMovies/MonitoringTooltipTemplate.hbs b/src/UI/AddMovies/MonitoringTooltipTemplate.hbs index 0cf813e98..66ad7d77f 100644 --- a/src/UI/AddMovies/MonitoringTooltipTemplate.hbs +++ b/src/UI/AddMovies/MonitoringTooltipTemplate.hbs @@ -1,18 +1,6 @@
-
All
-
Monitor all episodes except specials
-
Future
-
Monitor episodes that have not aired yet
-
Missing
-
Monitor episodes that do not have files or have not aired yet
-
Existing
-
Monitor episodes that have files or have not aired yet
-
First Season
-
Monitor all episodes of the first season. All other seasons will be ignored
-
Latest Season
-
Monitor all episodes of the latest season and future seasons
-
None
-
No episodes will be monitored.
- - +
Yes
+
Monitor for new releases
+
No
+
Do not monitor for new releases
\ No newline at end of file diff --git a/src/UI/AddMovies/SearchResultView.js b/src/UI/AddMovies/SearchResultView.js index abeaf5016..f563e6f66 100644 --- a/src/UI/AddMovies/SearchResultView.js +++ b/src/UI/AddMovies/SearchResultView.js @@ -84,7 +84,7 @@ var view = Marionette.ItemView.extend({ content : content, html : true, trigger : 'hover', - title : 'Episode Monitoring Options', + title : 'Movie Monitoring Options', placement : 'right', container : this.$el }); From 317f8917b92840e3908e47b61ee0157cdd34202f Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 11:08:36 -0500 Subject: [PATCH 25/71] Clean up Deluge Settings --- .../DelugeTests/DelugeFixture.cs | 2 +- .../Download/Clients/Deluge/Deluge.cs | 80 ++++--------------- .../Download/Clients/Deluge/DelugeSettings.cs | 14 +--- 3 files changed, 20 insertions(+), 76 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DelugeTests/DelugeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DelugeTests/DelugeFixture.cs index af24f2797..b70021190 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DelugeTests/DelugeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DelugeTests/DelugeFixture.cs @@ -26,7 +26,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DelugeTests Subject.Definition = new DownloadClientDefinition(); Subject.Definition.Settings = new DelugeSettings() { - TvCategory = null + MovieCategory = null }; _queued = new DelugeTorrent diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs index 810fa3f8c..831c31b4f 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs @@ -31,25 +31,17 @@ namespace NzbDrone.Core.Download.Clients.Deluge _proxy = proxy; } - protected override string AddFromMagnetLink(RemoteMovie remoteEpisode, string hash, string magnetLink) + protected override string AddFromMagnetLink(RemoteMovie remoteMovie, string hash, string magnetLink) { var actualHash = _proxy.AddTorrentFromMagnet(magnetLink, Settings); - if (!Settings.TvCategory.IsNullOrWhiteSpace()) + if (!Settings.MovieCategory.IsNullOrWhiteSpace()) { - _proxy.SetLabel(actualHash, Settings.TvCategory, Settings); + _proxy.SetLabel(actualHash, Settings.MovieCategory, Settings); } _proxy.SetTorrentConfiguration(actualHash, "remove_at_ratio", false, Settings); - /*var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)DelugePriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)DelugePriority.First) - { - _proxy.MoveTorrentToTopInQueue(actualHash, Settings); - }*/ - return actualHash.ToUpper(); } @@ -57,66 +49,24 @@ namespace NzbDrone.Core.Download.Clients.Deluge { var actualHash = _proxy.AddTorrentFromFile(filename, fileContent, Settings); - if (!Settings.TvCategory.IsNullOrWhiteSpace()) + if (!Settings.MovieCategory.IsNullOrWhiteSpace()) { - _proxy.SetLabel(actualHash, Settings.TvCategory, Settings); + _proxy.SetLabel(actualHash, Settings.MovieCategory, Settings); } _proxy.SetTorrentConfiguration(actualHash, "remove_at_ratio", false, Settings); - /*var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)DelugePriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)DelugePriority.First) - { - _proxy.MoveTorrentToTopInQueue(actualHash, Settings); - }*/ - return actualHash.ToUpper(); } protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink) { - var actualHash = _proxy.AddTorrentFromMagnet(magnetLink, Settings); - - if (!Settings.TvCategory.IsNullOrWhiteSpace()) - { - _proxy.SetLabel(actualHash, Settings.TvCategory, Settings); - } - - _proxy.SetTorrentConfiguration(actualHash, "remove_at_ratio", false, Settings); - - var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)DelugePriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)DelugePriority.First) - { - _proxy.MoveTorrentToTopInQueue(actualHash, Settings); - } - - return actualHash.ToUpper(); + throw new NotImplementedException("Episodes are not working with Radarr"); } protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent) { - var actualHash = _proxy.AddTorrentFromFile(filename, fileContent, Settings); - - if (!Settings.TvCategory.IsNullOrWhiteSpace()) - { - _proxy.SetLabel(actualHash, Settings.TvCategory, Settings); - } - - _proxy.SetTorrentConfiguration(actualHash, "remove_at_ratio", false, Settings); - - var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)DelugePriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)DelugePriority.First) - { - _proxy.MoveTorrentToTopInQueue(actualHash, Settings); - } - - return actualHash.ToUpper(); + throw new NotImplementedException("Episodes are not working with Radarr"); } public override string Name => "Deluge"; @@ -127,9 +77,9 @@ namespace NzbDrone.Core.Download.Clients.Deluge try { - if (!Settings.TvCategory.IsNullOrWhiteSpace()) + if (!Settings.MovieCategory.IsNullOrWhiteSpace()) { - torrents = _proxy.GetTorrentsByLabel(Settings.TvCategory, Settings); + torrents = _proxy.GetTorrentsByLabel(Settings.MovieCategory, Settings); } else { @@ -149,7 +99,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge var item = new DownloadClientItem(); item.DownloadId = torrent.Hash.ToUpper(); item.Title = torrent.Name; - item.Category = Settings.TvCategory; + item.Category = Settings.MovieCategory; item.DownloadClient = Definition.Name; @@ -280,7 +230,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge private ValidationFailure TestCategory() { - if (Settings.TvCategory.IsNullOrWhiteSpace()) + if (Settings.MovieCategory.IsNullOrWhiteSpace()) { return null; } @@ -297,14 +247,14 @@ namespace NzbDrone.Core.Download.Clients.Deluge var labels = _proxy.GetAvailableLabels(Settings); - if (!labels.Contains(Settings.TvCategory)) + if (!labels.Contains(Settings.MovieCategory)) { - _proxy.AddLabel(Settings.TvCategory, Settings); + _proxy.AddLabel(Settings.MovieCategory, Settings); labels = _proxy.GetAvailableLabels(Settings); - if (!labels.Contains(Settings.TvCategory)) + if (!labels.Contains(Settings.MovieCategory)) { - return new NzbDroneValidationFailure("TvCategory", "Configuration of label failed") + return new NzbDroneValidationFailure("MovieCategory", "Configuration of label failed") { DetailedDescription = "Radarr as unable to add the label to Deluge." }; diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs index 73bc0212a..a7175dff6 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs @@ -12,7 +12,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge RuleFor(c => c.Host).ValidHost(); RuleFor(c => c.Port).GreaterThan(0); - RuleFor(c => c.TvCategory).Matches("^[-a-z]*$").WithMessage("Allowed characters a-z and -"); + RuleFor(c => c.MovieCategory).Matches("^[-a-z]*$").WithMessage("Allowed characters a-z and -"); } } @@ -25,7 +25,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge Host = "localhost"; Port = 8112; Password = "deluge"; - TvCategory = "movie-radarr"; + MovieCategory = "movie-radarr"; } [FieldDefinition(0, Label = "Host", Type = FieldType.Textbox)] @@ -41,15 +41,9 @@ namespace NzbDrone.Core.Download.Clients.Deluge public string Password { get; set; } [FieldDefinition(4, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional")] - public string TvCategory { get; set; } + public string MovieCategory { get; set; } - [FieldDefinition(5, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(DelugePriority), HelpText = "Priority to use when grabbing episodes that aired within the last 14 days")] - public int RecentTvPriority { get; set; } - - [FieldDefinition(6, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(DelugePriority), HelpText = "Priority to use when grabbing episodes that aired over 14 days ago")] - public int OlderTvPriority { get; set; } - - [FieldDefinition(7, Label = "Use SSL", Type = FieldType.Checkbox)] + [FieldDefinition(5, Label = "Use SSL", Type = FieldType.Checkbox)] public bool UseSsl { get; set; } public NzbDroneValidationResult Validate() From fdd06127fc47d016d713d820e913256bd19c3310 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 11:13:41 -0500 Subject: [PATCH 26/71] Clean up Transmission --- .../TransmissionFixtureBase.cs | 4 +- .../Clients/Transmission/TransmissionBase.cs | 59 ++++--------------- .../Transmission/TransmissionSettings.cs | 18 ++---- 3 files changed, 21 insertions(+), 60 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixtureBase.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixtureBase.cs index d46f9a30e..5fd4136b6 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixtureBase.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixtureBase.cs @@ -112,12 +112,12 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests protected void GivenTvCategory() { - _settings.TvCategory = "sonarr"; + _settings.MovieCategory = "radarr"; } protected void GivenTvDirectory() { - _settings.TvDirectory = @"C:/Downloads/Finished/sonarr"; + _settings.MovieDirectory = @"C:/Downloads/Finished/radarr"; } protected void GivenFailedDownload() diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs index 2f9b77159..1eb6b6ce8 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs @@ -54,21 +54,21 @@ namespace NzbDrone.Core.Download.Clients.Transmission var outputPath = new OsPath(torrent.DownloadDir); - if (Settings.TvDirectory.IsNotNullOrWhiteSpace()) + if (Settings.MovieDirectory.IsNotNullOrWhiteSpace()) { - if (!new OsPath(Settings.TvDirectory).Contains(outputPath)) continue; + if (!new OsPath(Settings.MovieDirectory).Contains(outputPath)) continue; } - else if (Settings.TvCategory.IsNotNullOrWhiteSpace()) + else if (Settings.MovieCategory.IsNotNullOrWhiteSpace()) { var directories = outputPath.FullPath.Split('\\', '/'); - if (!directories.Contains(Settings.TvCategory)) continue; + if (!directories.Contains(Settings.MovieCategory)) continue; } outputPath = _remotePathMappingService.RemapRemoteToLocal(Settings.Host, outputPath); var item = new DownloadClientItem(); item.DownloadId = torrent.HashString.ToUpper(); - item.Category = Settings.TvCategory; + item.Category = Settings.MovieCategory; item.Title = torrent.Name; item.DownloadClient = Definition.Name; @@ -123,9 +123,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission var config = _proxy.GetConfig(Settings); var destDir = config.GetValueOrDefault("download-dir") as string; - if (Settings.TvCategory.IsNotNullOrWhiteSpace()) + if (Settings.MovieCategory.IsNotNullOrWhiteSpace()) { - destDir = string.Format("{0}/.{1}", destDir, Settings.TvCategory); + destDir = string.Format("{0}/.{1}", destDir, Settings.MovieCategory); } return new DownloadClientStatus @@ -137,56 +137,23 @@ namespace NzbDrone.Core.Download.Clients.Transmission protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink) { - _proxy.AddTorrentFromUrl(magnetLink, GetDownloadDirectory(), Settings); - - var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)TransmissionPriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)TransmissionPriority.First) - { - _proxy.MoveTorrentToTopInQueue(hash, Settings); - } - - return hash; + throw new NotImplementedException("Episodes are not working with Radarr"); } protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent) { - _proxy.AddTorrentFromData(fileContent, GetDownloadDirectory(), Settings); - - var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)TransmissionPriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)TransmissionPriority.First) - { - _proxy.MoveTorrentToTopInQueue(hash, Settings); - } - - return hash; + throw new NotImplementedException("Episodes are not working with Radarr"); } protected override string AddFromMagnetLink(RemoteMovie remoteMovie, string hash, string magnetLink) { _proxy.AddTorrentFromUrl(magnetLink, GetDownloadDirectory(), Settings); - if (remoteMovie.Release.Age < 14 && Settings.RecentTvPriority == (int)TransmissionPriority.First || - remoteMovie.Release.Age > 14 && Settings.OlderTvPriority == (int)TransmissionPriority.First) - { - _proxy.MoveTorrentToTopInQueue(hash, Settings); - } - return hash; } protected override string AddFromTorrentFile(RemoteMovie remoteMovie, string hash, string filename, byte[] fileContent) { _proxy.AddTorrentFromData(fileContent, GetDownloadDirectory(), Settings); - - if (remoteMovie.Release.Age < 14 && Settings.RecentTvPriority == (int)TransmissionPriority.First || - remoteMovie.Release.Age > 14 && Settings.OlderTvPriority == (int)TransmissionPriority.First) - { - _proxy.MoveTorrentToTopInQueue(hash, Settings); - } - return hash; } @@ -204,16 +171,16 @@ namespace NzbDrone.Core.Download.Clients.Transmission protected string GetDownloadDirectory() { - if (Settings.TvDirectory.IsNotNullOrWhiteSpace()) + if (Settings.MovieDirectory.IsNotNullOrWhiteSpace()) { - return Settings.TvDirectory; + return Settings.MovieDirectory; } - else if (Settings.TvCategory.IsNotNullOrWhiteSpace()) + else if (Settings.MovieCategory.IsNotNullOrWhiteSpace()) { var config = _proxy.GetConfig(Settings); var destDir = (string)config.GetValueOrDefault("download-dir"); - return string.Format("{0}/{1}", destDir.TrimEnd('/'), Settings.TvCategory); + return string.Format("{0}/{1}", destDir.TrimEnd('/'), Settings.MovieCategory); } else { diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs index e1783fe48..9d0a860ec 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs @@ -16,10 +16,10 @@ namespace NzbDrone.Core.Download.Clients.Transmission RuleFor(c => c.UrlBase).ValidUrlBase(); - RuleFor(c => c.TvCategory).Matches(@"^\.?[-a-z]*$", RegexOptions.IgnoreCase).WithMessage("Allowed characters a-z and -"); + RuleFor(c => c.MovieCategory).Matches(@"^\.?[-a-z]*$", RegexOptions.IgnoreCase).WithMessage("Allowed characters a-z and -"); - RuleFor(c => c.TvCategory).Empty() - .When(c => c.TvDirectory.IsNotNullOrWhiteSpace()) + RuleFor(c => c.MovieCategory).Empty() + .When(c => c.MovieDirectory.IsNotNullOrWhiteSpace()) .WithMessage("Cannot use Category and Directory"); } } @@ -51,18 +51,12 @@ namespace NzbDrone.Core.Download.Clients.Transmission public string Password { get; set; } [FieldDefinition(5, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional. Creates a [category] subdirectory in the output directory.")] - public string TvCategory { get; set; } + public string MovieCategory { get; set; } [FieldDefinition(6, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Transmission location")] - public string TvDirectory { get; set; } + public string MovieDirectory { get; set; } - [FieldDefinition(7, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing movies that we're released within the last 14 days")] - public int RecentTvPriority { get; set; } - - [FieldDefinition(8, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing movies that we're released over 14 days ago")] - public int OlderTvPriority { get; set; } - - [FieldDefinition(9, Label = "Use SSL", Type = FieldType.Checkbox)] + [FieldDefinition(7, Label = "Use SSL", Type = FieldType.Checkbox)] public bool UseSsl { get; set; } public NzbDroneValidationResult Validate() From 0efdc78f8ddeeaee85c5fe814babd45c5fdcd9f6 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 11:21:34 -0500 Subject: [PATCH 27/71] Clean up rTorrent --- .../RTorrentTests/RTorrentFixture.cs | 2 +- .../Download/Clients/rTorrent/RTorrent.cs | 88 +++---------------- .../rTorrent/RTorrentDirectoryValidator.cs | 4 +- .../Clients/rTorrent/RTorrentSettings.cs | 16 +--- 4 files changed, 19 insertions(+), 91 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/RTorrentTests/RTorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/RTorrentTests/RTorrentFixture.cs index f657a7884..a3d7eebf1 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/RTorrentTests/RTorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/RTorrentTests/RTorrentFixture.cs @@ -21,7 +21,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.RTorrentTests Subject.Definition = new DownloadClientDefinition(); Subject.Definition.Settings = new RTorrentSettings() { - TvCategory = null + MovieCategory = null }; _downloading = new RTorrentTorrent diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs index b456f828c..cc9b80aa5 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs @@ -37,51 +37,23 @@ namespace NzbDrone.Core.Download.Clients.RTorrent _rTorrentDirectoryValidator = rTorrentDirectoryValidator; } - protected override string AddFromMagnetLink(RemoteMovie remoteMovie, string hash, string magnetLink) + protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink) { - _proxy.AddTorrentFromUrl(magnetLink, Settings); - - // Download the magnet to the appropriate directory. - _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); - //SetPriority(remoteEpisode, hash); - SetDownloadDirectory(hash); - - // Once the magnet meta download finishes, rTorrent replaces it with the actual torrent download with default settings. - // Schedule an event to apply the appropriate settings when that happens. - // var priority = (RTorrentPriority)(remoteEpisode.IsRecentEpisode() ? Settings.RecentTvPriority : Settings.OlderTvPriority); - //_proxy.SetDeferredMagnetProperties(hash, Settings.TvCategory, Settings.TvDirectory, priority, Settings); - - _proxy.StartTorrent(hash, Settings); - - // Wait for the magnet to be resolved. - var tries = 10; - var retryDelay = 500; - if (WaitForTorrent(hash, tries, retryDelay)) - { - return hash; - } - else - { - _logger.Warn("rTorrent could not resolve magnet within {0} seconds, download may remain stuck: {1}.", tries * retryDelay / 1000, magnetLink); + throw new NotImplementedException("Episodes are not working with Radarr"); + } - return hash; - } + protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent) + { + throw new NotImplementedException("Episodes are not working with Radarr"); } - protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink) + protected override string AddFromMagnetLink(RemoteMovie remoteMovie, string hash, string magnetLink) { _proxy.AddTorrentFromUrl(magnetLink, Settings); // Download the magnet to the appropriate directory. - _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); - SetPriority(remoteEpisode, hash); + _proxy.SetTorrentLabel(hash, Settings.MovieCategory, Settings); SetDownloadDirectory(hash); - - // Once the magnet meta download finishes, rTorrent replaces it with the actual torrent download with default settings. - // Schedule an event to apply the appropriate settings when that happens. - var priority = (RTorrentPriority)(remoteEpisode.IsRecentEpisode() ? Settings.RecentTvPriority : Settings.OlderTvPriority); - _proxy.SetDeferredMagnetProperties(hash, Settings.TvCategory, Settings.TvDirectory, priority, Settings); - _proxy.StartTorrent(hash, Settings); // Wait for the magnet to be resolved. @@ -107,13 +79,9 @@ namespace NzbDrone.Core.Download.Clients.RTorrent var retryDelay = 100; if (WaitForTorrent(hash, tries, retryDelay)) { - _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); - - //SetPriority(remoteEpisode, hash); + _proxy.SetTorrentLabel(hash, Settings.MovieCategory, Settings); SetDownloadDirectory(hash); - _proxy.StartTorrent(hash, Settings); - return hash; } else @@ -125,32 +93,6 @@ namespace NzbDrone.Core.Download.Clients.RTorrent } } - protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent) - { - _proxy.AddTorrentFromFile(filename, fileContent, Settings); - - var tries = 2; - var retryDelay = 100; - if (WaitForTorrent(hash, tries, retryDelay)) - { - _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); - - SetPriority(remoteEpisode, hash); - SetDownloadDirectory(hash); - - _proxy.StartTorrent(hash, Settings); - - return hash; - } - else - { - _logger.Debug("rTorrent could not add file"); - - RemoveItem(hash, true); - throw new ReleaseDownloadException(remoteEpisode.Release, "Downloading torrent failed"); - } - } - public override string Name => "rTorrent"; public override ProviderMessage Message => new ProviderMessage("Radarr is unable to remove torrents that have finished seeding when using rTorrent", ProviderMessageType.Warning); @@ -167,7 +109,7 @@ namespace NzbDrone.Core.Download.Clients.RTorrent foreach (RTorrentTorrent torrent in torrents) { // Don't concern ourselves with categories other than specified - if (torrent.Category != Settings.TvCategory) continue; + if (torrent.Category != Settings.MovieCategory) continue; if (torrent.Path.StartsWith(".")) { @@ -287,17 +229,11 @@ namespace NzbDrone.Core.Download.Clients.RTorrent return result.Errors.First(); } - private void SetPriority(RemoteEpisode remoteEpisode, string hash) - { - var priority = (RTorrentPriority)(remoteEpisode.IsRecentEpisode() ? Settings.RecentTvPriority : Settings.OlderTvPriority); - _proxy.SetTorrentPriority(hash, priority, Settings); - } - private void SetDownloadDirectory(string hash) { - if (Settings.TvDirectory.IsNotNullOrWhiteSpace()) + if (Settings.MovieDirectory.IsNotNullOrWhiteSpace()) { - _proxy.SetTorrentDownloadDirectory(hash, Settings.TvDirectory, Settings); + _proxy.SetTorrentDownloadDirectory(hash, Settings.MovieDirectory, Settings); } } diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentDirectoryValidator.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentDirectoryValidator.cs index 3cb2d6a8b..1d0f5063a 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentDirectoryValidator.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentDirectoryValidator.cs @@ -18,13 +18,13 @@ namespace NzbDrone.Core.Download.Clients.rTorrent DroneFactoryValidator droneFactoryValidator, MappedNetworkDriveValidator mappedNetworkDriveValidator) { - RuleFor(c => c.TvDirectory).Cascade(CascadeMode.StopOnFirstFailure) + RuleFor(c => c.MovieDirectory).Cascade(CascadeMode.StopOnFirstFailure) .IsValidPath() .SetValidator(rootFolderValidator) .SetValidator(droneFactoryValidator) .SetValidator(mappedNetworkDriveValidator) .SetValidator(pathExistsValidator) - .When(c => c.TvDirectory.IsNotNullOrWhiteSpace()) + .When(c => c.MovieDirectory.IsNotNullOrWhiteSpace()) .When(c => c.Host == "localhost" || c.Host == "127.0.0.1"); } } diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs index dc5c02053..4965c9a78 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs @@ -11,7 +11,7 @@ namespace NzbDrone.Core.Download.Clients.RTorrent { RuleFor(c => c.Host).ValidHost(); RuleFor(c => c.Port).InclusiveBetween(0, 65535); - RuleFor(c => c.TvCategory).NotEmpty() + RuleFor(c => c.MovieCategory).NotEmpty() .WithMessage("A category is recommended") .AsWarning(); } @@ -26,9 +26,7 @@ namespace NzbDrone.Core.Download.Clients.RTorrent Host = "localhost"; Port = 8080; UrlBase = "RPC2"; - TvCategory = "movies-radarr"; - OlderTvPriority = (int)RTorrentPriority.Normal; - RecentTvPriority = (int)RTorrentPriority.Normal; + MovieCategory = "movies-radarr"; } [FieldDefinition(0, Label = "Host", Type = FieldType.Textbox)] @@ -50,16 +48,10 @@ namespace NzbDrone.Core.Download.Clients.RTorrent public string Password { get; set; } [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional.")] - public string TvCategory { get; set; } + public string MovieCategory { get; set; } [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default rTorrent location")] - public string TvDirectory { get; set; } - - [FieldDefinition(8, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(RTorrentPriority), HelpText = "Priority to use when grabbing episodes that aired within the last 14 days")] - public int RecentTvPriority { get; set; } - - [FieldDefinition(9, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(RTorrentPriority), HelpText = "Priority to use when grabbing episodes that aired over 14 days ago")] - public int OlderTvPriority { get; set; } + public string MovieDirectory { get; set; } public NzbDroneValidationResult Validate() { From 6a62546a4d83227735d0ad4a354e934a6b5b7755 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 11:25:59 -0500 Subject: [PATCH 28/71] Clean up QBitTorrent --- .../QBittorrentTests/QBittorrentFixture.cs | 2 +- .../Clients/QBittorrent/QBittorrent.cs | 66 +++---------------- .../Clients/QBittorrent/QBittorrentProxy.cs | 4 +- .../QBittorrent/QBittorrentSettings.cs | 13 +--- 4 files changed, 16 insertions(+), 69 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs index 3ceece6f6..2283f7add 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs @@ -25,7 +25,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Port = 2222, Username = "admin", Password = "pass", - TvCategory = "tv" + MovieCategory = "movies-radarr" }; Mocker.GetMock() diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index 4d4dc47db..5db723ff0 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -33,81 +33,35 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink) { - _proxy.AddTorrentFromUrl(magnetLink, Settings); - - if (Settings.TvCategory.IsNotNullOrWhiteSpace()) - { - _proxy.SetTorrentLabel(hash.ToLower(), Settings.TvCategory, Settings); - } - - var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)QBittorrentPriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)QBittorrentPriority.First) - { - _proxy.MoveTorrentToTopInQueue(hash.ToLower(), Settings); - } - - return hash; + throw new NotImplementedException("Episodes are not working with Radarr"); } protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, Byte[] fileContent) { - _proxy.AddTorrentFromFile(filename, fileContent, Settings); - - if (Settings.TvCategory.IsNotNullOrWhiteSpace()) - { - _proxy.SetTorrentLabel(hash.ToLower(), Settings.TvCategory, Settings); - } - - var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)QBittorrentPriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)QBittorrentPriority.First) - { - _proxy.MoveTorrentToTopInQueue(hash.ToLower(), Settings); - } - - return hash; + throw new NotImplementedException("Episodes are not working with Radarr"); } - protected override string AddFromMagnetLink(RemoteMovie remoteEpisode, string hash, string magnetLink) + protected override string AddFromMagnetLink(RemoteMovie remoteMovie, string hash, string magnetLink) { _proxy.AddTorrentFromUrl(magnetLink, Settings); - if (Settings.TvCategory.IsNotNullOrWhiteSpace()) + if (Settings.MovieCategory.IsNotNullOrWhiteSpace()) { - _proxy.SetTorrentLabel(hash.ToLower(), Settings.TvCategory, Settings); + _proxy.SetTorrentLabel(hash.ToLower(), Settings.MovieCategory, Settings); } - /*var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)QBittorrentPriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)QBittorrentPriority.First) - { - _proxy.MoveTorrentToTopInQueue(hash.ToLower(), Settings); - }*/ //TODO: Maybe reimplement for movies - return hash; } - protected override string AddFromTorrentFile(RemoteMovie remoteEpisode, string hash, string filename, Byte[] fileContent) + protected override string AddFromTorrentFile(RemoteMovie remoteMovie, string hash, string filename, Byte[] fileContent) { _proxy.AddTorrentFromFile(filename, fileContent, Settings); - if (Settings.TvCategory.IsNotNullOrWhiteSpace()) + if (Settings.MovieCategory.IsNotNullOrWhiteSpace()) { - _proxy.SetTorrentLabel(hash.ToLower(), Settings.TvCategory, Settings); + _proxy.SetTorrentLabel(hash.ToLower(), Settings.MovieCategory, Settings); } - /*var isRecentEpisode = remoteEpisode.IsRecentEpisode(); - - if (isRecentEpisode && Settings.RecentTvPriority == (int)QBittorrentPriority.First || - !isRecentEpisode && Settings.OlderTvPriority == (int)QBittorrentPriority.First) - { - _proxy.MoveTorrentToTopInQueue(hash.ToLower(), Settings); - }*/ - return hash; } @@ -236,7 +190,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent else if (version < 6) { // API version 6 introduced support for labels - if (Settings.TvCategory.IsNotNullOrWhiteSpace()) + if (Settings.MovieCategory.IsNotNullOrWhiteSpace()) { return new NzbDroneValidationFailure("Category", "Category is not supported") { @@ -244,7 +198,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent }; } } - else if (Settings.TvCategory.IsNullOrWhiteSpace()) + else if (Settings.MovieCategory.IsNullOrWhiteSpace()) { // warn if labels are supported, but category is not provided return new NzbDroneValidationFailure("TvCategory", "Category is recommended") diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentProxy.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentProxy.cs index e00c57585..be4ca16c5 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentProxy.cs @@ -58,8 +58,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent public List GetTorrents(QBittorrentSettings settings) { var request = BuildRequest(settings).Resource("/query/torrents") - .AddQueryParam("label", settings.TvCategory) - .AddQueryParam("category", settings.TvCategory); + .AddQueryParam("label", settings.MovieCategory) + .AddQueryParam("category", settings.MovieCategory); var response = ProcessRequest>(request, settings); diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs index d139d244b..c02619f2f 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs @@ -22,7 +22,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent { Host = "localhost"; Port = 9091; - TvCategory = "movie-radarr"; + MovieCategory = "movie-radarr"; } [FieldDefinition(0, Label = "Host", Type = FieldType.Textbox)] @@ -38,16 +38,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent public string Password { get; set; } [FieldDefinition(4, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional")] - public string TvCategory { get; set; } + public string MovieCategory { get; set; } - //Todo: update this shit. - [FieldDefinition(5, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(QBittorrentPriority), HelpText = "Priority to use when grabbing episodes that aired within the last 14 days")] - public int RecentTvPriority { get; set; } - - [FieldDefinition(6, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(QBittorrentPriority), HelpText = "Priority to use when grabbing episodes that aired over 14 days ago")] - public int OlderTvPriority { get; set; } - - [FieldDefinition(7, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use a secure connection. See Options -> Web UI -> 'Use HTTPS instead of HTTP' in qBittorrent.")] + [FieldDefinition(5, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Use a secure connection. See Options -> Web UI -> 'Use HTTPS instead of HTTP' in qBittorrent.")] public bool UseSsl { get; set; } public NzbDroneValidationResult Validate() From e76c160afe5b1089574df1f1e00664491241ee68 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Fri, 13 Jan 2017 18:13:39 +0100 Subject: [PATCH 29/71] Downloaded column should now use the correct quality name. Fixes #210. --- src/UI/Cells/DownloadedQualityCell.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/UI/Cells/DownloadedQualityCell.js b/src/UI/Cells/DownloadedQualityCell.js index 0cf40c21c..1a7d9c354 100644 --- a/src/UI/Cells/DownloadedQualityCell.js +++ b/src/UI/Cells/DownloadedQualityCell.js @@ -18,14 +18,8 @@ module.exports = Backgrid.Cell.extend({ this.$el.empty(); if (this.model.get("movieFile")) { var profileId = this.model.get("movieFile").quality.quality.id; - - var profile = _.findWhere(ProfileCollection.models, { id : profileId }); - - if (profile) { - this.$el.html(profile.get('name')); - } else { this.$el.html(this.model.get("movieFile").quality.quality.name); - } + } From ad824d4da530832d6752a4eb31175b1709726476 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 12:16:12 -0500 Subject: [PATCH 30/71] Finally fix for sorting title (hopefully) --- .../116_update_movie_sorttitle_again.cs | 44 +++++++++++++++++++ .../MetadataSource/SkyHook/SkyHookProxy.cs | 1 + src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + src/UI/Movies/Index/MoviesIndexLayout.js | 2 +- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/116_update_movie_sorttitle_again.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/116_update_movie_sorttitle_again.cs b/src/NzbDrone.Core/Datastore/Migration/116_update_movie_sorttitle_again.cs new file mode 100644 index 000000000..45666b1c2 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/116_update_movie_sorttitle_again.cs @@ -0,0 +1,44 @@ +using System.Data; +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(116)] + public class update_movie_sorttitle_again : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.WithConnection(SetSortTitles); + } + + private void SetSortTitles(IDbConnection conn, IDbTransaction tran) + { + using (IDbCommand getSeriesCmd = conn.CreateCommand()) + { + getSeriesCmd.Transaction = tran; + getSeriesCmd.CommandText = @"SELECT Id, Title FROM Movies"; + using (IDataReader seriesReader = getSeriesCmd.ExecuteReader()) + { + while (seriesReader.Read()) + { + var id = seriesReader.GetInt32(0); + var title = seriesReader.GetString(1); + + var sortTitle = Parser.Parser.NormalizeTitle(title).ToLower(); + + using (IDbCommand updateCmd = conn.CreateCommand()) + { + updateCmd.Transaction = tran; + updateCmd.CommandText = "UPDATE Movies SET SortTitle = ? WHERE Id = ?"; + updateCmd.AddParameter(sortTitle); + updateCmd.AddParameter(id); + + updateCmd.ExecuteNonQuery(); + } + } + } + } + } + } +} diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 2d8248638..318dccbd4 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -90,6 +90,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook movie.Title = resource.title; movie.TitleSlug = movie.Title.ToLower().Replace(" ", "-"); movie.CleanTitle = Parser.Parser.CleanSeriesTitle(movie.Title); + movie.SortTitle = Parser.Parser.NormalizeTitle(movie.Title); movie.Overview = resource.overview; movie.Website = resource.homepage; if (resource.release_date.IsNotNullOrWhiteSpace()) diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 9dfb29ec2..a0221be03 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -183,6 +183,7 @@ + diff --git a/src/UI/Movies/Index/MoviesIndexLayout.js b/src/UI/Movies/Index/MoviesIndexLayout.js index a4db4c892..ff71eab7f 100644 --- a/src/UI/Movies/Index/MoviesIndexLayout.js +++ b/src/UI/Movies/Index/MoviesIndexLayout.js @@ -139,7 +139,7 @@ module.exports = Marionette.Layout.extend({ items : [ { title : 'Title', - name : 'title' + name : 'sortTitle' }, { title : 'Quality', From 38c966c07b0b15fc29ff386e3a53fd6af33b0123 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Fri, 13 Jan 2017 18:57:43 +0100 Subject: [PATCH 31/71] Queue Service should now work properly again. Fixes issue with Activity Tab --- src/NzbDrone.Core/Queue/QueueService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Queue/QueueService.cs b/src/NzbDrone.Core/Queue/QueueService.cs index f03d86ccc..f7390ee6b 100644 --- a/src/NzbDrone.Core/Queue/QueueService.cs +++ b/src/NzbDrone.Core/Queue/QueueService.cs @@ -44,14 +44,14 @@ namespace NzbDrone.Core.Queue private IEnumerable MapQueue(TrackedDownload trackedDownload) { - if (trackedDownload.RemoteEpisode.Episodes != null && trackedDownload.RemoteEpisode.Episodes.Any()) + if (trackedDownload.RemoteEpisode != null && trackedDownload.RemoteEpisode.Episodes != null && trackedDownload.RemoteEpisode.Episodes.Any()) { foreach (var episode in trackedDownload.RemoteEpisode.Episodes) { yield return MapEpisode(trackedDownload, episode); } } - else if (trackedDownload.RemoteMovie.Movie != null) + else if (trackedDownload.RemoteMovie != null && trackedDownload.RemoteMovie.Movie != null) { yield return MapMovie(trackedDownload, trackedDownload.RemoteMovie.Movie); } From a0ecb19e32c2b9190b16ef618cd978fff661696e Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Fri, 13 Jan 2017 19:02:59 +0100 Subject: [PATCH 32/71] DownloadMonitoringService should now not care about deleted movies. Fixes #131. --- src/NzbDrone.Core/Download/CompletedDownloadService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 2a68c80d2..38f354a48 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -132,7 +132,7 @@ namespace NzbDrone.Core.Download private void Import(TrackedDownload trackedDownload) { var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; - if (trackedDownload.RemoteMovie.Movie != null) + if (trackedDownload.RemoteMovie != null && trackedDownload.RemoteMovie.Movie != null) { var importResults = _downloadedMovieImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteMovie.Movie, trackedDownload.DownloadItem); @@ -159,7 +159,7 @@ namespace NzbDrone.Core.Download trackedDownload.Warn(statusMessages); } } - else if (trackedDownload.RemoteEpisode.Series != null) + else if (trackedDownload.RemoteEpisode != null && trackedDownload.RemoteEpisode.Series != null) { var importResults = _downloadedEpisodesImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); From f7471940c47e52d13b8c411c62e8f3eaaafd8c1e Mon Sep 17 00:00:00 2001 From: William Comartin Date: Fri, 13 Jan 2017 14:57:25 -0500 Subject: [PATCH 33/71] Add Missing Filter (#237) --- src/UI/Movies/Index/MoviesIndexLayout.js | 7 +++++++ src/UI/Movies/MoviesCollection.js | 5 ++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/UI/Movies/Index/MoviesIndexLayout.js b/src/UI/Movies/Index/MoviesIndexLayout.js index ff71eab7f..87a2de772 100644 --- a/src/UI/Movies/Index/MoviesIndexLayout.js +++ b/src/UI/Movies/Index/MoviesIndexLayout.js @@ -175,6 +175,13 @@ module.exports = Marionette.Layout.extend({ tooltip : 'Monitored Only', icon : 'icon-sonarr-monitored', callback : this._setFilter + }, + { + key : 'missing', + title : '', + tooltip : 'Missing Only', + icon : 'icon-sonarr-missing', + callback : this._setFilter } ] }; diff --git a/src/UI/Movies/MoviesCollection.js b/src/UI/Movies/MoviesCollection.js index 594305ba0..193f47ef6 100644 --- a/src/UI/Movies/MoviesCollection.js +++ b/src/UI/Movies/MoviesCollection.js @@ -65,9 +65,8 @@ var Collection = PageableCollection.extend({ true ], 'missing' : [ - null, - null, - function(model) { return model.get('episodeCount') !== model.get('episodeFileCount'); } + 'downloaded', + false ] }, From d0c93759c624e800636e5107bb1d0b4a54658795 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 15:49:57 -0500 Subject: [PATCH 34/71] Fix Movie Title Slugs #233 --- .../Migration/117_fix_movie_slugs.cs | 72 +++++++++++++++++++ .../SkyHook/Resource/TMDBResources.cs | 1 + .../MetadataSource/SkyHook/SkyHookProxy.cs | 72 +++++++++++++------ src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + 4 files changed, 126 insertions(+), 20 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/117_fix_movie_slugs.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/117_fix_movie_slugs.cs b/src/NzbDrone.Core/Datastore/Migration/117_fix_movie_slugs.cs new file mode 100644 index 000000000..1f3591b23 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/117_fix_movie_slugs.cs @@ -0,0 +1,72 @@ +using System.Data; +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; +using System.Text; +using System.Text.RegularExpressions; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(117)] + public class fix_movie_slugs : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.WithConnection(SetTitleSlug); + } + + private void SetTitleSlug(IDbConnection conn, IDbTransaction tran) + { + using (IDbCommand getSeriesCmd = conn.CreateCommand()) + { + getSeriesCmd.Transaction = tran; + getSeriesCmd.CommandText = @"SELECT Id, Title, Year FROM Movies"; + using (IDataReader seriesReader = getSeriesCmd.ExecuteReader()) + { + while (seriesReader.Read()) + { + var id = seriesReader.GetInt32(0); + var title = seriesReader.GetString(1); + var year = seriesReader.GetString(2); + + var titleSlug = ToUrlSlug(title + "-" + year); + + using (IDbCommand updateCmd = conn.CreateCommand()) + { + updateCmd.Transaction = tran; + updateCmd.CommandText = "UPDATE Movies SET TitleSlug = ? WHERE Id = ?"; + updateCmd.AddParameter(titleSlug); + updateCmd.AddParameter(id); + + updateCmd.ExecuteNonQuery(); + } + } + } + } + } + + public static string ToUrlSlug(string value) + { + + //First to lower case + value = value.ToLowerInvariant(); + + //Remove all accents + var bytes = Encoding.GetEncoding("Cyrillic").GetBytes(value); + value = Encoding.ASCII.GetString(bytes); + + //Replace spaces + value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled); + + //Remove invalid chars + value = Regex.Replace(value, @"[^a-z0-9\s-_]", "", RegexOptions.Compiled); + + //Trim dashes from end + value = value.Trim('-', '_'); + + //Replace double occurences of - or _ + value = Regex.Replace(value, @"([-_]){2,}", "$1", RegexOptions.Compiled); + + return value; + } + } +} diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs index c0987e04f..399aec27d 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs @@ -34,6 +34,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook.Resource public int vote_count { get; set; } public bool video { get; set; } public float vote_average { get; set; } + public string Slug { get; set; } } diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 318dccbd4..f0a114d20 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -13,6 +13,7 @@ using NzbDrone.Core.MetadataSource; using NzbDrone.Core.Tv; using Newtonsoft.Json; using System.Text.RegularExpressions; +using System.Text; namespace NzbDrone.Core.MetadataSource.SkyHook { @@ -29,7 +30,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook public SkyHookProxy(IHttpClient httpClient, ISonarrCloudRequestBuilder requestBuilder, ITmdbConfigService configService, IMovieService movieService, Logger logger) { _httpClient = httpClient; - _requestBuilder = requestBuilder.SkyHookTvdb; + _requestBuilder = requestBuilder.SkyHookTvdb; _movieBuilder = requestBuilder.TMDB; _configService = configService; _movieService = movieService; @@ -88,7 +89,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook movie.TmdbId = TmdbId; movie.ImdbId = resource.imdb_id; movie.Title = resource.title; - movie.TitleSlug = movie.Title.ToLower().Replace(" ", "-"); + movie.TitleSlug = ToUrlSlug(movie.Title); movie.CleanTitle = Parser.Parser.CleanSeriesTitle(movie.Title); movie.SortTitle = Parser.Parser.NormalizeTitle(movie.Title); movie.Overview = resource.overview; @@ -104,20 +105,21 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { _logger.Debug("Movie with this title slug already exists. Adding year..."); } + //movie.TitleSlug += "-" + movie.Year.ToString(); movie.TitleSlug += "-" + movie.Year.ToString(); movie.Images.Add(_configService.GetCoverForURL(resource.poster_path, MediaCoverTypes.Poster));//TODO: Update to load image specs from tmdb page! movie.Images.Add(_configService.GetCoverForURL(resource.backdrop_path, MediaCoverTypes.Banner)); movie.Runtime = resource.runtime; - foreach(Title title in resource.alternative_titles.titles) + foreach (Title title in resource.alternative_titles.titles) { movie.AlternativeTitles.Add(title.title); } - foreach(ReleaseDates releaseDates in resource.release_dates.results) + foreach (ReleaseDates releaseDates in resource.release_dates.results) { - foreach(ReleaseDate releaseDate in releaseDates.release_dates) + foreach (ReleaseDate releaseDate in releaseDates.release_dates) { if (releaseDate.type == 5 || releaseDate.type == 4) { @@ -140,7 +142,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook movie.Ratings.Votes = resource.vote_count; movie.Ratings.Value = (decimal)resource.vote_average; - foreach(Genre genre in resource.genres) + foreach (Genre genre in resource.genres) { movie.Genres.Add(genre.name); } @@ -176,10 +178,11 @@ namespace NzbDrone.Core.MetadataSource.SkyHook private string StripTrailingTheFromTitle(string title) { - if(title.EndsWith(",the")) + if (title.EndsWith(",the")) { title = title.Substring(0, title.Length - 4); - } else if(title.EndsWith(", the")) + } + else if (title.EndsWith(", the")) { title = title.Substring(0, title.Length - 5); } @@ -202,7 +205,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { yearTerm = parserResult.Year.ToString(); } - + if (parserResult.ImdbId.IsNotNullOrWhiteSpace()) { return new List { GetMovieInfo(parserResult.ImdbId) }; @@ -298,14 +301,14 @@ namespace NzbDrone.Core.MetadataSource.SkyHook } } - + var httpRequest = _requestBuilder.Create() .SetSegment("route", "search") .AddQueryParam("term", title.ToLower().Trim()) .Build(); - + var httpResponse = _httpClient.Get>(httpRequest); @@ -330,8 +333,8 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { imdbMovie.SortTitle = Parser.Parser.NormalizeTitle(result.title); imdbMovie.Title = result.title; - string titleSlug = result.title; - imdbMovie.TitleSlug = titleSlug.ToLower().Replace(" ", "-"); + string titleSlug = ToUrlSlug(result.title); + // imdbMovie.TitleSlug = titleSlug.ToLower().Replace(" ", "-"); if (result.release_date.IsNotNullOrWhiteSpace()) { @@ -340,12 +343,16 @@ namespace NzbDrone.Core.MetadataSource.SkyHook - var slugResult = _movieService.FindByTitleSlug(imdbMovie.TitleSlug); - if (slugResult != null) - { - _logger.Debug("Movie with this title slug already exists. Adding year..."); - } - imdbMovie.TitleSlug += "-" + imdbMovie.Year.ToString(); + //var slugResult = _movieService.FindByTitleSlug(titleSlug); + //if (slugResult != null) + //{ + // _logger.Debug("Movie with this title slug already exists. Adding year..."); + //} + //imdbMovie.TitleSlug += "-" + imdbMovie.Year.ToString(); + + titleSlug += "-" + imdbMovie.Year.ToString(); ; + + imdbMovie.TitleSlug = titleSlug; imdbMovie.Images = new List(); imdbMovie.Overview = result.overview; @@ -419,7 +426,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { series.Certification = show.ContentRating.ToUpper(); } - + series.Actors = show.Actors.Select(MapActors).ToList(); series.Seasons = show.Seasons.Select(MapSeason).ToList(); series.Images = show.Images.Select(MapImage).ToList(); @@ -525,5 +532,30 @@ namespace NzbDrone.Core.MetadataSource.SkyHook return MediaCoverTypes.Unknown; } } + + public static string ToUrlSlug(string value) + { + + //First to lower case + value = value.ToLowerInvariant(); + + //Remove all accents + var bytes = Encoding.GetEncoding("Cyrillic").GetBytes(value); + value = Encoding.ASCII.GetString(bytes); + + //Replace spaces + value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled); + + //Remove invalid chars + value = Regex.Replace(value, @"[^a-z0-9\s-_]", "", RegexOptions.Compiled); + + //Trim dashes from end + value = value.Trim('-', '_'); + + //Replace double occurences of - or _ + value = Regex.Replace(value, @"([-_]){2,}", "$1", RegexOptions.Compiled); + + return value; + } } } diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index a0221be03..c8f72f327 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -294,6 +294,7 @@ + From 3180e648b41cb8825ad53e4799d1e4adb7a5f4d0 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 16:12:49 -0500 Subject: [PATCH 35/71] #236 #239 - Fixed user being needed, fixed age on torrentpotato --- .../Indexers/TorrentPotato/TorrentPotatoParser.cs | 1 + .../TorrentPotato/TorrentPotatoRequestGenerator.cs | 7 +++---- .../Indexers/TorrentPotato/TorrentPotatoResponse.cs | 1 + .../Indexers/TorrentPotato/TorrentPotatoSettings.cs | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoParser.cs b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoParser.cs index 2c21e408e..fdaf7bb9d 100644 --- a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoParser.cs +++ b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoParser.cs @@ -40,6 +40,7 @@ namespace NzbDrone.Core.Indexers.TorrentPotato torrentInfo.Seeders = torrent.seeders; torrentInfo.Peers = torrent.leechers + torrent.seeders; torrentInfo.Freeleech = torrent.freeleech; + torrentInfo.PublishDate = torrent.publishdate.ToUniversalTime(); results.Add(torrentInfo); } diff --git a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs index f85969d1e..5222d298b 100644 --- a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs @@ -78,9 +78,8 @@ namespace NzbDrone.Core.Indexers.TorrentPotato .Accept(HttpAccept.Json); requestBuilder.AddQueryParam("passkey", Settings.Passkey); - requestBuilder.AddQueryParam("user", Settings.User); - // requestBuilder.AddQueryParam("imdbid", "tt0076759"); //For now just search for Star Wars. - requestBuilder.AddQueryParam("search", "the"); // there has to be movies with 'the' in the title on any indexer + requestBuilder.AddQueryParam("user", !string.IsNullOrWhiteSpace(Settings.User) ? Settings.User : ""); + requestBuilder.AddQueryParam("search", "the"); yield return new IndexerRequest(requestBuilder.Build()); } @@ -91,7 +90,7 @@ namespace NzbDrone.Core.Indexers.TorrentPotato .Accept(HttpAccept.Json); requestBuilder.AddQueryParam("passkey", Settings.Passkey); - requestBuilder.AddQueryParam("user", Settings.User); + requestBuilder.AddQueryParam("user", !string.IsNullOrWhiteSpace(Settings.User) ? Settings.User : ""); if (searchCriteria.Movie.ImdbId.IsNotNullOrWhiteSpace()) { diff --git a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoResponse.cs b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoResponse.cs index 9b8300405..b0551ca67 100644 --- a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoResponse.cs +++ b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoResponse.cs @@ -21,6 +21,7 @@ namespace NzbDrone.Core.Indexers.TorrentPotato public int size { get; set; } public int leechers { get; set; } public int seeders { get; set; } + public DateTime publishdate { get; set; } } } diff --git a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoSettings.cs b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoSettings.cs index d0b902f5e..14c91e2d0 100644 --- a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoSettings.cs +++ b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoSettings.cs @@ -19,7 +19,7 @@ namespace NzbDrone.Core.Indexers.TorrentPotato public TorrentPotatoSettings() { - BaseUrl = ""; + BaseUrl = "http://127.0.0.1"; } [FieldDefinition(0, Label = "API URL", HelpText = "URL to TorrentPotato api.")] From d3bd0c9b692bf444ff796df2b733f466cea63b40 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 16:16:31 -0500 Subject: [PATCH 36/71] This conditional makes more sense. --- .../TorrentPotato/TorrentPotatoRequestGenerator.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs index 5222d298b..b9856250b 100644 --- a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs @@ -78,7 +78,10 @@ namespace NzbDrone.Core.Indexers.TorrentPotato .Accept(HttpAccept.Json); requestBuilder.AddQueryParam("passkey", Settings.Passkey); - requestBuilder.AddQueryParam("user", !string.IsNullOrWhiteSpace(Settings.User) ? Settings.User : ""); + if (!string.IsNullOrWhiteSpace(Settings.User)) + { + requestBuilder.AddQueryParam("user", Settings.User); + } requestBuilder.AddQueryParam("search", "the"); yield return new IndexerRequest(requestBuilder.Build()); @@ -90,7 +93,11 @@ namespace NzbDrone.Core.Indexers.TorrentPotato .Accept(HttpAccept.Json); requestBuilder.AddQueryParam("passkey", Settings.Passkey); - requestBuilder.AddQueryParam("user", !string.IsNullOrWhiteSpace(Settings.User) ? Settings.User : ""); + + if (!string.IsNullOrWhiteSpace(Settings.User)) + { + requestBuilder.AddQueryParam("user", Settings.User); + } if (searchCriteria.Movie.ImdbId.IsNotNullOrWhiteSpace()) { From 4260b585353b2ddce6768808eefeac4458675eab Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 17:34:27 -0500 Subject: [PATCH 37/71] Update Torznab to work with movies --- src/NzbDrone.Core/Indexers/Torznab/Torznab.cs | 3 +- .../Indexers/Torznab/TorznabRssParser.cs | 30 +++---------------- 2 files changed, 5 insertions(+), 28 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs b/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs index 602edc540..b17573758 100644 --- a/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs +++ b/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs @@ -97,8 +97,7 @@ namespace NzbDrone.Core.Indexers.Torznab } if (capabilities.SupportedTvSearchParameters != null && - new[] { "q", "tvdbid", "rid" }.Any(v => capabilities.SupportedTvSearchParameters.Contains(v)) && - new[] { "season", "ep" }.All(v => capabilities.SupportedTvSearchParameters.Contains(v))) + new[] { "q", "imdbid" }.Any(v => capabilities.SupportedTvSearchParameters.Contains(v))) { return null; } diff --git a/src/NzbDrone.Core/Indexers/Torznab/TorznabRssParser.cs b/src/NzbDrone.Core/Indexers/Torznab/TorznabRssParser.cs index 253386963..27ad87129 100644 --- a/src/NzbDrone.Core/Indexers/Torznab/TorznabRssParser.cs +++ b/src/NzbDrone.Core/Indexers/Torznab/TorznabRssParser.cs @@ -39,10 +39,7 @@ namespace NzbDrone.Core.Indexers.Torznab protected override ReleaseInfo ProcessItem(XElement item, ReleaseInfo releaseInfo) { var torrentInfo = base.ProcessItem(item, releaseInfo) as TorrentInfo; - - torrentInfo.TvdbId = GetTvdbId(item); - torrentInfo.TvRageId = GetTvRageId(item); - + torrentInfo.ImdbId = int.Parse(GetImdbId(item).Substring(2)); return torrentInfo; } @@ -100,31 +97,12 @@ namespace NzbDrone.Core.Indexers.Torznab return url; } - protected virtual int GetTvdbId(XElement item) + protected virtual string GetImdbId(XElement item) { - var tvdbIdString = TryGetTorznabAttribute(item, "tvdbid"); - int tvdbId; - - if (!tvdbIdString.IsNullOrWhiteSpace() && int.TryParse(tvdbIdString, out tvdbId)) - { - return tvdbId; - } - - return 0; + var imdbIdString = TryGetTorznabAttribute(item, "imdbid"); + return (!imdbIdString.IsNullOrWhiteSpace() ? imdbIdString.Substring(2) : null); } - protected virtual int GetTvRageId(XElement item) - { - var tvRageIdString = TryGetTorznabAttribute(item, "rageid"); - int tvRageId; - - if (!tvRageIdString.IsNullOrWhiteSpace() && int.TryParse(tvRageIdString, out tvRageId)) - { - return tvRageId; - } - - return 0; - } protected override string GetInfoHash(XElement item) { return TryGetTorznabAttribute(item, "infohash"); From e9b6c250f76e8794fa2a2a3a40f520fb79e49347 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 17:56:34 -0500 Subject: [PATCH 38/71] Revert TMDBResources --- .../MetadataSource/SkyHook/Resource/TMDBResources.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs index 399aec27d..c0987e04f 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/TMDBResources.cs @@ -34,7 +34,6 @@ namespace NzbDrone.Core.MetadataSource.SkyHook.Resource public int vote_count { get; set; } public bool video { get; set; } public float vote_average { get; set; } - public string Slug { get; set; } } From 5dc63e56075decfc1971c08a17d835ec6b94c119 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 18:20:22 -0500 Subject: [PATCH 39/71] Revert "Fix movie title slugs" --- .../Migration/117_fix_movie_slugs.cs | 72 ------------------- .../MetadataSource/SkyHook/SkyHookProxy.cs | 72 ++++++------------- src/NzbDrone.Core/NzbDrone.Core.csproj | 1 - 3 files changed, 20 insertions(+), 125 deletions(-) delete mode 100644 src/NzbDrone.Core/Datastore/Migration/117_fix_movie_slugs.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/117_fix_movie_slugs.cs b/src/NzbDrone.Core/Datastore/Migration/117_fix_movie_slugs.cs deleted file mode 100644 index 1f3591b23..000000000 --- a/src/NzbDrone.Core/Datastore/Migration/117_fix_movie_slugs.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Data; -using FluentMigrator; -using NzbDrone.Core.Datastore.Migration.Framework; -using System.Text; -using System.Text.RegularExpressions; - -namespace NzbDrone.Core.Datastore.Migration -{ - [Migration(117)] - public class fix_movie_slugs : NzbDroneMigrationBase - { - protected override void MainDbUpgrade() - { - Execute.WithConnection(SetTitleSlug); - } - - private void SetTitleSlug(IDbConnection conn, IDbTransaction tran) - { - using (IDbCommand getSeriesCmd = conn.CreateCommand()) - { - getSeriesCmd.Transaction = tran; - getSeriesCmd.CommandText = @"SELECT Id, Title, Year FROM Movies"; - using (IDataReader seriesReader = getSeriesCmd.ExecuteReader()) - { - while (seriesReader.Read()) - { - var id = seriesReader.GetInt32(0); - var title = seriesReader.GetString(1); - var year = seriesReader.GetString(2); - - var titleSlug = ToUrlSlug(title + "-" + year); - - using (IDbCommand updateCmd = conn.CreateCommand()) - { - updateCmd.Transaction = tran; - updateCmd.CommandText = "UPDATE Movies SET TitleSlug = ? WHERE Id = ?"; - updateCmd.AddParameter(titleSlug); - updateCmd.AddParameter(id); - - updateCmd.ExecuteNonQuery(); - } - } - } - } - } - - public static string ToUrlSlug(string value) - { - - //First to lower case - value = value.ToLowerInvariant(); - - //Remove all accents - var bytes = Encoding.GetEncoding("Cyrillic").GetBytes(value); - value = Encoding.ASCII.GetString(bytes); - - //Replace spaces - value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled); - - //Remove invalid chars - value = Regex.Replace(value, @"[^a-z0-9\s-_]", "", RegexOptions.Compiled); - - //Trim dashes from end - value = value.Trim('-', '_'); - - //Replace double occurences of - or _ - value = Regex.Replace(value, @"([-_]){2,}", "$1", RegexOptions.Compiled); - - return value; - } - } -} diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index f0a114d20..318dccbd4 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -13,7 +13,6 @@ using NzbDrone.Core.MetadataSource; using NzbDrone.Core.Tv; using Newtonsoft.Json; using System.Text.RegularExpressions; -using System.Text; namespace NzbDrone.Core.MetadataSource.SkyHook { @@ -30,7 +29,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook public SkyHookProxy(IHttpClient httpClient, ISonarrCloudRequestBuilder requestBuilder, ITmdbConfigService configService, IMovieService movieService, Logger logger) { _httpClient = httpClient; - _requestBuilder = requestBuilder.SkyHookTvdb; + _requestBuilder = requestBuilder.SkyHookTvdb; _movieBuilder = requestBuilder.TMDB; _configService = configService; _movieService = movieService; @@ -89,7 +88,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook movie.TmdbId = TmdbId; movie.ImdbId = resource.imdb_id; movie.Title = resource.title; - movie.TitleSlug = ToUrlSlug(movie.Title); + movie.TitleSlug = movie.Title.ToLower().Replace(" ", "-"); movie.CleanTitle = Parser.Parser.CleanSeriesTitle(movie.Title); movie.SortTitle = Parser.Parser.NormalizeTitle(movie.Title); movie.Overview = resource.overview; @@ -105,21 +104,20 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { _logger.Debug("Movie with this title slug already exists. Adding year..."); } - //movie.TitleSlug += "-" + movie.Year.ToString(); movie.TitleSlug += "-" + movie.Year.ToString(); movie.Images.Add(_configService.GetCoverForURL(resource.poster_path, MediaCoverTypes.Poster));//TODO: Update to load image specs from tmdb page! movie.Images.Add(_configService.GetCoverForURL(resource.backdrop_path, MediaCoverTypes.Banner)); movie.Runtime = resource.runtime; - foreach (Title title in resource.alternative_titles.titles) + foreach(Title title in resource.alternative_titles.titles) { movie.AlternativeTitles.Add(title.title); } - foreach (ReleaseDates releaseDates in resource.release_dates.results) + foreach(ReleaseDates releaseDates in resource.release_dates.results) { - foreach (ReleaseDate releaseDate in releaseDates.release_dates) + foreach(ReleaseDate releaseDate in releaseDates.release_dates) { if (releaseDate.type == 5 || releaseDate.type == 4) { @@ -142,7 +140,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook movie.Ratings.Votes = resource.vote_count; movie.Ratings.Value = (decimal)resource.vote_average; - foreach (Genre genre in resource.genres) + foreach(Genre genre in resource.genres) { movie.Genres.Add(genre.name); } @@ -178,11 +176,10 @@ namespace NzbDrone.Core.MetadataSource.SkyHook private string StripTrailingTheFromTitle(string title) { - if (title.EndsWith(",the")) + if(title.EndsWith(",the")) { title = title.Substring(0, title.Length - 4); - } - else if (title.EndsWith(", the")) + } else if(title.EndsWith(", the")) { title = title.Substring(0, title.Length - 5); } @@ -205,7 +202,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { yearTerm = parserResult.Year.ToString(); } - + if (parserResult.ImdbId.IsNotNullOrWhiteSpace()) { return new List { GetMovieInfo(parserResult.ImdbId) }; @@ -301,14 +298,14 @@ namespace NzbDrone.Core.MetadataSource.SkyHook } } - + var httpRequest = _requestBuilder.Create() .SetSegment("route", "search") .AddQueryParam("term", title.ToLower().Trim()) .Build(); - + var httpResponse = _httpClient.Get>(httpRequest); @@ -333,8 +330,8 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { imdbMovie.SortTitle = Parser.Parser.NormalizeTitle(result.title); imdbMovie.Title = result.title; - string titleSlug = ToUrlSlug(result.title); - // imdbMovie.TitleSlug = titleSlug.ToLower().Replace(" ", "-"); + string titleSlug = result.title; + imdbMovie.TitleSlug = titleSlug.ToLower().Replace(" ", "-"); if (result.release_date.IsNotNullOrWhiteSpace()) { @@ -343,16 +340,12 @@ namespace NzbDrone.Core.MetadataSource.SkyHook - //var slugResult = _movieService.FindByTitleSlug(titleSlug); - //if (slugResult != null) - //{ - // _logger.Debug("Movie with this title slug already exists. Adding year..."); - //} - //imdbMovie.TitleSlug += "-" + imdbMovie.Year.ToString(); - - titleSlug += "-" + imdbMovie.Year.ToString(); ; - - imdbMovie.TitleSlug = titleSlug; + var slugResult = _movieService.FindByTitleSlug(imdbMovie.TitleSlug); + if (slugResult != null) + { + _logger.Debug("Movie with this title slug already exists. Adding year..."); + } + imdbMovie.TitleSlug += "-" + imdbMovie.Year.ToString(); imdbMovie.Images = new List(); imdbMovie.Overview = result.overview; @@ -426,7 +419,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { series.Certification = show.ContentRating.ToUpper(); } - + series.Actors = show.Actors.Select(MapActors).ToList(); series.Seasons = show.Seasons.Select(MapSeason).ToList(); series.Images = show.Images.Select(MapImage).ToList(); @@ -532,30 +525,5 @@ namespace NzbDrone.Core.MetadataSource.SkyHook return MediaCoverTypes.Unknown; } } - - public static string ToUrlSlug(string value) - { - - //First to lower case - value = value.ToLowerInvariant(); - - //Remove all accents - var bytes = Encoding.GetEncoding("Cyrillic").GetBytes(value); - value = Encoding.ASCII.GetString(bytes); - - //Replace spaces - value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled); - - //Remove invalid chars - value = Regex.Replace(value, @"[^a-z0-9\s-_]", "", RegexOptions.Compiled); - - //Trim dashes from end - value = value.Trim('-', '_'); - - //Replace double occurences of - or _ - value = Regex.Replace(value, @"([-_]){2,}", "$1", RegexOptions.Compiled); - - return value; - } } } diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index c8f72f327..a0221be03 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -294,7 +294,6 @@ - From 29586667cb500dc46fff1a75ec482c022df75140 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 01:03:37 +0100 Subject: [PATCH 40/71] Files tab is now present. (#245) * Adding file info tab. Not finished yet. * Adding more media info options. * Deleting files now works. Fixes #127 * Fix button for modifying episode files. * Get Media Info when running DiskScanService. --- src/NzbDrone.Api/Movies/MovieFileModule.cs | 89 +++++++++++++++ src/NzbDrone.Api/NzbDrone.Api.csproj | 1 + src/NzbDrone.Api/Series/MovieFileResource.cs | 7 +- .../Migration/117_update_movie_file.cs | 45 ++++++++ .../EpisodeImport/ImportApprovedMovie.cs | 1 + .../EpisodeImport/ImportDecisionMaker.cs | 2 +- .../MediaFiles/MediaFileService.cs | 5 + src/NzbDrone.Core/MediaFiles/MovieFile.cs | 1 + src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + src/UI/Cells/FileTitleCell.js | 15 +++ src/UI/Cells/MediaInfoCell.js | 23 ++++ src/UI/Cells/QualityCellTemplate.hbs | 4 +- src/UI/Cells/ReleaseTitleCell.js | 2 +- src/UI/Movies/Details/MoviesDetailsLayout.js | 30 ++++- .../Movies/Details/MoviesDetailsTemplate.hbs | 4 +- src/UI/Movies/Files/DeleteFileCell.js | 26 +++++ src/UI/Movies/Files/FileModel.js | 3 + src/UI/Movies/Files/FilesCollection.js | 30 +++++ src/UI/Movies/Files/FilesLayout.js | 107 ++++++++++++++++++ src/UI/Movies/Files/FilesLayoutTemplate.hbs | 1 + src/UI/Movies/Files/NoFilesView.js | 5 + src/UI/Movies/Files/NoFilesViewTemplate.hbs | 3 + 22 files changed, 392 insertions(+), 13 deletions(-) create mode 100644 src/NzbDrone.Api/Movies/MovieFileModule.cs create mode 100644 src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs create mode 100644 src/UI/Cells/FileTitleCell.js create mode 100644 src/UI/Cells/MediaInfoCell.js create mode 100644 src/UI/Movies/Files/DeleteFileCell.js create mode 100644 src/UI/Movies/Files/FileModel.js create mode 100644 src/UI/Movies/Files/FilesCollection.js create mode 100644 src/UI/Movies/Files/FilesLayout.js create mode 100644 src/UI/Movies/Files/FilesLayoutTemplate.hbs create mode 100644 src/UI/Movies/Files/NoFilesView.js create mode 100644 src/UI/Movies/Files/NoFilesViewTemplate.hbs diff --git a/src/NzbDrone.Api/Movies/MovieFileModule.cs b/src/NzbDrone.Api/Movies/MovieFileModule.cs new file mode 100644 index 000000000..a45fbefad --- /dev/null +++ b/src/NzbDrone.Api/Movies/MovieFileModule.cs @@ -0,0 +1,89 @@ +using System.Collections.Generic; +using System.IO; +using NLog; +using NzbDrone.Api.REST; +using NzbDrone.Api.Movie; +using NzbDrone.Core.Datastore.Events; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.MediaFiles.Events; +using NzbDrone.Core.Messaging.Events; +using NzbDrone.Core.Tv; +using NzbDrone.Core.DecisionEngine; +using NzbDrone.SignalR; + +namespace NzbDrone.Api.EpisodeFiles +{ + public class MovieFileModule : NzbDroneRestModuleWithSignalR + //IHandle + { + private readonly IMediaFileService _mediaFileService; + private readonly IRecycleBinProvider _recycleBinProvider; + private readonly IMovieService _seriesService; + private readonly IQualityUpgradableSpecification _qualityUpgradableSpecification; + private readonly Logger _logger; + + public MovieFileModule(IBroadcastSignalRMessage signalRBroadcaster, + IMediaFileService mediaFileService, + IRecycleBinProvider recycleBinProvider, + IMovieService seriesService, + IQualityUpgradableSpecification qualityUpgradableSpecification, + Logger logger) + : base(signalRBroadcaster) + { + _mediaFileService = mediaFileService; + _recycleBinProvider = recycleBinProvider; + _seriesService = seriesService; + _qualityUpgradableSpecification = qualityUpgradableSpecification; + _logger = logger; + /*GetResourceById = GetEpisodeFile; + GetResourceAll = GetEpisodeFiles; + UpdateResource = SetQuality;*/ + DeleteResource = DeleteEpisodeFile; + } + + /*private EpisodeFileResource GetEpisodeFile(int id) + { + var episodeFile = _mediaFileService.Get(id); + var series = _seriesService.GetSeries(episodeFile.SeriesId); + + return episodeFile.ToResource(series, _qualityUpgradableSpecification); + } + + private List GetEpisodeFiles() + { + if (!Request.Query.SeriesId.HasValue) + { + throw new BadRequestException("seriesId is missing"); + } + + var seriesId = (int)Request.Query.SeriesId; + + var series = _seriesService.GetSeries(seriesId); + + return _mediaFileService.GetFilesBySeries(seriesId).ConvertAll(f => f.ToResource(series, _qualityUpgradableSpecification)); + } + + private void SetQuality(EpisodeFileResource episodeFileResource) + { + var episodeFile = _mediaFileService.Get(episodeFileResource.Id); + episodeFile.Quality = episodeFileResource.Quality; + _mediaFileService.Update(episodeFile); + }*/ + + private void DeleteEpisodeFile(int id) + { + var episodeFile = _mediaFileService.GetMovie(id); + var series = _seriesService.GetMovie(episodeFile.MovieId); + var fullPath = Path.Combine(series.Path, episodeFile.RelativePath); + + _logger.Info("Deleting episode file: {0}", fullPath); + _recycleBinProvider.DeleteFile(fullPath); + _mediaFileService.Delete(episodeFile, DeleteMediaFileReason.Manual); + } + + public void Handle(EpisodeFileAddedEvent message) + { + BroadcastResourceChange(ModelAction.Updated, message.EpisodeFile.Id); + } + } +} \ No newline at end of file diff --git a/src/NzbDrone.Api/NzbDrone.Api.csproj b/src/NzbDrone.Api/NzbDrone.Api.csproj index f92541404..6a61d84fc 100644 --- a/src/NzbDrone.Api/NzbDrone.Api.csproj +++ b/src/NzbDrone.Api/NzbDrone.Api.csproj @@ -116,6 +116,7 @@ + diff --git a/src/NzbDrone.Api/Series/MovieFileResource.cs b/src/NzbDrone.Api/Series/MovieFileResource.cs index 62ad7832f..848d31ab4 100644 --- a/src/NzbDrone.Api/Series/MovieFileResource.cs +++ b/src/NzbDrone.Api/Series/MovieFileResource.cs @@ -30,8 +30,8 @@ namespace NzbDrone.Api.Movie public string ReleaseGroup { get; set; } public QualityModel Quality { get; set; } public MovieResource Movie { get; set; } - - + public string Edition { get; set; } + public Core.MediaFiles.MediaInfo.MediaInfoModel MediaInfo { get; set; } //TODO: Add series statistics as a property of the series (instead of individual properties) } @@ -63,7 +63,8 @@ namespace NzbDrone.Api.Movie ReleaseGroup = model.ReleaseGroup, Quality = model.Quality, Movie = movie, - + MediaInfo = model.MediaInfo, + Edition = model.Edition }; } diff --git a/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs b/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs new file mode 100644 index 000000000..8e45441c1 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs @@ -0,0 +1,45 @@ +using System.Data; +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(117)] + public class update_movie_file : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Create.Column("Edition").OnTable("MovieFiles").AsString().Nullable(); + Execute.WithConnection(SetSortTitles); + } + + private void SetSortTitles(IDbConnection conn, IDbTransaction tran) + { + using (IDbCommand getSeriesCmd = conn.CreateCommand()) + { + getSeriesCmd.Transaction = tran; + getSeriesCmd.CommandText = @"SELECT Id, RelativePath FROM MovieFiles"; + using (IDataReader seriesReader = getSeriesCmd.ExecuteReader()) + { + while (seriesReader.Read()) + { + var id = seriesReader.GetInt32(0); + var relativePath = seriesReader.GetString(1); + + var edition = Parser.Parser.ParseMovieTitle(relativePath).Edition; + + using (IDbCommand updateCmd = conn.CreateCommand()) + { + updateCmd.Transaction = tran; + updateCmd.CommandText = "UPDATE MovieFiles SET Edition = ? WHERE Id = ?"; + updateCmd.AddParameter(edition); + updateCmd.AddParameter(id); + + updateCmd.ExecuteNonQuery(); + } + } + } + } + } + } +} diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedMovie.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedMovie.cs index 128ca64f9..1a2c812d6 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedMovie.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedMovie.cs @@ -83,6 +83,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport episodeFile.MediaInfo = localMovie.MediaInfo; episodeFile.Movie = localMovie.Movie; episodeFile.ReleaseGroup = localMovie.ParsedMovieInfo.ReleaseGroup; + episodeFile.Edition = localMovie.ParsedMovieInfo.Edition; bool copyOnly; switch (importMode) diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs index 9d4abe042..080ef2399 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs @@ -57,7 +57,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport public List GetImportDecisions(List videoFiles, Movie movie) { - return GetImportDecisions(videoFiles, movie, null, false); + return GetImportDecisions(videoFiles, movie, null, true); } public List GetImportDecisions(List videoFiles, Series series, ParsedEpisodeInfo folderInfo, bool sceneSource) diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs index 0587bb793..37e663ee5 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs @@ -26,6 +26,7 @@ namespace NzbDrone.Core.MediaFiles List FilterExistingFiles(List files, Series series); List FilterExistingFiles(List files, Movie movie); EpisodeFile Get(int id); + MovieFile GetMovie(int id); List Get(IEnumerable ids); List GetMovies(IEnumerable ids); @@ -150,5 +151,9 @@ namespace NzbDrone.Core.MediaFiles _movieFileRepository.Update(episodeFile); } + public MovieFile GetMovie(int id) + { + return _movieFileRepository.Get(id); + } } } \ No newline at end of file diff --git a/src/NzbDrone.Core/MediaFiles/MovieFile.cs b/src/NzbDrone.Core/MediaFiles/MovieFile.cs index dfb753ab6..9bb0f1ddd 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieFile.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieFile.cs @@ -19,6 +19,7 @@ namespace NzbDrone.Core.MediaFiles public string ReleaseGroup { get; set; } public QualityModel Quality { get; set; } public MediaInfoModel MediaInfo { get; set; } + public string Edition { get; set; } public LazyLoaded Movie { get; set; } public override string ToString() diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index a0221be03..7e70c9898 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -183,6 +183,7 @@ + diff --git a/src/UI/Cells/FileTitleCell.js b/src/UI/Cells/FileTitleCell.js new file mode 100644 index 000000000..372ee07c4 --- /dev/null +++ b/src/UI/Cells/FileTitleCell.js @@ -0,0 +1,15 @@ +var NzbDroneCell = require('./NzbDroneCell'); + +module.exports = NzbDroneCell.extend({ + className : 'file-title-cell', + + render : function() { + this.$el.empty(); + + var title = this.model.get('relativePath'); + this.$el.html(title); + + + return this; + } +}); diff --git a/src/UI/Cells/MediaInfoCell.js b/src/UI/Cells/MediaInfoCell.js new file mode 100644 index 000000000..ed42380a3 --- /dev/null +++ b/src/UI/Cells/MediaInfoCell.js @@ -0,0 +1,23 @@ +var NzbDroneCell = require('./NzbDroneCell'); + +module.exports = NzbDroneCell.extend({ + className : 'release-title-cell', + + render : function() { + this.$el.empty(); + + var info = this.model.get('mediaInfo'); + if (info) { + var runtime = info.runTime; + if (runtime) { + runtime = runtime.split(".")[0]; + } + var video = "{0} ({1}x{2}) ({3})".format(info.videoCodec, info.width, info.height, runtime); + var audio = "{0} ({1})".format(info.audioFormat, info.audioLanguages); + this.$el.html(video + " " + audio); + } + + + return this; + } +}); diff --git a/src/UI/Cells/QualityCellTemplate.hbs b/src/UI/Cells/QualityCellTemplate.hbs index 6625ade9b..9c76376a9 100644 --- a/src/UI/Cells/QualityCellTemplate.hbs +++ b/src/UI/Cells/QualityCellTemplate.hbs @@ -1,5 +1,5 @@ {{#if_gt proper compare="1"}} {{quality.name}} {{else}} - {{quality.name}} -{{/if_gt}} \ No newline at end of file + {{quality.name}} +{{/if_gt}} diff --git a/src/UI/Cells/ReleaseTitleCell.js b/src/UI/Cells/ReleaseTitleCell.js index 7d3551e41..761c642ff 100644 --- a/src/UI/Cells/ReleaseTitleCell.js +++ b/src/UI/Cells/ReleaseTitleCell.js @@ -17,4 +17,4 @@ module.exports = NzbDroneCell.extend({ return this; } -}); \ No newline at end of file +}); diff --git a/src/UI/Movies/Details/MoviesDetailsLayout.js b/src/UI/Movies/Details/MoviesDetailsLayout.js index da92d260a..1d01f8439 100644 --- a/src/UI/Movies/Details/MoviesDetailsLayout.js +++ b/src/UI/Movies/Details/MoviesDetailsLayout.js @@ -11,6 +11,7 @@ var LoadingView = require('../../Shared/LoadingView'); var EpisodeFileEditorLayout = require('../../EpisodeFile/Editor/EpisodeFileEditorLayout'); var HistoryLayout = require('../History/MovieHistoryLayout'); var SearchLayout = require('../Search/MovieSearchLayout'); +var FilesLayout = require("../Files/FilesLayout"); require('backstrech'); require('../../Mixins/backbone.signalr.mixin'); @@ -22,7 +23,8 @@ module.exports = Marionette.Layout.extend({ seasons : '#seasons', info : '#info', search : '#movie-search', - history : '#movie-history' + history : '#movie-history', + files : "#movie-files" }, @@ -36,11 +38,12 @@ module.exports = Marionette.Layout.extend({ poster : '.x-movie-poster', manualSearch : '.x-manual-search', history : '.x-movie-history', - search : '.x-movie-search' + search : '.x-movie-search', + files : ".x-movie-files" }, events : { - 'click .x-episode-file-editor' : '_openEpisodeFileEditor', + 'click .x-episode-file-editor' : '_showFiles', 'click .x-monitored' : '_toggleMonitored', 'click .x-edit' : '_editMovie', 'click .x-refresh' : '_refreshMovies', @@ -48,7 +51,8 @@ module.exports = Marionette.Layout.extend({ 'click .x-search' : '_moviesSearch', 'click .x-manual-search' : '_showSearch', 'click .x-movie-history' : '_showHistory', - 'click .x-movie-search' : '_showSearch' + 'click .x-movie-search' : '_showSearch', + "click .x-movie-files" : "_showFiles", }, initialize : function() { @@ -72,11 +76,18 @@ module.exports = Marionette.Layout.extend({ this.searchLayout = new SearchLayout({ model : this.model }); this.searchLayout.startManualSearch = true; + this.filesLayout = new FilesLayout({ model : this.model }); + this._showBackdrop(); this._showSeasons(); this._setMonitoredState(); this._showInfo(); - this._showHistory(); + if (this.model.get("movieFile")) { + this._showFiles() + } else { + this._showHistory(); + } + }, onRender : function() { @@ -144,6 +155,15 @@ module.exports = Marionette.Layout.extend({ this.search.show(this.searchLayout); }, + _showFiles : function(e) { + if (e) { + e.preventDefault(); + } + + this.ui.files.tab('show'); + this.files.show(this.filesLayout); + }, + _toggleMonitored : function() { var savePromise = this.model.save('monitored', !this.model.get('monitored'), { wait : true }); diff --git a/src/UI/Movies/Details/MoviesDetailsTemplate.hbs b/src/UI/Movies/Details/MoviesDetailsTemplate.hbs index 8516e5665..8e5bb874e 100644 --- a/src/UI/Movies/Details/MoviesDetailsTemplate.hbs +++ b/src/UI/Movies/Details/MoviesDetailsTemplate.hbs @@ -9,7 +9,7 @@ {{title}}
- +
@@ -42,10 +42,12 @@
diff --git a/src/UI/Movies/Files/DeleteFileCell.js b/src/UI/Movies/Files/DeleteFileCell.js new file mode 100644 index 000000000..45f815f04 --- /dev/null +++ b/src/UI/Movies/Files/DeleteFileCell.js @@ -0,0 +1,26 @@ +var vent = require('vent'); +var Backgrid = require('backgrid'); + +module.exports = Backgrid.Cell.extend({ + className : 'delete-episode-file-cell', + + events : { + 'click' : '_onClick' + }, + + render : function() { + this.$el.empty(); + this.$el.html(''); + + return this; + }, + + _onClick : function() { + var self = this; + if (window.confirm('Are you sure you want to delete \'{0}\' from disk?'.format(this.model.get('relativePath')))) { + this.model.destroy().done(function() { + vent.trigger(vent.Events.MovieFileDeleted, { movieFile : self.model }); + }); + } + } +}); diff --git a/src/UI/Movies/Files/FileModel.js b/src/UI/Movies/Files/FileModel.js new file mode 100644 index 000000000..cb2f217f3 --- /dev/null +++ b/src/UI/Movies/Files/FileModel.js @@ -0,0 +1,3 @@ +var Backbone = require('backbone'); + +module.exports = Backbone.Model.extend({}); diff --git a/src/UI/Movies/Files/FilesCollection.js b/src/UI/Movies/Files/FilesCollection.js new file mode 100644 index 000000000..dc787838e --- /dev/null +++ b/src/UI/Movies/Files/FilesCollection.js @@ -0,0 +1,30 @@ +var PagableCollection = require('backbone.pageable'); +var FileModel = require('./FileModel'); +var AsSortedCollection = require('../../Mixins/AsSortedCollection'); + +var Collection = PagableCollection.extend({ + url : window.NzbDrone.ApiRoot + "/moviefile", + model : FileModel, + + state : { + pageSize : 2000, + sortKey : 'title', + order : -1 + }, + + mode : 'client', + + sortMappings : { + 'quality' : { + sortKey : "qualityWeight" + }, + "edition" : { + sortKey : "edition" + } + }, + +}); + +Collection = AsSortedCollection.call(Collection); + +module.exports = Collection; diff --git a/src/UI/Movies/Files/FilesLayout.js b/src/UI/Movies/Files/FilesLayout.js new file mode 100644 index 000000000..3e6dd2bdd --- /dev/null +++ b/src/UI/Movies/Files/FilesLayout.js @@ -0,0 +1,107 @@ +var vent = require('vent'); +var Marionette = require('marionette'); +var Backgrid = require('backgrid'); +//var ButtonsView = require('./ButtonsView'); +//var ManualSearchLayout = require('./ManualLayout'); +var FilesCollection = require('./FilesCollection'); +var CommandController = require('../../Commands/CommandController'); +var LoadingView = require('../../Shared/LoadingView'); +var NoResultsView = require('./NoFilesView'); +var FileModel = require("./FileModel"); +var FileTitleCell = require('../../Cells/FileTitleCell'); +var FileSizeCell = require('../../Cells/FileSizeCell'); +var QualityCell = require('../../Cells/QualityCell'); +var MediaInfoCell = require('../../Cells/MediaInfoCell'); +var ApprovalStatusCell = require('../../Cells/ApprovalStatusCell'); +var DownloadReportCell = require('../../Release/DownloadReportCell'); +var AgeCell = require('../../Release/AgeCell'); +var ProtocolCell = require('../../Release/ProtocolCell'); +var PeersCell = require('../../Release/PeersCell'); +var EditionCell = require('../../Cells/EditionCell'); +var DeleteFileCell = require("./DeleteFileCell"); + +module.exports = Marionette.Layout.extend({ + template : 'Movies/Files/FilesLayoutTemplate', + + regions : { + main : '#movie-files-region', + grid : "#movie-files-grid" + }, + + events : { + 'click .x-search-auto' : '_searchAuto', + 'click .x-search-manual' : '_searchManual', + 'click .x-search-back' : '_showButtons' + }, + + columns : [ + { + name : 'title', + label : 'Title', + cell : FileTitleCell + }, + { + name : "mediaInfo", + label : "Media Info", + cell : MediaInfoCell + }, + { + name : 'edition', + label : 'Edition', + cell : EditionCell, + title : "Edition", + }, + { + name : 'size', + label : 'Size', + cell : FileSizeCell + }, + { + name : 'quality', + label : 'Quality', + cell : QualityCell, + }, + { + name : "delete", + label : "", + cell : DeleteFileCell, + } + ], + + + initialize : function(movie) { + this.filesCollection = new FilesCollection(); + var file = movie.model.get("movieFile"); + this.filesCollection.add(file); + //this.listenTo(this.releaseCollection, 'sync', this._showSearchResults); + }, + + onShow : function() { + this.grid.show(new Backgrid.Grid({ + row : Backgrid.Row, + columns : this.columns, + collection : this.filesCollection, + className : 'table table-hover' + })); + }, + + _showMainView : function() { + this.main.show(this.mainView); + }, + + _showButtons : function() { + this._showMainView(); + }, + + _showSearchResults : function() { + if (this.releaseCollection.length === 0) { + this.mainView = new NoResultsView(); + } + + else { + //this.mainView = new ManualSearchLayout({ collection : this.releaseCollection }); + } + + this._showMainView(); + } +}); diff --git a/src/UI/Movies/Files/FilesLayoutTemplate.hbs b/src/UI/Movies/Files/FilesLayoutTemplate.hbs new file mode 100644 index 000000000..ac6a3ca36 --- /dev/null +++ b/src/UI/Movies/Files/FilesLayoutTemplate.hbs @@ -0,0 +1 @@ +
diff --git a/src/UI/Movies/Files/NoFilesView.js b/src/UI/Movies/Files/NoFilesView.js new file mode 100644 index 000000000..22a2f7c4c --- /dev/null +++ b/src/UI/Movies/Files/NoFilesView.js @@ -0,0 +1,5 @@ +var Marionette = require('marionette'); + +module.exports = Marionette.ItemView.extend({ + template : 'Movies/Files/NoFilesViewTemplate' +}); diff --git a/src/UI/Movies/Files/NoFilesViewTemplate.hbs b/src/UI/Movies/Files/NoFilesViewTemplate.hbs new file mode 100644 index 000000000..300e4f666 --- /dev/null +++ b/src/UI/Movies/Files/NoFilesViewTemplate.hbs @@ -0,0 +1,3 @@ +

+ No files for this movie. +

From dd5049b4838beddf74e8677d19715f23886c51a4 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 13 Jan 2017 21:55:07 -0500 Subject: [PATCH 41/71] Add rss sync to awesome-hd --- src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs | 2 +- .../Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs index 2ecb61b84..afe7892a0 100644 --- a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs +++ b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHD.cs @@ -9,7 +9,7 @@ namespace NzbDrone.Core.Indexers.AwesomeHD { public override string Name => "AwesomeHD"; public override DownloadProtocol Protocol => DownloadProtocol.Torrent; - public override bool SupportsRss => false; + public override bool SupportsRss => true; public override bool SupportsSearch => true; public override int PageSize => 50; diff --git a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs index 7e42f9ad6..00289d7e4 100644 --- a/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/AwesomeHD/AwesomeHDRequestGenerator.cs @@ -15,7 +15,7 @@ namespace NzbDrone.Core.Indexers.AwesomeHD { var pageableRequests = new IndexerPageableRequestChain(); - pageableRequests.Add(GetRequest("tt2488496")); + pageableRequests.Add(GetRequest(null)); return pageableRequests; } @@ -54,8 +54,15 @@ namespace NzbDrone.Core.Indexers.AwesomeHD private IEnumerable GetRequest(string searchParameters) { - var request = 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 request; + 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); + } + else + { + yield return new IndexerRequest(string.Format("{0}/searchapi.php?action=latestmovies&passkey={1}", Settings.BaseUrl.Trim().TrimEnd('/'), Settings.Passkey.Trim()), HttpAccept.Rss); + } + } } } From 4447b7cd62883663bec2f6a4e70c3bb9f2587f24 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 12 Jan 2017 00:38:56 -0800 Subject: [PATCH 42/71] Fixed: Parsing of SABnzbd develop version --- .../Download/Clients/Sabnzbd/Sabnzbd.cs | 111 ++++++++---------- 1 file changed, 52 insertions(+), 59 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs index f542ae1a9..52fef65b0 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs @@ -30,13 +30,13 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd } // patch can be a number (releases) or 'x' (git) - private static readonly Regex VersionRegex = new Regex(@"(?\d+)\.(?\d+)\.(?\d+|x)(?.*)", RegexOptions.Compiled); + private static readonly Regex VersionRegex = new Regex(@"(?\d+)\.(?\d+)\.(?\d+|x)", RegexOptions.Compiled); protected override string AddFromNzbFile(RemoteEpisode remoteEpisode, string filename, byte[] fileContents) { var category = Settings.TvCategory; var priority = remoteEpisode.IsRecentEpisode() ? Settings.RecentTvPriority : Settings.OlderTvPriority; - + var response = _proxy.DownloadNzb(fileContents, filename, category, priority, Settings); if (response != null && response.Ids.Any()) @@ -284,110 +284,103 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd failures.AddIfNotNull(TestCategory()); } - private bool HasVersion(int major, int minor, int patch = 0, string candidate = null) + private bool HasVersion(int major, int minor, int patch = 0) { - candidate = candidate ?? string.Empty; - - var version = _proxy.GetVersion(Settings); - var parsed = VersionRegex.Match(version); + var rawVersion = _proxy.GetVersion(Settings); + var version = ParseVersion(rawVersion); - int actualMajor; - int actualMinor; - int actualPatch; - string actualCandidate; - - if (!parsed.Success) + if (version == null) { - if (!version.Equals("develop", StringComparison.InvariantCultureIgnoreCase)) - { - return false; - } - - actualMajor = 1; - actualMinor = 1; - actualPatch = 0; - actualCandidate = null; - } - - else - { - actualMajor = Convert.ToInt32(parsed.Groups["major"].Value); - actualMinor = Convert.ToInt32(parsed.Groups["minor"].Value); - actualPatch = Convert.ToInt32(parsed.Groups["patch"].Value.Replace("x", "")); - actualCandidate = parsed.Groups["candidate"].Value.ToUpper(); + return false; } - if (actualMajor > major) + if (version.Major > major) { return true; } - else if (actualMajor < major) + else if (version.Major < major) { return false; } - if (actualMinor > minor) + if (version.Minor > minor) { return true; } - else if (actualMinor < minor) + else if (version.Minor < minor) { return false; } - if (actualPatch > patch) + if (version.Build > patch) { return true; } - else if (actualPatch < patch) + else if (version.Build < patch) { return false; } - if (actualCandidate.IsNullOrWhiteSpace()) - { - return true; - } - else if (candidate.IsNullOrWhiteSpace()) + return true; + } + + private Version ParseVersion(string version) + { + var parsed = VersionRegex.Match(version); + + int major; + int minor; + int patch; + + if (parsed.Success) { - return false; + major = Convert.ToInt32(parsed.Groups["major"].Value); + minor = Convert.ToInt32(parsed.Groups["minor"].Value); + patch = Convert.ToInt32(parsed.Groups["patch"].Value.Replace("x", "0")); } + else { - return actualCandidate.CompareTo(candidate) > 0; + if (!version.Equals("develop", StringComparison.InvariantCultureIgnoreCase)) + { + return null; + } + + major = 1; + minor = 1; + patch = 0; } + + return new Version(major, minor, patch); } private ValidationFailure TestConnectionAndVersion() { try { - var version = _proxy.GetVersion(Settings); - var parsed = VersionRegex.Match(version); + var rawVersion = _proxy.GetVersion(Settings); + var version = ParseVersion(rawVersion); - if (!parsed.Success) + if (version == null) { - if (version.Equals("develop", StringComparison.InvariantCultureIgnoreCase)) - { - return new NzbDroneValidationFailure("Version", "Sabnzbd develop version, assuming version 1.1.0 or higher.") - { - IsWarning = true, - DetailedDescription = "Radarr may not be able to support new features added to SABnzbd when running develop versions." - }; - } - return new ValidationFailure("Version", "Unknown Version: " + version); } - var major = Convert.ToInt32(parsed.Groups["major"].Value); - var minor = Convert.ToInt32(parsed.Groups["minor"].Value); + if (rawVersion.Equals("develop", StringComparison.InvariantCultureIgnoreCase)) + { + return new NzbDroneValidationFailure("Version", "Sabnzbd develop version, assuming version 1.1.0 or higher.") + { + IsWarning = true, + DetailedDescription = "Radarr may not be able to support new features added to SABnzbd when running develop versions." + }; + } - if (major >= 1) + if (version.Major >= 1) { return null; } - if (minor >= 7) + if (version.Minor >= 7) { return null; } From bd0ec5dfceef0d1dd20fa517cd4da83b2df8fd8a Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 10:13:31 +0100 Subject: [PATCH 43/71] Fix epic fail on migration 117 --- .../Datastore/Migration/117_update_movie_file.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs b/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs index 8e45441c1..903053418 100644 --- a/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs +++ b/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs @@ -25,8 +25,15 @@ namespace NzbDrone.Core.Datastore.Migration { var id = seriesReader.GetInt32(0); var relativePath = seriesReader.GetString(1); - - var edition = Parser.Parser.ParseMovieTitle(relativePath).Edition; + + var result = Parser.Parser.ParseMovieTitle(relativePath); + + var edition = ""; + + if (result != null) + { + edition = Parser.Parser.ParseMovieTitle(relativePath).Edition; + } using (IDbCommand updateCmd = conn.CreateCommand()) { From 8c3260c545ee014aa0c97c9016b2a2f404f1093b Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 11:41:39 +0100 Subject: [PATCH 44/71] Remove file count, unecessary after the file info tab was added Fixes #215. --- src/UI/Movies/Details/InfoViewTemplate.hbs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/UI/Movies/Details/InfoViewTemplate.hbs b/src/UI/Movies/Details/InfoViewTemplate.hbs index 35652f838..c62818297 100644 --- a/src/UI/Movies/Details/InfoViewTemplate.hbs +++ b/src/UI/Movies/Details/InfoViewTemplate.hbs @@ -15,12 +15,6 @@ {{Bytes sizeOnDisk}} - {{#if_eq fileCount compare="1"}} - 1 file - {{else}} - {{fileCount}} files - {{/if_eq}} - {{#if_eq status compare="released"}} {{inCinemas}} {{else}} From 41dda3af483db5b82dc1b2afd9942874fd386da8 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 11:50:18 +0100 Subject: [PATCH 45/71] Update uTorrent to be able to use it as download client. --- .../Download/Clients/uTorrent/UTorrent.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs index da942b7f1..171910744 100644 --- a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrent.cs @@ -68,6 +68,38 @@ namespace NzbDrone.Core.Download.Clients.UTorrent return hash; } + protected override string AddFromMagnetLink(RemoteMovie remoteEpisode, string hash, string magnetLink) + { + _proxy.AddTorrentFromUrl(magnetLink, Settings); + _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); + + /*var isRecentEpisode = remoteEpisode.IsRecentEpisode(); + + if (isRecentEpisode && Settings.RecentTvPriority == (int)UTorrentPriority.First || + !isRecentEpisode && Settings.OlderTvPriority == (int)UTorrentPriority.First) + { + _proxy.MoveTorrentToTopInQueue(hash, Settings); + }*/ + + return hash; + } + + protected override string AddFromTorrentFile(RemoteMovie remoteEpisode, string hash, string filename, byte[] fileContent) + { + _proxy.AddTorrentFromFile(filename, fileContent, Settings); + _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); + + /*var isRecentEpisode = remoteEpisode.IsRecentEpisode(); + + if (isRecentEpisode && Settings.RecentTvPriority == (int)UTorrentPriority.First || + !isRecentEpisode && Settings.OlderTvPriority == (int)UTorrentPriority.First) + { + _proxy.MoveTorrentToTopInQueue(hash, Settings); + }*/ + + return hash; + } + public override string Name => "uTorrent"; public override IEnumerable GetItems() From fe1192848799add9777f5e3ed4b040332db471eb Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 11:56:08 +0100 Subject: [PATCH 46/71] Disable migration 117, takes too long to complete --- src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs b/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs index 903053418..ee1db828d 100644 --- a/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs +++ b/src/NzbDrone.Core/Datastore/Migration/117_update_movie_file.cs @@ -10,7 +10,7 @@ namespace NzbDrone.Core.Datastore.Migration protected override void MainDbUpgrade() { Create.Column("Edition").OnTable("MovieFiles").AsString().Nullable(); - Execute.WithConnection(SetSortTitles); + //Execute.WithConnection(SetSortTitles); } private void SetSortTitles(IDbConnection conn, IDbTransaction tran) From 68a0ef65df9c516f57a2d4da535c3f707419a642 Mon Sep 17 00:00:00 2001 From: Mitchell Cash Date: Sat, 14 Jan 2017 21:15:59 +1000 Subject: [PATCH 47/71] Use DOGnzb name as the default rather than the URL (#250) --- src/NzbDrone.Core/Indexers/Newznab/Newznab.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs index 88984e7c5..de939341b 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs @@ -39,7 +39,7 @@ namespace NzbDrone.Core.Indexers.Newznab { get { - yield return GetDefinition("Dognzb.cr", GetSettings("https://api.dognzb.cr")); + yield return GetDefinition("DOGnzb", GetSettings("https://api.dognzb.cr")); yield return GetDefinition("DrunkenSlug", GetSettings("https://api.drunkenslug.com")); yield return GetDefinition("Nzb-Tortuga", GetSettings("https://www.nzb-tortuga.com")); yield return GetDefinition("Nzb.su", GetSettings("https://api.nzb.su")); From dc7e75187c2f4edcf42063af241cdf10da321782 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 12:47:40 +0100 Subject: [PATCH 48/71] Should fix issue when history fails to capture a download item. --- .../Download/CompletedDownloadService.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 38f354a48..c09c7c054 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -112,12 +112,26 @@ namespace NzbDrone.Core.Download if (historyItem != null) { movie = _movieService.GetMovie(historyItem.MovieId); + if (movie.HasFile) + { + movie.MovieFile.LazyLoad(); + if (movie.MovieFile.Value != null) + { + _logger.Debug("File Title: {0}, download item title: {1}", Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath), Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title)); + if (Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath).Contains(Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title))) + { + trackedDownload.Warn("Seems like the movie already has a file associated with this download item. Maybe the History failed?"); + return; + } + } + } } if (movie == null) { trackedDownload.Warn("Movie title mismatch, automatic import is not possible."); + return; } } //trackedDownload.Warn("Series title mismatch, automatic import is not possible."); From d18b15d50494117bb14fbfa4026877ffb1951f30 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 13:00:10 +0100 Subject: [PATCH 49/71] Should help identify problem with queue trying to reimport stuff. --- src/NzbDrone.Core/Download/CompletedDownloadService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index c09c7c054..c38b0e306 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -112,7 +112,7 @@ namespace NzbDrone.Core.Download if (historyItem != null) { movie = _movieService.GetMovie(historyItem.MovieId); - if (movie.HasFile) + if (movie.MovieFile != null) { movie.MovieFile.LazyLoad(); if (movie.MovieFile.Value != null) From 3a0278d0a1285fc64c524cdf0e9a95e08d13852d Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 13:33:30 +0100 Subject: [PATCH 50/71] Use MediaInfo to correctly identify quality when scanning disk as some file names may not contain the real quality. Fixes #170 --- .../MediaFiles/DiskScanService.cs | 2 +- .../DownloadedMovieImportService.cs | 4 +- .../EpisodeImport/ImportDecisionMaker.cs | 119 +++++++++++++++++- .../Manual/ManualImportService.cs | 2 +- 4 files changed, 118 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index d4d2ec71c..1c37adb82 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -178,7 +178,7 @@ namespace NzbDrone.Core.MediaFiles _mediaFileTableCleanupService.Clean(movie, mediaFileList); var decisionsStopwatch = Stopwatch.StartNew(); - var decisions = _importDecisionMaker.GetImportDecisions(mediaFileList, movie); + var decisions = _importDecisionMaker.GetImportDecisions(mediaFileList, movie, true); decisionsStopwatch.Stop(); _logger.Trace("Import decisions complete for: {0} [{1}]", movie, decisionsStopwatch.Elapsed); diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs index 05617dffe..1843bdf72 100644 --- a/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/DownloadedMovieImportService.cs @@ -183,7 +183,7 @@ namespace NzbDrone.Core.MediaFiles } } - var decisions = _importDecisionMaker.GetImportDecisions(videoFiles.ToList(), movie, folderInfo, true); + var decisions = _importDecisionMaker.GetImportDecisions(videoFiles.ToList(), movie, folderInfo, true, false); var importResults = _importApprovedMovie.Import(decisions, true, downloadClientItem, importMode); if ((downloadClientItem == null || !downloadClientItem.IsReadOnly) && @@ -237,7 +237,7 @@ namespace NzbDrone.Core.MediaFiles } } - var decisions = _importDecisionMaker.GetImportDecisions(new List() { fileInfo.FullName }, movie, null, true); + var decisions = _importDecisionMaker.GetImportDecisions(new List() { fileInfo.FullName }, movie, null, true, false); return _importApprovedMovie.Import(decisions, true, downloadClientItem, importMode); } diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs index 080ef2399..e1f095791 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportDecisionMaker.cs @@ -19,7 +19,8 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport { List GetImportDecisions(List videoFiles, Series series); List GetImportDecisions(List videoFiles, Movie movie); - List GetImportDecisions(List videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource); //TODO: Needs changing to ParsedMovieInfo!! + List GetImportDecisions(List videoFiles, Movie movie, bool shouldCheckQuality); + List GetImportDecisions(List videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldCheckQuality); //TODO: Needs changing to ParsedMovieInfo!! List GetImportDecisions(List videoFiles, Series series, ParsedEpisodeInfo folderInfo, bool sceneSource); } @@ -31,6 +32,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport private readonly IDiskProvider _diskProvider; private readonly IVideoFileInfoReader _videoFileInfoReader; private readonly IDetectSample _detectSample; + private readonly IQualityDefinitionService _qualitiesService; private readonly Logger _logger; public ImportDecisionMaker(IEnumerable specifications, @@ -39,6 +41,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport IDiskProvider diskProvider, IVideoFileInfoReader videoFileInfoReader, IDetectSample detectSample, + IQualityDefinitionService qualitiesService, Logger logger) { _specifications = specifications; @@ -47,6 +50,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport _diskProvider = diskProvider; _videoFileInfoReader = videoFileInfoReader; _detectSample = detectSample; + _qualitiesService = qualitiesService; _logger = logger; } @@ -57,7 +61,12 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport public List GetImportDecisions(List videoFiles, Movie movie) { - return GetImportDecisions(videoFiles, movie, null, true); + return GetImportDecisions(videoFiles, movie, null, true, false); + } + + public List GetImportDecisions(List videoFiles, Movie movie, bool shouldCheckQuality = false) + { + return GetImportDecisions(videoFiles, movie, null, true, shouldCheckQuality); } public List GetImportDecisions(List videoFiles, Series series, ParsedEpisodeInfo folderInfo, bool sceneSource) @@ -77,7 +86,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport return decisions; } - public List GetImportDecisions(List videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource) + public List GetImportDecisions(List videoFiles, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldCheckQuality = false) { var newFiles = _mediaFileService.FilterExistingFiles(videoFiles.ToList(), movie); @@ -88,13 +97,13 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport foreach (var file in newFiles) { - decisions.AddIfNotNull(GetDecision(file, movie, folderInfo, sceneSource, shouldUseFolderName)); + decisions.AddIfNotNull(GetDecision(file, movie, folderInfo, sceneSource, shouldUseFolderName, shouldCheckQuality)); } return decisions; } - private ImportDecision GetDecision(string file, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldUseFolderName) + private ImportDecision GetDecision(string file, Movie movie, ParsedMovieInfo folderInfo, bool sceneSource, bool shouldUseFolderName, bool shouldCheckQuality = false) { ImportDecision decision = null; @@ -113,6 +122,106 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport if (sceneSource) { localMovie.MediaInfo = _videoFileInfoReader.GetMediaInfo(file); + if (shouldCheckQuality) + { + var width = localMovie.MediaInfo.Width; + var current = localMovie.Quality; + var qualityName = current.Quality.Name.ToLower(); + QualityModel updated = null; + if (width > 1400) + { + if (qualityName.Contains("bluray")) + { + updated = new QualityModel(Quality.Bluray1080p); + } + + else if (qualityName.Contains("webdl")) + { + updated = new QualityModel(Quality.WEBDL1080p); + } + + else if (qualityName.Contains("hdtv")) + { + updated = new QualityModel(Quality.HDTV1080p); + } + + else + { + + var def = _qualitiesService.Get(Quality.HDTV1080p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.HDTV1080p); + } + def = _qualitiesService.Get(Quality.WEBDL1080p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.WEBDL1080p); + } + def = _qualitiesService.Get(Quality.Bluray1080p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.Bluray1080p); + } + if (updated == null) + { + updated = new QualityModel(Quality.Bluray1080p); + } + } + + } + else + if (width > 900) + { + if (qualityName.Contains("bluray")) + { + updated = new QualityModel(Quality.Bluray720p); + } + + else if (qualityName.Contains("webdl")) + { + updated = new QualityModel(Quality.WEBDL720p); + } + + else if (qualityName.Contains("hdtv")) + { + updated = new QualityModel(Quality.HDTV720p); + } + + else + { + + var def = _qualitiesService.Get(Quality.HDTV720p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.HDTV720p); + } + def = _qualitiesService.Get(Quality.WEBDL720p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.WEBDL720p); + } + def = _qualitiesService.Get(Quality.Bluray720p); + if (localMovie.Size > def.MinSize && def.MaxSize > localMovie.Size) + { + updated = new QualityModel(Quality.Bluray720p); + } + if (updated == null) + { + updated = new QualityModel(Quality.Bluray720p); + } + + } + } + if (updated != null && updated != current) + { + updated.QualitySource = QualitySource.MediaInfo; + localMovie.Quality = updated; + } + } + + + decision = GetDecision(localMovie); } else diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs index e8f228327..d113d53b0 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/Manual/ManualImportService.cs @@ -161,7 +161,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual } var importDecisions = _importDecisionMaker.GetImportDecisions(new List { file }, - movie, null, SceneSource(movie, folder)); + movie, null, SceneSource(movie, folder), true); return importDecisions.Any() ? MapItem(importDecisions.First(), folder, downloadId) : null; } From f481fe9ea9600973f86896b957812788ad561725 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 13:36:14 +0100 Subject: [PATCH 51/71] Added more checks when tracking downloads. It should work now, even if history was not present. --- .../Download/CompletedDownloadService.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index c38b0e306..16893cce8 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -126,6 +126,28 @@ namespace NzbDrone.Core.Download } } } + else + { + var parserResult = Parser.Parser.ParseMovieTitle(trackedDownload.DownloadItem.Title); + if (parserResult != null) + { + movie = _movieService.FindByTitle(parserResult.MovieTitle); + if (movie.MovieFile != null) + { + movie.MovieFile.LazyLoad(); + if (movie.MovieFile.Value != null) + { + _logger.Debug("File Title: {0}, download item title: {1}", Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath), Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title)); + if (Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath).Contains(Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title))) + { + trackedDownload.Warn("Seems like the movie already has a file associated with this download item. Maybe the History failed?"); + return; + } + } + } + } + + } if (movie == null) From ca03f21b03da8be1ca745dc9dd158d334eb6dc17 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 13:56:42 +0100 Subject: [PATCH 52/71] If this does not fix stuff with no history, I have no clue anymore. --- .../Download/CompletedDownloadService.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 16893cce8..3b00979dd 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -156,6 +156,22 @@ namespace NzbDrone.Core.Download return; } } + else + { + if (movie.MovieFile != null) + { + movie.MovieFile.LazyLoad(); + if (movie.MovieFile.Value != null) + { + _logger.Debug("File Title: {0}, download item title: {1}", Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath), Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title)); + if (Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath).Contains(Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title))) + { + trackedDownload.Warn("Seems like the movie already has a file associated with this download item. Maybe the History failed?"); + return; + } + } + } + } //trackedDownload.Warn("Series title mismatch, automatic import is not possible."); //return; } From 4b559cf29cbdeebc67522c100f75dc4ff49de035 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 14:23:48 +0100 Subject: [PATCH 53/71] Fix history items getting deleted because they do not have a series id. --- .../Housekeepers/CleanupOrphanedHistoryItems.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedHistoryItems.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedHistoryItems.cs index ca03130e6..e8ee88d68 100644 --- a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedHistoryItems.cs +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedHistoryItems.cs @@ -13,8 +13,9 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers public void Clean() { - CleanupOrphanedBySeries(); - CleanupOrphanedByEpisode(); + //CleanupOrphanedBySeries(); + //CleanupOrphanedByEpisode(); + CleanupOrphanedByMovie(); } private void CleanupOrphanedBySeries() @@ -29,6 +30,18 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers WHERE Series.Id IS NULL)"); } + private void CleanupOrphanedByMovie() + { + var mapper = _database.GetDataMapper(); + + mapper.ExecuteNonQuery(@"DELETE FROM History + WHERE Id IN ( + SELECT History.Id FROM History + LEFT OUTER JOIN Movies + ON History.MovieId = Movies.Id + WHERE Movies.Id IS NULL)"); + } + private void CleanupOrphanedByEpisode() { var mapper = _database.GetDataMapper(); From 16c1a2ee50cb3f6346f361b84e5943d8a2f47336 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Sat, 14 Jan 2017 12:27:16 -0500 Subject: [PATCH 54/71] Torpotato username regression --- .../TorrentPotato/TorrentPotatoRequestGenerator.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs index b9856250b..808a40b89 100644 --- a/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/TorrentPotato/TorrentPotatoRequestGenerator.cs @@ -82,6 +82,11 @@ namespace NzbDrone.Core.Indexers.TorrentPotato { requestBuilder.AddQueryParam("user", Settings.User); } + else + { + requestBuilder.AddQueryParam("user", ""); + } + requestBuilder.AddQueryParam("search", "the"); yield return new IndexerRequest(requestBuilder.Build()); @@ -98,6 +103,10 @@ namespace NzbDrone.Core.Indexers.TorrentPotato { requestBuilder.AddQueryParam("user", Settings.User); } + else + { + requestBuilder.AddQueryParam("user", ""); + } if (searchCriteria.Movie.ImdbId.IsNotNullOrWhiteSpace()) { From 4bb58574442798ecd5f8864f459c0a58ea96e18e Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Sat, 14 Jan 2017 13:14:42 -0500 Subject: [PATCH 55/71] Fixed TitleSlug For Realz! --- .../Migration/118_update_movie_slug.cs | 71 +++++++++++++++++++ .../MetadataSource/SkyHook/SkyHookProxy.cs | 47 ++++++++---- src/NzbDrone.Core/NzbDrone.Core.csproj | 1 + 3 files changed, 104 insertions(+), 15 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/118_update_movie_slug.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/118_update_movie_slug.cs b/src/NzbDrone.Core/Datastore/Migration/118_update_movie_slug.cs new file mode 100644 index 000000000..f7026ae5d --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/118_update_movie_slug.cs @@ -0,0 +1,71 @@ +using System.Data; +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; +using System.Text; +using System.Text.RegularExpressions; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(118)] + public class update_movie_slug : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Execute.WithConnection(SetTitleSlug); + } + + private void SetTitleSlug(IDbConnection conn, IDbTransaction tran) + { + using (IDbCommand getSeriesCmd = conn.CreateCommand()) + { + getSeriesCmd.Transaction = tran; + getSeriesCmd.CommandText = @"SELECT Id, Title, Year FROM Movies"; + using (IDataReader seriesReader = getSeriesCmd.ExecuteReader()) + { + while (seriesReader.Read()) + { + var id = seriesReader.GetInt32(0); + var title = seriesReader.GetString(1); + var year = seriesReader.GetInt32(2); + + var titleSlug = ToUrlSlug(title + "-" + year); + + using (IDbCommand updateCmd = conn.CreateCommand()) + { + updateCmd.Transaction = tran; + updateCmd.CommandText = "UPDATE Movies SET TitleSlug = ? WHERE Id = ?"; + updateCmd.AddParameter(titleSlug); + updateCmd.AddParameter(id); + + updateCmd.ExecuteNonQuery(); + } + } + } + } + } + + public static string ToUrlSlug(string value) + { + //First to lower case + value = value.ToLowerInvariant(); + + //Remove all accents + var bytes = Encoding.GetEncoding("Cyrillic").GetBytes(value); + value = Encoding.ASCII.GetString(bytes); + + //Replace spaces + value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled); + + //Remove invalid chars + value = Regex.Replace(value, @"[^a-z0-9\s-_]", "", RegexOptions.Compiled); + + //Trim dashes from end + value = value.Trim('-', '_'); + + //Replace double occurences of - or _ + value = Regex.Replace(value, @"([-_]){2,}", "$1", RegexOptions.Compiled); + + return value; + } + } +} \ No newline at end of file diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 318dccbd4..6f1534ed7 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -13,6 +13,7 @@ using NzbDrone.Core.MetadataSource; using NzbDrone.Core.Tv; using Newtonsoft.Json; using System.Text.RegularExpressions; +using System.Text; namespace NzbDrone.Core.MetadataSource.SkyHook { @@ -88,7 +89,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook movie.TmdbId = TmdbId; movie.ImdbId = resource.imdb_id; movie.Title = resource.title; - movie.TitleSlug = movie.Title.ToLower().Replace(" ", "-"); + movie.TitleSlug = ToUrlSlug(movie.Title); movie.CleanTitle = Parser.Parser.CleanSeriesTitle(movie.Title); movie.SortTitle = Parser.Parser.NormalizeTitle(movie.Title); movie.Overview = resource.overview; @@ -99,11 +100,6 @@ namespace NzbDrone.Core.MetadataSource.SkyHook movie.Year = movie.InCinemas.Value.Year; } - var slugResult = _movieService.FindByTitleSlug(movie.TitleSlug); - if (slugResult != null) - { - _logger.Debug("Movie with this title slug already exists. Adding year..."); - } movie.TitleSlug += "-" + movie.Year.ToString(); movie.Images.Add(_configService.GetCoverForURL(resource.poster_path, MediaCoverTypes.Poster));//TODO: Update to load image specs from tmdb page! @@ -330,21 +326,18 @@ namespace NzbDrone.Core.MetadataSource.SkyHook { imdbMovie.SortTitle = Parser.Parser.NormalizeTitle(result.title); imdbMovie.Title = result.title; - string titleSlug = result.title; + string titleSlug = ToUrlSlug(result.title); imdbMovie.TitleSlug = titleSlug.ToLower().Replace(" ", "-"); if (result.release_date.IsNotNullOrWhiteSpace()) { imdbMovie.Year = DateTime.Parse(result.release_date).Year; } - - - - var slugResult = _movieService.FindByTitleSlug(imdbMovie.TitleSlug); - if (slugResult != null) - { - _logger.Debug("Movie with this title slug already exists. Adding year..."); - } + //var slugResult = _movieService.FindByTitleSlug(imdbMovie.TitleSlug); + //if (slugResult != null) + //{ + // _logger.Debug("Movie with this title slug already exists. Adding year..."); + //} imdbMovie.TitleSlug += "-" + imdbMovie.Year.ToString(); imdbMovie.Images = new List(); @@ -525,5 +518,29 @@ namespace NzbDrone.Core.MetadataSource.SkyHook return MediaCoverTypes.Unknown; } } + + public static string ToUrlSlug(string value) + { + //First to lower case + value = value.ToLowerInvariant(); + + //Remove all accents + var bytes = Encoding.GetEncoding("Cyrillic").GetBytes(value); + value = Encoding.ASCII.GetString(bytes); + + //Replace spaces + value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled); + + //Remove invalid chars + value = Regex.Replace(value, @"[^a-z0-9\s-_]", "", RegexOptions.Compiled); + + //Trim dashes from end + value = value.Trim('-', '_'); + + //Replace double occurences of - or _ + value = Regex.Replace(value, @"([-_]){2,}", "$1", RegexOptions.Compiled); + + return value; + } } } diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 7e70c9898..e69a850e7 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -183,6 +183,7 @@ + From 149faf467d6b92a0c4371d471b3b24260b9c408a Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sat, 14 Jan 2017 19:21:48 +0100 Subject: [PATCH 56/71] Fixed exception when Quality meets cutoff. --- .../DecisionEngine/Specifications/QueueSpecification.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs index 9a1e7ca36..08995e4d2 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs @@ -64,7 +64,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications if (!_qualityUpgradableSpecification.CutoffNotMet(subject.Movie.Profile, remoteEpisode.ParsedMovieInfo.Quality, subject.ParsedMovieInfo.Quality)) { - return Decision.Reject("Quality for release in queue already meets cutoff: {0}", remoteEpisode.ParsedEpisodeInfo.Quality); + return Decision.Reject("Quality for release in queue already meets cutoff: {0}", remoteEpisode.ParsedMovieInfo.Quality); } _logger.Debug("Checking if release is higher quality than queued release. Queued quality is: {0}", remoteEpisode.ParsedMovieInfo.Quality); From 6c413d83ebc0904cbeaeb70d23f0465384f85bdd Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Sat, 14 Jan 2017 14:02:45 -0500 Subject: [PATCH 57/71] Simply completed download service --- .../Download/CompletedDownloadService.cs | 147 +++--------------- 1 file changed, 24 insertions(+), 123 deletions(-) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 3b00979dd..bb4eedf4d 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -94,86 +94,18 @@ namespace NzbDrone.Core.Download return; } - var series = _parsingService.GetSeries(trackedDownload.DownloadItem.Title); - - if (series == null) + var movie = _parsingService.GetMovie(trackedDownload.DownloadItem.Title); + if (movie == null) { if (historyItem != null) { - //series = _seriesService.GetSeries(historyItem.SeriesId); + movie = _movieService.GetMovie(historyItem.MovieId); } - if (series == null) + if (movie == null) { - var movie = _parsingService.GetMovie(trackedDownload.DownloadItem.Title); - - if (movie == null) - { - if (historyItem != null) - { - movie = _movieService.GetMovie(historyItem.MovieId); - if (movie.MovieFile != null) - { - movie.MovieFile.LazyLoad(); - if (movie.MovieFile.Value != null) - { - _logger.Debug("File Title: {0}, download item title: {1}", Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath), Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title)); - if (Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath).Contains(Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title))) - { - trackedDownload.Warn("Seems like the movie already has a file associated with this download item. Maybe the History failed?"); - return; - } - } - } - } - else - { - var parserResult = Parser.Parser.ParseMovieTitle(trackedDownload.DownloadItem.Title); - if (parserResult != null) - { - movie = _movieService.FindByTitle(parserResult.MovieTitle); - if (movie.MovieFile != null) - { - movie.MovieFile.LazyLoad(); - if (movie.MovieFile.Value != null) - { - _logger.Debug("File Title: {0}, download item title: {1}", Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath), Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title)); - if (Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath).Contains(Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title))) - { - trackedDownload.Warn("Seems like the movie already has a file associated with this download item. Maybe the History failed?"); - return; - } - } - } - } - - } - - - if (movie == null) - { - trackedDownload.Warn("Movie title mismatch, automatic import is not possible."); - return; - } - } - else - { - if (movie.MovieFile != null) - { - movie.MovieFile.LazyLoad(); - if (movie.MovieFile.Value != null) - { - _logger.Debug("File Title: {0}, download item title: {1}", Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath), Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title)); - if (Parser.Parser.CleanSeriesTitle(movie.MovieFile.Value.RelativePath).Contains(Parser.Parser.CleanSeriesTitle(trackedDownload.DownloadItem.Title))) - { - trackedDownload.Warn("Seems like the movie already has a file associated with this download item. Maybe the History failed?"); - return; - } - } - } - } - //trackedDownload.Warn("Series title mismatch, automatic import is not possible."); - //return; + trackedDownload.Warn("Movie title mismatch, automatic import is not possible."); + return; } } } @@ -184,61 +116,30 @@ namespace NzbDrone.Core.Download private void Import(TrackedDownload trackedDownload) { var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; - if (trackedDownload.RemoteMovie != null && trackedDownload.RemoteMovie.Movie != null) - { - var importResults = _downloadedMovieImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteMovie.Movie, trackedDownload.DownloadItem); - - if (importResults.Empty()) - { - trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); - return; - } + var importResults = _downloadedMovieImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteMovie.Movie, trackedDownload.DownloadItem); - if (importResults.Count(c => c.Result == ImportResultType.Imported) >= 1) - { - trackedDownload.State = TrackedDownloadStage.Imported; - _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); - return; - } - - if (importResults.Any(c => c.Result != ImportResultType.Imported)) - { - var statusMessages = importResults - .Where(v => v.Result != ImportResultType.Imported) - .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) - .ToArray(); - - trackedDownload.Warn(statusMessages); - } - } - else if (trackedDownload.RemoteEpisode != null && trackedDownload.RemoteEpisode.Series != null) + if (importResults.Empty()) { - var importResults = _downloadedEpisodesImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); - - if (importResults.Empty()) - { - trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); - return; - } + trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); + return; + } - if (importResults.Count(c => c.Result == ImportResultType.Imported) >= Math.Max(1, trackedDownload.RemoteEpisode.Episodes.Count)) - { - trackedDownload.State = TrackedDownloadStage.Imported; - _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); - return; - } + if (importResults.Count(c => c.Result == ImportResultType.Imported) >= 1) + { + trackedDownload.State = TrackedDownloadStage.Imported; + _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); + return; + } - if (importResults.Any(c => c.Result != ImportResultType.Imported)) - { - var statusMessages = importResults - .Where(v => v.Result != ImportResultType.Imported) - .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) - .ToArray(); + if (importResults.Any(c => c.Result != ImportResultType.Imported)) + { + var statusMessages = importResults + .Where(v => v.Result != ImportResultType.Imported) + .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) + .ToArray(); - trackedDownload.Warn(statusMessages); - } + trackedDownload.Warn(statusMessages); } - } } } From 170349c9504bdd9bca6cb52914cd5dfff005f5ef Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Sat, 14 Jan 2017 14:07:34 -0500 Subject: [PATCH 58/71] Update CompletedDownloadService.cs --- src/NzbDrone.Core/Download/CompletedDownloadService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index bb4eedf4d..c55b98e84 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -135,7 +135,7 @@ namespace NzbDrone.Core.Download { var statusMessages = importResults .Where(v => v.Result != ImportResultType.Imported) - .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) + .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalMovie.Path), v.Errors)) .ToArray(); trackedDownload.Warn(statusMessages); From 8fb5049899044a5f02988c7f9251935ccc7cb52f Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Sat, 14 Jan 2017 16:43:51 -0500 Subject: [PATCH 59/71] Add in theaters to 1st coumn in movie list --- src/UI/Cells/MovieStatusCell.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/UI/Cells/MovieStatusCell.js b/src/UI/Cells/MovieStatusCell.js index 126afeb98..668e36d4e 100644 --- a/src/UI/Cells/MovieStatusCell.js +++ b/src/UI/Cells/MovieStatusCell.js @@ -32,10 +32,10 @@ module.exports = NzbDroneCell.extend({ this._setStatusWeight(1); } - else if (!monitored) { - this.$el.html(''); - this._setStatusWeight(0); - } + // else if (!monitored) { + // this.$el.html(''); + // this._setStatusWeight(0); + // } return this; }, From b3dfb960b55fa474407f1bd32a78ef22aa20f05f Mon Sep 17 00:00:00 2001 From: Mitchell Cash Date: Sun, 15 Jan 2017 08:23:35 +1000 Subject: [PATCH 60/71] Cleanup README --- readme.md => README.md | 66 ++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 31 deletions(-) rename readme.md => README.md (66%) diff --git a/readme.md b/README.md similarity index 66% rename from readme.md rename to README.md index 86665c6fd..34e021d27 100644 --- a/readme.md +++ b/README.md @@ -8,6 +8,7 @@ This fork of Sonarr aims to turn it into something like Couchpotato. ## Currently working: + * Adding new movies * Manually searching for releases of movies. * Automatically searching for releases. @@ -19,65 +20,68 @@ This fork of Sonarr aims to turn it into something like Couchpotato. * New TorrentPotato Indexer (Works well with [Jackett](https://github.com/Jackett/Jackett)) ## Planned Features: + * Scanning PreDB to know when a new release is available. * Fixing the other Indexers and download clients. * Importing of Sonarr config. ## Download + The latest precompiled binary versions can be found here: https://github.com/galli-leo/Radarr/releases. To connect to the UI, fire up your browser and open localhost:7878 or your-ip:7878. Docker containers from [linuxserver.io](https://linuxserver.io) can be found here. -* [Radarr (x64)](https://hub.docker.com/r/linuxserver/radarr/) -* [Radarr (armhf)](https://hub.docker.com/r/lsioarmhf/radarr/) -* [Radarr (aarch64)](https://hub.docker.com/r/lsioarmhf/radarr-aarch64/) +* [Radarr (x64)](https://hub.docker.com/r/linuxserver/radarr/) +* [Radarr (armhf)](https://hub.docker.com/r/lsioarmhf/radarr/) +* [Radarr (aarch64)](https://hub.docker.com/r/lsioarmhf/radarr-aarch64/) For more up to date versions (but also sometimes broken), daily builds can be found here: * [OSX](https://leonardogalli.ch/radarr/builds/latest.php?os=osx) * [Windows](https://leonardogalli.ch/radarr/builds/latest.php?os=windows) * [Linux](https://leonardogalli.ch/radarr/builds/latest.php?os=mono) -## Major Features Include: ## +## Major Features Include: -* Support for major platforms: Windows, Linux, OSX, Raspberry Pi, etc. -* Can watch for better quality of the movies you have and do an upgrade. +* Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc. +* Can watch for better quality of the movies you have and do an automatic upgrade. *eg. from DVD to Blu-Ray* * Automatic failed download handling will try another release if one fails -* Manual search so you can pick any release or to see why a release was not downloaded automatically. -* Full integration with SABNzbd and NzbGet. -* Full integration with XBMC, Plex (notification, library update, metadata). +* Manual search so you can pick any release or to see why a release was not downloaded automatically +* Full integration with SABnzbd and NZBGet +* Full integration with Kodi, Plex (notification, library update, metadata) * And a beautiful UI -## Configuring Development Environment: ## +## Configuring Development Environment: + +### Requirements -### Requirements ### -- Visual Studio 2015 [Free Community Edition](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) or Mono -- [Git](http://git-scm.com/downloads) -- [NodeJS](http://nodejs.org/download/) +* Visual Studio 2015 [Free Community Edition](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) or Mono +* [Git](https://git-scm.com/downloads) +* [NodeJS](https://nodejs.org/download/) -### Setup ### +### Setup -- Make sure all the required software mentioned above are installed. -- Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories) -- Grab the submodules `git submodule init && git submodule update` -- install the required Node Packages `npm install` -- start gulp to monitor your dev environment for any changes that need post processing using `npm start` command. +* Make sure all the required software mentioned above are installed. +* Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories) +* Grab the submodules `git submodule init && git submodule update` +* Install the required Node Packages `npm install` +* Start gulp to monitor your dev environment for any changes that need post processing using `npm start` command. -*Please note gulp must be running at all times while you are working with Sonarr client source files.* +*Please note gulp must be running at all times while you are working with Radarr client source files.* +### Development -### Development ### -- Open `NzbDrone.sln` in Visual Studio or run the build.sh script, if Mono is installed. -- Make sure `NzbDrone.Console` is set as the startup project +* Open `NzbDrone.sln` in Visual Studio or run the build.sh script, if Mono is installed. +* Make sure `NzbDrone.Console` is set as the startup project +### License -### License ### * [GNU GPL v3](http://www.gnu.org/licenses/gpl.html) -Copyright 2010-2016 +* Copyright 2010-2016 +### Sponsors -### Sponsors ### -- [JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools - - [ReSharper](http://www.jetbrains.com/resharper/) - - [WebStorm](http://www.jetbrains.com/webstorm/) - - [TeamCity](http://www.jetbrains.com/teamcity/) +* [JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools + * [ReSharper](http://www.jetbrains.com/resharper/) + * [WebStorm](http://www.jetbrains.com/webstorm/) + * [TeamCity](http://www.jetbrains.com/teamcity/) From 757ca1d72cc7132cd60768382eca73b6f683af71 Mon Sep 17 00:00:00 2001 From: hotio Date: Sat, 14 Jan 2017 23:48:04 +0100 Subject: [PATCH 61/71] Update README.md Some small additional fixes to README --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 34e021d27..3b9bf1e80 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ | AppVeyor | [![AppVeyor](https://img.shields.io/appveyor/ci/galli-leo/Radarr/master.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/Radarr) | [![AppVeyor](https://img.shields.io/appveyor/ci/galli-leo/Radarr-usby1/develop.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/Radarr-usby1) | | Travis | [![Travis](https://img.shields.io/travis/galli-leo/Radarr/master.svg?maxAge=60&style=flat-square)](https://travis-ci.org/galli-leo/Radarr) | [![Travis](https://img.shields.io/travis/galli-leo/Radarr/develop.svg?maxAge=60&style=flat-square)](https://travis-ci.org/galli-leo/Radarr) | -This fork of Sonarr aims to turn it into something like Couchpotato. +This fork of Sonarr aims to turn it into something like CouchPotato. ## Currently working: @@ -27,11 +27,11 @@ This fork of Sonarr aims to turn it into something like Couchpotato. ## Download -The latest precompiled binary versions can be found here: https://github.com/galli-leo/Radarr/releases. +The latest precompiled binary versions can be found here: https://github.com/Radarr/Radarr/releases. To connect to the UI, fire up your browser and open localhost:7878 or your-ip:7878. -Docker containers from [linuxserver.io](https://linuxserver.io) can be found here. +Docker containers from [linuxserver.io](https://linuxserver.io) can be found here: * [Radarr (x64)](https://hub.docker.com/r/linuxserver/radarr/) * [Radarr (armhf)](https://hub.docker.com/r/lsioarmhf/radarr/) * [Radarr (aarch64)](https://hub.docker.com/r/lsioarmhf/radarr-aarch64/) @@ -41,6 +41,9 @@ For more up to date versions (but also sometimes broken), daily builds can be fo * [Windows](https://leonardogalli.ch/radarr/builds/latest.php?os=windows) * [Linux](https://leonardogalli.ch/radarr/builds/latest.php?os=mono) +Continuous builds can be found on: +* [AppVeyor](https://ci.appveyor.com/project/galli-leo/radarr-usby1/build/artifacts) + ## Major Features Include: * Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc. From 674919dbf5b0e4d18f1fa25758c511c504f70a81 Mon Sep 17 00:00:00 2001 From: hotio Date: Sun, 15 Jan 2017 00:06:18 +0100 Subject: [PATCH 62/71] Update README.md --- README.md | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 3b9bf1e80..d03c2c48d 100644 --- a/README.md +++ b/README.md @@ -27,23 +27,19 @@ This fork of Sonarr aims to turn it into something like CouchPotato. ## Download -The latest precompiled binary versions can be found here: https://github.com/Radarr/Radarr/releases. - -To connect to the UI, fire up your browser and open localhost:7878 or your-ip:7878. - -Docker containers from [linuxserver.io](https://linuxserver.io) can be found here: -* [Radarr (x64)](https://hub.docker.com/r/linuxserver/radarr/) -* [Radarr (armhf)](https://hub.docker.com/r/lsioarmhf/radarr/) -* [Radarr (aarch64)](https://hub.docker.com/r/lsioarmhf/radarr-aarch64/) - -For more up to date versions (but also sometimes broken), daily builds can be found here: -* [OSX](https://leonardogalli.ch/radarr/builds/latest.php?os=osx) -* [Windows](https://leonardogalli.ch/radarr/builds/latest.php?os=windows) -* [Linux](https://leonardogalli.ch/radarr/builds/latest.php?os=mono) +Release builds can be found on: +* [GitHub](https://github.com/Radarr/Radarr/releases) Continuous builds can be found on: * [AppVeyor](https://ci.appveyor.com/project/galli-leo/radarr-usby1/build/artifacts) +Docker containers from [linuxserver.io](http://tools.linuxserver.io/dockers) can be found here: +* [x64](https://store.docker.com/community/images/linuxserver/radarr) +* [armhf](https://store.docker.com/community/images/lsioarmhf/radarr) +* [aarch64](https://store.docker.com/community/images/lsioarmhf/radarr-aarch64) + +To connect to the UI, fire up your browser and open http://localhost:7878 or http://your-ip:7878. + ## Major Features Include: * Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc. From ad147ed425e62def673ef0ac1409079189d9b6de Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sun, 15 Jan 2017 00:49:37 +0100 Subject: [PATCH 63/71] Release Group should now be available for renamer to use. --- src/NzbDrone.Core/Organizer/FileNameBuilder.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index 25399e6de..6e631ae0f 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -163,6 +163,7 @@ namespace NzbDrone.Core.Organizer AddReleaseDateTokens(tokenHandlers, movie.Year); //In case we want to separate the year AddQualityTokens(tokenHandlers, movie, movieFile); AddMediaInfoTokens(tokenHandlers, movieFile); + AddReleaseGroupTokens(tokenHandlers, movie, movieFile); var fileName = ReplaceTokens(pattern, tokenHandlers, namingConfig).Trim(); fileName = FileNameCleanupRegex.Replace(fileName, match => match.Captures[0].Value[0].ToString()); @@ -527,6 +528,13 @@ namespace NzbDrone.Core.Organizer tokenHandlers["{Quality Real}"] = m => qualityReal; } + private void AddReleaseGroupTokens(Dictionary> tokenHandlers, Movie movie, MovieFile movieFile) + { + var releaseGroup = movieFile.ReleaseGroup; + + tokenHandlers["{Release Group}"] = m => releaseGroup; + } + private void AddMediaInfoTokens(Dictionary> tokenHandlers, EpisodeFile episodeFile) { if (episodeFile.MediaInfo == null) return; From 53373e6f4aa0548b93dcc47bd4667fe4122aed3e Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sun, 15 Jan 2017 00:55:15 +0100 Subject: [PATCH 64/71] Add {Original Title} to FileNameBuilder. Fixes #103 --- src/NzbDrone.Core/Organizer/FileNameBuilder.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index 6e631ae0f..18197e161 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -163,7 +163,7 @@ namespace NzbDrone.Core.Organizer AddReleaseDateTokens(tokenHandlers, movie.Year); //In case we want to separate the year AddQualityTokens(tokenHandlers, movie, movieFile); AddMediaInfoTokens(tokenHandlers, movieFile); - AddReleaseGroupTokens(tokenHandlers, movie, movieFile); + AddMovieFileTokens(tokenHandlers, movieFile); var fileName = ReplaceTokens(pattern, tokenHandlers, namingConfig).Trim(); fileName = FileNameCleanupRegex.Replace(fileName, match => match.Captures[0].Value[0].ToString()); @@ -504,6 +504,13 @@ namespace NzbDrone.Core.Organizer tokenHandlers["{Release Group}"] = m => episodeFile.ReleaseGroup ?? m.DefaultValue("Sonarr"); } + private void AddMovieFileTokens(Dictionary> tokenHandlers, MovieFile episodeFile) + { + tokenHandlers["{Original Title}"] = m => GetOriginalTitle(episodeFile); + tokenHandlers["{Original Filename}"] = m => GetOriginalFileName(episodeFile); + tokenHandlers["{Release Group}"] = m => episodeFile.ReleaseGroup ?? m.DefaultValue("Sonarr"); + } + private void AddQualityTokens(Dictionary> tokenHandlers, Series series, EpisodeFile episodeFile) { var qualityTitle = _qualityDefinitionService.Get(episodeFile.Quality.Quality).Title; @@ -528,13 +535,6 @@ namespace NzbDrone.Core.Organizer tokenHandlers["{Quality Real}"] = m => qualityReal; } - private void AddReleaseGroupTokens(Dictionary> tokenHandlers, Movie movie, MovieFile movieFile) - { - var releaseGroup = movieFile.ReleaseGroup; - - tokenHandlers["{Release Group}"] = m => releaseGroup; - } - private void AddMediaInfoTokens(Dictionary> tokenHandlers, EpisodeFile episodeFile) { if (episodeFile.MediaInfo == null) return; From 637c2e43eb795529aa1196d2609bc1af1ab9b5d6 Mon Sep 17 00:00:00 2001 From: hotio Date: Sun, 15 Jan 2017 00:56:52 +0100 Subject: [PATCH 65/71] Update README.md (#271) * Update README.md * Update README.md --- README.md | 62 +++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index d03c2c48d..4de1c7db7 100644 --- a/README.md +++ b/README.md @@ -7,24 +7,6 @@ This fork of Sonarr aims to turn it into something like CouchPotato. -## Currently working: - -* Adding new movies -* Manually searching for releases of movies. -* Automatically searching for releases. -* Automatically importing downloaded movies. -* Recognizing Special Editions, Director's Cut, etc. -* Identifying releases with hardcoded subs. -* Rarbg.to, Torznab and Newznab Indexer. -* QBittorrent and Deluge download client (Other clients are coming) -* New TorrentPotato Indexer (Works well with [Jackett](https://github.com/Jackett/Jackett)) - -## Planned Features: - -* Scanning PreDB to know when a new release is available. -* Fixing the other Indexers and download clients. -* Importing of Sonarr config. - ## Download Release builds can be found on: @@ -38,9 +20,27 @@ Docker containers from [linuxserver.io](http://tools.linuxserver.io/dockers) can * [armhf](https://store.docker.com/community/images/lsioarmhf/radarr) * [aarch64](https://store.docker.com/community/images/lsioarmhf/radarr-aarch64) -To connect to the UI, fire up your browser and open http://localhost:7878 or http://your-ip:7878. +To connect to the UI, fire up your browser and open or . + +## Currently Working + +* Adding new movies +* Manually searching for releases of movies +* Automatically searching for releases +* Automatically importing downloaded movies +* Recognizing Special Editions, Director's Cut, etc. +* Identifying releases with hardcoded subs +* Rarbg.to, Torznab and Newznab Indexer +* QBittorrent and Deluge download client (Other clients are coming) +* New TorrentPotato Indexer (Works well with [Jackett](https://github.com/Jackett/Jackett)) + +## Planned Features + +* Scanning PreDB to know when a new release is available +* Fixing the other Indexers and download clients +* Importing of Sonarr config -## Major Features Include: +## Major Features * Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc. * Can watch for better quality of the movies you have and do an automatic upgrade. *eg. from DVD to Blu-Ray* @@ -50,27 +50,27 @@ To connect to the UI, fire up your browser and open http://localhost:7878 or htt * Full integration with Kodi, Plex (notification, library update, metadata) * And a beautiful UI -## Configuring Development Environment: +## Configuring Development Environment ### Requirements -* Visual Studio 2015 [Free Community Edition](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) or Mono +* [Visual Studio Community](https://www.visualstudio.com/vs/community/) or [MonoDevelop](http://www.monodevelop.com) * [Git](https://git-scm.com/downloads) -* [NodeJS](https://nodejs.org/download/) +* [Node.js](https://nodejs.org/en/download/) ### Setup -* Make sure all the required software mentioned above are installed. -* Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories) +* Make sure all the required software mentioned above are installed +* Clone the repository into your development machine ([*info*](https://help.github.com/desktop/guides/contributing/working-with-your-remote-repository-on-github-or-github-enterprise/)) * Grab the submodules `git submodule init && git submodule update` * Install the required Node Packages `npm install` * Start gulp to monitor your dev environment for any changes that need post processing using `npm start` command. -*Please note gulp must be running at all times while you are working with Radarr client source files.* +*Please note: gulp must be running at all times while you are working with Radarr client source files.* ### Development -* Open `NzbDrone.sln` in Visual Studio or run the build.sh script, if Mono is installed. +* Open `NzbDrone.sln` in Visual Studio or run the build.sh script, if Mono is installed * Make sure `NzbDrone.Console` is set as the startup project ### License @@ -80,7 +80,7 @@ To connect to the UI, fire up your browser and open http://localhost:7878 or htt ### Sponsors -* [JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools - * [ReSharper](http://www.jetbrains.com/resharper/) - * [WebStorm](http://www.jetbrains.com/webstorm/) - * [TeamCity](http://www.jetbrains.com/teamcity/) +[JetBrains](http://www.jetbrains.com) for providing us with free licenses to their great tools: +* [ReSharper](http://www.jetbrains.com/resharper) +* [WebStorm](http://www.jetbrains.com/webstorm) +* [TeamCity](http://www.jetbrains.com/teamcity) From 105af5cf119883114b1e672a34d2403bb3fc876b Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sun, 15 Jan 2017 01:20:02 +0100 Subject: [PATCH 66/71] Fix for special characters when searching with title in Newznab. Fixes #97 --- src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs index 7ccaba8d8..71e0d806b 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs @@ -124,7 +124,7 @@ namespace NzbDrone.Core.Indexers.Newznab { var pageableRequests = new IndexerPageableRequestChain(); - if (SupportsMovieSearch) + if (false) { pageableRequests.Add(GetPagedRequests(MaxPages, Settings.Categories, "movie", string.Format("&imdbid={0}", searchCriteria.Movie.ImdbId.Substring(2)))); //strip off the "tt" - VERY HACKY @@ -133,7 +133,7 @@ namespace NzbDrone.Core.Indexers.Newznab { //Let's try anyways with q parameter, worst case nothing found. pageableRequests.Add(GetPagedRequests(MaxPages, Settings.Categories, "search", - string.Format("&q={0}", searchCriteria.Movie.Title))); + string.Format("&q={0}", Parser.Parser.NormalizeTitle(searchCriteria.Movie.Title)))); } return pageableRequests; From 401a650273b07dc120ec5d59e6f28d74f4abbd38 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sun, 15 Jan 2017 01:36:05 +0100 Subject: [PATCH 67/71] Adding only original title is now allowed. Fixes #272 --- src/NzbDrone.Core/Organizer/FileNameBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index 18197e161..36b8e926d 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -58,7 +58,7 @@ namespace NzbDrone.Core.Organizer public static readonly Regex SeriesTitleRegex = new Regex(@"(?\{(?:Series)(?[- ._])(Clean)?Title\})", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public static readonly Regex MovieTitleRegex = new Regex(@"(?\{(?:Movie)(?[- ._])(Clean)?Title\})", + public static readonly Regex MovieTitleRegex = new Regex(@"(?\{((?:(Movie|Original))(?[- ._])(Clean)?Title)\})", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex FileNameCleanupRegex = new Regex(@"([- ._])(\1)+", RegexOptions.Compiled); From f60b8cefcad37e34e0694c31b8d6d2123c31a03e Mon Sep 17 00:00:00 2001 From: hotio Date: Sun, 15 Jan 2017 11:38:54 +0100 Subject: [PATCH 68/71] Update .gitignore and remove Thumbs.db files (#276) * Update .gitignore * Delete Thumbs.db * Delete Thumbs.db * Delete Thumbs.db * Update .gitignore --- .gitignore | 26 +++++++++++++++++--------- Logo/Thumbs.db | Bin 179712 -> 0 bytes src/NzbDrone/Resources/Thumbs.db | Bin 38400 -> 0 bytes src/Thumbs.db | Bin 44032 -> 0 bytes 4 files changed, 17 insertions(+), 9 deletions(-) delete mode 100644 Logo/Thumbs.db delete mode 100644 src/NzbDrone/Resources/Thumbs.db delete mode 100644 src/Thumbs.db diff --git a/.gitignore b/.gitignore index 2a5850895..177a9eeed 100644 --- a/.gitignore +++ b/.gitignore @@ -101,16 +101,21 @@ App_Data/*.ldf _NCrunch_* _TeamCity* -# Sonarr -config.xml -nzbdrone.log*txt +# Radarr +Backups/ +logs/ +MediaCover/ UpdateLogs/ +xdg/ +config.xml +logs.db* +nzbdrone.db* +nzbdrone.pid *workspace.xml *.test-cache *.userprefs */test-results/* src/UI/.idea/* -*log.txt node_modules/ _output* _rawPackage/ @@ -122,23 +127,26 @@ setup/Output/ UI.Phantom/ -#VS outout folders +# VS outout folders bin obj output/* -#Packages +# Packages Radarr_*/ Radarr_*.zip Radarr_*.gz -#OS X metadata files +# macOS metadata files ._* .DS_Store _start _temp_*/**/* -#AppVeyor +# Windows thumbnail cache files +Thumbs.db + +# AppVeyor /tools-cake/ -/_artifacts/ \ No newline at end of file +/_artifacts/ diff --git a/Logo/Thumbs.db b/Logo/Thumbs.db deleted file mode 100644 index f01582531282a823b45604a1d784f0649ca0effc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179712 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

O){+w`EEYUJa^D@7c45-wRS#XFZrkmk*ES zYZ%8MkUjP!rUV`$S=T&i8NAK`C@OP2m~iffmzB$E`1Q}G-k4s&LWLVdR1;8O&}%5)o=*FYNZf*- zGaTAl>t4OpH1Ohe(v^zGZ1(ptCXlLM9yM~Q{%jy83mA0Yf+fAdYXFal`D zQBTnN=$}j`fKUR%PC11ODy$|1#(SLrp8;zM!B1rZ3G09zg{(Gh_=G?Vxtfg$`rR8~ z=15vx7a!jPZvtTg?hMKXpX+{~04CmHHr5#Lj!gL={S;%~izx-Jh}gu%nGrY? z)*HAF{7y_*7zBYSFdQ{El>JU9qBYEuaUFaKxQI@1(ITCAf~T9Su^!~KVMokBb`g2W zy2geD3m05<4 zTtg};JhV`O)1giqIg-{f%LC!}o}7Vz-1U=~63{Z`&%FgdO3EEi+?YZSj7jn>XkqR~ zm043rGPF@znm(WeN3cGH=Lh4+^JzdiPp%-GK~rI=g;RM8$xMppN1;@0LB2`K)l&bT~j?} zoINF5?9S!>gdgy$0GPg&D<#J(tlK?$zI~dGdbA5|_1Yg?ljXY~e&8`-a|MJFBp+D* zaD=kfO0l-@18Vu+2);4o@3h%v`oC`r=z-UBslw{{9?`Oo%)2L$rVRCLBf6X84uoOf ze*b;-x=L-4kzk{gIIpN)Ae+S|%~h^^;D6JeA?d7*3)mYyOamOTNmnO(#22*zv_JBk zYdzr`F%Sno^~^K$)!cx6t|AP8g8beug>>`G94fPVPFK;EOQwC(NmIUoT{YdggmpCc zmH*lRGI?qzU+=NPA{|aXcjGGM(gy(*0Q*2$)C#XCm(}RqUQg+X0pAufzzKjW*_;5k z?Y;NjqlF6>`fSaps6DVSIDe&$Ui^`Tpk|&%2iGH?P1^F?^vU25vppsl^k(W3n&vOG)>#NtzPfs5hy>%4hQ z+#zk8fG68iTtTse9YnF9y1R)y_}n%xThV0kHg7@cYu0&+k17 z;UJRt))vR(J0k$5%BpP^y718hw9!u{q4D4=q(AxQ$@VGaCc@jt^attXzc#FyH)@H=gtP=V5JmG&W3q z^ifXl1@PNIeGT>C6nB6qgZG7!?BNbD38Q0}`)3TlW&@am;Q0qi;0grXBXSaIL*@c= z4fOGF0cISCORn64%}n^upR%7;ZTIvbQS8Q$^9~sf``E2U1;qT1O`pzp09?TQ0Z9tn z4sSULh9_@s&0eouD5$hbWl6?(p8`MLs4=;3NJxh@-In-GJPTM6u(o64;%G2aLKqA5xwj%f z-$Q^f*>JcEh$j$u@c6s1v4R5mm$l?$No&}nm%zyuZg9kYs z*gbCn_X_skAof0dH)yTJNCY+p&wj|5AOwc z9t_C%D4E_KpHAlu_KJgJc}&pcU84FFz`F? zy!&oW5<~xRrO*1~Up7ymOz}JvC6pu-EUId|az$K#q5%E-iCf#!<%5oR2(sNN78jNq zMzkKijMx4ThL9A1ymElfTIASb(2E_FCXT!kCk>xiNp0J8;cPO{gE0Xh;2oIYV&`prma${`q-o5+08N@Qg?{+q2ReaS`6MQcV7GyT?>;~PehZRp zAmq^GNU}k3R16#vdLV$X`tEL^3lI>V2F%>St?V^Wl<=m|24Mn=&)+sGz7xD~2s54s zRTqG=fyIZQBC*6>ski{e(vy8Y`1;5i1j7)@0yJ(18^cZPv*0Co140R94@C~o015(a z;HcyM$asVz^X?x26C4L$R5E1+g$D%+0mtVRvG2m1^0!cod4u=CXy8N~YiSO>dT%CO zJk-o4wfpx7Rhfht_mTeS=VUkvW+v8ZG-QiEovaymH~1Nhi~stIuDjs|ZX8qD?*}_} z*Y4eZy)X0+`U2a9P_USPIFb)ZROGCnFCHwTIJ4*bDs9qyQ$d&Wgv-CGac?nXX)F7^ z|7eq5{=xm=5MauCN9ccF7xO%DSal?tz=eTT3+9Rfn5@Vq13w&-=Mg4YxNfY#@0#`2 zTilYtvO_R2xog_Pg|@~qPMEOp9_&m>!qQ@5`x6Qm&_8g2PiEF0nO;~UKpHTVK`>Vx zfB@p?wsu)r{QmNovVq%K6NMXA9U%g&I$jG)1aAR}Cc*9%fHgyi2dfTGW+$7}sAA+V zh1ebFA1EhyC-_}Zh_HrG1~v5$#sT*VFC{77NSE~8L!$>uyeQ@|R2@PhI`Ww{a~~__ zD#s3H9>SysOEX47+_TR;N7;uCaVj+wv_EC+4vdNGU=W0qIyScduK16hydj$IIN$TW zC0Uj#E%Jcqv)0vU{eh5!pogzX$kU3Nb2XyST500I!2@6XQA9bp`8=M-R%Iu+sAEtNTdyi{v>|nqO*CZ4GUIPya@ir#;y!rD3_74OO z>A+An0A7cQf_NMI#fbMq`A!HDJTP#}VMUfPH@l{Z2H>;tTj3?ZYxs*HHr|D|vL%w{2tmS+;W zZ&eEtLNnif!?^^S%AMql>C2C1uWx+E!p0w&_Xw{ThNLD%4xoQv`5`Art;PW%$uUlv zF*b#TKb|6NbI1!!gF>ph>CvfExzNKp z;=3RawfRoG58oT^d+~byKIJ+b;5#9h@CZ;~WY!yR(8Aw-qbDAJJZNHv6m<)~fTwLPS`zD&vAxd6f=&Te+-8mkb?U zeOlzPI|K}cGv>|X=N2A!xM%g%r&5C3Kkd;+>59uQ=Ze4utgxSV?z!~+x8Kr?C!eGX zFSvlm^;iUKY`~%}wz2MIitB6U$vyeR6LiWcr+9E8pu{d8Glr&2n#2`CeF3ijh`wgJ z_Vn-;_cWC|s+52waGAE+V#CIbbwYYWcs%WfR@5rN)Ah%vmRY6OQZCw7TGbL7!Zs@w znclEFWe+um(oN$=CwQIyT05YFW<2vu*m?1F4VUE)C7(YMK;Wk{*BCn>u$=yYLB~q) z6Vs=2ui%%TexloMy_HvHf-*QB-U03viVHg&SiJr1*I#KaQB0oR`z_#G5S+kU@hDUAl`NIVS`+@uJ zqZ_WfE+keRU!hM(;BocSES6lidNuv@!w=kh7{fvblmx3UE(Put3J2xfuDkYHdj7fR zICo>|k|q2%fJXp^UnmQ>Py*LneKk#-IFT!nx&(~T^S8C4)(PP;D&2v#0P~(Hq$$Cv z){$9k7_`}+e#*Cd>jM2dSgCDm&)+7=GR|mywe`r&VN+^rWwLYT_l`<3h=+Be;34t* z^R+Z?Ruuj5*S}%8I+!%r%E1fLwV>EZU*7VucG_=Z1_W^f)O+|C`_w^MRT3O}J4ufZS227mZ{ zm;l)K#~47tpgJ!~cELJdc;SWoo?+!d$ieOe1QvgF;dS8q-+TXkdYpL!xNmHEf=!8i z@^I!40AkeIwQKoea^Fq{n)65|b;^h=RFXBZRGBrI95I8@NlI&YK(W)aSQrP+hYL`a z;CHNCi4&1SN9#l_t$)8eC73-I5Sd55{}9D>Z9j5x*qL>;_Sq|b?=!)u7oT@m_zp>= zXTR0ajJMZ8D=Dot1C#IMlTPB>A}$30fI|EYizh))X$U~5vDN2Yz|$L0R$#P&2M`V* zOc${@9vNT{jUUe~XI)!Be}ET*Z6tU$*hj|dJ`@2~&C&Ndri`$+45fs;0`UB?zaEM; zj}#d1|9ky)n)%|3+zUeA{<(N@*a~0>n?ERq>LLyGYHy%-A4;cwUZ>-P3t2RiCF4%A zC!8C$5`fDO!Vj3T?m#$)g?ew&0b2Jqcm51a$W1@j+1};6^TL>Yn0RUbBxb4G- z59dUW`UI$`IG-Q%-awNNRA=hbj{$5l?78C)eGjex&K&?B1B##_gdc!XL@`wKg~a9yNJQ|6(6^y% zDPu>WOQ%khmY&YbmV-P5B2jLkgBGqX=cii-JJhBo2(q2Dr7KC+C6Hw5z#2jqnOSeY zO`m`9MfLnZzhdrm>e!KoOSn(`)wIBj@$20so?f~=g$!O(#v#dTEQOkB&wZ5>8gar4 zwN?Pn&CV^FcwMSSuMy5vnmEil2W6!vQXzHcHO>Mpd|=>FYrZFQEs^Ab{eSFnf+&N5 z1d#*^1a2&7t)P|G7hnxv`@jFAk3Rl5;9y{33+`ztv!bvx*wck3hkK02?w*S~FhPg1 zxEaC)D(6V1%c0EYy)>dC_pa40Vp^~6Y~dN z4(3VQHf{Kr94)faycOltt*wDNc^#D%4g_*CC9sM;(2_H{CvT|<2xBHrnp8b6pm0xC zPWC|wFi^7jyzbG1Q?C8d!2!$@c*n2Zok(qyJY}5qid=4|$q5&%sr8wA5vh4LE<)+T zA?suGmFSgf6qPyY;>VAYF1{CELII!KHINu=2smQOLZ%!L_d@_(faL+D7(8h#oPa$C zD}_)1NiuZ}Sbh}qK#~i#-5{i3+wu6A-3yqFpzz|pSFo7PmF(jJtS2lxlo)8iF8VVp zE^;F9JD|kynK#{dBPYYuMa5-m_euYL+Z2g!dgKfYwK&t*6JD-8Uzk4z-YX5%ov^% zfkj!&XIT6d%;ooHRl+lbVS&N|a}r7nfVY5yQ}EtyDcSVcdc~J^58HASRn}Uh7B9IGV*8T z@tZ(lMkvG2Zey>(-uJ2Ocj9+of+CX(E9Z|t_E>|&{7n^5jM!y>5=DHBIRNVjVMlTq zh+?O(K1LV=!vO(vHy$p)u)uIY_%J3%@=9sV{%Gb#CsJB`Wkgm_Td|o0M=?2KPhwZT zp9Cd^-J{=wW*>>Dymmw$03d%kMq^Fd@uxv23{{${G4ACY`ry|hF0`(LL6-mfFBh&* zfpr0#TmvO=?z!jEJ$KzzCrSX8|B*)@rO%Xnes>^Fg8)Ng2g=g&2Uz{nM~&iM0#bl6 zxEM@q(Y^HIi}kke-Q0lwn=*AOueAVyLLVY-MluZg72cM=u)rTcJ%-VNa^Jmk6U`i# zKv(!2I~G1{iD#2F{T`3}0Uk=e{yM$$?z?p6>8Ep7A3H^%ZY9IrM=lHwSzWSpDK{>U zT$@bOu1`^3aST>FeP|f9=4RG4wYL61L>>Tuq=Sd9OIfTDgxfTt;1SsN?P#R${x0Pq z0kk?|I=I^50B#}NaGXMe(#c$rbn3(>MQwr4#Dd?~bLaY z`h8{9v12$pUyPuzrKWN>X)3mnBkp7(u}ZOH_hRytDLkWOTxNW7#gI3L+~+& z26r=Yn!VAh*r&}QmsXa@XPdg^hQ00QjXLqC*Ju;>J0yC`J5i`jD;+&?(=qK8PG|T7 zVm)*)^6F~~Y=wc9_4U_Z^W>8{hud!ibr;D!_04^6jzFmN$mGeK9$lBHuu3%Htt0gG zr+H+tMKT{Ho+zwI8Qbre{CPr>P$t<=KOgKwGwk+ZDf&pcj2Ly+tI6l?EUC0gciA11$Eu7@BhZ8^l6l>Lx&p!h zXj|8cX(&Jl0+LTKhF@I)?(54hy;QFWFD(V=L*z=po2pAVm=bvP>wLQBwZq&is4XNW zLeG4#o|gR=QvHpP&^bd-w_o5%_yKGV$y#o4+%1gU7qRQ_LfuIvLu|5cKKsbo%>D83 zfVySrSuB(4Riz~|AYTtnpZ132@3JX194 zYJc4W>nL~LaR>LV>Jpd|-!3Vko1V+2(u#0A0fA;O*3gu<_LI$CHy$N)+r@(|G@!jN zDac}{0~Hm{_t|UebQ0I80svAjT9Yk_;`NeD9<(LBMxw{B(owtAx?{k>l?RVJkXw&^ zSELr#cRoL?(y*aJ=>w*aKAE(utSGkKPde!dDHba|Hk#vXuVB;wqnm|56hK zdh3C-u<8bY7y<2%Ofi4%AGU`O+k12P;T60&YwW#Ma2!n(HMU~QVvCv4VrFJ0iLgYqaE}MfJgd>-;CI}ZQhB`&# z5W2rMC7HSF@?zv)XU}URkU=QUR7qZtb!_2>aOqh#4Kqir{KE(p>VuNb%8+nzzbx0a%{E zj|ZfakU}!{B=7}UOyDc!&Z0oR3}#MtnAo7fPIv%>ChSz>R;QaY4h03`HYODlluduE zz(*YAVwnY&fuY0D?OqlTNjXkH@K*3tc-m)a7vd9dH4Q0^Fd$C*v3p#i>GS@g_Hj>w@b2$Z-V2E) zWYd&9KKI;w7cZe701InLn?s>f*3lU|N8VGZi*`(a)qlNRgPnQc%De&a})z zqp!oL65SYTq7DuV)7=P*MKPp*MC6xg6gfteQXm2KY#zGTVpu<)V4%AAM$Y5e2j2Pe zi1?WlH+@oCL1yE$%W_nZ%WmBXF+*D8m;xXfQyh}jZHkAAa*QRx!$Dut^&U}d+6;Be zZyMHR_SG|2%&AgETTzj~N9od1=AxQc&EiXnuK!IEM8|I5p{Wo{Be%?{RZ$9?JEG#s zKc4~e!=4Zsf(r)&TWxpbLlN=s&lv5B)6K-NEyz6mkr2V4%?YK5c47Sg9Z63(f8^CqdNjKa-`;kM($Q93hl zB|a^xp-To%OxUMAX2{E^?r@I09f^nZjipPj?m4b0BtrF;l|{v6icX9fG%$Q5pj zXHxk1kG!|9!B-#4pU|)QI2O$iFy~_;(Le(2i}-skS@@rA!K`DkrFK&i%p1Ar}bw zHQ@r$FL>)lSc)zbf3WF^(=^zEF=|9)@6+o>S@OmI;Vr#B6L7i-2K12zm<9w2$IDyz zfXK%sx%>j7CG>px@lAw#(_x!icfBB12u?^xhDRUTL+V3Y0XVhqAK}aqtRSqQ=UFBA z#7v{JHHgT?jvwtCuLKsNJ2u<2W|i^YDLYRmM~}Ec)8d0Vem*Tjg#cEwDaKjm8q2Eg zOo{HUlqO7>8x#PI?s9&f>{P8zW3;qscC;6B-lz6tF;9rn84R)2fuxB_Z9Bd~dlAqE z@%=DxzVIwG*Y`Up?F<6L4AJ?$v7sRe13emylk)EGMeWJ2;y`SG{cak2)EQwU29zpJ z4RRm82361He&iV?hFyq=WDs${y`(+5$a9vXzr3+yFUKXKN1@nUR1|(Yje=zb$I>Ld zKgYhpMpIo!s^I55GyvaPUutg z-H#M9st-hE*)KBY;Qt%!1L^_m;|x_#Eqc1$0mMU|IIJwCj+khvN~pi*CY|(id}b0y z_$2^Z3E)p%`><1tzCio*&ZmPz`@P4(>u1MH(wjgE^^d%Q$xi!jF%Un3ik2!Xd!GNu z`%U*K+!(8w&hHA*)NG9*J~+@Ey{@LbmuA6fJLpXhj*JL_+O$?R5Dp6gCy7Q$MTjl-nq7@kdxXE*GgZ|% z)C@ndd-;YEx}bAo!3eb*Xo75Km@(5ROCwTH9>|}QCC<0OL61Y%lCbUbZmUNwDYghe z`)A$=3O|qF!WmpS=Inq7Q0{`o+!*&#@e@A8qKJJ97M2Vw9H5ZB&i@t;qqD9Y$327O z2`pB%MtP{%>K&J+1|c&(??yj}5H&E-MG?>Z8k{YS>Dg zx^^WCmdf&dzPMm0Jp2n;rpKqMLZ+AMGI;PUE*EmtK?B6GdR{R{Zh1s+5x-wL=eP&P zn<>oXS*T36VutG?nk);g2^t}}LsuNxcl50V^!;1Ow1+;jSvtWg9kRBVA;n&z7+%d| zf;esZi?3c1tJkPtY2|>&0Rl)VLkJ~Hl1}gz-(1g3p_Utk`j-NSOk+(CW`Z{fDyf1z3$UeecwH=7tRShxK4xHfQ-mdgD|5n$OFh- zXGQ^sFoZF4PU7<+RE0w+@iYPzL@zsZbj8|wV-%GllXM*J%UG;QILi3Q_m|p!G zAcPyNXiX8}Hx?a1RkRT#Xl;15Rb9X+;Zav@@0VwdhAOK*t!_({*=)`<*K64_5_2rv zn($D6cG+UD*DOJ7l?qu|z_*Yt*jGJ zTm|iC=*$#^mMzS0(IZn=zO|IYtaoi{KG)PGBm7B zuOXjXLukjvX4^SURQGI}Xwf-?f2#bl=^(DH&J?mE~*OXt9D#i)F845g87QA)l z%go;Yqox-fP1|O)2)5QZ@z~6yg=4ihC6CT-&%KYZD)}^$12jV-(_fn5;N$G<^zA)j zspfRQ6hwk%PC772Y>D4zg6)(Vgo0`Q_jZ!x;wuJnF3wd?2O9T1_&)8lvNvlqR|}EH zf%LI~Xr-)#Zg|gZ0Jo_R-W~SqF4qTE951)(lnzE~ohw+uOxKyYh4Svgmpw#swk7)@ zSD018V63=-3)_ESWRQFhODZnw#iiU^@CxZ#n#Q z`j*bNXZno3T9%Tj!R!TJA}5PlpHkOKn|iz*Z&`<-M;y1HZbPenrl@nL<+pO5k**x^ zck`E3#`mP9NPTiI>p0;CVOZ?u?diLJd32ml{QR|NAK*XfdkkV#{0V#~R9O56GnLh6 z5u=@Pus`g-S8DDd4urWe)&9PPoYP^lWs{a|>#{R#Udx1(r4(QNfw zjA6kB%Avmy!<;5WAyw^~l=jnxqNI>V$#;i``U+5jppq}bUM{aAi9o47x-UAtAnfDi zdLjcJu+iJ&Uj_)@6KE4+rF0G8vORC6W<9Gg$qnKGlS+}9xSW3$%l+EX78aK;MEA{` zmjP=sSG}k@u}$z!96Xc39buYf*jdilZWBm`@93)mtobHV%Khip{{=F`@BhPJo%3uj zG-xJP?N00ZUZIU-{6e_ewwi zJG)l2pn7aXp@5#145i7dUB5r>?Jfk;oNepoKr7U*vRjy?)GnV*PEV5wv|JWq#kOM* zQ@Pf?6_2k)X>Z-4St^o-&6CQy&SxW2=jXKra|!Za)~`zhXBs+}k}c{RwG2MSvdVA_ zCUS?bIIJ49-LJu`-sc>zQ&12z3$xDDz z+puwbKTiEb{rg}HN2`F&pL*{V_c)+WE&)^hK&9-M&piwP@AYHGJ3QsmQUX(tHDon5 z)Kxv71kd|nn&a_`qw(xG9)r79ABu%$0@bdMo+ZK~DcOoZzRO_QQR*xjQcf8R;L)3f zWew8xVL1G5ND$MLqtDnw2D$2pEQ3UgK%$a> zL%LiH+`?H9yKwu1Yjoq>O+_v(P8+3xOi!9g_G-E;jTRZv?Hg%sd=IkPj$cB$$VSB` z_Lgx8vA{94;o+lr@*FB`Mlv|SL~|v{KFvEN-)Zt)>!N>U%2FlAF;ozwA`Hq|h$l5e z?o@4s(I!iato^Aa7?R~CWm3~CV6SJEQ#iQhkt(-iDXW@Gxe6PI%!|+*{-5wBCXK64 zdNK9e5xVVB%Y)eX55WPb2J$SSmLw*SDDh8Q8ZB^E(+kO5j#QUnzs8?H!!DJmdKo23 z?xeYhGnD^X!IK7H@cyI@pB^*t^EY{={@fZOIaBA&$@6zI>w>Wq7cdpb)Sr=m zraQE?7|DLvN=W9u6E}YNB@n&tv?ofE%8WdP+A{f!q$6$k*~-)Ra%c_7GOXX)a3tDp z3>KKqA`~=o?%KQJY$VdXl7NJCCp}9X2~ldUyvE2{Uaq=9U$g@TB{UR~sLl2gf*ChalH>+x;~bUDnx z!aq%>KP&dV>0iD?+@%=D8kn4QO&{}M3OSm9GHoCC6#YlBXmm5HbUROGA&NbA3EK@P z^w9^ByF0VIfY5eaeL{yJ1Tm3coe>n^;VvKofMs9~Yf83vKLaw}8@pO3{{yx50yPkG z=Lsiwu_A*->#!=tRFi7w!%E-hDB?tHvR?_Oob#KQBAJA&KtoGM3YoKdf*A0qP?Z(& z+sqG;;wPoZ^=MJ~TE7W*` z3Sh2UtXW3Io;zL`gihC~CV#U*s`jSr%}umU)&H$td_>={U*U?SfD@uXYQ-y&H<9Ux z%c`eLD6%eYs^la9iB(IgbS1&R3dC9Pl{LME(&CKgTQ-jxo&OV(&85t>vh#Xt4yXX2 z5z&t6zbkj>Ri&BKe4J>_yOPC(d+vUrh=L+*Cb78U?8oR1VnlBOr1E0Af$R3;(t)M| z*!MkTARSmTPH7J>BFUm;Q{$C+X_Xsulg_8bwXay!OM*lp5OgG?Y~ebVTiFm0E`nqiN#cK5sHkEnzy1#U&l%g((}?9z~FTG_qp5kD7$sdPn1!CbyXNdIs^5i3gU6nU7*52(~94)3$dQ zc0G&!CjyyBGtIg;uxVIEQoFsHrUj{ZRx`?;!(~glBdyeyi4ushcz50xMTm}90sal8 zj7P9?dqFKt#(puCzEi61-#!Gn`EKqJlAi8WtTsAzD;| z!1)e|3DXZ-VKVp#DJlH~tVA{2C~CNTR^uWJ_kJKHp;-VP@5Qx{)4h>e@E4%jKdY0f zt}&L@N{dMW(w> z^TVcH7PbzV4=w)$dED%BNau4&Q=a%d@#7EwMMFc)E#I}e7)bt_NEnUqgHKAO=~77q zG%kmhypyb=dDGpU1IdJ2gy1Z6BJtYN~Au3pLh#xlD33Rq5X z#I@MqhqEhQ4PO3~D+qSE18Nn#0hKc5fWu8qjT6b{zm~v30C7^u4T11x^{VNH@eY{B zr_WUDY984FS|(HE3NeVdbPJ<;8#D&B{jh5hd1s_2H}LVl8c)0`-(oiX)GM>@{QWU(%Xz5z<11BW!vByRZfTC1#kJRhT8hytst3rLVjm@zL5 zY?%pleN$H(Y+CL6*=0^RmLOB&6?h8BH#HCjdre>aDRl%*m_+KY`;)-ek9B=kKiwbz z_%*GWu

;_w)>K*=8?N?iHv^0Y2Ovv)I@!|AwWL@Nip`3Nn3VoA%06&N+J#K4Chil>`WbB;Q7CPZ zek&~-cjqS>h)1y7y~b7@A)39X5*pXkZ+6|z-ZD8|nbya#0ge}qPyx;`_4b|tb7tq%|`WyMWU$NqL!ZpQ7Kje=gA=gruU~ziu%0~PJk`+5{1Nv@y zG1t?DOV^0M#j8@e(#+MZmdtQAmd5O4ly1~YdS&~ZBA{l_@<>qm=;zckpoozR$h?vD*ZxZunv4xROI(_}dLz6kA`K&1 z7fYquRYsZMOcWQbWq(xsie8Y=g>vazhjiXc0KdRkg&2?We(t>gN?2*(5pqbvhMGi) z&YK^dcw5_+r_3hd!rPK+Y5HNR-9)8+E?TaPHa;`e5Z#?l4QsMEe#unhc$%GOE?jL6 z#7%3hIT)8?wltMul}RvYk}{zpk0zE_vf!|S^nlfTXhpW1u+1Qo`f>1ce2qe&T-KY@DYeQMnZf&Xp)|I7c^Bftz`1F!@10UQ7$&=xaj%?T=u z044w{Xp0e4i~%g5`v0qi1^^BK{twIl)p7r0eJg0E(fWU>`QPjt{?FD-Kz%R-6=RTn z7JwP3CmbN#CjT$nzXq9Z|NVco|KI0j1li>P6)u1&s28RntIVK&{8z{Nza0F3^7{Ye z^HYO?8nXI7Y3%=D)&DU3!2i2VV1Z760F})D^?IxyYetl(Rwjfi%1a=8$N3I=3qeX! zR2cyHuhU?FZ_uEXj#HW0e|yf#62gF*8N4&l4y3t|oDcv|9}D+k2n7IGi%E$Jsk-Z3 zWy2()4P%7ZE96XvX9fA2KtigD1`?IMpyg^RDZ-~ALwti4gpy4g&O&$YgCSY>Pau<- zN!J}1Sr7j_XRu01Kg(%i>9je$$>QVD%{1%0*zWlCZ%6xwrK(koeb(k$c57{_*i5Z; z0eGSkKYcsz8-*Qn3$bPegH#S$_@-I5Xo4ugQ%W}_qa^=Bh^AxniWP7mb1l3 zx+3RE*DfWNgAwDVY;S@5Ih9PrxLe0$q5WZvC280#g=4DtRK=te<&iB8NvoY|c8=Ps;o3>Hc2R0h65jSOI zlH#BUmhKcs_3A}7OQg$mEc!S#i`8$huecY)={SXL*rN1ZMJCxy!e|%y++{7eS{@q(cCCbxDVt&CAxCuV~jv zbuAz9*diEy$z*lNmKG)U*5hV;9n3F(G8Rw%!Mh`mb`o?390_hG?44*8i+u7Cc%&)u zE9u{_4XN+@7m>!+Lwm?JOR+Z~iO_h!Q&DzvhxJo->oixJAMCPF;NQ zkikL)!3u*cai6;VcZ7tnOWd{dhS{@$MVg1(GfMMN-bUj34@-JIOJOVf0b(9A7))NP zt+{*v*PnvuA_kq&EHUarFN`D3-)u2bo}akv6+kiR=hiQD{rNDIX|SO%TEAijEhh7# zc@KlMd7mbcM>zL|@%U_9Z|$dcI>Plzk}$N#;EQw-1Hvg{BIPh{=KW5%bnC2Ql&$sU^KCxa6Y8F2f7=eKxPR1#($~T@Np_dc>g*lnVYR9Z zWUEZfhYXY=+saQKP*T^tcgbT8XN$T7*+;sWHRE2ETYCD$8EgfhE32g3bRT2=7_(I< zTa(rJYNYwceF|Yb-4%?(^UsqFFYhZ9LO`ej`YwDFB}V*Ak3^G%zX?$&y>sy3(&O-9 zjlDOq78?nu9TcKTh0}#o^TuKT$8-)%7#h>@c@xwzdd)f}0V9H`Ye@p(VDXYl%k z_u!wxS8h2Gni08wv*pU1t{j?5Wgz#`MbJbX1B7=qnJ3PdZm}xpVLJ656eZzDA@U{7 znq`9&Ad_q5hHWL!R+{@BRWt14I$uRRhv$#f@S)%B6Kol^?cv_l|C{wPEOvf7-h&$V z4kmsS?QTkt6!8=fMpKkAQdYuT91XqgF@4xhrMh%V7f*%k%-Z%uFpmomV0*UgcAhPf z%jOwF5nhsKAT+CY(0eFL*ymXw)nt{0!HdXDkSlV0Sxc(L=^}mhDz6eP@uSn{wZx)g zMb!&NvF<)6a_Wh0QKM}~niXm|dno|>Yxz+6tiOhJN3%X|Jnk9O8B#x?#~|7Q4lxtM zrXf>1O8WfcoS~pxOWD@T@p>ViuIhf)B)k1%TWjsMcQEBZldEV$)n*wa zoWT<`pD$2KXF{toiP_~lMiwqbZi8ogYMYu4)#T}A(r5kUQ4tIgha?bhveSNzpXdx^ zOSnX?mgX(VP}Mncbt?XcPKWagb};EW?dFnYV*KWw0u7Bygko&06-ZQOMrQN= zcQ3s21%W0+nfc?-D}T-PDB04HH?>ubDvBV+w0+;()lODs5o!*EPTr8O(KxWCk6(2` z1NVDKu`ZC-OMiEuz@QEO%*$qkrAFrLO)dGSwDJ+2zwOyCh0N@C0t78rnT13?>u+3E zNC)}7AjQoRBx zFq#XrRll@NSUR!DkP+%fvCQ#?8%@1&Dl9|}x|WlR8d>bF25B^g>K}+i=4zeSX z+&!J&mlh%A75I8Yjcz+Ybm~;N{{Co_E2z(}m)oGcG;3g>61c?`d@WF{$sytnUmRZS2)+N*oZ3I$ zm9}Uhe1^07)~i)J3Awf!s@J3-RNiX!XftSdlSjbTFkQRU7^HH~exKjG7IIOZ##q9n zQ(_>{fRs7nL0P`8j>Y-;hpX+*XUB$vV|$9T*oL36C9xGEA~0n?CpCeITMgdb?a$}Z zO4%>0+0^Lx!w=kiM(on|=VZlq53gV51UM`{nB#`hLv%WAam*|%XI1jqqW^tUFzB^J zMeN(j%kCf^>(l+v=k^ZlI!-UizHfR76PhkA5*ydns(dVshSGF7)eZ3Y59ssAwqz7j z4i^)$cgm{Eb4ubOu9iT+1j%sur1u(tEtl(NayQvCXtA<}`2r7+I`&3z%hw1rx8{EyeC-JiI)v-B6>lG1;2x-W_G-E4?G zs9{8;jK!tH5q{2zupUe@h=J}X^VbM;7d{qWZAX_^5a$p1J%3nF8T1?dTU}dKoT>&) z97pM=xs=)#{{BMjKb|X>>+VjAtC$6H3lCm`4*Ml4t-b=V=yQZ9KTv9(SkrA74M@USgzCB6SJ zraxZ)o8PuHx;@!+eXg2`Pd@T*pLia{9;F`T*yd8_ONUK^3kIse4rjP79!x4-lG`4Q z_s)eo+%E}eX!+a!hPHcmvfEM-GsTl-$HWlEUdnnluFGc6az{QwLsWm95LPG^LbKT} zhZQzrTjfkI$p5r$?}EbDo1m&`IZvMW@}A_qz(hX1yWU zY5kdy%ju6+vyBv+wVE_js(6ykPEU3TCuaicc|`8y zbu1YiCvan#nmg-FmZ*Rt5y*e^}SgsWVoF`7Gzu+5YQg*3W&-2p96N zCVs)NJcY5@lVKlR_@!i;#S%lsgaTjbvrzn=pHj1MvC;87b8~y?dyujes6fy9*#h}b z≀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

bRhl7(i*CdmO< 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 z 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 diff --git a/src/NzbDrone/Resources/Thumbs.db b/src/NzbDrone/Resources/Thumbs.db deleted file mode 100644 index 32f10f9f8f821e97c7b3b8fcb5763473247cae5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38400 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 L-v7t{kb(aI*m6di diff --git a/src/Thumbs.db b/src/Thumbs.db deleted file mode 100644 index f63c6733651943be0abaf5ba8274a71089f93c5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44032 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%0AFh)4o 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 L?7!##*X@4*n?@)r From 941b3bd7013eff6d42cb0395f79c4be4d093c56d Mon Sep 17 00:00:00 2001 From: Mitchell Cash Date: Sun, 15 Jan 2017 20:39:00 +1000 Subject: [PATCH 69/71] Move Travis builds to container-based infrastructure (#273) * Remove example warning as it does not apply * Modify the way apt packages work in .travis.yml By modifying the way apt packages work (remove the need to directly require sudo), the builds can now run on container-based infrastructure. --- .travis.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3cea8954a..f1a014a34 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,14 @@ language: csharp solution: src/NzbDrone.sln -script: # the following commands are just examples, use whatever your build process requires +addons: + apt: + packages: + - nodejs + - npm +script: - ./build.sh - chmod +x test.sh # - ./test.sh Linux Unit Takes far too long, maybe even crashes travis :/ -install: - - sudo apt-get install nodejs - - sudo apt-get install npm after_success: - chmod +x package.sh - ./package.sh From 50f49863b71f069173c491559b793db34fd13bd4 Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sun, 15 Jan 2017 11:42:15 +0100 Subject: [PATCH 70/71] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4de1c7db7..068ec561d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ | Service | Master | Develop | |----------|:---------------------------:|:----------------------------:| | AppVeyor | [![AppVeyor](https://img.shields.io/appveyor/ci/galli-leo/Radarr/master.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/Radarr) | [![AppVeyor](https://img.shields.io/appveyor/ci/galli-leo/Radarr-usby1/develop.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/Radarr-usby1) | -| Travis | [![Travis](https://img.shields.io/travis/galli-leo/Radarr/master.svg?maxAge=60&style=flat-square)](https://travis-ci.org/galli-leo/Radarr) | [![Travis](https://img.shields.io/travis/galli-leo/Radarr/develop.svg?maxAge=60&style=flat-square)](https://travis-ci.org/galli-leo/Radarr) | +| Travis | [![Travis](https://img.shields.io/travis/Radarr/Radarr/master.svg?maxAge=60&style=flat-square)](https://travis-ci.org/Radarr/Radarr) | [![Travis](https://img.shields.io/travis/Radarr/Radarr/develop.svg?maxAge=60&style=flat-square)](https://travis-ci.org/Radarr/Radarr) | This fork of Sonarr aims to turn it into something like CouchPotato. From f63c3091f4507533e5487200826ad37274970ed1 Mon Sep 17 00:00:00 2001 From: hotio Date: Sun, 15 Jan 2017 13:50:45 +0100 Subject: [PATCH 71/71] Reworked README (#280) --- README.md | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 068ec561d..1a6ccd091 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ -# Radarr +## Status + +[![GitHub issues](https://img.shields.io/github/issues/radarr/radarr.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/issues) +[![GitHub pull requests](https://img.shields.io/github/issues-pr/radarr/radarr.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/pulls) +[![GNU GPL v3](https://img.shields.io/badge/license-GNU%20GPL%20v3-blue.svg?maxAge=60&style=flat-square)](http://www.gnu.org/licenses/gpl.html) +[![Copyright 2010-2017](https://img.shields.io/badge/copyright-2017-blue.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr) | Service | Master | Develop | |----------|:---------------------------:|:----------------------------:| @@ -7,22 +12,21 @@ This fork of Sonarr aims to turn it into something like CouchPotato. -## Download +## Downloads -Release builds can be found on: -* [GitHub](https://github.com/Radarr/Radarr/releases) +[![GitHub Releases](https://img.shields.io/badge/downloads-releases-brightgreen.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/releases) -Continuous builds can be found on: -* [AppVeyor](https://ci.appveyor.com/project/galli-leo/radarr-usby1/build/artifacts) +[![AppVeyor Builds](https://img.shields.io/badge/downloads-continuous-green.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/radarr-usby1/build/artifacts) -Docker containers from [linuxserver.io](http://tools.linuxserver.io/dockers) can be found here: -* [x64](https://store.docker.com/community/images/linuxserver/radarr) -* [armhf](https://store.docker.com/community/images/lsioarmhf/radarr) -* [aarch64](https://store.docker.com/community/images/lsioarmhf/radarr-aarch64) +[![Docker x64](https://img.shields.io/badge/docker-x64-blue.svg?maxAge=60&style=flat-square)](https://store.docker.com/community/images/linuxserver/radarr) +[![Docker armhf](https://img.shields.io/badge/docker-armhf-blue.svg?maxAge=60&style=flat-square)](https://store.docker.com/community/images/lsioarmhf/radarr) +[![Docker aarch64](https://img.shields.io/badge/docker-aarch64-blue.svg?maxAge=60&style=flat-square)](https://store.docker.com/community/images/lsioarmhf/radarr-aarch64) To connect to the UI, fire up your browser and open or . -## Currently Working +## Features + +### Currently Working * Adding new movies * Manually searching for releases of movies @@ -34,13 +38,13 @@ To connect to the UI, fire up your browser and open or < * QBittorrent and Deluge download client (Other clients are coming) * New TorrentPotato Indexer (Works well with [Jackett](https://github.com/Jackett/Jackett)) -## Planned Features +### Planned Features * Scanning PreDB to know when a new release is available * Fixing the other Indexers and download clients * Importing of Sonarr config -## Major Features +### Major Features * Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc. * Can watch for better quality of the movies you have and do an automatic upgrade. *eg. from DVD to Blu-Ray* @@ -61,7 +65,7 @@ To connect to the UI, fire up your browser and open or < ### Setup * Make sure all the required software mentioned above are installed -* Clone the repository into your development machine ([*info*](https://help.github.com/desktop/guides/contributing/working-with-your-remote-repository-on-github-or-github-enterprise/)) +* Clone the repository into your development machine ([*info*](https://help.github.com/desktop/guides/contributing/working-with-your-remote-repository-on-github-or-github-enterprise)) * Grab the submodules `git submodule init && git submodule update` * Install the required Node Packages `npm install` * Start gulp to monitor your dev environment for any changes that need post processing using `npm start` command. @@ -73,12 +77,7 @@ To connect to the UI, fire up your browser and open or < * Open `NzbDrone.sln` in Visual Studio or run the build.sh script, if Mono is installed * Make sure `NzbDrone.Console` is set as the startup project -### License - -* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html) -* Copyright 2010-2016 - -### Sponsors +## Sponsors [JetBrains](http://www.jetbrains.com) for providing us with free licenses to their great tools: * [ReSharper](http://www.jetbrains.com/resharper)