mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-14 17:22:54 -07:00
Fixed #1631 and improved translation support
Included startup args for the auto updater #1460 Mark TV requests as available #1632
This commit is contained in:
parent
2d77be0478
commit
37617eb04d
40 changed files with 177 additions and 95 deletions
|
@ -274,6 +274,13 @@ namespace Ombi.Core.Engine
|
|||
};
|
||||
}
|
||||
request.Available = false;
|
||||
foreach (var season in request.SeasonRequests)
|
||||
{
|
||||
foreach (var e in season.Episodes)
|
||||
{
|
||||
e.Available = false;
|
||||
}
|
||||
}
|
||||
await TvRepository.UpdateChild(request);
|
||||
NotificationHelper.Notify(request, NotificationType.RequestAvailable);
|
||||
return new RequestEngineResult
|
||||
|
@ -285,7 +292,7 @@ namespace Ombi.Core.Engine
|
|||
|
||||
public async Task<RequestEngineResult> MarkAvailable(int modelId)
|
||||
{
|
||||
var request = await TvRepository.GetChild().FirstOrDefaultAsync(x => x.Id == modelId);
|
||||
ChildRequests request = await TvRepository.GetChild().FirstOrDefaultAsync(x => x.Id == modelId);
|
||||
if (request == null)
|
||||
{
|
||||
return new RequestEngineResult
|
||||
|
@ -294,6 +301,13 @@ namespace Ombi.Core.Engine
|
|||
};
|
||||
}
|
||||
request.Available = true;
|
||||
foreach (var season in request.SeasonRequests)
|
||||
{
|
||||
foreach (var e in season.Episodes)
|
||||
{
|
||||
e.Available = true;
|
||||
}
|
||||
}
|
||||
await TvRepository.UpdateChild(request);
|
||||
NotificationHelper.Notify(request, NotificationType.RequestAvailable);
|
||||
return new RequestEngineResult
|
||||
|
|
|
@ -19,6 +19,8 @@ using Ombi.Api.Service.Models;
|
|||
using Ombi.Core.Settings;
|
||||
using Ombi.Helpers;
|
||||
using Ombi.Settings.Settings.Models;
|
||||
using Ombi.Store.Entities;
|
||||
using Ombi.Store.Repository;
|
||||
using Ombi.Updater;
|
||||
using SharpCompress.Readers;
|
||||
using SharpCompress.Readers.Tar;
|
||||
|
@ -28,12 +30,13 @@ namespace Ombi.Schedule.Jobs.Ombi
|
|||
public class OmbiAutomaticUpdater : IOmbiAutomaticUpdater
|
||||
{
|
||||
public OmbiAutomaticUpdater(ILogger<OmbiAutomaticUpdater> log, IOmbiService service,
|
||||
ISettingsService<UpdateSettings> s, IProcessProvider proc)
|
||||
ISettingsService<UpdateSettings> s, IProcessProvider proc, IRepository<ApplicationConfiguration> appConfig)
|
||||
{
|
||||
Logger = log;
|
||||
OmbiService = service;
|
||||
Settings = s;
|
||||
_processProvider = proc;
|
||||
_appConfig = appConfig;
|
||||
}
|
||||
|
||||
private ILogger<OmbiAutomaticUpdater> Logger { get; }
|
||||
|
@ -41,6 +44,7 @@ namespace Ombi.Schedule.Jobs.Ombi
|
|||
private ISettingsService<UpdateSettings> Settings { get; }
|
||||
private readonly IProcessProvider _processProvider;
|
||||
private static PerformContext Ctx { get; set; }
|
||||
private readonly IRepository<ApplicationConfiguration> _appConfig;
|
||||
|
||||
public string[] GetVersion()
|
||||
{
|
||||
|
@ -182,13 +186,15 @@ namespace Ombi.Schedule.Jobs.Ombi
|
|||
}
|
||||
var updaterFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),
|
||||
"TempUpdate", $"Ombi.Updater{updaterExtension}");
|
||||
|
||||
|
||||
// There must be an update
|
||||
var start = new ProcessStartInfo
|
||||
{
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true,
|
||||
FileName = updaterFile,
|
||||
Arguments = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + " " + (settings.ProcessName.HasValue() ? settings.ProcessName : "Ombi"),
|
||||
Arguments = GetArgs(settings),
|
||||
WorkingDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "TempUpdate"),
|
||||
};
|
||||
if (settings.Username.HasValue())
|
||||
|
@ -213,6 +219,18 @@ namespace Ombi.Schedule.Jobs.Ombi
|
|||
}
|
||||
}
|
||||
|
||||
private string GetArgs(UpdateSettings settings)
|
||||
{
|
||||
var config = _appConfig.GetAll();
|
||||
var url = config.FirstOrDefault(x => x.Type == ConfigurationTypes.Url);
|
||||
var storage = config.FirstOrDefault(x => x.Type == ConfigurationTypes.StoragePath);
|
||||
|
||||
var currentLocation = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
|
||||
var processName = (settings.ProcessName.HasValue() ? settings.ProcessName : "Ombi");
|
||||
|
||||
return string.Join(" ", currentLocation, processName, url, storage);
|
||||
}
|
||||
|
||||
private void RunScript(UpdateSettings settings, string downloadUrl)
|
||||
{
|
||||
var scriptToRun = settings.ScriptLocation;
|
||||
|
@ -230,7 +248,7 @@ namespace Ombi.Schedule.Jobs.Ombi
|
|||
|
||||
var ombiProcess = _processProvider.FindProcessByName(settings.ProcessName).FirstOrDefault();
|
||||
var currentInstallLocation = Assembly.GetEntryAssembly().Location;
|
||||
_processProvider.Start(scriptToRun, string.Join(" ", downloadUrl, ombiProcess.Id, currentInstallLocation));
|
||||
_processProvider.Start(scriptToRun, downloadUrl + " " + ombiProcess.Id + " " + GetArgs(settings));
|
||||
|
||||
Logger.LogInformation("Script started");
|
||||
}
|
||||
|
|
|
@ -56,7 +56,8 @@ namespace Ombi.Updater
|
|||
{
|
||||
UseShellExecute = false,
|
||||
FileName = Path.Combine(options.ApplicationPath,fileName),
|
||||
WorkingDirectory = options.ApplicationPath
|
||||
WorkingDirectory = options.ApplicationPath,
|
||||
Arguments = options.StartupArgs
|
||||
};
|
||||
using (var proc = new Process { StartInfo = start })
|
||||
{
|
||||
|
|
|
@ -72,6 +72,14 @@ namespace Ombi.Updater
|
|||
ApplicationPath = args[0],
|
||||
ProcessName = args[1],
|
||||
};
|
||||
if (args.Length == 4)
|
||||
{
|
||||
startup.StartupArgs = args[2] + " " + args[3];
|
||||
}
|
||||
else if (args.Length == 3)
|
||||
{
|
||||
startup.StartupArgs = args[2];
|
||||
}
|
||||
|
||||
var p = new ProcessProvider();
|
||||
var ombiProc = p.FindProcessByName(startup.ProcessName).FirstOrDefault();
|
||||
|
@ -87,5 +95,6 @@ namespace Ombi.Updater
|
|||
public string ProcessName { get; set; }
|
||||
public string ApplicationPath { get; set; }
|
||||
public int OmbiProcessId { get; set; }
|
||||
public string StartupArgs { get; set; }
|
||||
}
|
||||
}
|
|
@ -72,7 +72,7 @@
|
|||
</li>
|
||||
<li [routerLinkActive]="['active']">
|
||||
<a (click)="logOut()">
|
||||
<i class="fa fa-sign-out"></i> {{ 'NavigationBar.UpdateDetails' | translate }}</a>
|
||||
<i class="fa fa-sign-out"></i> {{ 'NavigationBar.Logout' | translate }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { Component, OnInit } from "@angular/core";
|
||||
import { FormBuilder, FormGroup, Validators } from "@angular/forms";
|
||||
import { ActivatedRoute, Router } from "@angular/router";
|
||||
import { TranslateService } from "@ngx-translate/core";
|
||||
|
||||
import { PlatformLocation } from "@angular/common";
|
||||
import { AuthService } from "../auth/auth.service";
|
||||
|
@ -23,10 +24,13 @@ export class LoginComponent implements OnInit {
|
|||
public background: any;
|
||||
public landingFlag: boolean;
|
||||
public baseUrl: string;
|
||||
|
||||
private errorBody: string;
|
||||
private errorValidation: string;
|
||||
|
||||
constructor(private authService: AuthService, private router: Router, private notify: NotificationService, private status: StatusService,
|
||||
private fb: FormBuilder, private settingsService: SettingsService, private images: ImageService, private sanitizer: DomSanitizer,
|
||||
private route: ActivatedRoute, private location: PlatformLocation) {
|
||||
private route: ActivatedRoute, private location: PlatformLocation, private readonly translate: TranslateService) {
|
||||
this.route.params
|
||||
.subscribe((params: any) => {
|
||||
this.landingFlag = params.landing;
|
||||
|
@ -61,11 +65,14 @@ export class LoginComponent implements OnInit {
|
|||
if (base.length > 1) {
|
||||
this.baseUrl = base;
|
||||
}
|
||||
|
||||
this.translate.get("Login.Errors.IncorrectCredentials").subscribe(x => this.errorBody = x);
|
||||
this.translate.get("Common.Errors.Validation").subscribe(x => this.errorValidation = x);
|
||||
}
|
||||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notify.error("Validation", "Please check your entered values");
|
||||
this.notify.error(this.errorValidation);
|
||||
return;
|
||||
}
|
||||
const value = form.value;
|
||||
|
@ -76,9 +83,9 @@ export class LoginComponent implements OnInit {
|
|||
if (this.authService.loggedIn()) {
|
||||
this.router.navigate(["search"]);
|
||||
} else {
|
||||
this.notify.error("Could not log in", "Incorrect username or password");
|
||||
this.notify.error(this.errorBody);
|
||||
}
|
||||
|
||||
}, err => this.notify.error("Could not log in", "Incorrect username or password"));
|
||||
}, err => this.notify.error(this.errorBody));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
you can substitue the span of reauth email for a input with the email and
|
||||
include the remember me checkbox
|
||||
-->
|
||||
<div *ngIf="form && customizationSettings">
|
||||
<div *ngIf="form && customizationSettings && background">
|
||||
<img class="landingDiv bg" [style.background-image]="background" />
|
||||
<div class="container" id="login">
|
||||
<div class="card card-container">
|
||||
<!-- <img class="profile-img-card" src="//lh3.googleusercontent.com/-6V8xOA6M7BA/AAAAAAAAAAI/AAAAAAAAAAA/rzlHcD0KYwo/photo.jpg?sz=120" alt="" /> -->
|
||||
|
@ -11,8 +12,8 @@ include the remember me checkbox
|
|||
<p id="profile-name" class="profile-name-card"></p>
|
||||
|
||||
<form class="form-signin" novalidate [formGroup]="form" (ngSubmit)="onSubmit(form)">
|
||||
<input type="email" id="inputEmail" class="form-control" formControlName="email" [attr.placeholder]="'ResetPassword.EmailAddressPlaceholder' | translate" autofocus>
|
||||
<button class="btn btn-success-outline" [disabled]="form.invalid" type="submit" [translate]="'ResetPassword.ResetPasswordButton'"></button>
|
||||
<input type="email" id="inputEmail" class="form-control" formControlName="email" [attr.placeholder]="'PasswordReset.EmailAddressPlaceholder' | translate" autofocus>
|
||||
<button class="btn btn-success-outline" [disabled]="form.invalid" type="submit" [translate]="'PasswordReset.ResetPasswordButton'"></button>
|
||||
|
||||
</form><!-- /form -->
|
||||
</div><!-- /card-container -->
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
import { PlatformLocation } from "@angular/common";
|
||||
import { Component, OnInit } from "@angular/core";
|
||||
import { FormBuilder, FormGroup, Validators } from "@angular/forms";
|
||||
import { DomSanitizer } from "@angular/platform-browser";
|
||||
|
||||
import { ICustomizationSettings, IEmailNotificationSettings } from "../interfaces";
|
||||
import { IdentityService } from "../services";
|
||||
import { NotificationService } from "../services";
|
||||
import { SettingsService } from "../services";
|
||||
import { ICustomizationSettings } from "../interfaces";
|
||||
import { IdentityService, ImageService,NotificationService, SettingsService } from "../services";
|
||||
|
||||
@Component({
|
||||
templateUrl: "./resetpassword.component.html",
|
||||
|
@ -15,30 +14,35 @@ export class ResetPasswordComponent implements OnInit {
|
|||
|
||||
public form: FormGroup;
|
||||
public customizationSettings: ICustomizationSettings;
|
||||
public emailSettings: IEmailNotificationSettings;
|
||||
public emailSettingsEnabled: boolean;
|
||||
public baseUrl: string;
|
||||
public background: any;
|
||||
|
||||
constructor(private identityService: IdentityService, private notify: NotificationService,
|
||||
private fb: FormBuilder, private settingsService: SettingsService, private location: PlatformLocation) {
|
||||
private fb: FormBuilder, private settingsService: SettingsService, private location: PlatformLocation,
|
||||
private images: ImageService, private sanitizer: DomSanitizer) {
|
||||
this.form = this.fb.group({
|
||||
email: ["", [Validators.required]],
|
||||
});
|
||||
}
|
||||
|
||||
public ngOnInit() {
|
||||
this.images.getRandomBackground().subscribe(x => {
|
||||
this.background = this.sanitizer.bypassSecurityTrustStyle("linear-gradient(-10deg, transparent 20%, rgba(0,0,0,0.7) 20.0%, rgba(0,0,0,0.7) 80.0%, transparent 80%),url(" + x.url + ")");
|
||||
});
|
||||
const base = this.location.getBaseHrefFromDOM();
|
||||
if (base.length > 1) {
|
||||
this.baseUrl = base;
|
||||
}
|
||||
this.settingsService.getCustomization().subscribe(x => this.customizationSettings = x);
|
||||
this.settingsService.getEmailNotificationSettings().subscribe(x => this.emailSettings = x);
|
||||
this.settingsService.getEmailSettingsEnabled().subscribe(x => this.emailSettingsEnabled = x);
|
||||
}
|
||||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (this.emailSettings && this.emailSettings.enabled) {
|
||||
if (this.emailSettingsEnabled) {
|
||||
|
||||
if (form.invalid) {
|
||||
this.notify.error("Validation", "Email address is required");
|
||||
this.notify.error("Email address is required");
|
||||
return;
|
||||
}
|
||||
this.identityService.submitResetPassword(form.value.email).subscribe(x => {
|
||||
|
@ -47,7 +51,7 @@ export class ResetPasswordComponent implements OnInit {
|
|||
});
|
||||
});
|
||||
} else {
|
||||
this.notify.error("Not Setup", "Sorry but the administrator has not set up email notitfications!");
|
||||
this.notify.error("Sorry but the administrator has not set up email notifications!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ export class TokenResetPasswordComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notify.error("Validation", "Email address is required");
|
||||
this.notify.error("Email address is required");
|
||||
return;
|
||||
}
|
||||
const token = form.value as IResetPasswordToken;
|
||||
|
@ -48,7 +48,7 @@ export class TokenResetPasswordComponent implements OnInit {
|
|||
this.router.navigate(["login"]);
|
||||
} else {
|
||||
x.errors.forEach((val) => {
|
||||
this.notify.error("Error", val);
|
||||
this.notify.error(val);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -9,15 +9,15 @@
|
|||
|
||||
|
||||
<div class="col-md-1 col-md-push-9" *ngIf="isAdmin">
|
||||
<form>
|
||||
<button style="text-align: right" *ngIf="child.canApprove && !child.approved" (click)="approve(child)" class="btn btn-sm btn-success-outline" type="submit"><i class="fa fa-plus"></i> Approve</button>
|
||||
</form>
|
||||
<form *ngIf="!child.denied">
|
||||
<button type="button" (click)="deny(child)" class="btn btn-sm btn-danger-outline deny"><i class="fa fa-times"></i> Deny</button>
|
||||
</form>
|
||||
<form>
|
||||
|
||||
<button *ngIf="child.canApprove && !child.approved" (click)="approve(child)" class="btn btn-sm btn-success-outline" type="submit"><i class="fa fa-plus"></i> Approve</button>
|
||||
<button *ngIf="child.available" (click)="changeAvailability(child, false)" style="text-align: right" value="false" class="btn btn-sm btn-info-outline change"><i class="fa fa-minus"></i> Mark Unavailable</button>
|
||||
<button *ngIf="!child.available" (click)="changeAvailability(child, true)" style="text-align: right" value="true" class="btn btn-sm btn-success-outline change"><i class="fa fa-plus"></i> Mark Available</button>
|
||||
|
||||
<button *ngIf="!child.denied" type="button" (click)="deny(child)" class="btn btn-sm btn-danger-outline deny"><i class="fa fa-times"></i> Deny</button>
|
||||
|
||||
<button type="button" (click)="removeRequest(child)" class="btn btn-sm btn-danger-outline deny"><i class="fa fa-times"></i> Remove</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
|
|
|
@ -25,6 +25,11 @@ export class TvRequestChildrenComponent {
|
|||
|
||||
public changeAvailability(request: IChildRequests, available: boolean) {
|
||||
request.available = available;
|
||||
request.seasonRequests.forEach((season)=> {
|
||||
season.episodes.forEach((ep)=> {
|
||||
ep.available = available;
|
||||
});
|
||||
});
|
||||
if(available) {
|
||||
this.requestService.markTvAvailable({ id: request.id }).subscribe(x => {
|
||||
if (x.result) {
|
||||
|
|
|
@ -90,7 +90,7 @@ export class MovieSearchComponent implements OnInit {
|
|||
|
||||
searchResult.processed = false;
|
||||
searchResult.requestProcessing = false;
|
||||
this.notificationService.error("Something went wrong", e);
|
||||
this.notificationService.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ export class MovieSearchGridComponent implements OnInit {
|
|||
|
||||
searchResult.processed = false;
|
||||
searchResult.requestProcessing = false;
|
||||
this.notificationService.error("Something went wrong", e);
|
||||
this.notificationService.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,8 +22,8 @@ export class NotificationService {
|
|||
this.addMessage({ severity: "warning", detail: body, summary: title });
|
||||
}
|
||||
|
||||
public error(title: string, body: string) {
|
||||
this.addMessage({ severity: "error", detail: body, summary: title });
|
||||
public error(body: string) {
|
||||
this.addMessage({ severity: "error", detail: body });
|
||||
}
|
||||
|
||||
public clearMessages() {
|
||||
|
|
|
@ -124,6 +124,9 @@ export class SettingsService extends ServiceAuthHelpers {
|
|||
public getEmailNotificationSettings(): Observable<IEmailNotificationSettings> {
|
||||
return this.httpAuth.get(`${this.url}/notifications/email`).map(this.extractData).catch(this.handleError);
|
||||
}
|
||||
public getEmailSettingsEnabled(): Observable<boolean> {
|
||||
return this.nonAuthHttp.get(`${this.url}/notifications/email/enabled`).map(this.extractData).catch(this.handleError);
|
||||
}
|
||||
|
||||
public saveEmailNotificationSettings(settings: IEmailNotificationSettings): Observable<boolean> {
|
||||
return this.httpAuth
|
||||
|
|
|
@ -51,7 +51,7 @@ export class CouchPotatoComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,7 @@ export class CouchPotatoComponent implements OnInit {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
const settings = form.value;
|
||||
|
@ -76,7 +76,7 @@ export class CouchPotatoComponent implements OnInit {
|
|||
if (x === true) {
|
||||
this.notificationService.success("Connected", "Successfully connected to CouchPotato!");
|
||||
} else {
|
||||
this.notificationService.error("Connected", "We could not connect to CouchPotato!");
|
||||
this.notificationService.error("We could not connect to CouchPotato!");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ export class CouchPotatoComponent implements OnInit {
|
|||
(<FormControl>this.form.controls.apiKey).setValue(x.api_key);
|
||||
this.notificationService.success("Api Key", "Successfully got the Api Key");
|
||||
} else {
|
||||
this.notificationService.error("Api Key", "Could not get the Api Key");
|
||||
this.notificationService.error("Could not get the Api Key");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ export class DogNzbComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ export class EmbyComponent implements OnInit {
|
|||
if (x === true) {
|
||||
this.notificationService.success("Connected", `Successfully connected to the Emby server ${server.name}!`);
|
||||
} else {
|
||||
this.notificationService.error("Connected", `We could not connect to the Emby server ${server.name}!`);
|
||||
this.notificationService.error(`We could not connect to the Emby server ${server.name}!`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ export class DiscordComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@ export class DiscordComponent implements OnInit {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ export class EmailNotificationComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -69,7 +69,7 @@ export class EmailNotificationComponent implements OnInit {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ export class MattermostComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ export class MattermostComponent implements OnInit {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ export class PushbulletComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,7 @@ export class PushbulletComponent implements OnInit {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ export class PushoverComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,7 @@ export class PushoverComponent implements OnInit {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,14 +37,14 @@ export class SlackComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
const settings = <ISlackNotificationSettings>form.value;
|
||||
if (settings.iconEmoji && settings.iconUrl) {
|
||||
|
||||
this.notificationService.error("Validation", "You cannot have a Emoji icon and a URL icon");
|
||||
this.notificationService.error("You cannot have a Emoji icon and a URL icon");
|
||||
return;
|
||||
}
|
||||
settings.notificationTemplates = this.templates;
|
||||
|
@ -61,14 +61,14 @@ export class SlackComponent implements OnInit {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
const settings = <ISlackNotificationSettings>form.value;
|
||||
if (settings.iconEmoji && settings.iconUrl) {
|
||||
|
||||
this.notificationService.error("Validation", "You cannot have a Emoji icon and a URL icon");
|
||||
this.notificationService.error("You cannot have a Emoji icon and a URL icon");
|
||||
return;
|
||||
}
|
||||
this.testerService.slackTest(settings).subscribe(x => {
|
||||
|
|
|
@ -34,7 +34,7 @@ export class OmbiComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ export class PlexComponent implements OnInit, OnDestroy {
|
|||
if (x === true) {
|
||||
this.notificationService.success("Connected", `Successfully connected to the Plex server ${server.name}!`);
|
||||
} else {
|
||||
this.notificationService.error("Connected", `We could not connect to the Plex server ${server.name}!`);
|
||||
this.notificationService.error(`We could not connect to the Plex server ${server.name}!`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ export class PlexComponent implements OnInit, OnDestroy {
|
|||
|
||||
public loadLibraries(server: IPlexServer) {
|
||||
if (server.ip == null) {
|
||||
this.notificationService.error("Not Configured", "Plex is not yet configured correctly");
|
||||
this.notificationService.error("Plex is not yet configured correctly");
|
||||
return;
|
||||
}
|
||||
this.plexService.getLibraries(server).subscribe(x => {
|
||||
|
@ -100,10 +100,10 @@ export class PlexComponent implements OnInit, OnDestroy {
|
|||
server.plexSelectedLibraries.push(lib);
|
||||
});
|
||||
} else {
|
||||
this.notificationService.error("Error", x.message);
|
||||
this.notificationService.error(x.message);
|
||||
}
|
||||
},
|
||||
err => { this.notificationService.error("Error", err); });
|
||||
err => { this.notificationService.error(err); });
|
||||
}
|
||||
|
||||
public save() {
|
||||
|
|
|
@ -88,7 +88,7 @@ export class RadarrComponent implements OnInit {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
const settings = <IRadarrSettings>form.value;
|
||||
|
@ -96,14 +96,14 @@ export class RadarrComponent implements OnInit {
|
|||
if (x === true) {
|
||||
this.notificationService.success("Connected", "Successfully connected to Radarr!");
|
||||
} else {
|
||||
this.notificationService.error("Connected", "We could not connect to Radarr!");
|
||||
this.notificationService.error("We could not connect to Radarr!");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -87,7 +87,7 @@ export class SonarrComponent implements OnInit, OnDestroy {
|
|||
|
||||
public test(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
const settings = <ISonarrSettings>form.value;
|
||||
|
@ -95,14 +95,14 @@ export class SonarrComponent implements OnInit, OnDestroy {
|
|||
if (x) {
|
||||
this.notificationService.success("Connected", "Successfully connected to Sonarr!");
|
||||
} else {
|
||||
this.notificationService.error("Connected", "We could not connect to Sonarr!");
|
||||
this.notificationService.error("We could not connect to Sonarr!");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
this.settingsService.saveSonarr(form.value)
|
||||
|
@ -111,7 +111,7 @@ export class SonarrComponent implements OnInit, OnDestroy {
|
|||
if (x) {
|
||||
this.notificationService.success("Settings Saved", "Successfully saved Sonarr settings");
|
||||
} else {
|
||||
this.notificationService.error("Settings Saved", "There was an error when saving the Sonarr settings");
|
||||
this.notificationService.error("There was an error when saving the Sonarr settings");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ export class UpdateComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
this.enableUpdateButton = form.value.autoUpdateEnabled;
|
||||
|
@ -65,7 +65,7 @@ export class UpdateComponent implements OnInit {
|
|||
if (x) {
|
||||
this.notificationService.success("Settings Saved", "Successfully saved Update settings");
|
||||
} else {
|
||||
this.notificationService.error("Settings Saved", "There was an error when saving the Update settings");
|
||||
this.notificationService.error("There was an error when saving the Update settings");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -33,13 +33,13 @@ export class UpdateDetailsComponent implements OnInit {
|
|||
|
||||
public onSubmit(form: FormGroup) {
|
||||
if (form.invalid) {
|
||||
this.notificationService.error("Validation", "Please check your entered values");
|
||||
this.notificationService.error("Please check your entered values");
|
||||
return;
|
||||
}
|
||||
|
||||
if (form.controls.password.dirty) {
|
||||
if (form.value.password !== form.value.confirmNewPassword) {
|
||||
this.notificationService.error("Error", "Passwords do not match");
|
||||
this.notificationService.error("Passwords do not match");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ export class UpdateDetailsComponent implements OnInit {
|
|||
this.notificationService.success("Updated", `All of your details have now been updated`);
|
||||
} else {
|
||||
x.errors.forEach((val) => {
|
||||
this.notificationService.error("Error", val);
|
||||
this.notificationService.error(val);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -37,7 +37,7 @@ export class UserManagementAddComponent implements OnInit {
|
|||
|
||||
if (this.user.password) {
|
||||
if (this.user.password !== this.confirmPass) {
|
||||
this.notificationSerivce.error("Error", "Passwords do not match");
|
||||
this.notificationSerivce.error("Passwords do not match");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ export class UserManagementAddComponent implements OnInit {
|
|||
});
|
||||
|
||||
if (!hasClaims) {
|
||||
this.notificationSerivce.error("Error", "Please assign a role");
|
||||
this.notificationSerivce.error("Please assign a role");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -58,7 +58,7 @@ export class UserManagementAddComponent implements OnInit {
|
|||
this.router.navigate(["usermanagement"]);
|
||||
} else {
|
||||
x.errors.forEach((val) => {
|
||||
this.notificationSerivce.error("Error", val);
|
||||
this.notificationSerivce.error(val);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -42,7 +42,7 @@ export class UserManagementEditComponent {
|
|||
this.router.navigate(["usermanagement"]);
|
||||
} else {
|
||||
x.errors.forEach((val) => {
|
||||
this.notificationService.error("Error", val);
|
||||
this.notificationService.error(val);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -61,7 +61,7 @@ export class UserManagementEditComponent {
|
|||
this.router.navigate(["usermanagement"]);
|
||||
} else {
|
||||
x.errors.forEach((val) => {
|
||||
this.notificationService.error("Error", val);
|
||||
this.notificationService.error(val);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -76,7 +76,7 @@ export class UserManagementEditComponent {
|
|||
});
|
||||
|
||||
if (!hasClaims) {
|
||||
this.notificationService.error("Error", "Please assign a role");
|
||||
this.notificationService.error("Please assign a role");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@ export class UserManagementEditComponent {
|
|||
this.router.navigate(["usermanagement"]);
|
||||
} else {
|
||||
x.errors.forEach((val) => {
|
||||
this.notificationService.error("Error", val);
|
||||
this.notificationService.error(val);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -29,11 +29,11 @@ export class UserManagementComponent implements OnInit {
|
|||
|
||||
public welcomeEmail(user: IUser) {
|
||||
if(!user.emailAddress) {
|
||||
this.notificationService.error("Email", "The user needs an email address.");
|
||||
this.notificationService.error("The user needs an email address.");
|
||||
return;
|
||||
}
|
||||
if (!this.emailSettings.enabled) {
|
||||
this.notificationService.error("Email", "Email Notifications are not setup, cannot send welcome email");
|
||||
this.notificationService.error("Email Notifications are not setup, cannot send welcome email");
|
||||
return;
|
||||
}
|
||||
this.identityService.sendWelcomeEmail(user).subscribe();
|
||||
|
|
|
@ -38,8 +38,7 @@ export class CreateAdminComponent {
|
|||
|
||||
});
|
||||
} else {
|
||||
this.notificationService.error("Error in creating user",
|
||||
"There was an error... You might want to put this on Github...");
|
||||
this.notificationService.error("There was an error... You might want to put this on Github...");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ export class EmbyComponent implements OnInit {
|
|||
public save() {
|
||||
this.embyService.logIn(this.embySettings).subscribe(x => {
|
||||
if (x == null || !x.servers[0].apiKey) {
|
||||
this.notificationService.error("Could Not Authenticate", "Username or password was incorrect. Could not authenticate with Emby.");
|
||||
this.notificationService.error("Username or password was incorrect. Could not authenticate with Emby.");
|
||||
return;
|
||||
}
|
||||
this.router.navigate(["Wizard/CreateAdmin"]);
|
||||
|
|
|
@ -21,7 +21,7 @@ export class PlexComponent {
|
|||
public requestAuthToken() {
|
||||
this.plexService.logIn(this.login, this.password).subscribe(x => {
|
||||
if (x.user == null) {
|
||||
this.notificationService.error("Could Not Authenticate", "Username or password was incorrect. Could not authenticate with Plex.");
|
||||
this.notificationService.error("Username or password was incorrect. Could not authenticate with Plex.");
|
||||
return;
|
||||
}
|
||||
this.authenticationResult = x;
|
||||
|
|
|
@ -828,4 +828,8 @@ a > h4:hover {
|
|||
.btn-split .btn.dropdown-toggle {
|
||||
border-radius: 0 0.25rem 0.25rem 0 !important;
|
||||
padding: 3.5px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.ui-treetable tbody td {
|
||||
padding: 0.25em 3.5em;
|
||||
}
|
|
@ -407,6 +407,19 @@ namespace Ombi.Controllers
|
|||
return model;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the Email Notification Settings.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("notifications/email/enabled")]
|
||||
[AllowAnonymous]
|
||||
public async Task<bool> EmailNotificationSettingsEnabled()
|
||||
{
|
||||
var emailSettings = await Get<EmailNotificationSettings>();
|
||||
return emailSettings.Enabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves the discord notification settings.
|
||||
/// </summary>
|
||||
|
|
|
@ -55,8 +55,7 @@ namespace Ombi
|
|||
if (string.IsNullOrEmpty(StoragePath.StoragePath))
|
||||
{
|
||||
config = new LoggerConfiguration()
|
||||
.MinimumLevel.Information()
|
||||
|
||||
.MinimumLevel.Debug()
|
||||
.WriteTo.RollingFile(Path.Combine(env.ContentRootPath, "Logs", "log-{Date}.txt"))
|
||||
.WriteTo.SQLite("Ombi.db", "Logs", LogEventLevel.Debug)
|
||||
.CreateLogger();
|
||||
|
@ -64,8 +63,7 @@ namespace Ombi
|
|||
else
|
||||
{
|
||||
config = new LoggerConfiguration()
|
||||
.MinimumLevel.Information()
|
||||
|
||||
.MinimumLevel.Debug()
|
||||
.WriteTo.RollingFile(Path.Combine(StoragePath.StoragePath, "Logs", "log-{Date}.txt"))
|
||||
.WriteTo.SQLite(Path.Combine(StoragePath.StoragePath, "Ombi.db"), "Logs", LogEventLevel.Debug)
|
||||
.CreateLogger();
|
||||
|
|
|
@ -4,10 +4,16 @@
|
|||
"UsernamePlaceholder": "Username",
|
||||
"PasswordPlaceholder": "Password",
|
||||
"RememberMe": "Remember Me",
|
||||
"ForgottenPassword": "Forgot your password?"
|
||||
"ForgottenPassword": "Forgot your password?",
|
||||
"Errors":{
|
||||
"IncorrectCredentials":"Incorrect username or password"
|
||||
}
|
||||
},
|
||||
"Common":{
|
||||
"ContinueButton":"Continue"
|
||||
"ContinueButton":"Continue",
|
||||
"Errors":{
|
||||
"Validation":"Please check your entered values"
|
||||
}
|
||||
},
|
||||
"PasswordReset": {
|
||||
"EmailAddressPlaceholder": "Email Address",
|
||||
|
@ -25,7 +31,7 @@
|
|||
"OfflineHeading":"Currently Offline",
|
||||
"OfflineParagraph":"The media server is currently offline.",
|
||||
|
||||
"CheckPageForUpdates":"Check this page for continous site updates."
|
||||
"CheckPageForUpdates":"Check this page for continuous site updates."
|
||||
},
|
||||
"NavigationBar":{
|
||||
"Search":"Search",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue