Merge branch 'develop' of https://github.com/tidusjar/Ombi into develop

pull/4595/head
tidusjar 2 years ago
commit f7ac2b3adf

@ -1,3 +1,16 @@
## [4.16.10](https://github.com/Ombi-app/Ombi/compare/v4.16.9...v4.16.10) (2022-04-13)
## [4.16.9](https://github.com/Ombi-app/Ombi/compare/v4.16.8...v4.16.9) (2022-04-13)
### Bug Fixes
* **plex-watchlist:** Only request the latest season when importing from the watchlist ([77a47ff](https://github.com/Ombi-app/Ombi/commit/77a47ff157c6c5feafe3f2a29a3fcba8df4fdfef))
## [4.16.8](https://github.com/Ombi-app/Ombi/compare/v4.16.7...v4.16.8) (2022-04-13)
@ -295,16 +308,3 @@
## [4.11.2](https://github.com/Ombi-app/Ombi/compare/v4.11.1...v4.11.2) (2022-02-01)
### Bug Fixes
* :globe_with_meridians: Added Czech and Chinese Simplified to the language list ([68ef366](https://github.com/Ombi-app/Ombi/commit/68ef366e8525e2c349b9e81704ad8bcca6c347a0))
## [4.11.1](https://github.com/Ombi-app/Ombi/compare/v4.11.0...v4.11.1) (2022-02-01)

@ -251,7 +251,7 @@ namespace Ombi.Core.Engine
var requests = await (OrderMovies(allRequests, orderFilter.OrderType)).Skip(position).Take(count)
.ToListAsync();
await CheckForSubscription(shouldHide, requests);
await CheckForSubscription(shouldHide.UserId, requests);
return new RequestsViewModel<MovieRequests>
{
Collection = requests,
@ -295,7 +295,7 @@ namespace Ombi.Core.Engine
var total = requests.Count();
requests = requests.Skip(position).Take(count).ToList();
await CheckForSubscription(shouldHide, requests);
await CheckForSubscription(shouldHide.UserId, requests);
return new RequestsViewModel<MovieRequests>
{
Collection = requests,
@ -380,7 +380,7 @@ namespace Ombi.Core.Engine
// TODO fix this so we execute this on the server
requests = requests.Skip(position).Take(count).ToList();
await CheckForSubscription(shouldHide, requests);
await CheckForSubscription(shouldHide.UserId, requests);
return new RequestsViewModel<MovieRequests>
{
Collection = requests,
@ -423,7 +423,7 @@ namespace Ombi.Core.Engine
var total = requests.Count();
requests = requests.Skip(position).Take(count).ToList();
await CheckForSubscription(shouldHide, requests);
await CheckForSubscription(shouldHide.UserId, requests);
return new RequestsViewModel<MovieRequests>
{
Collection = requests,
@ -505,7 +505,7 @@ namespace Ombi.Core.Engine
allRequests = await MovieRepository.GetWithUser().ToListAsync();
}
await CheckForSubscription(shouldHide, allRequests);
await CheckForSubscription(shouldHide.UserId, allRequests);
return allRequests;
}
@ -513,21 +513,21 @@ namespace Ombi.Core.Engine
public async Task<MovieRequests> GetRequest(int requestId)
{
var request = await MovieRepository.GetWithUser().Where(x => x.Id == requestId).FirstOrDefaultAsync();
await CheckForSubscription(new HideResult(), new List<MovieRequests> { request });
await CheckForSubscription((await GetUser()).Id, new List<MovieRequests> { request });
return request;
}
private async Task CheckForSubscription(HideResult shouldHide, List<MovieRequests> movieRequests)
private async Task CheckForSubscription(string UserId, List<MovieRequests> movieRequests)
{
var requestIds = movieRequests.Select(x => x.Id);
var sub = await _subscriptionRepository.GetAll().Where(s =>
s.UserId == shouldHide.UserId && requestIds.Contains(s.RequestId) && s.RequestType == RequestType.Movie)
s.UserId == UserId && requestIds.Contains(s.RequestId) && s.RequestType == RequestType.Movie)
.ToListAsync();
foreach (var x in movieRequests)
{
x.PosterPath = PosterPathHelper.FixPosterPath(x.PosterPath);
if (shouldHide.UserId == x.RequestedUserId)
if (UserId == x.RequestedUserId)
{
x.ShowSubscribe = false;
}
@ -559,7 +559,7 @@ namespace Ombi.Core.Engine
}
var results = allRequests.Where(x => x.Title.Contains(search, CompareOptions.IgnoreCase)).ToList();
await CheckForSubscription(shouldHide, results);
await CheckForSubscription(shouldHide.UserId, results);
return results;
}

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations.Schema;
using System;
using System.ComponentModel.DataAnnotations.Schema;
using Ombi.Store.Entities;
namespace Ombi.Core.Models.Search
@ -32,6 +33,7 @@ namespace Ombi.Core.Models.Search
public string TheMovieDbId { get; set; }
[NotMapped]
[Obsolete("Use request service instead")]
public bool Subscribed { get; set; }
[NotMapped]
public bool ShowSubscribe { get; set; }

@ -148,9 +148,9 @@
<value>Album</value>
</data>
<data name="Movie" xml:space="preserve">
<value>Movie</value>
<value>Film</value>
</data>
<data name="TvShow" xml:space="preserve">
<value>TV Show</value>
<value>TV-Serier</value>
</data>
</root>

@ -121,7 +121,7 @@
<value>Nouveaux Albums</value>
</data>
<data name="NewMovies" xml:space="preserve">
<value>Nouveaux Films</value>
<value>Nouveaux films</value>
</data>
<data name="NewTV" xml:space="preserve">
<value>Nouvelles séries</value>

@ -4,30 +4,18 @@
<div *ngIf="movie" class="main-content-container">
<top-banner [background]="movie.background" [available]="movie.available" [title]="movie.title" [releaseDate]="movie.releaseDate" [tagline]="movie.tagline"></top-banner>
<top-banner [background]="movie.background" [available]="movie.available" [title]="movie.title"
[releaseDate]="movie.releaseDate" [tagline]="movie.tagline"></top-banner>
<div class="social-icons-container">
<social-icons
[homepage]="movie.homepage"
[theMoviedbId]="movie.id"
[hasTrailer]="movie.videos?.results?.length > 0"
[imdbId]="movie.imdbId"
[twitter]="movie.externalIds.twitterId"
[facebook]="movie.externalIds.facebookId"
[instagram]="movie.externalIds.instagramId"
[available]="movie.available"
[plexUrl]="movie.plexUrl"
[embyUrl]="movie.embyUrl"
[jellyfinUrl]="movie.jellyfinUrl"
[isAdmin]="isAdmin"
[canShowAdvanced]="showAdvanced && movieRequest"
[type]="requestType"
[has4KRequest]="movie.has4KRequest"
(openTrailer)="openDialog()"
(onAdvancedOptions)="openAdvancedOptions()"
(onReProcessRequest)="reProcessRequest(false)"
(onReProcess4KRequest)="reProcessRequest(true)"
>
<social-icons [homepage]="movie.homepage" [theMoviedbId]="movie.id"
[hasTrailer]="movie.videos?.results?.length > 0" [imdbId]="movie.imdbId"
[twitter]="movie.externalIds.twitterId" [facebook]="movie.externalIds.facebookId"
[instagram]="movie.externalIds.instagramId" [available]="movie.available" [plexUrl]="movie.plexUrl"
[embyUrl]="movie.embyUrl" [jellyfinUrl]="movie.jellyfinUrl" [isAdmin]="isAdmin"
[canShowAdvanced]="showAdvanced && movieRequest" [type]="requestType" [has4KRequest]="movie.has4KRequest"
(openTrailer)="openDialog()" (onAdvancedOptions)="openAdvancedOptions()"
(onReProcessRequest)="reProcessRequest(false)" (onReProcess4KRequest)="reProcessRequest(true)">
</social-icons>
</div>
@ -43,118 +31,147 @@
<div class="details-button-container">
<div class="col-12 media-row">
<span *ngIf="movie.available || movie.available4K">
<a id="viewOnPlexButton" *ngIf="movie.plexUrl" href="{{movie.plexUrl}}" mat-raised-button target="_blank" class="btn-spacing viewon-btn plex">
<a id="viewOnPlexButton" *ngIf="movie.plexUrl" href="{{movie.plexUrl}}" mat-raised-button
target="_blank" class="btn-spacing viewon-btn plex">
{{'Search.ViewOnPlex' | translate}}
<i class="far fa-play-circle fa-2x"></i>
</a>
<a id="viewOnEmbyButton" *ngIf="movie.embyUrl" href="{{movie.embyUrl}}" mat-raised-button target="_blank" class="btn-spacing viewon-btn emby">
<a id="viewOnEmbyButton" *ngIf="movie.embyUrl" href="{{movie.embyUrl}}" mat-raised-button
target="_blank" class="btn-spacing viewon-btn emby">
{{'Search.ViewOnEmby' | translate}}
<i class="far fa-play-circle fa-2x"></i>
</a>
<a id="viewOnJellyfinButton" *ngIf="movie.jellyfinUrl" href="{{movie.jellyfinUrl}}" mat-raised-button target="_blank" class="btn-spacing viewon-btn jellyfin">
<a id="viewOnJellyfinButton" *ngIf="movie.jellyfinUrl" href="{{movie.jellyfinUrl}}"
mat-raised-button target="_blank" class="btn-spacing viewon-btn jellyfin">
{{'Search.ViewOnJellyfin' | translate}}
<i class="far fa-play-circle fa-2x"></i>
</a>
</span>
<!-- Regular Movie Status -->
<button mat-raised-button class="btn-green btn-spacing" id="availableBtn" *ngIf="movie.available && !movie.plexUrl && !movie.embyUrl && !movie.jellyfinUrl"> {{
'Common.Available' | translate }}</button>
<span *ngIf="!movie.available">
<span *ngIf="movie.requested || movie.approved; then requestedBtn else notRequestedBtn"></span>
<ng-template #requestedBtn>
<button id="requestedBtn" mat-raised-button *ngIf="!hasRequest || hasRequest && movieRequest && !movieRequest.denied" class="btn-spacing" color="warn" [disabled]>
<i class="fas fa-check"></i>
{{ 'Common.Requested' | translate }}
</button>
</ng-template>
<ng-template #notRequestedBtn>
<button *ngIf="!movie.requested" id="requestBtn" mat-raised-button class="btn-spacing" color="primary" (click)="request(false)">
<i *ngIf="movie.requestProcessing" class="fas fa-circle-notch fa-spin fa-fw"></i>
<i *ngIf="!movie.requestProcessing && !movie.processed" class="fas fa-plus"></i>
<i *ngIf="movie.processed && !movie.requestProcessing" class="fas fa-check"></i>
{{'Common.Request' | translate }}
</button>
</ng-template>
<button mat-raised-button class="btn-green btn-spacing" id="availableBtn"
*ngIf="movie.available && !movie.plexUrl && !movie.embyUrl && !movie.jellyfinUrl"> {{
'Common.Available' | translate }}</button>
<span *ngIf="!movie.available">
<span
*ngIf="movie.requested || movie.approved; then requestedBtn else notRequestedBtn"></span>
<ng-template #requestedBtn>
<button id="requestedBtn" mat-raised-button
*ngIf="!hasRequest || hasRequest && movieRequest && !movieRequest.denied"
class="btn-spacing" color="warn" [disabled]>
<i class="fas fa-check"></i>
{{ 'Common.Requested' | translate }}
</button>
</ng-template>
<ng-template #notRequestedBtn>
<button *ngIf="!movie.requested" id="requestBtn" mat-raised-button class="btn-spacing"
color="primary" (click)="request(false)">
<i *ngIf="movie.requestProcessing" class="fas fa-circle-notch fa-spin fa-fw"></i>
<i *ngIf="!movie.requestProcessing && !movie.processed" class="fas fa-plus"></i>
<i *ngIf="movie.processed && !movie.requestProcessing" class="fas fa-check"></i>
{{'Common.Request' | translate }}
</button>
</ng-template>
</span>
<!-- 4k Status -->
<span *ngIf="is4KEnabled">
<!-- 4k Status -->
<span *ngIf="is4KEnabled">
<span *permission="roleName4k">
<button mat-raised-button class="btn-green btn-spacing" id="availableBtn4k" *ngIf="movie.available4K"> {{
<button mat-raised-button class="btn-green btn-spacing" id="availableBtn4k"
*ngIf="movie.available4K"> {{
'Common.Available4K' | translate }}
</button>
<span *ngIf="!movie.available4K">
<span *ngIf="movie.has4KRequest || movie.approved4K; then requestedBtn4K else notRequestedBtn4K"></span>
<span
*ngIf="movie.has4KRequest || movie.approved4K; then requestedBtn4K else notRequestedBtn4K"></span>
<ng-template #requestedBtn4K>
<button id="requestedBtn4K" mat-raised-button *ngIf="movieRequest && !movieRequest.denied4K" class="btn-spacing" color="warn" [disabled]>
<button id="requestedBtn4K" mat-raised-button
*ngIf="movieRequest && !movieRequest.denied4K" class="btn-spacing"
color="warn" [disabled]>
<i class="fas fa-check"></i>
{{ 'Common.Requested4K' | translate }}
</button>
</ng-template>
<ng-template #notRequestedBtn4K>
<button *ngIf="!movie.has4KRequest" id="requestBtn4k" mat-raised-button class="btn-spacing" color="primary" (click)="request(true)">
<i *ngIf="movie.requestProcessing" class="fas fa-circle-notch fa-spin fa-fw"></i>
<i *ngIf="!movie.requestProcessing && !movie.processed" class="fas fa-plus"></i>
<i *ngIf="movie.processed && !movie.requestProcessing" class="fas fa-check"></i>
<button *ngIf="!movie.has4KRequest" id="requestBtn4k" mat-raised-button
class="btn-spacing" color="primary" (click)="request(true)">
<i *ngIf="movie.requestProcessing"
class="fas fa-circle-notch fa-spin fa-fw"></i>
<i *ngIf="!movie.requestProcessing && !movie.processed"
class="fas fa-plus"></i>
<i *ngIf="movie.processed && !movie.requestProcessing"
class="fas fa-check"></i>
{{'Common.Request4K' | translate }}
</button>
</ng-template>
<span *ngIf="!isAdmin && movie.showSubscribe" >
<button *ngIf="!movie.subscribed" (click)="notify()" id="notifyBtn" mat-raised-button class="btn-spacing" > <i class="fas fa-bell"></i>
{{ 'Requests.Notify' | translate }}</button>
<button *ngIf="movie.subscribed" (click)="unNotify()" id="unnotifyBtn" mat-raised-button class="btn-spacing" > <i class="fas fa-bell-slash"></i>
{{ 'Requests.RemoveNotification' | translate }}</button>
</span>
</span>
</span>
</span>
<span *ngIf="movieRequest?.showSubscribe">
<button *ngIf="!movieRequest?.subscribed" (click)="notify()" id="notifyBtn"
mat-raised-button class="btn-spacing"> <i class="fas fa-bell"></i>
{{ 'Requests.Notify' | translate }}</button>
<button *ngIf="movieRequest?.subscribed" (click)="unNotify()" id="unnotifyBtn"
mat-raised-button class="btn-spacing"> <i class="fas fa-bell-slash"></i>
{{ 'Requests.RemoveNotification' | translate }}</button>
</span>
<span *ngIf="isAdmin && hasRequest">
<button id="approveBtn" *ngIf="!movie.approved && movie.requested" (click)="approve(false)" mat-raised-button class="btn-spacing" color="accent">
<i class="fas fa-plus"></i> {{ 'Common.Approve' | translate }}
<span *ngIf="isAdmin && hasRequest">
<button id="approveBtn" *ngIf="!movie.approved && movie.requested" (click)="approve(false)"
mat-raised-button class="btn-spacing" color="accent">
<i class="fas fa-plus"></i> {{ 'Common.Approve' | translate }}
</button>
<button id="markAvailableBtn" *ngIf="!movie.available && movie.requested"
(click)="markAvailable(false)" mat-raised-button class="btn-spacing" color="accent">
<i class="fas fa-plus"></i> {{ 'Requests.MarkAvailable' | translate }}
</button>
<button id="markUnavailableBtn" *ngIf="movie.available && movie.requested"
(click)="markUnavailable(false)" mat-raised-button class="btn-spacing" color="accent">
<i class="fas fa-minus"></i> {{ 'Requests.MarkUnavailable' | translate }}
</button>
<!-- 4k -->
<span *ngIf="is4KEnabled">
<span *permission="roleName4k">
<button id="approve4kBtn" *ngIf="!movie.approved4K && movie.has4KRequest"
(click)="approve(true)" mat-raised-button class="btn-spacing" color="accent">
<i class="fas fa-plus"></i> {{ 'Common.Approve4K' | translate }}
</button>
<button id="markAvailableBtn" *ngIf="!movie.available && movie.requested" (click)="markAvailable(false)" mat-raised-button class="btn-spacing"
<button id="markAvailable4kBtn" *ngIf="!movie.available4K && movie.has4KRequest"
(click)="markAvailable(true)" mat-raised-button class="btn-spacing"
color="accent">
<i class="fas fa-plus"></i> {{ 'Requests.MarkAvailable' | translate }}
<i class="fas fa-plus"></i> {{ 'Requests.MarkAvailable4K' | translate }}
</button>
<button id="markUnavailableBtn" *ngIf="movie.available && movie.requested" (click)="markUnavailable(false)" mat-raised-button class="btn-spacing"
<button id="markUnavailable4kBtn" *ngIf="movie.available4K"
(click)="markUnavailable(true)" mat-raised-button class="btn-spacing"
color="accent">
<i class="fas fa-minus"></i> {{ 'Requests.MarkUnavailable' | translate }}
<i class="fas fa-minus"></i> {{ 'Requests.MarkUnavailable4K' | translate }}
</button>
<!-- 4k -->
<span *ngIf="is4KEnabled">
<span *permission="roleName4k">
<button id="approve4kBtn" *ngIf="!movie.approved4K && movie.has4KRequest" (click)="approve(true)" mat-raised-button class="btn-spacing" color="accent">
<i class="fas fa-plus"></i> {{ 'Common.Approve4K' | translate }}
</button>
<button id="markAvailable4kBtn" *ngIf="!movie.available4K && movie.has4KRequest" (click)="markAvailable(true)" mat-raised-button class="btn-spacing"
color="accent">
<i class="fas fa-plus"></i> {{ 'Requests.MarkAvailable4K' | translate }}
</button>
<button id="markUnavailable4kBtn" *ngIf="movie.available4K" (click)="markUnavailable(true)" mat-raised-button class="btn-spacing"
color="accent">
<i class="fas fa-minus"></i> {{ 'Requests.MarkUnavailable4K' | translate }}
</button>
</span>
</span>
<button id="denyBtn" *ngIf="!movieRequest.denied && movie.requested" mat-raised-button class="btn-spacing" color="warn" (click)="deny(false)">
<i class="fas fa-times"></i> {{'Requests.Deny' | translate }}
</button>
<button id="deniedButton" *ngIf="movieRequest && movieRequest.denied" [matTooltip]="movieRequest.deniedReason" mat-raised-button class="btn-spacing" color="warn">
<i class="fas fa-times"></i> {{'MediaDetails.Denied' | translate }}
</button>
</span>
<button id="reportIssueBtn" mat-raised-button class="btn-spacing" color="danger" (click)="issue()" *ngIf="issuesEnabled">
<i class="fas fa-exclamation"></i> {{'Requests.ReportIssue' | translate }}
<button id="denyBtn" *ngIf="!movieRequest.denied && movie.requested" mat-raised-button
class="btn-spacing" color="warn" (click)="deny(false)">
<i class="fas fa-times"></i> {{'Requests.Deny' | translate }}
</button>
<button id="viewCollectionBtn" *ngIf="movie.belongsToCollection" [routerLink]="'/discover/collection/' + movie.belongsToCollection.id" mat-raised-button class="btn-spacing">
<i class="fas fa-list"></i> {{'MediaDetails.ViewCollection' | translate}}
<button id="deniedButton" *ngIf="movieRequest && movieRequest.denied"
[matTooltip]="movieRequest.deniedReason" mat-raised-button class="btn-spacing"
color="warn">
<i class="fas fa-times"></i> {{'MediaDetails.Denied' | translate }}
</button>
</span>
<button id="reportIssueBtn" mat-raised-button class="btn-spacing" color="danger"
(click)="issue()" *ngIf="issuesEnabled">
<i class="fas fa-exclamation"></i> {{'Requests.ReportIssue' | translate }}
</button>
<button id="viewCollectionBtn" *ngIf="movie.belongsToCollection"
[routerLink]="'/discover/collection/' + movie.belongsToCollection.id" mat-raised-button
class="btn-spacing">
<i class="fas fa-list"></i> {{'MediaDetails.ViewCollection' | translate}}
</button>
</div>
</div>
</div>
@ -163,7 +180,8 @@
<div class="col-12 col-md-2">
<mat-card class="mat-elevation-z8">
<mat-card-content>
<movie-information-panel [movie]="movie" [request]="movieRequest" [advancedOptions]="showAdvanced"></movie-information-panel>
<movie-information-panel [movie]="movie" [request]="movieRequest"
[advancedOptions]="showAdvanced"></movie-information-panel>
</mat-card-content>
</mat-card>
@ -199,9 +217,14 @@
<mat-card class="mat-elevation-z8">
<mat-card-header>{{'MediaDetails.Trailers' | translate}}</mat-card-header>
<mat-card-content>
<p-carousel class="no-indicator" [numVisible]="2" [numScroll]="10" [page]="0" [value]="movie.videos?.results">
<p-carousel class="no-indicator" [numVisible]="2" [numScroll]="10" [page]="0"
[value]="movie.videos?.results">
<ng-template let-result pTemplate="item">
<iframe width="98%" height="315px" [src]="'https://www.youtube.com/embed/' + result.key | safe" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<iframe width="98%" height="315px"
[src]="'https://www.youtube.com/embed/' + result.key | safe"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</ng-template>
</p-carousel>
</mat-card-content>
@ -229,7 +252,9 @@
<div class="sidebar affixable affix-top preview-poster">
<div class="poster">
<a [routerLink]="'/details/movie/'+r.id">
<img class="real grow" matTooltip="{{r.title}}" src="https://image.tmdb.org/t/p/w300/{{r.poster_path}}" alt="Poster" style="display: block;">
<img class="real grow" matTooltip="{{r.title}}"
src="https://image.tmdb.org/t/p/w300/{{r.poster_path}}"
alt="Poster" style="display: block;">
</a>
</div>
</div>
@ -249,7 +274,9 @@
<div class="sidebar affixable affix-top preview-poster">
<div class="poster ">
<a [routerLink]="'/details/movie/'+r.id">
<img class="real grow" matTooltip="{{r.title}}" src="https://image.tmdb.org/t/p/w300/{{r.poster_path}}" alt="Poster" style="display: block;">
<img class="real grow" matTooltip="{{r.title}}"
src="https://image.tmdb.org/t/p/w300/{{r.poster_path}}"
alt="Poster" style="display: block;">
</a>
</div>
</div>

@ -98,7 +98,9 @@
<button id="bulkFab" *ngIf="selection.hasValue() && isAdmin" mat-fab color="accent" class="floating-fab" [matMenuTriggerFor]="aboveMenu">
<i class="fas fa-bars"></i></button>
<mat-menu #aboveMenu="matMenu" yPosition="above">
<button id="deleteFabButton" mat-menu-item (click)="bulkDelete()">{{'Requests.RequestPanel.Delete' | translate}}</button>
<button id="approveFabButton" mat-menu-item (click)="bulkApprove()">{{'Requests.RequestPanel.Approve' | translate}}</button>
<button id="approve4kFabButton" mat-menu-item (click)="bulkApprove4K()">{{'Requests.RequestPanel.Approve4K' | translate}}</button>
<button *ngIf="is4kEnabled" id="approve4kFabButton" mat-menu-item (click)="bulkApprove4K()">{{'Requests.RequestPanel.Approve4K' | translate}}</button>
<button id="denyFabButton" mat-menu-item (click)="bulkDeny()">{{'Requests.RequestPanel.Deny' | translate}}</button>
<button *ngIf="is4kEnabled" id="deny4kFabButton" mat-menu-item (click)="bulkDeny4K()">{{'Requests.RequestPanel.Deny4K' | translate}}</button>
<button id="deleteFabButton" mat-menu-item (click)="bulkDelete()">{{'Requests.RequestPanel.Delete' | translate}}</button>
</mat-menu>

@ -62,11 +62,11 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
this.manageOwnRequests = this.auth.hasRole("ManageOwnRequests")
if (this.isAdmin) {
this.displayedColumns.unshift('select');
}
}
this.is4kEnabled = this.featureFacade.is4kEnabled();
if ((this.isAdmin || this.auth.hasRole("Request4KMovie"))
&& this.is4kEnabled) {
&& this.is4kEnabled) {
this.displayedColumns.splice(4, 0, 'has4kRequest');
}
@ -155,13 +155,13 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
private checkDate(date: Date|string): boolean {
if (typeof date === 'string') {
return new Date(date).getFullYear() > 1;
return new Date(date).getFullYear() > 1;
}
if (date instanceof Date) {
return date.getFullYear() > 1;
return date.getFullYear() > 1;
}
return false;
}
}
public switchFilter(type: RequestFilterType) {
this.currentFilter = type;
@ -172,15 +172,15 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
const numSelected = this.selection.selected.length;
const numRows = this.dataSource.data.length;
return numSelected === numRows;
}
}
public masterToggle() {
public masterToggle() {
this.isAllSelected() ?
this.selection.clear() :
this.dataSource.data.forEach(row => this.selection.select(row));
}
}
public async bulkDelete() {
public async bulkDelete() {
if (this.selection.isEmpty()) {
return;
}
@ -194,13 +194,13 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
this.selection.clear();
this.ngAfterViewInit();
});
}
}
public bulkApprove = () => this.bulkApproveInternal(false);
public bulkApprove = () => this.bulkApproveInternal(false);
public bulkApprove4K = () => this.bulkApproveInternal(true);
public bulkApprove4K = () => this.bulkApproveInternal(true);
private bulkApproveInternal(is4k: boolean) {
private bulkApproveInternal(is4k: boolean) {
if (this.selection.isEmpty()) {
return;
}
@ -222,12 +222,45 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
this.selection.clear();
this.ngAfterViewInit();
})
}
}
public bulkDeny = () => this.bulkDenyInternal(false);
public bulkDeny4K = () => this.bulkDenyInternal(true);
private bulkDenyInternal(is4k: boolean) {
if (this.selection.isEmpty()) {
return;
}
let tasks = new Array<Observable<IRequestEngineResult>>();
this.selection.selected.forEach((selected) => {
tasks.push(this.requestServiceV1.denyMovie({
id: selected.id,
is4K: is4k,
reason: `` // TOOD: reuse DenyDialog to allow for a reason to be entered
}));
});
this.isLoadingResults = true;
forkJoin(tasks).subscribe((result: IRequestEngineResult[]) => {
this.isLoadingResults = false;
const failed = result.filter(x => !x.result);
if (failed.length > 0) {
this.notification.error("Some requests failed to deny: " + failed[0].errorMessage);
this.selection.clear();
return;
}
this.notification.success(this.translateService.instant('Requests.RequestPanel.Denied'));
this.selection.clear();
this.ngAfterViewInit();
})
}
public getRequestDate(request: IMovieRequests) : Date {
public getRequestDate(request: IMovieRequests): Date {
if (new Date(request.requestedDate).getFullYear() === 1) {
return request.requestedDate4k;
}
return request.requestedDate;
}
}
}

