diff --git a/client/src/app/+admin/config/edit-custom-config/edit-live-configuration.component.html b/client/src/app/+admin/config/edit-custom-config/edit-live-configuration.component.html index 5d826fbe9..10d5278c1 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-live-configuration.component.html +++ b/client/src/app/+admin/config/edit-custom-config/edit-live-configuration.component.html @@ -153,7 +153,7 @@ diff --git a/client/src/app/+admin/config/edit-custom-config/edit-live-configuration.component.ts b/client/src/app/+admin/config/edit-custom-config/edit-live-configuration.component.ts index 3328d28a9..72372ffac 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-live-configuration.component.ts +++ b/client/src/app/+admin/config/edit-custom-config/edit-live-configuration.component.ts @@ -1,6 +1,6 @@ import { SelectOptionsItem } from 'src/types/select-options-item.model' -import { Component, Input, OnInit } from '@angular/core' +import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core' import { FormGroup } from '@angular/forms' import { ServerConfig } from '@shared/models' import { ConfigService } from '../shared/config.service' @@ -11,12 +11,14 @@ import { EditConfigurationService, ResolutionOption } from './edit-configuration templateUrl: './edit-live-configuration.component.html', styleUrls: [ './edit-custom-config.component.scss' ] }) -export class EditLiveConfigurationComponent implements OnInit { +export class EditLiveConfigurationComponent implements OnInit, OnChanges { @Input() form: FormGroup @Input() formErrors: any @Input() serverConfig: ServerConfig transcodingThreadOptions: SelectOptionsItem[] = [] + transcodingProfiles: SelectOptionsItem[] = [] + liveMaxDurationOptions: SelectOptionsItem[] = [] liveResolutions: ResolutionOption[] = [] @@ -39,7 +41,13 @@ export class EditLiveConfigurationComponent implements OnInit { this.liveResolutions = this.editConfigurationService.getLiveResolutions() } - getAvailableTranscodingProfile () { + ngOnChanges (changes: SimpleChanges) { + if (changes['serverConfig']) { + this.transcodingProfiles = this.buildAvailableTranscodingProfile() + } + } + + buildAvailableTranscodingProfile () { const profiles = this.serverConfig.live.transcoding.availableProfiles return profiles.map(p => { diff --git a/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.html b/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.html index cf13b27bb..1c5d6a9b4 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.html +++ b/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.html @@ -181,7 +181,7 @@ diff --git a/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.ts b/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.ts index b864f1bc4..a2dc3e52a 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.ts +++ b/client/src/app/+admin/config/edit-custom-config/edit-vod-transcoding.component.ts @@ -1,6 +1,6 @@ import { SelectOptionsItem } from 'src/types/select-options-item.model' -import { Component, Input, OnInit } from '@angular/core' +import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core' import { FormGroup } from '@angular/forms' import { ServerConfig } from '@shared/models' import { ConfigService } from '../shared/config.service' @@ -11,12 +11,13 @@ import { EditConfigurationService, ResolutionOption } from './edit-configuration templateUrl: './edit-vod-transcoding.component.html', styleUrls: [ './edit-custom-config.component.scss' ] }) -export class EditVODTranscodingComponent implements OnInit { +export class EditVODTranscodingComponent implements OnInit, OnChanges { @Input() form: FormGroup @Input() formErrors: any @Input() serverConfig: ServerConfig transcodingThreadOptions: SelectOptionsItem[] = [] + transcodingProfiles: SelectOptionsItem[] = [] resolutions: ResolutionOption[] = [] constructor ( @@ -31,7 +32,13 @@ export class EditVODTranscodingComponent implements OnInit { this.checkTranscodingFields() } - getAvailableTranscodingProfile () { + ngOnChanges (changes: SimpleChanges) { + if (changes['serverConfig']) { + this.transcodingProfiles = this.buildAvailableTranscodingProfile() + } + } + + buildAvailableTranscodingProfile () { const profiles = this.serverConfig.transcoding.availableProfiles return profiles.map(p => { diff --git a/client/src/app/shared/shared-main/date/date-toggle.component.ts b/client/src/app/shared/shared-main/date/date-toggle.component.ts index 53f25f0ad..0c3949f11 100644 --- a/client/src/app/shared/shared-main/date/date-toggle.component.ts +++ b/client/src/app/shared/shared-main/date/date-toggle.component.ts @@ -1,5 +1,4 @@ -import { DatePipe } from '@angular/common' -import { Component, Input, OnChanges, OnInit } from '@angular/core' +import { Component, Input, OnChanges } from '@angular/core' import { FromNowPipe } from '../angular/from-now.pipe' @Component({ @@ -14,10 +13,7 @@ export class DateToggleComponent implements OnChanges { dateRelative: string dateAbsolute: string - constructor ( - private datePipe: DatePipe, - private fromNowPipe: FromNowPipe - ) { } + constructor (private fromNowPipe: FromNowPipe) { } ngOnChanges () { this.updateDates() diff --git a/client/src/sass/player/playlist.scss b/client/src/sass/player/playlist.scss index cf125a562..ebbed02d9 100644 --- a/client/src/sass/player/playlist.scss +++ b/client/src/sass/player/playlist.scss @@ -5,7 +5,8 @@ $playlist-menu-width: 350px; right: 0; height: 100%; width: $playlist-menu-width; - background: rgba(0, 0, 0, 0.8); + // !important to prevent none background set on focus + background: rgba(0, 0, 0, 0.8) !important; z-index: 101; transition: right 0.2s; overflow-y: scroll; diff --git a/server/helpers/youtube-dl.ts b/server/helpers/youtube-dl.ts index 9d2e54fb5..fac3da6ba 100644 --- a/server/helpers/youtube-dl.ts +++ b/server/helpers/youtube-dl.ts @@ -76,7 +76,7 @@ function getYoutubeDLSubs (url: string, opts?: object): Promise { logger.debug('Get subtitles from youtube dl.', { url, files }) const subtitles = files.reduce((acc, filename) => { - const matched = filename.match(/\.([a-z]{2})\.(vtt|ttml)/i) + const matched = filename.match(/\.([a-z]{2})(-[a-z]+)?\.(vtt|ttml)/i) if (!matched || !matched[1]) return acc return [ diff --git a/server/initializers/migrations/0612-captions-unique.ts b/server/initializers/migrations/0612-captions-unique.ts new file mode 100644 index 000000000..368838a2a --- /dev/null +++ b/server/initializers/migrations/0612-captions-unique.ts @@ -0,0 +1,23 @@ +import * as Sequelize from 'sequelize' + +async function up (utils: { + transaction: Sequelize.Transaction + queryInterface: Sequelize.QueryInterface + sequelize: Sequelize.Sequelize + db: any +}): Promise { + + await utils.sequelize.query( + 'DELETE FROM "videoCaption" v1 USING (SELECT MIN(id) as id, "filename" FROM "videoCaption" ' + + 'GROUP BY "filename" HAVING COUNT(*) > 1) v2 WHERE v1."filename" = v2."filename" AND v1.id <> v2.id' + ) +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { + up, + down +} diff --git a/server/models/video/video.ts b/server/models/video/video.ts index b10c6e38e..e9afb2c18 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -917,7 +917,7 @@ export class VideoModel extends Model { }, include: [ { - attributes: [ 'language', 'fileUrl' ], + attributes: [ 'filename', 'language', 'fileUrl' ], model: VideoCaptionModel.unscoped(), required: false }, diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index 8be6575b4..373b17ddf 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -2646,9 +2646,14 @@ paths: content: application/json: schema: - type: array - items: - $ref: '#/components/schemas/VideoChannel' + properties: + total: + type: integer + example: 1 + data: + type: array + items: + $ref: '#/components/schemas/VideoChannel' '/accounts/{name}/ratings': get: summary: List ratings of an account