diff options
author | kontrollanten <6680299+kontrollanten@users.noreply.github.com> | 2021-03-31 11:26:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-31 11:26:32 +0200 |
commit | 58b9ce3080c12678e8c1c28c08da09d6ea60011d (patch) | |
tree | 10e501ba791e67febd47b397729ba5debb81a85c /client/src/assets | |
parent | d794137057fc5fcea10ddd29f82e79ee2412fea4 (diff) | |
download | PeerTube-58b9ce3080c12678e8c1c28c08da09d6ea60011d.tar.gz PeerTube-58b9ce3080c12678e8c1c28c08da09d6ea60011d.tar.zst PeerTube-58b9ce3080c12678e8c1c28c08da09d6ea60011d.zip |
Resume videos for non-logged in users (#3885)
* client: resume videos for non-logged in users
closes #3866
* fix build for embeded
* Update client/src/app/app.component.ts
* fix review comments
Diffstat (limited to 'client/src/assets')
4 files changed, 64 insertions, 6 deletions
diff --git a/client/src/assets/player/peertube-player-local-storage.ts b/client/src/assets/player/peertube-player-local-storage.ts index 75ccfe618..cf2cfb472 100644 --- a/client/src/assets/player/peertube-player-local-storage.ts +++ b/client/src/assets/player/peertube-player-local-storage.ts | |||
@@ -68,6 +68,51 @@ function getStoredLastSubtitle () { | |||
68 | return getLocalStorage('last-subtitle') | 68 | return getLocalStorage('last-subtitle') |
69 | } | 69 | } |
70 | 70 | ||
71 | function saveVideoWatchHistory(videoUUID: string, duration: number) { | ||
72 | return setLocalStorage(`video-watch-history`, JSON.stringify({ | ||
73 | ...getStoredVideoWatchHistory(), | ||
74 | [videoUUID]: { | ||
75 | duration, | ||
76 | date: `${(new Date()).toISOString()}` | ||
77 | } | ||
78 | })) | ||
79 | } | ||
80 | |||
81 | function getStoredVideoWatchHistory(videoUUID?: string) { | ||
82 | let data | ||
83 | |||
84 | try { | ||
85 | data = JSON.parse(getLocalStorage('video-watch-history')) | ||
86 | } catch (error) { | ||
87 | console.error('Cannot parse video watch history from local storage: ', error) | ||
88 | } | ||
89 | |||
90 | data = data || {} | ||
91 | |||
92 | if (videoUUID) return data[videoUUID] | ||
93 | |||
94 | return data | ||
95 | } | ||
96 | |||
97 | function cleanupVideoWatch() { | ||
98 | const data = getStoredVideoWatchHistory() | ||
99 | |||
100 | const newData = Object.keys(data).reduce((acc, videoUUID) => { | ||
101 | const date = Date.parse(data[videoUUID].date) | ||
102 | |||
103 | const diff = Math.ceil(((new Date()).getTime() - date) / (1000 * 3600 * 24)) | ||
104 | |||
105 | if (diff > 30) return acc | ||
106 | |||
107 | return { | ||
108 | ...acc, | ||
109 | [videoUUID]: data[videoUUID] | ||
110 | } | ||
111 | }, {}) | ||
112 | |||
113 | setLocalStorage('video-watch-history', JSON.stringify(newData)) | ||
114 | } | ||
115 | |||
71 | // --------------------------------------------------------------------------- | 116 | // --------------------------------------------------------------------------- |
72 | 117 | ||
73 | export { | 118 | export { |
@@ -81,7 +126,10 @@ export { | |||
81 | saveAverageBandwidth, | 126 | saveAverageBandwidth, |
82 | getAverageBandwidthInStore, | 127 | getAverageBandwidthInStore, |
83 | saveLastSubtitle, | 128 | saveLastSubtitle, |
84 | getStoredLastSubtitle | 129 | getStoredLastSubtitle, |
130 | saveVideoWatchHistory, | ||
131 | getStoredVideoWatchHistory, | ||
132 | cleanupVideoWatch | ||
85 | } | 133 | } |
86 | 134 | ||
87 | // --------------------------------------------------------------------------- | 135 | // --------------------------------------------------------------------------- |
diff --git a/client/src/assets/player/peertube-player-manager.ts b/client/src/assets/player/peertube-player-manager.ts index 1d335805b..119dec379 100644 --- a/client/src/assets/player/peertube-player-manager.ts +++ b/client/src/assets/player/peertube-player-manager.ts | |||
@@ -106,6 +106,8 @@ export interface CommonOptions extends CustomizationOptions { | |||
106 | 106 | ||
107 | videoCaptions: VideoJSCaption[] | 107 | videoCaptions: VideoJSCaption[] |
108 | 108 | ||
109 | videoUUID: string | ||
110 | |||
109 | userWatching?: UserWatching | 111 | userWatching?: UserWatching |
110 | 112 | ||
111 | serverUrl: string | 113 | serverUrl: string |
@@ -231,7 +233,8 @@ export class PeertubePlayerManager { | |||
231 | subtitle: commonOptions.subtitle, | 233 | subtitle: commonOptions.subtitle, |
232 | videoCaptions: commonOptions.videoCaptions, | 234 | videoCaptions: commonOptions.videoCaptions, |
233 | stopTime: commonOptions.stopTime, | 235 | stopTime: commonOptions.stopTime, |
234 | isLive: commonOptions.isLive | 236 | isLive: commonOptions.isLive, |
237 | videoUUID: commonOptions.videoUUID | ||
235 | } | 238 | } |
236 | } | 239 | } |
237 | 240 | ||
diff --git a/client/src/assets/player/peertube-plugin.ts b/client/src/assets/player/peertube-plugin.ts index 75a6e662e..07c7e33f6 100644 --- a/client/src/assets/player/peertube-plugin.ts +++ b/client/src/assets/player/peertube-plugin.ts | |||
@@ -13,6 +13,7 @@ import { | |||
13 | getStoredVolume, | 13 | getStoredVolume, |
14 | saveLastSubtitle, | 14 | saveLastSubtitle, |
15 | saveMuteInStore, | 15 | saveMuteInStore, |
16 | saveVideoWatchHistory, | ||
16 | saveVolumeInStore | 17 | saveVolumeInStore |
17 | } from './peertube-player-local-storage' | 18 | } from './peertube-player-local-storage' |
18 | 19 | ||
@@ -120,7 +121,7 @@ class PeerTubePlugin extends Plugin { | |||
120 | this.initializePlayer() | 121 | this.initializePlayer() |
121 | this.runViewAdd() | 122 | this.runViewAdd() |
122 | 123 | ||
123 | if (options.userWatching) this.runUserWatchVideo(options.userWatching) | 124 | this.runUserWatchVideo(options.userWatching, options.videoUUID) |
124 | }) | 125 | }) |
125 | } | 126 | } |
126 | 127 | ||
@@ -178,7 +179,7 @@ class PeerTubePlugin extends Plugin { | |||
178 | }, 1000) | 179 | }, 1000) |
179 | } | 180 | } |
180 | 181 | ||
181 | private runUserWatchVideo (options: UserWatching) { | 182 | private runUserWatchVideo (options: UserWatching, videoUUID: string) { |
182 | let lastCurrentTime = 0 | 183 | let lastCurrentTime = 0 |
183 | 184 | ||
184 | this.userWatchingVideoInterval = setInterval(() => { | 185 | this.userWatchingVideoInterval = setInterval(() => { |
@@ -187,8 +188,12 @@ class PeerTubePlugin extends Plugin { | |||
187 | if (currentTime - lastCurrentTime >= 1) { | 188 | if (currentTime - lastCurrentTime >= 1) { |
188 | lastCurrentTime = currentTime | 189 | lastCurrentTime = currentTime |
189 | 190 | ||
190 | this.notifyUserIsWatching(currentTime, options.url, options.authorizationHeader) | 191 | if (options) { |
191 | .catch(err => console.error('Cannot notify user is watching.', err)) | 192 | this.notifyUserIsWatching(currentTime, options.url, options.authorizationHeader) |
193 | .catch(err => console.error('Cannot notify user is watching.', err)) | ||
194 | } else { | ||
195 | saveVideoWatchHistory(videoUUID, currentTime) | ||
196 | } | ||
192 | } | 197 | } |
193 | }, this.CONSTANTS.USER_WATCHING_VIDEO_INTERVAL) | 198 | }, this.CONSTANTS.USER_WATCHING_VIDEO_INTERVAL) |
194 | } | 199 | } |
diff --git a/client/src/assets/player/peertube-videojs-typings.ts b/client/src/assets/player/peertube-videojs-typings.ts index e5259092c..4a6c80247 100644 --- a/client/src/assets/player/peertube-videojs-typings.ts +++ b/client/src/assets/player/peertube-videojs-typings.ts | |||
@@ -108,6 +108,8 @@ type PeerTubePluginOptions = { | |||
108 | stopTime: number | string | 108 | stopTime: number | string |
109 | 109 | ||
110 | isLive: boolean | 110 | isLive: boolean |
111 | |||
112 | videoUUID: string | ||
111 | } | 113 | } |
112 | 114 | ||
113 | type PlaylistPluginOptions = { | 115 | type PlaylistPluginOptions = { |