diff --git a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html
index 96629940f..adbb97f00 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html
+++ b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html
@@ -15,6 +15,18 @@
+
+
{
this.form.patchValue({
nsfwPolicy: this.user.nsfwPolicy,
+ webTorrentPolicy: this.user.webTorrentPolicy,
autoPlayVideo: this.user.autoPlayVideo === true
})
})
@@ -42,9 +44,11 @@ export class MyAccountVideoSettingsComponent extends FormReactive implements OnI
updateDetails () {
const nsfwPolicy = this.form.value['nsfwPolicy']
+ const webTorrentPolicy = this.form.value['webTorrentPolicy']
const autoPlayVideo = this.form.value['autoPlayVideo']
const details: UserUpdateMe = {
nsfwPolicy,
+ webTorrentPolicy,
autoPlayVideo
}
diff --git a/client/src/app/core/auth/auth-user.model.ts b/client/src/app/core/auth/auth-user.model.ts
index 74ed1c580..97acf7bfe 100644
--- a/client/src/app/core/auth/auth-user.model.ts
+++ b/client/src/app/core/auth/auth-user.model.ts
@@ -4,6 +4,7 @@ import { UserRight } from '../../../../../shared/models/users/user-right.enum'
import { hasUserRight, UserRole } from '../../../../../shared/models/users/user-role'
import { User, UserConstructorHash } from '../../shared/users/user.model'
import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type'
+import { WebTorrentPolicyType } from '../../../../../shared/models/users/user-webtorrent-policy.type'
export type TokenOptions = {
accessToken: string
@@ -72,6 +73,7 @@ export class AuthUser extends User {
EMAIL: 'email',
USERNAME: 'username',
NSFW_POLICY: 'nsfw_policy',
+ WEBTORRENT_POLICY: 'peertube-videojs-' + 'webtorrent_policy',
AUTO_PLAY_VIDEO: 'auto_play_video'
}
@@ -87,6 +89,7 @@ export class AuthUser extends User {
email: peertubeLocalStorage.getItem(this.KEYS.EMAIL),
role: parseInt(peertubeLocalStorage.getItem(this.KEYS.ROLE), 10) as UserRole,
nsfwPolicy: peertubeLocalStorage.getItem(this.KEYS.NSFW_POLICY) as NSFWPolicyType,
+ webTorrentPolicy: peertubeLocalStorage.getItem(this.KEYS.WEBTORRENT_POLICY) as WebTorrentPolicyType,
autoPlayVideo: peertubeLocalStorage.getItem(this.KEYS.AUTO_PLAY_VIDEO) === 'true'
},
Tokens.load()
@@ -101,6 +104,7 @@ export class AuthUser extends User {
peertubeLocalStorage.removeItem(this.KEYS.ID)
peertubeLocalStorage.removeItem(this.KEYS.ROLE)
peertubeLocalStorage.removeItem(this.KEYS.NSFW_POLICY)
+ peertubeLocalStorage.removeItem(this.KEYS.WEBTORRENT_POLICY)
peertubeLocalStorage.removeItem(this.KEYS.AUTO_PLAY_VIDEO)
peertubeLocalStorage.removeItem(this.KEYS.EMAIL)
Tokens.flush()
@@ -138,6 +142,7 @@ export class AuthUser extends User {
peertubeLocalStorage.setItem(AuthUser.KEYS.EMAIL, this.email)
peertubeLocalStorage.setItem(AuthUser.KEYS.ROLE, this.role.toString())
peertubeLocalStorage.setItem(AuthUser.KEYS.NSFW_POLICY, this.nsfwPolicy.toString())
+ peertubeLocalStorage.setItem(AuthUser.KEYS.WEBTORRENT_POLICY, this.webTorrentPolicy.toString())
peertubeLocalStorage.setItem(AuthUser.KEYS.AUTO_PLAY_VIDEO, JSON.stringify(this.autoPlayVideo))
this.tokens.save()
}
diff --git a/client/src/app/shared/users/user.model.ts b/client/src/app/shared/users/user.model.ts
index 877f1bf3a..240c7aacf 100644
--- a/client/src/app/shared/users/user.model.ts
+++ b/client/src/app/shared/users/user.model.ts
@@ -9,6 +9,7 @@ import {
import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type'
import { Account } from '@app/shared/account/account.model'
import { Avatar } from '../../../../../shared/models/avatars/avatar.model'
+import { WebTorrentPolicyType } from '../../../../../shared/models/users/user-webtorrent-policy.type'
export type UserConstructorHash = {
id: number,
@@ -18,6 +19,7 @@ export type UserConstructorHash = {
videoQuota?: number,
videoQuotaDaily?: number,
nsfwPolicy?: NSFWPolicyType,
+ webTorrentPolicy?: WebTorrentPolicyType,
autoPlayVideo?: boolean,
createdAt?: Date,
account?: AccountServerModel,
@@ -32,6 +34,7 @@ export class User implements UserServerModel {
email: string
role: UserRole
nsfwPolicy: NSFWPolicyType
+ webTorrentPolicy: WebTorrentPolicyType
autoPlayVideo: boolean
videoQuota: number
videoQuotaDaily: number
@@ -52,6 +55,7 @@ export class User implements UserServerModel {
this.videoQuota = hash.videoQuota
this.videoQuotaDaily = hash.videoQuotaDaily
this.nsfwPolicy = hash.nsfwPolicy
+ this.webTorrentPolicy = hash.webTorrentPolicy
this.autoPlayVideo = hash.autoPlayVideo
this.createdAt = hash.createdAt
this.blocked = hash.blocked
diff --git a/client/src/assets/player/peertube-player-local-storage.ts b/client/src/assets/player/peertube-player-local-storage.ts
index dac54c5a4..c3d8b71bc 100644
--- a/client/src/assets/player/peertube-player-local-storage.ts
+++ b/client/src/assets/player/peertube-player-local-storage.ts
@@ -10,6 +10,15 @@ function getStoredVolume () {
return undefined
}
+function getStoredWebTorrentPolicy () {
+ const value = getLocalStorage('webtorrent_policy')
+ if (value !== null && value !== undefined) {
+ if (value.toString() === 'disable') return true
+ }
+
+ return undefined
+}
+
function getStoredMute () {
const value = getLocalStorage('mute')
if (value !== null && value !== undefined) return value === 'true'
@@ -56,6 +65,7 @@ function getAverageBandwidthInStore () {
export {
getStoredVolume,
+ getStoredWebTorrentPolicy,
getStoredMute,
getStoredTheater,
saveVolumeInStore,
diff --git a/client/src/assets/player/peertube-videojs-plugin.ts b/client/src/assets/player/peertube-videojs-plugin.ts
index 2330f476f..90ca8f9fa 100644
--- a/client/src/assets/player/peertube-videojs-plugin.ts
+++ b/client/src/assets/player/peertube-videojs-plugin.ts
@@ -8,6 +8,7 @@ import { isMobile, timeToInt, videoFileMaxByResolution, videoFileMinByResolution
import * as CacheChunkStore from 'cache-chunk-store'
import { PeertubeChunkStore } from './peertube-chunk-store'
import {
+ getStoredWebTorrentPolicy,
getAverageBandwidthInStore,
getStoredMute,
getStoredVolume,
@@ -64,6 +65,7 @@ class PeerTubePlugin extends Plugin {
private autoResolution = true
private forbidAutoResolution = false
private isAutoResolutionObservation = false
+ private playerRefusedP2P = false
private videoViewInterval
private torrentInfoInterval
@@ -97,6 +99,7 @@ class PeerTubePlugin extends Plugin {
if (volume !== undefined) this.player.volume(volume)
const muted = getStoredMute()
if (muted !== undefined) this.player.muted(muted)
+ this.playerRefusedP2P = getStoredWebTorrentPolicy() || false
this.initializePlayer()
this.runTorrentInfoScheduler()
@@ -288,7 +291,8 @@ class PeerTubePlugin extends Plugin {
renderVideo(torrent.files[ 0 ], this.playerElement, renderVideoOptions, (err, renderer) => {
this.renderer = renderer
- if (err) return this.fallbackToHttp(done)
+ console.log('value this.playerRefusedP2P', this.playerRefusedP2P)
+ if (err || this.playerRefusedP2P) return this.fallbackToHttp(done)
return this.tryToPlay(err => {
if (err) return done(err)
diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts
index 591ec6b25..f78294f17 100644
--- a/server/controllers/api/users/me.ts
+++ b/server/controllers/api/users/me.ts
@@ -327,6 +327,7 @@ async function updateMe (req: express.Request, res: express.Response, next: expr
if (body.password !== undefined) user.password = body.password
if (body.email !== undefined) user.email = body.email
if (body.nsfwPolicy !== undefined) user.nsfwPolicy = body.nsfwPolicy
+ if (body.webTorrentPolicy !== undefined) user.webTorrentPolicy = body.webTorrentPolicy
if (body.autoPlayVideo !== undefined) user.autoPlayVideo = body.autoPlayVideo
await sequelizeTypescript.transaction(async t => {
diff --git a/server/helpers/custom-validators/users.ts b/server/helpers/custom-validators/users.ts
index 90fc74a48..2024d4a22 100644
--- a/server/helpers/custom-validators/users.ts
+++ b/server/helpers/custom-validators/users.ts
@@ -1,7 +1,7 @@
import 'express-validator'
import * as validator from 'validator'
import { UserRole } from '../../../shared'
-import { CONSTRAINTS_FIELDS, NSFW_POLICY_TYPES } from '../../initializers'
+import { CONSTRAINTS_FIELDS, NSFW_POLICY_TYPES, WEBTORRENT_POLICY_TYPES } from '../../initializers'
import { exists, isFileValid, isBooleanValid } from './misc'
import { values } from 'lodash'
@@ -42,6 +42,11 @@ function isUserNSFWPolicyValid (value: any) {
return exists(value) && nsfwPolicies.indexOf(value) !== -1
}
+const webTorrentPolicies = values(WEBTORRENT_POLICY_TYPES)
+function isUserWebTorrentPolicyValid (value: any) {
+ return exists(value) && webTorrentPolicies.indexOf(value) !== -1
+}
+
function isUserAutoPlayVideoValid (value: any) {
return isBooleanValid(value)
}
@@ -78,6 +83,7 @@ export {
isUserUsernameValid,
isUserEmailVerifiedValid,
isUserNSFWPolicyValid,
+ isUserWebTorrentPolicyValid,
isUserAutoPlayVideoValid,
isUserDisplayNameValid,
isUserDescriptionValid,
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
index e08fd75cd..f56763a16 100644
--- a/server/initializers/constants.ts
+++ b/server/initializers/constants.ts
@@ -7,6 +7,7 @@ import { VideoAbuseState, VideoImportState, VideoPrivacy, VideoTranscodingFPS }
// Do not use barrels, remain constants as independent as possible
import { buildPath, isTestInstance, parseDuration, parseBytes, root, sanitizeHost, sanitizeUrl } from '../helpers/core-utils'
import { NSFWPolicyType } from '../../shared/models/videos/nsfw-policy.type'
+import { WebTorrentPolicyType } from '../../shared/models/users/user-webtorrent-policy.type'
import { invert } from 'lodash'
import { CronRepeatOptions, EveryRepeatOptions } from 'bull'
import * as bytes from 'bytes'
@@ -16,7 +17,7 @@ let config: IConfig = require('config')
// ---------------------------------------------------------------------------
-const LAST_MIGRATION_VERSION = 275
+const LAST_MIGRATION_VERSION = 280
// ---------------------------------------------------------------------------
@@ -546,6 +547,12 @@ const NSFW_POLICY_TYPES: { [ id: string]: NSFWPolicyType } = {
DISPLAY: 'display'
}
+const WEBTORRENT_POLICY_TYPES: { [ id: string]: WebTorrentPolicyType } = {
+ ENABLE: 'enable',
+ DISABLE: 'disable',
+ DISABLE_ON_MOBILE: 'disable_on_mobile'
+}
+
// ---------------------------------------------------------------------------
// Express static paths (router)
@@ -698,6 +705,7 @@ export {
FEEDS,
JOB_TTL,
NSFW_POLICY_TYPES,
+ WEBTORRENT_POLICY_TYPES,
TORRENT_MIMETYPE_EXT,
STATIC_MAX_AGE,
STATIC_PATHS,
diff --git a/server/initializers/migrations/0280-webtorrent-policy-user.ts b/server/initializers/migrations/0280-webtorrent-policy-user.ts
new file mode 100644
index 000000000..d24f6709e
--- /dev/null
+++ b/server/initializers/migrations/0280-webtorrent-policy-user.ts
@@ -0,0 +1,26 @@
+import * as Sequelize from 'sequelize'
+import { values } from 'lodash'
+import { WEBTORRENT_POLICY_TYPES } from '../constants'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction
+ queryInterface: Sequelize.QueryInterface
+ sequelize: Sequelize.Sequelize
+}): Promise {
+ {
+ const data = {
+ type: Sequelize.ENUM(values(WEBTORRENT_POLICY_TYPES)),
+ allowNull: false,
+ defaultValue: 'enable'
+ }
+
+ await utils.queryInterface.addColumn('user', 'webTorrentPolicy', data)
+ }
+
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export { up, down }
diff --git a/server/models/account/user.ts b/server/models/account/user.ts
index 39654cfcf..5fe7d7e7d 100644
--- a/server/models/account/user.ts
+++ b/server/models/account/user.ts
@@ -31,7 +31,8 @@ import {
isUserRoleValid,
isUserUsernameValid,
isUserVideoQuotaDailyValid,
- isUserVideoQuotaValid
+ isUserVideoQuotaValid,
+ isUserWebTorrentPolicyValid
} from '../../helpers/custom-validators/users'
import { comparePassword, cryptPassword } from '../../helpers/peertube-crypto'
import { OAuthTokenModel } from '../oauth/oauth-token'
@@ -39,8 +40,9 @@ import { getSort, throwIfNotValid } from '../utils'
import { VideoChannelModel } from '../video/video-channel'
import { AccountModel } from './account'
import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type'
+import { WebTorrentPolicyType } from '../../../shared/models/users/user-webtorrent-policy.type'
import { values } from 'lodash'
-import { NSFW_POLICY_TYPES } from '../../initializers'
+import { NSFW_POLICY_TYPES, WEBTORRENT_POLICY_TYPES } from '../../initializers'
import { clearCacheByUserId } from '../../lib/oauth-model'
enum ScopeNames {
@@ -107,6 +109,11 @@ export class UserModel extends Model {
@Column(DataType.ENUM(values(NSFW_POLICY_TYPES)))
nsfwPolicy: NSFWPolicyType
+ @AllowNull(false)
+ @Is('UserWebTorrentPolicy', value => throwIfNotValid(value, isUserWebTorrentPolicyValid, 'WebTorrent policy'))
+ @Column(DataType.ENUM(values(WEBTORRENT_POLICY_TYPES)))
+ webTorrentPolicy: WebTorrentPolicyType
+
@AllowNull(false)
@Default(true)
@Is('UserAutoPlayVideo', value => throwIfNotValid(value, isUserAutoPlayVideoValid, 'auto play video boolean'))
@@ -355,6 +362,7 @@ export class UserModel extends Model {
email: this.email,
emailVerified: this.emailVerified,
nsfwPolicy: this.nsfwPolicy,
+ webTorrentPolicy: this.webTorrentPolicy,
autoPlayVideo: this.autoPlayVideo,
role: this.role,
roleLabel: USER_ROLE_LABELS[ this.role ],
diff --git a/shared/models/users/user-update-me.model.ts b/shared/models/users/user-update-me.model.ts
index bbffe1487..81790377e 100644
--- a/shared/models/users/user-update-me.model.ts
+++ b/shared/models/users/user-update-me.model.ts
@@ -1,9 +1,11 @@
import { NSFWPolicyType } from '../videos/nsfw-policy.type'
+import { WebTorrentPolicyType } from './user-webtorrent-policy.type'
export interface UserUpdateMe {
displayName?: string
description?: string
- nsfwPolicy?: NSFWPolicyType
+ nsfwPolicy?: NSFWPolicyType,
+ webTorrentPolicy?: WebTorrentPolicyType,
autoPlayVideo?: boolean
email?: string
currentPassword?: string
diff --git a/shared/models/users/user-webtorrent-policy.type.ts b/shared/models/users/user-webtorrent-policy.type.ts
new file mode 100644
index 000000000..e293f761d
--- /dev/null
+++ b/shared/models/users/user-webtorrent-policy.type.ts
@@ -0,0 +1 @@
+export type WebTorrentPolicyType = 'enable' | 'disable' | 'disable_on_mobile'