@ -1,14 +1,20 @@
<mat-nav-list>
<a id="requestDelete" *ngIf="data.isAdmin || data.manageOwnRequests" (click)="delete()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Delete' | translate}}</span>
</a>
<a id="requestApprove" *ngIf="data.canApprove && data.isAdmin && data.hasRegularRequest" (click)="approve()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Approve' | translate}}</span>
</a>
<a id="requestDeny" *ngIf="data.canApprove && data.isAdmin && data.hasRegularRequest" (click)="deny()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Deny' | translate}}</span>
</a>
<a id="requestApprove4k" *ngIf="data.canApprove && data.isAdmin && data.has4kRequest ?? false" (click)="approve4K()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Approve4K' | translate}}</span>
</a>
<a id="requestDeny4k" *ngIf="data.canApprove && data.isAdmin && data.has4kRequest ?? false" (click)="deny4K()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Deny4K' | translate}}</span>
</a>
<a id="requestChangeAvailability" *ngIf="data.type !== RequestType.tvShow && data.isAdmin" (click)="changeAvailability()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.ChangeAvailability' | translate}}</span>
</a>
<a id="requestDelete" *ngIf="data.isAdmin || data.manageOwnRequests" (click)="delete()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Delete' | translate}}</span>
</a>
</mat-nav-list>

