mirror of
https://github.com/Radarr/Radarr.git
synced 2026-03-05 13:21:25 -05:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
792679fd81 | ||
|
|
ecf47d4b17 | ||
|
|
3b1d49a78f | ||
|
|
753f3eb863 | ||
|
|
9fc2d22d19 | ||
|
|
3cb42f06c2 | ||
|
|
a6c396a595 | ||
|
|
bac9076b1e | ||
|
|
b228273be0 | ||
|
|
e7fa4cba19 | ||
|
|
0506cc4185 | ||
|
|
cde8b4dd97 | ||
|
|
0a0a44162c | ||
|
|
125f46fbec | ||
|
|
f3222ca7c7 | ||
|
|
d252a8b232 |
@@ -25,6 +25,7 @@ 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.
|
||||
A docker container can be found here: https://hub.docker.com/r/lsiodev/radarr/.
|
||||
|
||||
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)
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace NzbDrone.Api.Frontend.Mappers
|
||||
|
||||
public override bool CanHandle(string resourceUrl)
|
||||
{
|
||||
return resourceUrl.StartsWith("/backup/") && resourceUrl.ContainsIgnoreCase("nzbdrone_backup_") && resourceUrl.EndsWith(".zip");
|
||||
return resourceUrl.StartsWith("/backup/") && resourceUrl.ContainsIgnoreCase("radarr_backup_") && resourceUrl.EndsWith(".zip");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -232,6 +232,7 @@
|
||||
<Compile Include="RootFolders\RootFolderResource.cs" />
|
||||
<Compile Include="SeasonPass\SeasonPassResource.cs" />
|
||||
<Compile Include="Series\AlternateTitleResource.cs" />
|
||||
<Compile Include="Series\MovieFileResource.cs" />
|
||||
<Compile Include="Series\SeasonResource.cs" />
|
||||
<Compile Include="SeasonPass\SeasonPassModule.cs" />
|
||||
<Compile Include="Series\SeriesEditorModule.cs" />
|
||||
|
||||
85
src/NzbDrone.Api/Series/MovieFileResource.cs
Normal file
85
src/NzbDrone.Api/Series/MovieFileResource.cs
Normal file
@@ -0,0 +1,85 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NzbDrone.Api.REST;
|
||||
using NzbDrone.Core.MediaCover;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Qualities;
|
||||
using NzbDrone.Api.Series;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
|
||||
namespace NzbDrone.Api.Movie
|
||||
{
|
||||
public class MovieFileResource : RestResource
|
||||
{
|
||||
public MovieFileResource()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//Todo: Sorters should be done completely on the client
|
||||
//Todo: Is there an easy way to keep IgnoreArticlesWhenSorting in sync between, Series, History, Missing?
|
||||
//Todo: We should get the entire Profile instead of ID and Name separately
|
||||
|
||||
public int MovieId { get; set; }
|
||||
public string RelativePath { get; set; }
|
||||
public string Path { get; set; }
|
||||
public long Size { get; set; }
|
||||
public DateTime DateAdded { get; set; }
|
||||
public string SceneName { get; set; }
|
||||
public string ReleaseGroup { get; set; }
|
||||
public QualityModel Quality { get; set; }
|
||||
public MovieResource Movie { get; set; }
|
||||
|
||||
|
||||
|
||||
//TODO: Add series statistics as a property of the series (instead of individual properties)
|
||||
}
|
||||
|
||||
public static class MovieFileResourceMapper
|
||||
{
|
||||
public static MovieFileResource ToResource(this MovieFile model)
|
||||
{
|
||||
if (model == null) return null;
|
||||
|
||||
MovieResource movie = null;
|
||||
|
||||
if (model.Movie != null)
|
||||
{
|
||||
model.Movie.LazyLoad();
|
||||
if (model.Movie.Value != null)
|
||||
{
|
||||
//movie = model.Movie.Value.ToResource();
|
||||
}
|
||||
}
|
||||
|
||||
return new MovieFileResource
|
||||
{
|
||||
Id = model.Id,
|
||||
RelativePath = model.RelativePath,
|
||||
Path = model.Path,
|
||||
Size = model.Size,
|
||||
DateAdded = model.DateAdded,
|
||||
ReleaseGroup = model.ReleaseGroup,
|
||||
Quality = model.Quality,
|
||||
Movie = movie,
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
public static MovieFile ToModel(this MovieFileResource resource)
|
||||
{
|
||||
if (resource == null) return null;
|
||||
|
||||
return new MovieFile
|
||||
{
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
public static List<MovieFileResource> ToResource(this IEnumerable<MovieFile> movies)
|
||||
{
|
||||
return movies.Select(ToResource).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,6 +55,7 @@ namespace NzbDrone.Api.Movie
|
||||
public AddMovieOptions AddOptions { get; set; }
|
||||
public Ratings Ratings { get; set; }
|
||||
public List<string> AlternativeTitles { get; set; }
|
||||
public MovieFileResource MovieFile { get; set; }
|
||||
|
||||
//TODO: Add series statistics as a property of the series (instead of individual properties)
|
||||
|
||||
@@ -84,6 +85,7 @@ namespace NzbDrone.Api.Movie
|
||||
|
||||
long size = 0;
|
||||
bool downloaded = false;
|
||||
MovieFileResource movieFile = null;
|
||||
|
||||
|
||||
if(model.MovieFile != null)
|
||||
@@ -95,6 +97,7 @@ namespace NzbDrone.Api.Movie
|
||||
{
|
||||
size = model.MovieFile.Value.Size;
|
||||
downloaded = true;
|
||||
movieFile = model.MovieFile.Value.ToResource();
|
||||
}
|
||||
|
||||
return new MovieResource
|
||||
@@ -140,7 +143,8 @@ namespace NzbDrone.Api.Movie
|
||||
Added = model.Added,
|
||||
AddOptions = model.AddOptions,
|
||||
AlternativeTitles = model.AlternativeTitles,
|
||||
Ratings = model.Ratings
|
||||
Ratings = model.Ratings,
|
||||
MovieFile = movieFile
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Backup
|
||||
|
||||
private string _backupTempFolder;
|
||||
|
||||
private static readonly Regex BackupFileRegex = new Regex(@"nzbdrone_backup_[._0-9]+\.zip", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
private static readonly Regex BackupFileRegex = new Regex(@"radarr_backup_[._0-9]+\.zip", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
public BackupService(IMainDatabase maindDb,
|
||||
IDiskTransferService diskTransferService,
|
||||
@@ -49,7 +49,7 @@ namespace NzbDrone.Core.Backup
|
||||
_archiveService = archiveService;
|
||||
_logger = logger;
|
||||
|
||||
_backupTempFolder = Path.Combine(_appFolderInfo.TempFolder, "nzbdrone_backup");
|
||||
_backupTempFolder = Path.Combine(_appFolderInfo.TempFolder, "radarr_backup");
|
||||
}
|
||||
|
||||
public void Backup(BackupType backupType)
|
||||
@@ -59,7 +59,7 @@ namespace NzbDrone.Core.Backup
|
||||
_diskProvider.EnsureFolder(_backupTempFolder);
|
||||
_diskProvider.EnsureFolder(GetBackupFolder(backupType));
|
||||
|
||||
var backupFilename = string.Format("nzbdrone_backup_{0:yyyy.MM.dd_HH.mm.ss}.zip", DateTime.Now);
|
||||
var backupFilename = string.Format("radarr_backup_{0:yyyy.MM.dd_HH.mm.ss}.zip", DateTime.Now);
|
||||
var backupPath = Path.Combine(GetBackupFolder(backupType), backupFilename);
|
||||
|
||||
Cleanup();
|
||||
|
||||
@@ -83,7 +83,7 @@ namespace NzbDrone.Core.DecisionEngine
|
||||
{
|
||||
if (parsedEpisodeInfo.Quality.HardcodedSubs.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
remoteEpisode.DownloadAllowed = true;
|
||||
remoteEpisode.DownloadAllowed = false;
|
||||
decision = new DownloadDecision(remoteEpisode, new Rejection("Hardcoded subs found: " + parsedEpisodeInfo.Quality.HardcodedSubs));
|
||||
}
|
||||
else
|
||||
@@ -257,7 +257,7 @@ namespace NzbDrone.Core.DecisionEngine
|
||||
}
|
||||
catch (NotImplementedException e)
|
||||
{
|
||||
_logger.Info("Spec " + spec.GetType().Name + " does not care about movies.");
|
||||
_logger.Trace("Spec " + spec.GetType().Name + " does not care about movies.");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
@@ -51,6 +51,12 @@ namespace NzbDrone.Core.Download
|
||||
continue;
|
||||
}
|
||||
|
||||
if (report.Rejections.Any())
|
||||
{
|
||||
_logger.Debug("Rejecting release {0} because {1}", report.ToString(), report.Rejections.First().Reason);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (remoteMovie == null || remoteMovie.Movie == null)
|
||||
{
|
||||
continue;
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace NzbDrone.Core.Indexers.Wombles
|
||||
|
||||
public override IIndexerRequestGenerator GetRequestGenerator()
|
||||
{
|
||||
return new RssIndexerRequestGenerator("http://newshost.co.za/rss/?sec=TV&fr=false");
|
||||
return new RssIndexerRequestGenerator("http://newshost.co.za/rss/?sec=Movies&fr=false");
|
||||
}
|
||||
|
||||
public Wombles(IHttpClient httpClient, IIndexerStatusService indexerStatusService, IConfigService configService, IParsingService parsingService, Logger logger)
|
||||
|
||||
@@ -58,7 +58,7 @@ var view = Marionette.ItemView.extend({
|
||||
var defaultProfile = Config.getValue(Config.Keys.DefaultProfileId);
|
||||
var defaultRoot = Config.getValue(Config.Keys.DefaultRootFolderId);
|
||||
var useSeasonFolder = Config.getValueBoolean(Config.Keys.UseSeasonFolder, true);
|
||||
var defaultMonitorEpisodes = Config.getValue(Config.Keys.MonitorEpisodes, 'missing');
|
||||
var defaultMonitorEpisodes = Config.getValue(Config.Keys.MonitorEpisodes, 'all');
|
||||
|
||||
if (Profiles.get(defaultProfile)) {
|
||||
this.ui.profile.val(defaultProfile);
|
||||
@@ -169,6 +169,7 @@ var view = Marionette.ItemView.extend({
|
||||
|
||||
var profile = this.ui.profile.val();
|
||||
var rootFolderPath = this.ui.rootFolder.children(':selected').text();
|
||||
var monitor = this.ui.monitor.val();
|
||||
|
||||
var options = this._getAddMoviesOptions();
|
||||
options.searchForMovie = searchForMovie;
|
||||
@@ -178,7 +179,7 @@ var view = Marionette.ItemView.extend({
|
||||
profileId : profile,
|
||||
rootFolderPath : rootFolderPath,
|
||||
addOptions : options,
|
||||
monitored : true
|
||||
monitored : (monitor === 'all' ? true : false)
|
||||
}, { silent : true });
|
||||
|
||||
var self = this;
|
||||
@@ -229,44 +230,10 @@ var view = Marionette.ItemView.extend({
|
||||
},
|
||||
|
||||
_getAddMoviesOptions : function() {
|
||||
var monitor = this.ui.monitor.val();
|
||||
|
||||
var options = {
|
||||
return {
|
||||
ignoreEpisodesWithFiles : false,
|
||||
ignoreEpisodesWithoutFiles : false
|
||||
};
|
||||
|
||||
if (monitor === 'all') {
|
||||
return options;
|
||||
}
|
||||
|
||||
else if (monitor === 'future') {
|
||||
options.ignoreEpisodesWithFiles = true;
|
||||
options.ignoreEpisodesWithoutFiles = true;
|
||||
}
|
||||
|
||||
// else if (monitor === 'latest') {
|
||||
// this.model.setSeasonPass(lastSeason.seasonNumber);
|
||||
// }
|
||||
|
||||
// else if (monitor === 'first') {
|
||||
// this.model.setSeasonPass(lastSeason.seasonNumber + 1);
|
||||
// this.model.setSeasonMonitored(firstSeason.seasonNumber);
|
||||
// }
|
||||
|
||||
else if (monitor === 'missing') {
|
||||
options.ignoreEpisodesWithFiles = true;
|
||||
}
|
||||
|
||||
else if (monitor === 'existing') {
|
||||
options.ignoreEpisodesWithoutFiles = true;
|
||||
}
|
||||
|
||||
// else if (monitor === 'none') {
|
||||
// this.model.setSeasonPass(lastSeason.seasonNumber + 1);
|
||||
// }
|
||||
|
||||
return options;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<div class="search-item {{#unless isExisting}}search-item-new{{/unless}}">
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<a href="{{imdbUrl}}" target="_blank">
|
||||
<a href="{{tmdbUrl}}" target="_blank">
|
||||
{{#if remotePoster}}
|
||||
{{remotePoster}}
|
||||
{{else}}
|
||||
@@ -41,9 +41,9 @@
|
||||
<div class="form-group col-md-2">
|
||||
<label>Monitor <i class="icon-sonarr-form-info monitor-tooltip x-monitor-tooltip"></i></label>
|
||||
<select class="form-control col-md-2 x-monitor">
|
||||
<option value="all">All</option>
|
||||
<option value="missing">Missing</option>
|
||||
<option value="none">None</option>
|
||||
<option value="all">Yes</option>
|
||||
<!-- <option value="missing">Missing</option> -->
|
||||
<option value="none">No</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
<span class="label label-{{DownloadedStatusColor}}">{{DownloadedStatus}}</span>
|
||||
<span class="label label-{{DownloadedStatusColor}}" title="{{DownloadedQuality}}">{{DownloadedStatus}}</span>
|
||||
|
||||
@@ -161,6 +161,14 @@ Handlebars.registerHelper('DownloadedStatus', function() {
|
||||
return "Missing";
|
||||
});
|
||||
|
||||
Handlebars.registerHelper("DownloadedQuality", function() {
|
||||
if (this.movieFile) {
|
||||
return this.movieFile.quality.quality.name;
|
||||
}
|
||||
|
||||
return "";
|
||||
})
|
||||
|
||||
|
||||
Handlebars.registerHelper('inCinemas', function() {
|
||||
var monthNames = ["January", "February", "March", "April", "May", "June",
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
{{else}}
|
||||
<span class="label label-default">Announced</span>
|
||||
{{/if_eq}}
|
||||
<span class="label label-{{DownloadedStatusColor}}">{{DownloadedStatus}}</span>
|
||||
<span class="label label-{{DownloadedStatusColor}}" title="{{DownloadedQuality}}">{{DownloadedStatus}}</span>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="series-info-links">
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
{{profile profileId}}
|
||||
|
||||
<span class="label label-{{DownloadedStatusColor}}">{{DownloadedStatus}}</span>
|
||||
<span class="label label-{{DownloadedStatusColor}}" title="{{DownloadedQuality}}">{{DownloadedStatus}}</span>
|
||||
</div>
|
||||
<div class="col-md-4 col-xs-4">
|
||||
<span class="movie-info-links">
|
||||
|
||||
@@ -2,26 +2,31 @@
|
||||
<legend>More Info</legend>
|
||||
|
||||
<dl class="dl-horizontal info">
|
||||
<dt>Home page</dt>
|
||||
<dt>Discord</dt>
|
||||
<dd><a href="https://discord.gg/AD3UP37">Radarr on Discord</a>
|
||||
|
||||
<dt>Reddit</dt>
|
||||
<dd><a href="https://www.reddit.com/r/radarr/">Radarr Subreddit</a>
|
||||
{{!--<dt>Home page</dt>
|
||||
<dd><a href="https://radarr.tdb/">radarr.tdb</a></dd>
|
||||
|
||||
<dt>Wiki</dt>
|
||||
<dd><a href="https://wiki.radarr.tdb/">wiki.radarr.tdb</a></dd>
|
||||
|
||||
<!-- <dt>Forums</dt>
|
||||
<dt>Forums</dt>
|
||||
<dd><a href="https://forums.sonarr.tv/">forums.sonarr.tv</a></dd>
|
||||
|
||||
<dt>Twitter</dt>
|
||||
<dd><a href="https://twitter.com/sonarrtv">@sonarrtv</a></dd>
|
||||
|
||||
<dt>IRC</dt>
|
||||
<dd><a href="irc://irc.freenode.net/#sonarr">#sonarr on Freenode</a> or (<a href="http://webchat.freenode.net/?channels=#sonarr">webchat</a>)</dd>-->
|
||||
<dd><a href="irc://irc.freenode.net/#sonarr">#sonarr on Freenode</a> or (<a href="http://webchat.freenode.net/?channels=#sonarr">webchat</a>)</dd>--}}
|
||||
|
||||
<dt>Source</dt>
|
||||
<dd><a href="https://github.com/galli-leo/Radarr/">github.com/galli-leo/Radarr</a></dd>
|
||||
<dd><a href="https://github.com/Radarr/Radarr">Radarr on Github</a></dd>
|
||||
|
||||
<dt>Feature Requests</dt>
|
||||
<!--<dd><a href="https://forums.sonarr.tv/">forums.sonarr.tv</a></dd>-->
|
||||
<dd><a href="https://github.com/galli-leo/Radarr/issues">github.com/galli-leo/Radarr/issues</a></dd>
|
||||
<dd><a href="https://github.com/Radarr/Radarr/issues">Github Issues</a></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
@@ -131,7 +131,7 @@ module.exports = Marionette.Layout.extend({
|
||||
});
|
||||
|
||||
Messenger.show({
|
||||
message : 'Sonarr will shutdown shortly',
|
||||
message : 'Radarr will shutdown shortly',
|
||||
type : 'info'
|
||||
});
|
||||
},
|
||||
@@ -143,8 +143,8 @@ module.exports = Marionette.Layout.extend({
|
||||
});
|
||||
|
||||
Messenger.show({
|
||||
message : 'Sonarr will restart shortly',
|
||||
message : 'Radarr will restart shortly',
|
||||
type : 'info'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user