mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-10-03 09:49:20 +02:00

* Add NSFW flags to videos so the publisher can add more NSFW context * Add NSFW summary to videos, similar to content warning system so the publisher has a free text to describe NSFW aspect of its video * Add additional "warn" NSFW policy: the video thumbnail is not blurred and we display a tag below the video miniature, the video player includes the NSFW warning (with context if available) and it also prevent autoplay * "blur" NSFW settings inherits "warn" policy and also blur the video thumbnail * Add NSFW flag settings to users so they can have more granular control about what content they want to hide, warn or display
135 lines
4.1 KiB
TypeScript
135 lines
4.1 KiB
TypeScript
import { NgFor, NgIf } from '@angular/common'
|
|
import { Component, OnInit, inject, model } from '@angular/core'
|
|
import { ServerService } from '@app/core'
|
|
import { formatICU } from '@app/helpers'
|
|
import { ServerConfig, ServerStats } from '@peertube/peertube-models'
|
|
import { of } from 'rxjs'
|
|
import { HelpComponent } from '../shared-main/buttons/help.component'
|
|
import { BytesPipe } from '../shared-main/common/bytes.pipe'
|
|
import { DaysDurationFormatterPipe } from '../shared-main/date/days-duration-formatter.pipe'
|
|
import { FeatureBooleanComponent } from './feature-boolean.component'
|
|
|
|
@Component({
|
|
selector: 'my-instance-features-table',
|
|
templateUrl: './instance-features-table.component.html',
|
|
styleUrls: [ './instance-features-table.component.scss' ],
|
|
imports: [ NgIf, FeatureBooleanComponent, HelpComponent, NgFor, BytesPipe ]
|
|
})
|
|
export class InstanceFeaturesTableComponent implements OnInit {
|
|
private serverService = inject(ServerService)
|
|
|
|
readonly serverConfig = model<ServerConfig>(undefined)
|
|
readonly serverStats = model<ServerStats>(undefined)
|
|
|
|
quotaHelpIndication = ''
|
|
|
|
get initialUserVideoQuota () {
|
|
return this.serverConfig().user.videoQuota
|
|
}
|
|
|
|
get dailyUserVideoQuota () {
|
|
return Math.min(this.initialUserVideoQuota, this.serverConfig().user.videoQuotaDaily)
|
|
}
|
|
|
|
get maxInstanceLives () {
|
|
const value = this.serverConfig().live.maxInstanceLives
|
|
if (value === -1) return $localize`Unlimited`
|
|
|
|
return value
|
|
}
|
|
|
|
get maxUserLives () {
|
|
const value = this.serverConfig().live.maxUserLives
|
|
if (value === -1) return $localize`Unlimited`
|
|
|
|
return value
|
|
}
|
|
|
|
ngOnInit () {
|
|
const serverConfig = this.serverConfig()
|
|
const serverConfigObs = serverConfig
|
|
? of(serverConfig)
|
|
: this.serverService.getConfig()
|
|
|
|
serverConfigObs.subscribe(config => {
|
|
this.serverConfig.set(config)
|
|
|
|
this.buildQuotaHelpIndication()
|
|
})
|
|
|
|
if (!this.serverStats()) {
|
|
this.serverService.getServerStats().subscribe(stats => this.serverStats.set(stats))
|
|
}
|
|
}
|
|
|
|
buildNSFWLabel () {
|
|
const policy = this.serverConfig().instance.defaultNSFWPolicy
|
|
|
|
if (policy === 'do_not_list') return $localize`Hidden`
|
|
if (policy === 'warn') return $localize`Warn users`
|
|
if (policy === 'blur') return $localize`Warn users and blur thumbnail`
|
|
if (policy === 'display') return $localize`Displayed`
|
|
}
|
|
|
|
buildRegistrationLabel () {
|
|
const config = this.serverConfig().signup
|
|
|
|
if (config.allowed !== true) return $localize`Disabled`
|
|
|
|
if (config.requiresApproval === true) {
|
|
const responseTimeMS = this.serverStats()?.averageRegistrationRequestResponseTimeMs
|
|
|
|
if (!responseTimeMS) {
|
|
return $localize`Requires approval by moderators`
|
|
}
|
|
|
|
const responseTime = new DaysDurationFormatterPipe().transform(responseTimeMS)
|
|
return $localize`Requires approval by moderators (~ ${responseTime})`
|
|
}
|
|
|
|
return $localize`Enabled`
|
|
}
|
|
|
|
getServerVersionAndCommit () {
|
|
return this.serverService.getServerVersionAndCommit()
|
|
}
|
|
|
|
private getApproximateTime (seconds: number) {
|
|
const hours = Math.floor(seconds / 3600)
|
|
|
|
if (hours !== 0) {
|
|
return formatICU(
|
|
$localize`~ {hours, plural, =1 {1 hour} other {{hours} hours}}`,
|
|
{ hours }
|
|
)
|
|
}
|
|
|
|
const minutes = Math.floor(seconds % 3600 / 60)
|
|
|
|
return formatICU(
|
|
$localize`~ {minutes, plural, =1 {1 minute} other {{minutes} minutes}}`,
|
|
{ minutes }
|
|
)
|
|
}
|
|
|
|
private buildQuotaHelpIndication () {
|
|
if (this.initialUserVideoQuota === -1) return
|
|
|
|
const initialUserVideoQuotaBit = this.initialUserVideoQuota * 8
|
|
|
|
// 1080p: ~ 6Mbps
|
|
// 720p: ~ 4Mbps
|
|
// 360p: ~ 1.5Mbps
|
|
const fullHdSeconds = initialUserVideoQuotaBit / (6 * 1000 * 1000)
|
|
const hdSeconds = initialUserVideoQuotaBit / (4 * 1000 * 1000)
|
|
const normalSeconds = initialUserVideoQuotaBit / (1.5 * 1000 * 1000)
|
|
|
|
const lines = [
|
|
$localize`${this.getApproximateTime(fullHdSeconds)} of full HD videos`,
|
|
$localize`${this.getApproximateTime(hdSeconds)} of HD videos`,
|
|
$localize`${this.getApproximateTime(normalSeconds)} of average quality videos`
|
|
]
|
|
|
|
this.quotaHelpIndication = lines.join('<br />')
|
|
}
|
|
}
|