}
}
- private initHotkeys () {
- this.hotkeys = [
- new Hotkey('shift+l', () => {
- this.setLike()
- return false
- }, undefined, this.i18n('Like the video')),
-
- new Hotkey('shift+d', () => {
- this.setDislike()
- return false
- }, undefined, this.i18n('Dislike the video')),
-
- new Hotkey('shift+s', () => {
- this.subscribeButton.subscribed ? this.subscribeButton.unsubscribe() : this.subscribeButton.subscribe()
- return false
- }, undefined, this.i18n('Subscribe to the account'))
- ]
- if (this.isUserLoggedIn()) this.hotkeysService.add(this.hotkeys)
- }
-
private buildPlayerManagerOptions (params: {
video: VideoDetails,
videoCaptions: VideoCaption[],
this.player.pause()
}
+
+ private initHotkeys () {
+ this.hotkeys = [
+ new Hotkey('shift+l', () => {
+ this.setLike()
+ return false
+ }, undefined, this.i18n('Like the video')),
+
+ new Hotkey('shift+d', () => {
+ this.setDislike()
+ return false
+ }, undefined, this.i18n('Dislike the video')),
+
+ new Hotkey('shift+s', () => {
+ this.subscribeButton.subscribed ? this.subscribeButton.unsubscribe() : this.subscribeButton.subscribe()
+ return false
+ }, undefined, this.i18n('Subscribe to the account')),
+
+ // These hotkeys are managed by the player
+ new Hotkey('f', e => e, undefined, this.i18n('Enter/exit fullscreen (requires player focus)')),
+ new Hotkey('space', e => e, undefined, this.i18n('Play/Pause the video (requires player focus)')),
+ new Hotkey('m', e => e, undefined, this.i18n('Mute/unmute the video (requires player focus)')),
+
+ new Hotkey('0-9', e => e, undefined, this.i18n('Skip to a percentage of the video: 0 is 0% and 9 is 90% (requires player focus)')),
+
+ new Hotkey('up', e => e, undefined, this.i18n('Increase the volume (requires player focus)')),
+ new Hotkey('down', e => e, undefined, this.i18n('Decrease the volume (requires player focus)')),
+
+ new Hotkey('right', e => e, undefined, this.i18n('Seek the video forward (requires player focus)')),
+ new Hotkey('left', e => e, undefined, this.i18n('Seek the video backward (requires player focus)')),
+
+ new Hotkey('>', e => e, undefined, this.i18n('Increase playback rate (requires player focus)')),
+ new Hotkey('<', e => e, undefined, this.i18n('Decrease playback rate (requires player focus)')),
+
+ new Hotkey('.', e => e, undefined, this.i18n('Navigate in the video frame by frame (requires player focus)'))
+ ]
+ if (this.isUserLoggedIn()) this.hotkeysService.add(this.hotkeys)
+ }
}
import { values } from 'lodash'
import { extname } from 'path'
-import * as Sequelize from 'sequelize'
import {
AllowNull,
BelongsTo,
MActorWithInboxes
} from '../../typings/models'
import * as Bluebird from 'bluebird'
-import { Op } from 'sequelize'
+import { Op, Transaction } from 'sequelize'
enum ScopeNames {
FULL = 'FULL'
return ActorModel.scope(ScopeNames.FULL).findByPk(id)
}
- static loadFromAccountByVideoId (videoId: number, transaction: Sequelize.Transaction): Bluebird<MActor> {
+ static loadFromAccountByVideoId (videoId: number, transaction: Transaction): Bluebird<MActor> {
const query = {
include: [
{
.then(a => !!a)
}
- static listByFollowersUrls (followersUrls: string[], transaction?: Sequelize.Transaction): Bluebird<MActorFull[]> {
+ static listByFollowersUrls (followersUrls: string[], transaction?: Transaction): Bluebird<MActorFull[]> {
const query = {
where: {
followersUrl: {
- [ Sequelize.Op.in ]: followersUrls
+ [ Op.in ]: followersUrls
}
},
transaction
return ActorModel.scope(ScopeNames.FULL).findAll(query)
}
- static loadLocalByName (preferredUsername: string, transaction?: Sequelize.Transaction): Bluebird<MActorFull> {
+ static loadLocalByName (preferredUsername: string, transaction?: Transaction): Bluebird<MActorFull> {
const query = {
where: {
preferredUsername,
return ActorModel.scope(ScopeNames.FULL).findOne(query)
}
- static loadByUrl (url: string, transaction?: Sequelize.Transaction): Bluebird<MActorAccountChannelId> {
+ static loadByUrl (url: string, transaction?: Transaction): Bluebird<MActorAccountChannelId> {
const query = {
where: {
url
return ActorModel.unscoped().findOne(query)
}
- static loadByUrlAndPopulateAccountAndChannel (url: string, transaction?: Sequelize.Transaction): Bluebird<MActorFull> {
+ static loadByUrlAndPopulateAccountAndChannel (url: string, transaction?: Transaction): Bluebird<MActorFull> {
const query = {
where: {
url
return activityPubContextify(json)
}
- getFollowerSharedInboxUrls (t: Sequelize.Transaction) {
+ getFollowerSharedInboxUrls (t: Transaction) {
const query = {
attributes: [ 'sharedInboxUrl' ],
include: [
tempFixturePath = await generateHighBitrateVideo()
const bitrate = await getVideoFileBitrate(tempFixturePath)
- expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 60, VIDEO_TRANSCODING_FPS))
+ expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 25, VIDEO_TRANSCODING_FPS))
}
const videoAttributes = {
tempFixturePath = await generateHighBitrateVideo()
const bitrate = await getVideoFileBitrate(tempFixturePath)
- expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 60, VIDEO_TRANSCODING_FPS))
+ expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 25, VIDEO_TRANSCODING_FPS))
}
for (const fixture of [ 'video_short.mkv', 'video_short.avi' ]) {
tempFixturePath = await generateHighBitrateVideo()
const bitrate = await getVideoFileBitrate(tempFixturePath)
- expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 60, VIDEO_TRANSCODING_FPS))
+ expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 25, VIDEO_TRANSCODING_FPS))
}
// Upload two videos for our needs
expect(videosDetails.files).to.have.lengthOf(1)
const file = videosDetails.files[0]
- expect(file.size).to.be.below(5000000)
+ expect(file.size).to.be.below(8000000)
const path = join(root(), 'test' + servers[0].internalServerNumber, 'videos', video.uuid + '-' + file.resolution.id + '.mp4')
const bitrate = await getVideoFileBitrate(path)