@ -5,6 +5,8 @@ import { IRequestEngineResult, RequestType } from '../../../interfaces';
import { UpdateType } from '../../models/UpdateType';
import { TranslateService } from '@ngx-translate/core';
import { firstValueFrom, Observable } from 'rxjs';
import { DenyDialogComponent } from '../../../media-details/components/shared/deny-dialog/deny-dialog.component';
import { MatDialog } from '@angular/material/dialog';
@Component({
selector: 'request-options',
@ -17,6 +19,7 @@ export class RequestOptionsComponent {
constructor(@Inject(MAT_BOTTOM_SHEET_DATA) public data: any,
private requestService: RequestService,
private messageService: MessageService,
public dialog: MatDialog,
private bottomSheetRef: MatBottomSheetRef<RequestOptionsComponent>,
private translate: TranslateService) { }
@ -33,11 +36,11 @@ export class RequestOptionsComponent {
}
request.subscribe(result => {
if (result.result) {
this.messageService.send(this.translate.instant("Requests.SuccessfullyDeleted"));
this.bottomSheetRef.dismiss({type: UpdateType.Delete});
return;
this.messageService.send(this.translate.instant("Requests.SuccessfullyDeleted"));
this.bottomSheetRef.dismiss({type: UpdateType.Delete});
return;
} else {
this.messageService.sendRequestEngineResultError(result);
this.messageService.sendRequestEngineResultError(result);
}
});
}
@ -57,6 +60,24 @@ export class RequestOptionsComponent {
return;
}
public deny = () => this.denyInternal(false);
public deny4K = () => this.denyInternal(true);
private async denyInternal(is4K: boolean) {
const dialogRef = this.dialog.open(DenyDialogComponent, {
width: '250px',
data: { requestId: this.data.id, is4K: is4K, requestType: this.data.type }
});
dialogRef.afterClosed().subscribe(result => {
if (result.denied) {
this.bottomSheetRef.dismiss({ type: UpdateType.Deny });
}
});
}
public async approve4K() {
if (this.data.type != RequestType.movie) {
return;

@ -35,6 +35,11 @@ export class RequestsListComponent {
event.onChange();
return;
}
if (result.type == UpdateType.Deny) {
event.request.requestStatus = 'Common.Denied';
event.onChange();
return;
}
});
}
}

