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