@ -1,5 +1,6 @@
export enum UpdateType {
Delete,
Approve,
Availability
Availability,
Deny
}

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Изтриване на заявка",
"Approve": "Одобряване на заявка",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Маркиране като налично",
"Deleted": "Избраните елементи са изтрити успешно",
"Approved": "Избраните елементи са одобрени успешно"
"Approved": "Избраните елементи са одобрени успешно",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:",
"StartDate": "Start Date:",
"EndDate": "EndDate:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Популярни",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Odstranit požadavek",
"Approve": "Schválit požadavek",
"Deny": "Deny Request",
"Approve4K": "Schválit 4K požadavek",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Označit jako dostupné",
"Deleted": "Vybrané položky úspěšně odstraněny",
"Approved": "Vybrané položky byly úspěšně schváleny"
"Approved": "Vybrané položky byly úspěšně schváleny",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Úspěšně schváleno",
"SuccessfullyDeleted": "Požadavek byl úspěšně odstraněn",
@ -379,7 +382,8 @@
"Country": "Stát:",
"StartDate": "Datum zahájení:",
"EndDate": "Datum ukončení:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Oblíbené",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Slet Anmodning",
"Approve": "Godkend Andmodning",
"Deny": "Deny Request",
"Approve4K": "Godkend 4K Anmodning",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Markér som tilgængelig",
"Deleted": "De valgte elementer blev slettet",
"Approved": "De valgte elementer blev godkendt"
"Approved": "De valgte elementer blev godkendt",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Godkendt",
"SuccessfullyDeleted": "Anmodningen blev slettet",
@ -379,7 +382,8 @@
"Country": "Land:",
"StartDate": "Startdato:",
"EndDate": "Slutdato:"
}
},
"RequestSource": "Kilde:"
},
"Discovery": {
"PopularTab": "Populære",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Anfrage löschen",
"Approve": "Anfrage genehmigen",
"Deny": "Deny Request",
"Approve4K": "4K Anfrage genehmigen",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Als verfügbar markieren",
"Deleted": "Ausgewählte Elemente erfolgreich gelöscht",
"Approved": "Ausgewählte Elemente erfolgreich freigegeben"
"Approved": "Ausgewählte Elemente erfolgreich freigegeben",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Erfolgreich genehmigt",
"SuccessfullyDeleted": "Anfrage erfolgreich gelöscht",
@ -228,7 +231,7 @@
"NoPermissionsOnBehalf": "Sie haben nicht die richtigen Berechtigungen, um im Namen von Benutzern anzufragen!",
"NoPermissions": "Sie haben nicht die nötigen Rechte!",
"RequestDoesNotExist": "Die Anfrage existiert nicht",
"ChildRequestDoesNotExist": "Child Request does not exist",
"ChildRequestDoesNotExist": "Untergeordnete Anfrage existiert nicht",
"NoPermissionsRequestMovie": "Sie haben keine Berechtigung, um einen Film anzufordern",
"NoPermissionsRequestTV": "Sie haben keine Berechtigung, um eine TV-Sendung anzufordern",
"NoPermissionsRequestAlbum": "Sie haben keine Berechtigung, um ein Album anzufordern",
@ -379,7 +382,8 @@
"Country": "Land:",
"StartDate": "Startdatum:",
"EndDate": "Enddatum:"
}
},
"RequestSource": "Quelle:"
},
"Discovery": {
"PopularTab": "Beliebt",
@ -432,7 +436,7 @@
"2": "Plex User",
"3": "Emby User",
"4": "Emby Connect User",
"5": "Jellyfin User"
"5": "Jellyfin Server"
},
"Paginator": {
"itemsPerPageLabel": "Elemente pro Seite:",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete":"Delete Request",
"Approve":"Approve Request",
"Deny":"Deny Request",
"Approve4K":"Approve 4K Request",
"Deny4K":"Deny 4K Request",
"ChangeAvailability":"Mark Available",
"Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items"
"Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Eliminar solicitud",
"Approve": "Aprobar Solicitud",
"Deny": "Rechazar Solicitud",
"Approve4K": "Aprobar Solicitud 4K",
"Deny4K": "Rechazar Solicitud 4K",
"ChangeAvailability": "Marcar como disponible",
"Deleted": "Los elementos seleccionados ha sido eliminados correctamente",
"Approved": "Los elementos seleccionados ha sido aprobados correctamente"
"Approved": "Los elementos seleccionados ha sido aprobados correctamente",
"Denied": "Elementos seleccionados rechazados con éxito"
},
"SuccessfullyApproved": "Se ha aprobado con éxito",
"SuccessfullyDeleted": "Solicitud eliminada con éxito",
@ -379,7 +382,8 @@
"Country": "País:",
"StartDate": "Fecha de inicio:",
"EndDate": "Fecha de finalización:"
}
},
"RequestSource": "Fuente:"
},
"Discovery": {
"PopularTab": "Popular",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Supprimer la demande",
"Approve": "Approuver la demande",
"Deny": "Refuser la demande",
"Approve4K": "Approuver la demande 4K",
"Deny4K": "Refuser la demande 4K",
"ChangeAvailability": "Marquer comme Disponible",
"Deleted": "Éléments sélectionnés supprimés avec succès",
"Approved": "Éléments sélectionnés approuvés avec succès"
"Approved": "Éléments sélectionnés approuvés avec succès",
"Denied": "Les éléments sélectionnés ont été refusés"
},
"SuccessfullyApproved": "Approuvée avec succès",
"SuccessfullyDeleted": "Demande supprimée avec succès",
@ -379,7 +382,8 @@
"Country": "Pays :",
"StartDate": "Date de début :",
"EndDate": "Date de fin :"
}
},
"RequestSource": "Source :"
},
"Discovery": {
"PopularTab": "Populaire",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Kérés törlése",
"Approve": "Kérés elfogadása",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Elérhetőnek jelölés",
"Deleted": "A kijelölt elemek törlésre kerultek",
"Approved": "A kijelölt elemek jóváhagyásra kerultek"
"Approved": "A kijelölt elemek jóváhagyásra kerultek",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Sikeresen jóváhagyva",
"SuccessfullyDeleted": "Kérés sikeresen törölve",
@ -379,7 +382,8 @@
"Country": "Ország:",
"StartDate": "Kezdés dátuma:",
"EndDate": "Befejezés dátuma:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Népszerű",

@ -14,7 +14,7 @@
"Common": {
"ContinueButton": "Continua",
"Available": "Disponibile",
"Available4K": "Disponibile 4K",
"Available4K": "Disponibile in 4K",
"Approved": "Approvato",
"Approve4K": "Approva 4K",
"Pending": "In Sospeso",
@ -66,7 +66,7 @@
"Discover": "Scopri",
"Search": "Cerca",
"Requests": "Richieste",
"UserManagement": "Gestione degli utenti",
"UserManagement": "Utenti",
"Issues": "Problemi",
"Vote": "Vota",
"Donate": "Dona!",
@ -74,7 +74,7 @@
"DonateTooltip": "Questo è come convinco mia moglie a farmi spendere il mio tempo libero nello sviluppo di Ombi ;)",
"UpdateAvailableTooltip": "Aggiornamento disponibile!",
"Settings": "Impostazioni",
"Welcome": "Ti diamo il benvenuto {{username}}",
"Welcome": "Benvenuto {{username}}",
"UpdateDetails": "Aggiorna dettagli",
"Logout": "Esci",
"OpenMobileApp": "Apri l'app Mobile",
@ -90,9 +90,9 @@
"Music": "Musica",
"People": "Persone"
},
"MorningWelcome": "Buona mattina!",
"MorningWelcome": "Buongiorno!",
"AfternoonWelcome": "Buon pomeriggio!",
"EveningWelcome": "Buona sera!"
"EveningWelcome": "Buonasera!"
},
"Search": {
"Title": "Cerca",
@ -100,10 +100,10 @@
"MoviesTab": "Film",
"TvTab": "Serie TV",
"MusicTab": "Musica",
"AdvancedSearch": "Puoi compilare uno dei seguenti per scoprire nuovi media. Tutti i risultati sono ordinati per popolarità",
"AdvancedSearch": "Compila uno dei seguenti campi per cercare nuovi media. I risultati sono in ordine di popolarità",
"AdvancedSearchHeader": "Ricerca Avanzata",
"Suggestions": "Suggerimenti",
"NoResults": "Spiacenti, non abbiamo trovato nulla!",
"NoResults": "Nessun risultato trovato!",
"DigitalDate": "Uscita in digitale: {{date}}",
"TheatricalRelease": "Uscita nei cinema: {{date}}",
"ViewOnPlex": "Guarda su Plex",
@ -136,12 +136,12 @@
"Season": "Stagione {{seasonNumber}}",
"SelectAllInSeason": "Seleziona tutto nella stagione {{seasonNumber}}"
},
"AdvancedSearchInstructions": "Sei pregato di scegliere che tipo di media stai cercando:",
"AdvancedSearchInstructions": "Scegli che tipo di media cercare:",
"YearOfRelease": "Anno di Rilascio",
"SearchGenre": "Cerca per genere",
"SearchKeyword": "Termini di ricerca",
"SearchKeyword": "Cerca per parola chiave",
"SearchProvider": "Provider di ricerca",
"KeywordSearchingDisclaimer": "Sei pregato di notare che la Ricerca per Parola chiave è molto a fortuna a causa di dati non coerenti nel TheMovieDb"
"KeywordSearchingDisclaimer": "Attenzione: La ricerca per parola chiave è incostante a causa di dati non coerenti su TheMovieDb"
},
"Requests": {
"Title": "Richieste",
@ -207,17 +207,20 @@
"RequestPanel": {
"Delete": "Elimina Richiesta",
"Approve": "Approva Richiesta",
"Deny": "Rifiuta Richiesta",
"Approve4K": "Approva Richiesta 4K",
"Deny4K": "Rifiuta Richiesta 4K",
"ChangeAvailability": "Segna come Disponibile",
"Deleted": "Elementi selezionati eliminati correttamente",
"Approved": "Elementi selezionati approvati correttamente"
"Approved": "Elementi selezionati approvati correttamente",
"Denied": "Elementi selezionati rifiutati con successo"
},
"SuccessfullyApproved": "Approvato Correttamente",
"SuccessfullyApproved": "Approvata",
"SuccessfullyDeleted": "Richiesta eliminata correttamente",
"NowAvailable": "Richiesta ora disponibile",
"NowUnavailable": "Richiesta ora non disponibile",
"SuccessfullyReprocessed": "Richiesta ri-elaborata correttamente",
"DeniedRequest": "Richiesta Negata",
"SuccessfullyReprocessed": "Richiesta rielaborata correttamente",
"DeniedRequest": "Richiesta Rifiutata",
"RequestCollection": "Richiedi Raccolta",
"CollectionSuccesfullyAdded": "La raccolta {{name}} è stata aggiunta correttamente!",
"NeedToSelectEpisodes": "Devi selezionare degli episodi!",
@ -243,20 +246,20 @@
"CouldntNotify": "Impossibile notificare il titolo {{title}}"
},
"Issues": {
"Title": "Problemi",
"IssuesForTitle": "Problemi per {{title}}",
"PendingTitle": "Problemi In Attesa",
"InProgressTitle": "Problemi In Corso",
"ResolvedTitle": "Problemi Risolti",
"Title": "Segnalazioni",
"IssuesForTitle": "Segnalazioni per {{title}}",
"PendingTitle": "Segnalazioni In Attesa",
"InProgressTitle": "Segnalazioni In Risoluzione",
"ResolvedTitle": "Segnalazioni Risolte",
"ColumnTitle": "Titolo",
"Count": "Conteggio",
"Count": "Totale",
"Category": "Categoria",
"Status": "Stato",
"Details": "Dettagli",
"Description": "Descrizione",
"NoComments": "Nessun Commento!",
"MarkInProgress": "Senza In Corso",
"MarkResolved": "Segna Risolto",
"MarkInProgress": "Approva",
"MarkResolved": "Risolvi",
"SendMessageButton": "Invia",
"Subject": "Oggetto",
"Comments": "Commenti",
@ -306,22 +309,22 @@
"Denied": "Rifiutato",
"Denied4K": "4K Negato",
"Trailers": "Trailer",
"RecommendationsTitle": "Raccomandazioni",
"RecommendationsTitle": "Raccomandati",
"SimilarTitle": "Simili",
"VideosTitle": "Video",
"AlbumsTitle": "Album",
"RequestAllAlbums": "Richiedi Tutti gli Album",
"RequestAllAlbums": "Richiedi tutti gli Album",
"ClearSelection": "Cancella Selezione",
"RequestSelectedAlbums": "Richiesta degli Album Selezionati",
"RequestSelectedAlbums": "Richiedi gli Album Selezionati",
"ViewCollection": "Visualizza Raccolta",
"NotEnoughInfo": "Sfortunatamente ancora non ci sono abbastanza informazioni su questo show!",
"NotEnoughInfo": "Purtroppo ancora non ci sono abbastanza informazioni su questa serie!",
"AdvancedOptions": "Opzioni Avanzate",
"AutoApproveOptions": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR e automaticamente approvata! La configurazione è facoltativa, basta premere Richiedi per saltarla!",
"AutoApproveOptionsTv": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR e automaticamente approvata! Se la richiesta è già presente in Sonarr, la cartella radice o il profilo qualità non verrà cambiato! La configurazione è facoltativa, basta premere Richiedi per saltarla!",
"AutoApproveOptionsTvShort": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR! Se la richiesta è già presente in Sonarr, la cartella radice o il profilo qualità non verrà cambiato! La configurazione è facoltativa, basta premere Richiedi per saltarla!",
"QualityProfilesSelect": "Seleziona Un Profilo di Qualità",
"RootFolderSelect": "Seleziona Una Cartella di Root",
"LanguageProfileSelect": "Seleziona Un Profilo della Lingua",
"QualityProfilesSelect": "Seleziona un Profilo per la Qualità",
"RootFolderSelect": "Seleziona una Cartella Principale",
"LanguageProfileSelect": "Seleziona un profilo per la Lingua",
"Status": "Stato:",
"StatusValues": {
"Rumored": "Rumor",
@ -331,16 +334,16 @@
"Released": "Rilasciato",
"Running": "In Corso",
"Returning Series": "Serie Rinnovate",
"Ended": "Terminata",
"Canceled": "Annullata"
"Ended": "Conclusa",
"Canceled": "Cancellata"
},
"Seasons": "Stagioni:",
"Episodes": "Episodi:",
"Availability": "Disponibilità:",
"RequestStatus": "Stato Richiesta",
"Quality": "Qualità:",
"RootFolderOverride": "Sovrascrizione Cartella di Root:",
"QualityOverride": "Sovrascrizione Qualità:",
"RootFolderOverride": "Sovrascrivi Cartella Principale:",
"QualityOverride": "Sovrascrivi Qualità:",
"Network": "Rete:",
"GenresLabel": "Generi:",
"Genres": "Generi",
@ -357,9 +360,9 @@
"CastTitle": "Trasmetti"
},
"EpisodeSelector": {
"AllSeasonsTooltip": "Questo richiederà ogni stagione per questo show",
"FirstSeasonTooltip": "Questo richiederà solo la Prima Stagione per questo show",
"LatestSeasonTooltip": "Questo richiederà solo l'Ultima Stagione per questo show",
"AllSeasonsTooltip": "Richiederà tutte le stagioni per questa serie",
"FirstSeasonTooltip": "Richiederà solo la Prima Stagione per questa serie",
"LatestSeasonTooltip": "Richiederà solo l'Ultima Stagione per questa serie",
"NoEpisodes": "Sfortunatamente, non c'è ancora alcun dato dell'episodio per questa serie!",
"SeasonNumber": "Stagione {{number}}"
},
@ -379,7 +382,8 @@
"Country": "Paese:",
"StartDate": "Data Iniziale:",
"EndDate": "Data Finale:"
}
},
"RequestSource": "Sorgente:"
},
"Discovery": {
"PopularTab": "Popolare",
@ -410,14 +414,14 @@
"DarkMode": "Modalità Scura",
"Updated": "Aggiornate Correttamente",
"StreamingCountry": "Paese di Streaming",
"StreamingCountryDescription": "Questo è il codice paese per cui mostreremo le informazioni di streaming. Se sei negli USA, selezionando US riceverai le informazioni di streaming correlate agli USA.",
"StreamingCountryDescription": "Questo è il codice del paese per cui mostreremo le informazioni dei media. Se sei in Italia, seleziona IT e ti mostreremo le informazioni dei media in Italiano.",
"LanguageDescription": "Questa è la lingua in cui vorresti fosse visualizzata l'interfaccia di Ombi.",
"MobileQRCode": "Codice QR Mobile",
"LegacyApp": "Avvia l'App Legacy",
"NoQrCode": "Sei pregato di contattare il tuo amministratore per abilitare i codici QR",
"NoQrCode": "Contatta l'amministratore per abilitare i codici QR",
"UserType": "Tipo di Utente:",
"ChangeDetails": "Modifica i Dettagli",
"NeedCurrentPassword": "Necessiti la tua password corrente per effettuare qualsiasi modifica qui",
"NeedCurrentPassword": "Hai bisogno della tua password attuale per apportare qualsiasi modifica qui",
"CurrentPassword": "Password Corrente",
"EmailAddress": "Indirizzo Email",
"NewPassword": "Nuova Password",
@ -429,8 +433,8 @@
},
"UserTypeLabel": {
"1": "Utente Locale",
"2": "Utente di Plex",
"3": "Utente di Emby",
"2": "Utente Plex",
"3": "Utente Emby",
"4": "Connetti Utente di Emby",
"5": "Utente di Jellyfin"
},

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Verwijder Verzoek",
"Approve": "Verzoek Goedkeuren",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Markeer beschikbaar",
"Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items"
"Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:",
"StartDate": "Start Date:",
"EndDate": "EndDate:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Populair",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Delete Request",
"Approve": "Approve Request",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Merk tilgjengelig",
"Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items"
"Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:",
"StartDate": "Start Date:",
"EndDate": "EndDate:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Populært",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Usuń zgłoszenie",
"Approve": "Zatwierdź zgłoszenie",
"Deny": "Deny Request",
"Approve4K": "Zatwierdź prośbę o 4K",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Ozn. jako dostępne",
"Deleted": "Pomyślnie usunięto wybrane elementy",
"Approved": "Pomyślnie zatwierdzono wybrane elementy"
"Approved": "Pomyślnie zatwierdzono wybrane elementy",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Zatwierdzono pomyślnie",
"SuccessfullyDeleted": "Prośba pomyślnie usunięta",
@ -379,7 +382,8 @@
"Country": "Kraj:",
"StartDate": "Data rozpoczęcia:",
"EndDate": "Data zakończenia:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Popularne",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Apagar Solicitação",
"Approve": "Aprovar Solicitação",
"Deny": "Recusar pedido",
"Approve4K": "Aprovar pedido 4K",
"Deny4K": "Recusar pedido de 4K",
"ChangeAvailability": "Marcar Como Disponível",
"Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items"
"Approved": "Successfully approved selected items",
"Denied": "Itens selecionados negados com sucesso"
},
"SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:",
"StartDate": "Start Date:",
"EndDate": "EndDate:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Popular",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Delete Request",
"Approve": "Approve Request",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Mark Available",
"Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items"
"Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:",
"StartDate": "Start Date:",
"EndDate": "EndDate:"
}
},
"RequestSource": "Origem:"
},
"Discovery": {
"PopularTab": "Popular",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Delete Request",
"Approve": "Approve Request",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Отметить доступным",
"Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items"
"Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:",
"StartDate": "Start Date:",
"EndDate": "EndDate:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Популярное",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Odstrániž požiadavku",
"Approve": "Schváliť žiadosť",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Označiť k dispozícií",
"Deleted": "Úspešne odstránené vybrané položky",
"Approved": "Úspešne schválené vybrané položky"
"Approved": "Úspešne schválené vybrané položky",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Úspešne schválené",
"SuccessfullyDeleted": "Žiadosť bola úspešne vymazaná",
@ -379,7 +382,8 @@
"Country": "Krajina:",
"StartDate": "Dátum začatia:",
"EndDate": "Dátum ukončenia:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "Populárne",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "Ta bort förfrågan",
"Approve": "Godkänn begäran",
"Deny": "Deny Request",
"Approve4K": "Godkänn 4K-begäran",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Markera Tillgänglig",
"Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items"
"Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:",
"StartDate": "Start Date:",
"EndDate": "EndDate:"
}
},
"RequestSource": "Källa:"
},
"Discovery": {
"PopularTab": "Populära",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "删除请求",
"Approve": "批准请求",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "标记为可用",
"Deleted": "所选项目已删除",
"Approved": "所选项目已批准"
"Approved": "所选项目已批准",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "批准成功",
"SuccessfullyDeleted": "删除请求成功",
@ -379,7 +382,8 @@
"Country": "国家:",
"StartDate": "开始日期:",
"EndDate": "结束日期:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "热门",

@ -207,10 +207,13 @@
"RequestPanel": {
"Delete": "删除请求",
"Approve": "批准请求",
"Deny": "Deny Request",
"Approve4K": "批准4K请求",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "标记为可用",
"Deleted": "所选项目已删除",
"Approved": "所选项目已批准"
"Approved": "所选项目已批准",
"Denied": "Successfully denied selected items"
},
"SuccessfullyApproved": "批准成功",
"SuccessfullyDeleted": "删除请求成功",
@ -379,7 +382,8 @@
"Country": "国家:",
"StartDate": "开始日期:",
"EndDate": "结束日期:"
}
},
"RequestSource": "Source:"
},
"Discovery": {
"PopularTab": "热门",

@ -1,3 +1,3 @@
{
"version": "4.16.8"
"version": "4.16.10"
}
Loading…
Cancel
Save